@weapp-vite/web 1.6.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/css/wxss.mjs +2 -1
- package/dist/css/wxss.mjs.map +1 -1
- package/dist/plugin/hostTypes.d.mts +74 -0
- package/dist/plugin/index.d.mts +2 -74
- package/dist/plugin/index.mjs +9 -2
- package/dist/plugin/index.mjs.map +1 -1
- package/dist/plugin/sfcHmr.mjs +19 -0
- package/dist/plugin/sfcHmr.mjs.map +1 -0
- package/dist/plugin/vueSfc.mjs +12 -9
- package/dist/plugin/vueSfc.mjs.map +1 -1
- package/dist/runtime/appStyle.mjs +25 -0
- package/dist/runtime/appStyle.mjs.map +1 -0
- package/dist/runtime/component/element.mjs +39 -19
- package/dist/runtime/component/element.mjs.map +1 -1
- package/dist/runtime/component/events.mjs +34 -3
- package/dist/runtime/component/events.mjs.map +1 -1
- package/dist/runtime/component/publicInstance.mjs +7 -3
- package/dist/runtime/component/publicInstance.mjs.map +1 -1
- package/dist/runtime/component/state.mjs +7 -0
- package/dist/runtime/component/state.mjs.map +1 -1
- package/dist/runtime/component/types.d.mts +2 -0
- package/dist/runtime/component/utils.mjs +23 -3
- package/dist/runtime/component/utils.mjs.map +1 -1
- package/dist/runtime/componentEvents.mjs +37 -0
- package/dist/runtime/componentEvents.mjs.map +1 -0
- package/dist/runtime/eventBinding.mjs +5 -2
- package/dist/runtime/eventBinding.mjs.map +1 -1
- package/dist/runtime/legacyTemplate/dom.mjs +2 -7
- package/dist/runtime/legacyTemplate/dom.mjs.map +1 -1
- package/dist/runtime/nativeComponents/canvas/index.mjs +12 -3
- package/dist/runtime/nativeComponents/canvas/index.mjs.map +1 -1
- package/dist/runtime/polyfill/routeRuntime.d.mts +1 -1
- package/dist/runtime/polyfill/routeRuntime.mjs +5 -1
- package/dist/runtime/polyfill/routeRuntime.mjs.map +1 -1
- package/dist/runtime/renderContext.mjs +3 -2
- package/dist/runtime/renderContext.mjs.map +1 -1
- package/dist/runtime/wevu.mjs +2 -0
- package/dist/runtime/wevu.mjs.map +1 -1
- package/dist/shared/wxml.mjs +5 -1
- package/dist/shared/wxml.mjs.map +1 -1
- package/package.json +14 -12
package/README.md
CHANGED
|
@@ -54,6 +54,28 @@ defineComponent('wv-hello-world', {
|
|
|
54
54
|
document.body.innerHTML = '<wv-hello-world title="文档地址"></wv-hello-world>'
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
## 应用样式与隔离
|
|
58
|
+
|
|
59
|
+
`app.vue` 的内联 `<style>`、`<style src="...">`,以及原生 `App` 入口对应的样式文件,共用应用样式注册链路。样式进入页面的 Shadow Root,不依赖向 `document.head` 注入 CSS 来穿透 Shadow DOM。
|
|
60
|
+
|
|
61
|
+
- 页面先应用 app 样式,再应用自身样式;两者保留独立的 stylesheet,局部样式开头的合法 `@import` 不会因 app 规则而失效,相同优先级时页面声明仍可覆盖 app 声明。
|
|
62
|
+
- 自定义组件默认隔离 app 的选择器。`options.styleIsolation` 为 `apply-shared` 或 `shared` 时接收 app 样式;未设置 `styleIsolation` 时,`options.addGlobalClass: true` 也可开启。显式 `isolated` 优先于 `addGlobalClass`。
|
|
63
|
+
- `page` 选择器只命中页面宿主,不会在共享样式的子组件上重新设置页面主题;页面限定不增加原有 `:host` 转换的选择器权重。CSS 自定义属性仍按浏览器规则继承,局部主题可以覆盖继承值。
|
|
64
|
+
- 应用样式更新与一次性的 `App()` 生命周期分开:HMR 可以修改、移除、重新添加样式,已挂载和后续挂载的消费方读取同一份最新状态;卸载时解除订阅。
|
|
65
|
+
- legacy 字符串模板保留节点时,事件监听器按绑定所有权复用;样式更新不会叠加监听器或丢失输入值与选区,方法、别名或捕获配置变化时替换旧绑定,移除后不再拦截事件。
|
|
66
|
+
|
|
67
|
+
这些规则描述 app 样式的可见范围,不会取消 Shadow DOM,也不扩展页面样式向组件、组件样式向外传播的现有支持范围。
|
|
68
|
+
|
|
69
|
+
## 组件事件与属性
|
|
70
|
+
|
|
71
|
+
- 自定义组件上的 `click`、`input` 等事件绑定只接收组件通过 `triggerEvent` 或 Vue `emit` 发出的事件,不会再被内部同名原生 DOM 事件额外触发。原生控件事件和 `tap` 等已有手势别名保持原有交互。
|
|
72
|
+
- 组件事件保留原始名称、大小写和 `detail`,并遵循显式的 `bubbles`、`composed` 选项。捕获、`catch` 与 `capture-catch` 先区分事件来源,再决定是否处理或停止传播,不会吞掉另一通道的原生事件。Vue SFC 处理函数接收 emit payload,原生 WXML 处理函数接收含 `detail` 的事件对象。
|
|
73
|
+
- DOM 宿主属性承载 props 输入,公开实例的方法表承载组件方法。两者同名时,Boolean、String、Number、Object、Array 和 Function props 不会被方法安装改写,模板和公开实例仍可调用对应方法。方法表优先级仅用于声明的 prop 冲突;没有此类冲突的普通实例方法仍支持显式赋值或自有访问器覆写。
|
|
74
|
+
- setup 方法安装采用完整快照,替换或移除方法不会写入 props。保留 setup 方法优先于同名静态方法的顺序;清空 setup 快照后恢复最新静态定义。普通自有字段、访问器和不可配置属性不由框架热更新覆盖。
|
|
75
|
+
- 父级 `setData` 的嵌套 Object / Array 路径更新只复制本批变更路径上的容器;显式提交整个对象或数组时,为该子树创建输入快照。原地修改后的同引用提交,以及新外层对象复用旧嵌套值的提交,都能更新子组件的深层投影和继续转发的输入。函数引用保持可调用,未提交的分支不复制,普通未变值不重复触发观察器;大对象增量更新优先使用具体路径,避免整棵已提交子树的复制成本。
|
|
76
|
+
|
|
77
|
+
现有限制:`<script setup>` 的同节点同名事件捕获/冒泡处理器,以及 legacy 字符串模板中的同类组合,仍存在独立的处理器键冲突;该组合暂需使用不同层级的节点。这不属于上述原生事件与组件事件的来源隔离。
|
|
78
|
+
|
|
57
79
|
## 设备视口
|
|
58
80
|
|
|
59
81
|
默认配置模拟小程序页面视口:移动宽度下铺满,浏览器宽度达到 600px 后使用 375px 居中容器。页面、导航栏、`fixed` 元素和 `rpx` 共用这一区域。
|
package/dist/css/wxss.mjs
CHANGED
|
@@ -5,6 +5,7 @@ import selectorParser from "postcss-selector-parser";
|
|
|
5
5
|
//#region src/css/wxss.ts
|
|
6
6
|
const RPX_RE = /(-?(?:\d+(?:\.\d+)?|\.\d+))rpx/gi;
|
|
7
7
|
const SAFE_AREA_ENV_RE = /env\(\s*safe-area-inset-(top|right|bottom|left)(?:\s*,[^)]*)?\)/gi;
|
|
8
|
+
const PAGE_HOST_SELECTOR = selectorParser().astSync(":host(:where([data-weapp-page-active]))").nodes[0].nodes[0];
|
|
8
9
|
function isDeepPseudo(pseudo) {
|
|
9
10
|
return pseudo.value === ":deep" || pseudo.value === "::v-deep";
|
|
10
11
|
}
|
|
@@ -23,7 +24,7 @@ function transformNativeTags(selector) {
|
|
|
23
24
|
selector.walkTags((tag) => {
|
|
24
25
|
if (tag.parent?.type === "selector" && tag.parent.parent?.type === "pseudo" && tag.parent.parent.value === "::part") return;
|
|
25
26
|
if (tag.value === "page") {
|
|
26
|
-
tag.replaceWith(
|
|
27
|
+
tag.replaceWith(PAGE_HOST_SELECTOR.clone());
|
|
27
28
|
return;
|
|
28
29
|
}
|
|
29
30
|
const webTag = resolveNativeComponentWebTag(tag.value);
|
package/dist/css/wxss.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wxss.mjs","names":[],"sources":["../../src/css/wxss.ts"],"sourcesContent":["import postcss from 'postcss'\nimport selectorParser from 'postcss-selector-parser'\nimport { resolveNativeComponentWebTag } from '../shared/nativeComponents'\n\nexport interface WxssTransformOptions {\n /**\n * 1rpx 对应的 CSS 像素数。\n * 默认值近似于 750rpx 设计稿在 375px 屏幕上的换算。\n */\n pxPerRpx?: number\n /**\n * rpx 换算的设计宽度。传入后会把 rpx 转为\n * `calc(var(--rpx) * N)` 以实现响应式缩放。\n */\n designWidth?: number\n /**\n * 用于存储运行时 rpx 大小的 CSS 变量名。\n * @default \"--rpx\"\n */\n rpxVar?: string\n}\n\nexport interface WxssTransformResult {\n css: string\n}\n\nconst RPX_RE = /(-?(?:\\d+(?:\\.\\d+)?|\\.\\d+))rpx/gi\nconst SAFE_AREA_ENV_RE = /env\\(\\s*safe-area-inset-(top|right|bottom|left)(?:\\s*,[^)]*)?\\)/gi\n\nfunction isDeepPseudo(pseudo: selectorParser.Pseudo) {\n return pseudo.value === ':deep' || pseudo.value === '::v-deep'\n}\n\nfunction flattenDeepPseudos(selector: selectorParser.Selector) {\n selector.walkPseudos((pseudo) => {\n if (!isDeepPseudo(pseudo)) {\n return\n }\n const nestedSelector = pseudo.nodes?.[0]\n if (nestedSelector && nestedSelector.nodes.length > 0) {\n pseudo.replaceWith(...nestedSelector.nodes.map(node => node.clone()))\n return\n }\n pseudo.remove()\n })\n}\n\nfunction transformNativeTags(selector: selectorParser.Selector) {\n selector.walkTags((tag) => {\n if (tag.parent?.type === 'selector' && tag.parent.parent?.type === 'pseudo' && tag.parent.parent.value === '::part') {\n return\n }\n if (tag.value === 'page') {\n tag.replaceWith(
|
|
1
|
+
{"version":3,"file":"wxss.mjs","names":[],"sources":["../../src/css/wxss.ts"],"sourcesContent":["import postcss from 'postcss'\nimport selectorParser from 'postcss-selector-parser'\nimport { resolveNativeComponentWebTag } from '../shared/nativeComponents'\n\nexport interface WxssTransformOptions {\n /**\n * 1rpx 对应的 CSS 像素数。\n * 默认值近似于 750rpx 设计稿在 375px 屏幕上的换算。\n */\n pxPerRpx?: number\n /**\n * rpx 换算的设计宽度。传入后会把 rpx 转为\n * `calc(var(--rpx) * N)` 以实现响应式缩放。\n */\n designWidth?: number\n /**\n * 用于存储运行时 rpx 大小的 CSS 变量名。\n * @default \"--rpx\"\n */\n rpxVar?: string\n}\n\nexport interface WxssTransformResult {\n css: string\n}\n\nconst RPX_RE = /(-?(?:\\d+(?:\\.\\d+)?|\\.\\d+))rpx/gi\nconst SAFE_AREA_ENV_RE = /env\\(\\s*safe-area-inset-(top|right|bottom|left)(?:\\s*,[^)]*)?\\)/gi\nconst PAGE_HOST_SELECTOR = selectorParser().astSync(':host(:where([data-weapp-page-active]))').nodes[0]!.nodes[0]!\n\nfunction isDeepPseudo(pseudo: selectorParser.Pseudo) {\n return pseudo.value === ':deep' || pseudo.value === '::v-deep'\n}\n\nfunction flattenDeepPseudos(selector: selectorParser.Selector) {\n selector.walkPseudos((pseudo) => {\n if (!isDeepPseudo(pseudo)) {\n return\n }\n const nestedSelector = pseudo.nodes?.[0]\n if (nestedSelector && nestedSelector.nodes.length > 0) {\n pseudo.replaceWith(...nestedSelector.nodes.map(node => node.clone()))\n return\n }\n pseudo.remove()\n })\n}\n\nfunction transformNativeTags(selector: selectorParser.Selector) {\n selector.walkTags((tag) => {\n if (tag.parent?.type === 'selector' && tag.parent.parent?.type === 'pseudo' && tag.parent.parent.value === '::part') {\n return\n }\n if (tag.value === 'page') {\n tag.replaceWith(PAGE_HOST_SELECTOR.clone())\n return\n }\n const webTag = resolveNativeComponentWebTag(tag.value)\n if (webTag) {\n tag.value = webTag\n }\n })\n}\n\nfunction createPartPseudo(className: string) {\n return selectorParser.pseudo({\n value: '::part',\n nodes: [selectorParser.selector({\n value: '',\n nodes: [selectorParser.tag({ value: className })],\n })],\n })\n}\n\nfunction createVirtualHostPartSelector(source: selectorParser.Selector) {\n const selector = source.clone()\n let deepPseudo: selectorParser.Pseudo | undefined\n selector.walkPseudos((pseudo) => {\n if (!deepPseudo && isDeepPseudo(pseudo)) {\n deepPseudo = pseudo\n }\n })\n if (!deepPseudo || deepPseudo.parent?.type !== 'selector') {\n return undefined\n }\n\n const parent = deepPseudo.parent\n const pseudoIndex = parent.nodes.indexOf(deepPseudo)\n const nestedNodes = deepPseudo.nodes?.[0]?.nodes ?? []\n const nestedTargetClass = nestedNodes.find(node => node.type === 'class')?.value\n let targetStart = pseudoIndex\n if (nestedNodes.length > 0) {\n deepPseudo.replaceWith(...nestedNodes.map(node => node.clone()))\n }\n else {\n deepPseudo.remove()\n while (parent.nodes[targetStart]?.type === 'combinator') {\n targetStart += 1\n }\n }\n\n let targetEnd = targetStart\n while (targetEnd + 1 < parent.nodes.length && parent.nodes[targetEnd + 1]?.type !== 'combinator') {\n targetEnd += 1\n }\n if (targetStart >= parent.nodes.length || targetEnd < parent.nodes.length - 1) {\n return undefined\n }\n\n const targetNodes = parent.nodes.slice(targetStart, targetEnd + 1)\n const targetClass = nestedTargetClass\n ?? targetNodes.find(node => node.type === 'class')?.value\n const targetNode = parent.nodes[targetEnd]!\n if (!targetClass) {\n return undefined\n }\n\n const firstTargetPseudo = targetNodes.find(node => node.type === 'pseudo')\n if (firstTargetPseudo?.value.startsWith(':') && !firstTargetPseudo.value.startsWith('::')) {\n return undefined\n }\n if (firstTargetPseudo) {\n parent.insertBefore(firstTargetPseudo, createPartPseudo(targetClass))\n }\n else {\n parent.insertAfter(targetNode, createPartPseudo(targetClass))\n }\n flattenDeepPseudos(selector)\n transformNativeTags(selector)\n return selector\n}\n\nfunction transformWxssSelector(selector: string) {\n const root = selectorParser().astSync(selector)\n const output: string[] = []\n for (const sourceSelector of root.nodes) {\n const partSelector = createVirtualHostPartSelector(sourceSelector)\n const flatSelector = sourceSelector.clone()\n flattenDeepPseudos(flatSelector)\n transformNativeTags(flatSelector)\n output.push(flatSelector.toString())\n if (partSelector) {\n output.push(partSelector.toString())\n }\n }\n return output.join(',\\n')\n}\n\nfunction transformWxssRoot(root: postcss.Root, options?: WxssTransformOptions) {\n const rpxVar = options?.rpxVar ?? '--rpx'\n const useVariable = options?.pxPerRpx === undefined\n || (typeof options.designWidth === 'number' && Number.isFinite(options.designWidth))\n const ratio = options?.pxPerRpx ?? 0.5\n root.walkRules((rule) => {\n if (rule.selector) {\n rule.selector = transformWxssSelector(rule.selector)\n }\n })\n root.walkDecls((declaration) => {\n declaration.value = declaration.value\n .replace(\n SAFE_AREA_ENV_RE,\n (_, side: string) => `var(--weapp-safe-area-inset-${side})`,\n )\n .replace(RPX_RE, (_, value: string) => {\n const numeric = Number.parseFloat(value)\n if (useVariable) {\n return `calc(var(${rpxVar}) * ${numeric})`\n }\n const converted = Math.round(numeric * ratio * 1000) / 1000\n return `${converted}px`\n })\n })\n}\n\nexport function createWxssPostcssPlugin(options?: WxssTransformOptions) {\n return {\n postcssPlugin: 'weapp-vite-web-wxss',\n Once(root: postcss.Root) {\n transformWxssRoot(root, options)\n },\n }\n}\n\nexport function transformWxssToCss(source: string, options?: WxssTransformOptions): WxssTransformResult {\n const root = postcss.parse(source)\n transformWxssRoot(root, options)\n return {\n css: root.toString(),\n }\n}\n"],"mappings":";;;;;AA0BA,MAAM,SAAS;AACf,MAAM,mBAAmB;AACzB,MAAM,qBAAqB,eAAe,CAAC,CAAC,QAAQ,yCAAyC,CAAC,CAAC,MAAM,EAAE,CAAE,MAAM;AAE/G,SAAS,aAAa,QAA+B;CACnD,OAAO,OAAO,UAAU,WAAW,OAAO,UAAU;AACtD;AAEA,SAAS,mBAAmB,UAAmC;CAC7D,SAAS,aAAa,WAAW;EAC/B,IAAI,CAAC,aAAa,MAAM,GACtB;EAEF,MAAM,iBAAiB,OAAO,QAAQ;EACtC,IAAI,kBAAkB,eAAe,MAAM,SAAS,GAAG;GACrD,OAAO,YAAY,GAAG,eAAe,MAAM,KAAI,SAAQ,KAAK,MAAM,CAAC,CAAC;GACpE;EACF;EACA,OAAO,OAAO;CAChB,CAAC;AACH;AAEA,SAAS,oBAAoB,UAAmC;CAC9D,SAAS,UAAU,QAAQ;EACzB,IAAI,IAAI,QAAQ,SAAS,cAAc,IAAI,OAAO,QAAQ,SAAS,YAAY,IAAI,OAAO,OAAO,UAAU,UACzG;EAEF,IAAI,IAAI,UAAU,QAAQ;GACxB,IAAI,YAAY,mBAAmB,MAAM,CAAC;GAC1C;EACF;EACA,MAAM,SAAS,6BAA6B,IAAI,KAAK;EACrD,IAAI,QACF,IAAI,QAAQ;CAEhB,CAAC;AACH;AAEA,SAAS,iBAAiB,WAAmB;CAC3C,OAAO,eAAe,OAAO;EAC3B,OAAO;EACP,OAAO,CAAC,eAAe,SAAS;GAC9B,OAAO;GACP,OAAO,CAAC,eAAe,IAAI,EAAE,OAAO,UAAU,CAAC,CAAC;EAClD,CAAC,CAAC;CACJ,CAAC;AACH;AAEA,SAAS,8BAA8B,QAAiC;CACtE,MAAM,WAAW,OAAO,MAAM;CAC9B,IAAI;CACJ,SAAS,aAAa,WAAW;EAC/B,IAAI,CAAC,cAAc,aAAa,MAAM,GACpC,aAAa;CAEjB,CAAC;CACD,IAAI,CAAC,cAAc,WAAW,QAAQ,SAAS,YAC7C;CAGF,MAAM,SAAS,WAAW;CAC1B,MAAM,cAAc,OAAO,MAAM,QAAQ,UAAU;CACnD,MAAM,cAAc,WAAW,QAAQ,EAAE,EAAE,SAAS,CAAC;CACrD,MAAM,oBAAoB,YAAY,MAAK,SAAQ,KAAK,SAAS,OAAO,CAAC,EAAE;CAC3E,IAAI,cAAc;CAClB,IAAI,YAAY,SAAS,GACvB,WAAW,YAAY,GAAG,YAAY,KAAI,SAAQ,KAAK,MAAM,CAAC,CAAC;MAE5D;EACH,WAAW,OAAO;EAClB,OAAO,OAAO,MAAM,YAAY,EAAE,SAAS,cACzC,eAAe;CAEnB;CAEA,IAAI,YAAY;CAChB,OAAO,YAAY,IAAI,OAAO,MAAM,UAAU,OAAO,MAAM,YAAY,EAAE,EAAE,SAAS,cAClF,aAAa;CAEf,IAAI,eAAe,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,SAAS,GAC1E;CAGF,MAAM,cAAc,OAAO,MAAM,MAAM,aAAa,YAAY,CAAC;CACjE,MAAM,cAAc,qBACf,YAAY,MAAK,SAAQ,KAAK,SAAS,OAAO,CAAC,EAAE;CACtD,MAAM,aAAa,OAAO,MAAM;CAChC,IAAI,CAAC,aACH;CAGF,MAAM,oBAAoB,YAAY,MAAK,SAAQ,KAAK,SAAS,QAAQ;CACzE,IAAI,mBAAmB,MAAM,WAAW,GAAG,KAAK,CAAC,kBAAkB,MAAM,WAAW,IAAI,GACtF;CAEF,IAAI,mBACF,OAAO,aAAa,mBAAmB,iBAAiB,WAAW,CAAC;MAGpE,OAAO,YAAY,YAAY,iBAAiB,WAAW,CAAC;CAE9D,mBAAmB,QAAQ;CAC3B,oBAAoB,QAAQ;CAC5B,OAAO;AACT;AAEA,SAAS,sBAAsB,UAAkB;CAC/C,MAAM,OAAO,eAAe,CAAC,CAAC,QAAQ,QAAQ;CAC9C,MAAM,SAAmB,CAAC;CAC1B,KAAK,MAAM,kBAAkB,KAAK,OAAO;EACvC,MAAM,eAAe,8BAA8B,cAAc;EACjE,MAAM,eAAe,eAAe,MAAM;EAC1C,mBAAmB,YAAY;EAC/B,oBAAoB,YAAY;EAChC,OAAO,KAAK,aAAa,SAAS,CAAC;EACnC,IAAI,cACF,OAAO,KAAK,aAAa,SAAS,CAAC;CAEvC;CACA,OAAO,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,kBAAkB,MAAoB,SAAgC;CAC7E,MAAM,SAAS,SAAS,UAAU;CAClC,MAAM,cAAc,SAAS,aAAa,UACpC,OAAO,QAAQ,gBAAgB,YAAY,OAAO,SAAS,QAAQ,WAAW;CACpF,MAAM,QAAQ,SAAS,YAAY;CACnC,KAAK,WAAW,SAAS;EACvB,IAAI,KAAK,UACP,KAAK,WAAW,sBAAsB,KAAK,QAAQ;CAEvD,CAAC;CACD,KAAK,WAAW,gBAAgB;EAC9B,YAAY,QAAQ,YAAY,MAC7B,QACC,mBACC,GAAG,SAAiB,+BAA+B,KAAK,EAC3D,CAAC,CACA,QAAQ,SAAS,GAAG,UAAkB;GACrC,MAAM,UAAU,OAAO,WAAW,KAAK;GACvC,IAAI,aACF,OAAO,YAAY,OAAO,MAAM,QAAQ;GAG1C,OAAO,GADW,KAAK,MAAM,UAAU,QAAQ,GAAI,IAAI,IACnC;EACtB,CAAC;CACL,CAAC;AACH;AAEA,SAAgB,wBAAwB,SAAgC;CACtE,OAAO;EACL,eAAe;EACf,KAAK,MAAoB;GACvB,kBAAkB,MAAM,OAAO;EACjC;CACF;AACF;AAEA,SAAgB,mBAAmB,QAAgB,SAAqD;CACtG,MAAM,OAAO,QAAQ,MAAM,MAAM;CACjC,kBAAkB,MAAM,OAAO;CAC/B,OAAO,EACL,KAAK,KAAK,SAAS,EACrB;AACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createWebAssetMiddleware } from "./assets.mjs";
|
|
2
|
+
import { ResolveWebModuleId, WebStylePreprocessOptions } from "./types.mjs";
|
|
3
|
+
import { AcceptedPlugin, ProcessOptions } from "postcss";
|
|
4
|
+
import { SourceMap } from "magic-string";
|
|
5
|
+
import { ViteDevServer } from "vite";
|
|
6
|
+
//#region src/plugin/hostTypes.d.ts
|
|
7
|
+
export interface WebPluginContext {
|
|
8
|
+
warn?: (message: string) => void;
|
|
9
|
+
addWatchFile?: (id: string) => void;
|
|
10
|
+
emitFile?: (asset: {
|
|
11
|
+
type: 'asset';
|
|
12
|
+
fileName: string;
|
|
13
|
+
source: Uint8Array;
|
|
14
|
+
}) => void;
|
|
15
|
+
resolve?: (source: string, importer?: string, options?: {
|
|
16
|
+
skipSelf?: boolean;
|
|
17
|
+
}) => Promise<{
|
|
18
|
+
id: string;
|
|
19
|
+
} | null>;
|
|
20
|
+
}
|
|
21
|
+
type WebTransformResult = {
|
|
22
|
+
code: string;
|
|
23
|
+
map: SourceMap | null;
|
|
24
|
+
} | null;
|
|
25
|
+
type WebPostcssConfig = ProcessOptions & {
|
|
26
|
+
plugins?: AcceptedPlugin[];
|
|
27
|
+
};
|
|
28
|
+
export interface WebCssConfig {
|
|
29
|
+
postcss?: string | WebPostcssConfig;
|
|
30
|
+
preprocessorOptions?: WebStylePreprocessOptions;
|
|
31
|
+
}
|
|
32
|
+
export interface WebUserConfig {
|
|
33
|
+
css?: WebCssConfig;
|
|
34
|
+
}
|
|
35
|
+
export interface WebResolvedConfig extends WebUserConfig {
|
|
36
|
+
root: string;
|
|
37
|
+
command: string;
|
|
38
|
+
createResolver?: () => ResolveWebModuleId;
|
|
39
|
+
optimizeDeps?: {
|
|
40
|
+
exclude?: string[];
|
|
41
|
+
include?: string[];
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface WebHmrContext<Module extends object = object> {
|
|
45
|
+
file: string;
|
|
46
|
+
modules?: Module[];
|
|
47
|
+
}
|
|
48
|
+
export interface WebDevServer {
|
|
49
|
+
middlewares: {
|
|
50
|
+
use: (middleware: ReturnType<typeof createWebAssetMiddleware>) => void;
|
|
51
|
+
};
|
|
52
|
+
moduleGraph?: Pick<ViteDevServer['moduleGraph'], 'getModuleById' | 'getModulesByFile' | 'invalidateModule'>;
|
|
53
|
+
}
|
|
54
|
+
export interface WeappWebVitePlugin {
|
|
55
|
+
name: string;
|
|
56
|
+
enforce?: 'pre' | 'post';
|
|
57
|
+
config?: (this: WebPluginContext, config: WebUserConfig) => WebUserConfig | void;
|
|
58
|
+
configResolved?: (this: WebPluginContext, config: WebResolvedConfig) => void | Promise<void>;
|
|
59
|
+
configureServer?: (server: WebDevServer) => void;
|
|
60
|
+
buildStart?: (this: WebPluginContext) => void | Promise<void>;
|
|
61
|
+
resolveId?: (id: string, importer?: string) => string | null | Promise<string | null>;
|
|
62
|
+
load?: (id: string) => string | null | Promise<string | null>;
|
|
63
|
+
watchChange?: {
|
|
64
|
+
order: 'post';
|
|
65
|
+
sequential: true;
|
|
66
|
+
handler: (this: WebPluginContext, id: string, change: {
|
|
67
|
+
event: 'create' | 'update' | 'delete';
|
|
68
|
+
}) => Promise<void>;
|
|
69
|
+
};
|
|
70
|
+
handleHotUpdate?: <Module extends object>(this: WebPluginContext, ctx: WebHmrContext<Module>) => Module[] | void | Promise<Module[] | void>;
|
|
71
|
+
transform?: (this: WebPluginContext, code: string, id: string) => WebTransformResult | Promise<WebTransformResult>;
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
//# sourceMappingURL=hostTypes.d.mts.map
|
package/dist/plugin/index.d.mts
CHANGED
|
@@ -1,78 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { SourceMap } from "magic-string";
|
|
1
|
+
import { WeappWebPluginOptions } from "./types.mjs";
|
|
2
|
+
import { WeappWebVitePlugin } from "./hostTypes.mjs";
|
|
4
3
|
//#region src/plugin/index.d.ts
|
|
5
|
-
interface WebPluginContext {
|
|
6
|
-
warn?: (message: string) => void;
|
|
7
|
-
addWatchFile?: (id: string) => void;
|
|
8
|
-
emitFile?: (asset: {
|
|
9
|
-
type: 'asset';
|
|
10
|
-
fileName: string;
|
|
11
|
-
source: Uint8Array;
|
|
12
|
-
}) => void;
|
|
13
|
-
resolve?: (source: string, importer?: string, options?: {
|
|
14
|
-
skipSelf?: boolean;
|
|
15
|
-
}) => Promise<{
|
|
16
|
-
id: string;
|
|
17
|
-
} | null>;
|
|
18
|
-
}
|
|
19
|
-
type WebTransformResult = {
|
|
20
|
-
code: string;
|
|
21
|
-
map: SourceMap | null;
|
|
22
|
-
} | null;
|
|
23
|
-
interface WebPostcssConfig {
|
|
24
|
-
plugins?: Array<{
|
|
25
|
-
postcssPlugin?: string;
|
|
26
|
-
}>;
|
|
27
|
-
[key: string]: unknown;
|
|
28
|
-
}
|
|
29
|
-
interface WebUserConfig {
|
|
30
|
-
css?: {
|
|
31
|
-
postcss?: string | WebPostcssConfig;
|
|
32
|
-
preprocessorOptions?: WebStylePreprocessOptions;
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
interface WebResolvedConfig extends WebUserConfig {
|
|
36
|
-
root: string;
|
|
37
|
-
command: string;
|
|
38
|
-
createResolver?: () => ResolveWebModuleId;
|
|
39
|
-
optimizeDeps?: {
|
|
40
|
-
exclude?: string[];
|
|
41
|
-
include?: string[];
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
interface WebHmrContext {
|
|
45
|
-
file: string;
|
|
46
|
-
}
|
|
47
|
-
interface WebDevServer {
|
|
48
|
-
middlewares: {
|
|
49
|
-
use: (middleware: ReturnType<typeof createWebAssetMiddleware>) => void;
|
|
50
|
-
};
|
|
51
|
-
moduleGraph?: {
|
|
52
|
-
getModuleById: (id: string) => object | undefined;
|
|
53
|
-
getModulesByFile: (file: string) => Set<object> | undefined;
|
|
54
|
-
invalidateModule: (module: object) => void;
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
interface WeappWebVitePlugin {
|
|
58
|
-
name: string;
|
|
59
|
-
enforce?: 'pre' | 'post';
|
|
60
|
-
config?: (this: WebPluginContext, config: WebUserConfig) => WebUserConfig | void;
|
|
61
|
-
configResolved?: (this: WebPluginContext, config: WebResolvedConfig) => void | Promise<void>;
|
|
62
|
-
configureServer?: (server: WebDevServer) => void;
|
|
63
|
-
buildStart?: (this: WebPluginContext) => void | Promise<void>;
|
|
64
|
-
resolveId?: (id: string, importer?: string) => string | null | Promise<string | null>;
|
|
65
|
-
load?: (id: string) => string | null | Promise<string | null>;
|
|
66
|
-
watchChange?: {
|
|
67
|
-
order: 'post';
|
|
68
|
-
sequential: true;
|
|
69
|
-
handler: (this: WebPluginContext, id: string, change: {
|
|
70
|
-
event: 'create' | 'update' | 'delete';
|
|
71
|
-
}) => Promise<void>;
|
|
72
|
-
};
|
|
73
|
-
handleHotUpdate?: (this: WebPluginContext, ctx: WebHmrContext) => void | Promise<void>;
|
|
74
|
-
transform?: (this: WebPluginContext, code: string, id: string) => WebTransformResult | Promise<WebTransformResult>;
|
|
75
|
-
}
|
|
76
4
|
export declare function weappWebPlugin(options?: WeappWebPluginOptions): WeappWebVitePlugin;
|
|
77
5
|
//#endregion
|
|
78
6
|
export type { WeappWebPluginOptions };
|
package/dist/plugin/index.mjs
CHANGED
|
@@ -11,6 +11,7 @@ import { createMiniProgramPackageResolver, getAncestorNodeModulesPaths } from ".
|
|
|
11
11
|
import { transformScriptModule } from "./register.mjs";
|
|
12
12
|
import { ensureWebVueSfcResult, generateWebVueSfcStyle, generateWebVueSfcTemplate, resolveWebVueSfcStyleLanguage, transformWebVueSfcScript } from "./vueSfc.mjs";
|
|
13
13
|
import { getStableWebComponentId, scanProject } from "./scan.mjs";
|
|
14
|
+
import { collectSfcHmrFiles } from "./sfcHmr.mjs";
|
|
14
15
|
import { createEmptyScanState } from "./state.mjs";
|
|
15
16
|
import { createInlineStyleModule } from "./styleModule.mjs";
|
|
16
17
|
import { readFile } from "node:fs/promises";
|
|
@@ -54,7 +55,7 @@ function createWebCssConfig(config, wxssOptions, warn) {
|
|
|
54
55
|
return;
|
|
55
56
|
}
|
|
56
57
|
const plugins = postcssConfig?.plugins ?? [];
|
|
57
|
-
if (plugins.some((plugin) => plugin.postcssPlugin === "weapp-vite-web-wxss")) return;
|
|
58
|
+
if (plugins.some((plugin) => "postcssPlugin" in plugin && plugin.postcssPlugin === "weapp-vite-web-wxss")) return;
|
|
58
59
|
return {
|
|
59
60
|
postcss: {
|
|
60
61
|
...postcssConfig,
|
|
@@ -165,7 +166,7 @@ function weappWebPlugin(options = {}) {
|
|
|
165
166
|
const clean = cleanUrl(file);
|
|
166
167
|
const normalized = normalizePath(clean);
|
|
167
168
|
if (!isInsideDir(clean, srcRoot) && !state.moduleMeta.has(normalized) && !state.templatePathSet.has(normalized)) return;
|
|
168
|
-
if (clean.endsWith(".json") || isTemplateFile(clean) || isWxsFile(clean) || clean.endsWith(".wxss") || SCRIPT_EXTS.includes(extname(clean))) await scan(context);
|
|
169
|
+
if (state.templatePathSet.has(normalized) || clean.endsWith(".json") || isTemplateFile(clean) || isWxsFile(clean) || clean.endsWith(".wxss") || SCRIPT_EXTS.includes(extname(clean))) await scan(context);
|
|
169
170
|
};
|
|
170
171
|
return {
|
|
171
172
|
name: "@weapp-vite/web",
|
|
@@ -304,6 +305,8 @@ function weappWebPlugin(options = {}) {
|
|
|
304
305
|
uniApp: options.__uniApp,
|
|
305
306
|
stylePreprocessOptions
|
|
306
307
|
});
|
|
308
|
+
this.addWatchFile?.(filename);
|
|
309
|
+
for (const dependency of result.meta?.sfcSrcDeps ?? []) this.addWatchFile?.(dependency);
|
|
307
310
|
return generateWebVueSfcStyle(result);
|
|
308
311
|
}
|
|
309
312
|
return null;
|
|
@@ -316,7 +319,11 @@ function weappWebPlugin(options = {}) {
|
|
|
316
319
|
}
|
|
317
320
|
},
|
|
318
321
|
async handleHotUpdate(ctx) {
|
|
322
|
+
const graph = devServer?.moduleGraph;
|
|
323
|
+
const affected = new Set(ctx.modules);
|
|
324
|
+
if (graph) for (const file of collectSfcHmrFiles(state, cleanUrl(ctx.file))) for (const module of graph.getModulesByFile(file) ?? []) affected.add(module);
|
|
319
325
|
await scanChangedFile(this, ctx.file);
|
|
326
|
+
return ctx.modules || affected.size ? [...affected] : void 0;
|
|
320
327
|
},
|
|
321
328
|
async transform(code, id) {
|
|
322
329
|
const clean = cleanUrl(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type { SourceMap } from 'magic-string'\nimport type { ResolveWebAutoImportTag, ResolveWebModuleId, WeappWebPluginOptions, WebResolvedComponent, WebStylePreprocessOptions } from './types'\nimport { readFile } from 'node:fs/promises'\nimport process from 'node:process'\n\nimport { dirname, extname, resolve } from 'pathe'\nimport { isUniAppCompatibilityFile, transformUniAppSource } from 'wevu/compiler'\nimport { compileWxml } from '../compiler/wxml'\nimport { transformWxsToEsm } from '../compiler/wxs'\nimport { createWxssPostcssPlugin, transformWxssToCss } from '../css/wxss'\nimport { createWebAssetMiddleware, emitWebAssets } from './assets'\nimport { AUTO_ROUTES_ID, ENTRY_ID, RESOLVED_AUTO_ROUTES_ID, RUNTIME_ID, SCRIPT_EXTS, SFC_STYLE_QUERY, SFC_TEMPLATE_QUERY, STYLE_EXTS, STYLE_QUERY, TEMPLATE_EXTS, TEMPLATE_QUERY, TRANSFORM_STYLE_EXTS, WEB_COMPONENT_PREFIX, WEB_COMPONENT_QUERY, WXS_EXTS } from './constants'\nimport { collectExternalComponentOptimizeDeps } from './dependencyScan'\nimport { generateAutoRoutesModule, generateEntryModule } from './entry'\nimport { wrapPageTemplate } from './layout'\nimport { createMiniProgramPackageResolver, getAncestorNodeModulesPaths } from './packageResolution'\nimport { cleanUrl, isHtmlEntry, isInsideDir, normalizePath, resolveFileWithExtensionsSync, resolveRuntimePolyfillPath, resolveTemplatePathSync, resolveWxsPathSync, toRelativeImport, toViteFsImport } from './path'\nimport { transformScriptModule } from './register'\nimport { getStableWebComponentId, scanProject } from './scan'\nimport { createEmptyScanState } from './state'\nimport { createInlineStyleModule } from './styleModule'\nimport { ensureWebVueSfcResult, generateWebVueSfcStyle, generateWebVueSfcTemplate, resolveWebVueSfcStyleLanguage, transformWebVueSfcScript } from './vueSfc'\n\ninterface WebPluginContext {\n warn?: (message: string) => void\n addWatchFile?: (id: string) => void\n emitFile?: (asset: { type: 'asset', fileName: string, source: Uint8Array }) => void\n resolve?: (source: string, importer?: string, options?: { skipSelf?: boolean }) => Promise<{ id: string } | null>\n}\n\ntype WebTransformResult = { code: string, map: SourceMap | null } | null\n\ninterface WebPostcssConfig {\n plugins?: Array<{ postcssPlugin?: string }>\n [key: string]: unknown\n}\n\ninterface WebCssConfig {\n postcss?: string | WebPostcssConfig\n preprocessorOptions?: WebStylePreprocessOptions\n}\n\ninterface WebUserConfig {\n css?: {\n postcss?: string | WebPostcssConfig\n preprocessorOptions?: WebStylePreprocessOptions\n }\n}\n\ninterface WebResolvedConfig extends WebUserConfig {\n root: string\n command: string\n createResolver?: () => ResolveWebModuleId\n optimizeDeps?: {\n exclude?: string[]\n include?: string[]\n }\n}\n\ninterface WebHmrContext {\n file: string\n}\n\ninterface WebDevServer {\n middlewares: {\n use: (middleware: ReturnType<typeof createWebAssetMiddleware>) => void\n }\n moduleGraph?: {\n getModuleById: (id: string) => object | undefined\n getModulesByFile: (file: string) => Set<object> | undefined\n invalidateModule: (module: object) => void\n }\n}\n\ninterface WeappWebVitePlugin {\n name: string\n enforce?: 'pre' | 'post'\n config?: (this: WebPluginContext, config: WebUserConfig) => WebUserConfig | void\n configResolved?: (this: WebPluginContext, config: WebResolvedConfig) => void | Promise<void>\n configureServer?: (server: WebDevServer) => void\n buildStart?: (this: WebPluginContext) => void | Promise<void>\n resolveId?: (id: string, importer?: string) => string | null | Promise<string | null>\n load?: (id: string) => string | null | Promise<string | null>\n watchChange?: {\n order: 'post'\n sequential: true\n handler: (this: WebPluginContext, id: string, change: { event: 'create' | 'update' | 'delete' }) => Promise<void>\n }\n handleHotUpdate?: (this: WebPluginContext, ctx: WebHmrContext) => void | Promise<void>\n transform?: (\n this: WebPluginContext,\n code: string,\n id: string,\n ) => WebTransformResult | Promise<WebTransformResult>\n}\n\nconst WEB_RUNTIME_MODULE_IDS = [\n 'lit',\n 'lit/async-directive.js',\n 'lit/directives/repeat.js',\n] as const\n\nconst SCAN_VIRTUAL_MODULE_IDS = [ENTRY_ID, RESOLVED_AUTO_ROUTES_ID] as const\n\nfunction isTemplateFile(id: string) {\n const lower = id.toLowerCase()\n return TEMPLATE_EXTS.some(ext => lower.endsWith(ext))\n}\n\nfunction isWxsFile(id: string) {\n const lower = id.toLowerCase()\n return WXS_EXTS.some(ext => lower.endsWith(ext))\n}\n\nfunction hasWxsQuery(id: string) {\n return id.includes('?wxs') || id.includes('&wxs')\n}\n\nfunction hasQuery(id: string, query: string) {\n return id.includes(`?${query}`) || id.includes(`&${query}`)\n}\n\nfunction isUniAppDependency(id: string, includes: readonly string[]) {\n return includes.some(packageName => id === packageName || id.startsWith(`${packageName}/`))\n}\n\nfunction resolveSfcStyleSourceFilename(id: string) {\n const filename = cleanUrl(id)\n const vueSuffixIndex = filename.lastIndexOf('.vue.')\n return vueSuffixIndex >= 0\n ? filename.slice(0, vueSuffixIndex + '.vue'.length)\n : filename\n}\n\nfunction createWebCssConfig(\n config: WebUserConfig,\n wxssOptions: WeappWebPluginOptions['wxss'],\n warn?: (message: string) => void,\n): WebCssConfig | undefined {\n const postcssConfig = config.css?.postcss\n if (typeof postcssConfig === 'string') {\n warn?.('[@weapp-vite/web] css.postcss 使用配置文件路径时无法注入 WXSS 转换插件。')\n return undefined\n }\n\n const plugins = postcssConfig?.plugins ?? []\n if (plugins.some(plugin => plugin.postcssPlugin === 'weapp-vite-web-wxss')) {\n return undefined\n }\n\n return {\n postcss: {\n ...postcssConfig,\n plugins: [...plugins, createWxssPostcssPlugin(wxssOptions)],\n },\n preprocessorOptions: config.css?.preprocessorOptions,\n }\n}\n\nfunction resolveStylePreprocessOptions(\n options: WebStylePreprocessOptions | undefined,\n root: string,\n): WebStylePreprocessOptions | undefined {\n if (!options) {\n return undefined\n }\n\n const nodeModules = getAncestorNodeModulesPaths(root)\n return Object.fromEntries(Object.entries(options).map(([language, languageOptions]) => {\n if (!['sass', 'scss'].includes(language)) {\n return [language, languageOptions]\n }\n\n const loadPaths = Array.isArray(languageOptions.loadPaths)\n ? languageOptions.loadPaths.filter((value): value is string => typeof value === 'string')\n : []\n return [language, {\n ...languageOptions,\n loadPaths: Array.from(new Set([...loadPaths, ...nodeModules])),\n }]\n }))\n}\n\nexport function weappWebPlugin(options: WeappWebPluginOptions = {}): WeappWebVitePlugin {\n let root = process.cwd()\n let srcRoot = resolve(root, options.srcDir ?? 'src')\n let enableHmr = false\n let devServer: WebDevServer | undefined\n let resolveWebModuleId: ResolveWebModuleId | undefined\n let resolveMiniProgramModuleId: ResolveWebModuleId | undefined\n let resolveWebAutoImportTag: ResolveWebAutoImportTag | undefined\n const webRuntimeModules = new Map<string, string>()\n let stylePreprocessOptions: WebStylePreprocessOptions | undefined\n let componentImportIdMap = new Map<string, string>()\n\n let state = createEmptyScanState()\n let scanQueue: Promise<void> = Promise.resolve()\n const wxssOptions = options.wxss\n const runtimeProvider = options.__runtimeProvider\n const hmrAcceptCode = runtimeProvider\n ? runtimeProvider.hmrAcceptCode\n : 'if (import.meta.hot) { import.meta.hot.accept() }'\n\n const resolveTemplatePath = (raw: string, importer: string) => resolveTemplatePathSync(raw, importer, srcRoot)\n const resolveWxsPath = (raw: string, importer: string) => resolveWxsPathSync(raw, importer, srcRoot)\n const resolveMetaByTemplate = (filename: string) => {\n const normalized = normalizePath(filename)\n for (const meta of state.moduleMeta.values()) {\n if (meta.templatePath && normalizePath(meta.templatePath) === normalized) {\n return meta\n }\n }\n return undefined\n }\n\n const createAutoImportTagResolver = (): ResolveWebAutoImportTag | undefined => {\n const resolvers = options.__autoImportResolvers\n if (!resolvers?.length) {\n return undefined\n }\n return async (tag, importer) => {\n for (const resolver of resolvers) {\n let matched: WebResolvedComponent | void\n if (typeof resolver === 'function') {\n matched = resolver(tag, importer)\n }\n else if (typeof resolver.resolve === 'function') {\n matched = resolver.resolve(tag, importer)\n }\n else {\n const from = resolver.components?.[tag]\n matched = from ? { name: tag, from } : undefined\n }\n if (!matched) {\n continue\n }\n const request = matched.resolvedId ?? matched.from\n const resolvedId = await resolveWebModuleId?.(request, importer)\n return {\n ...matched,\n resolvedId: resolvedId ?? matched.resolvedId,\n sourceType: matched.sourceType ?? (resolvedId?.endsWith('.vue') ? 'wevu-sfc' : 'native'),\n }\n }\n return undefined\n }\n }\n\n const scan = (context: WebPluginContext) => {\n const result = scanQueue.then(async () => {\n const nextState = createEmptyScanState()\n await scanProject({\n srcRoot,\n warn: context.warn?.bind(context),\n state: nextState,\n resolveId: resolveWebModuleId,\n resolveAutoImportTag: resolveWebAutoImportTag,\n resolveAppConfig: options.__resolveAppConfig,\n uniApp: options.__uniApp,\n stylePreprocessOptions,\n })\n const nextComponentImportIdMap = new Map<string, string>()\n for (const component of nextState.scanResult.components) {\n if (component.importId) {\n nextComponentImportIdMap.set(component.importId, component.script)\n }\n }\n const graph = devServer?.moduleGraph\n const files = graph ? new Set<string>() : undefined\n if (files) {\n for (const snapshot of [state, nextState]) {\n for (const file of snapshot.moduleMeta.keys()) {\n files.add(file)\n }\n for (const file of snapshot.templatePathSet) {\n files.add(file)\n }\n for (const [file, result] of snapshot.sfcResults) {\n files.add(`${file}.${resolveWebVueSfcStyleLanguage(result, file)}`)\n }\n }\n }\n // 虚拟模块始终读取最后一次完整快照,不暴露扫描过程中的空映射。\n state = nextState\n componentImportIdMap = nextComponentImportIdMap\n if (graph && files) {\n for (const id of SCAN_VIRTUAL_MODULE_IDS) {\n const module = graph.getModuleById(id)\n if (module) {\n graph.invalidateModule(module)\n }\n }\n // 入口失效不会向下传播;脚本、模板和合成样式同样属于扫描快照。\n for (const file of files) {\n const modules = graph.getModulesByFile(file)\n if (modules) {\n for (const module of modules) {\n graph.invalidateModule(module)\n }\n }\n }\n }\n })\n // 调用方仍接收原始错误;队尾只负责允许下一次文件变更恢复扫描。\n scanQueue = result.catch(() => {})\n return result\n }\n\n const scanChangedFile = async (context: WebPluginContext, file: string) => {\n const clean = cleanUrl(file)\n const normalized = normalizePath(clean)\n if (!isInsideDir(clean, srcRoot) && !state.moduleMeta.has(normalized) && !state.templatePathSet.has(normalized)) {\n return\n }\n if (clean.endsWith('.json') || isTemplateFile(clean) || isWxsFile(clean) || clean.endsWith('.wxss') || SCRIPT_EXTS.includes(extname(clean))) {\n await scan(context)\n }\n }\n\n return {\n name: '@weapp-vite/web',\n enforce: 'pre',\n config(this: WebPluginContext, config: WebUserConfig) {\n const css = createWebCssConfig(config, wxssOptions, this.warn?.bind(this))\n return css ? { css } : undefined\n },\n async configResolved(this: WebPluginContext, config: WebResolvedConfig) {\n root = config.root\n const { createRequire } = await import('node:module')\n const requireFromWebRuntime = createRequire(import.meta.url)\n const requireFromProject = createRequire(resolve(root, 'package.json'))\n for (const id of WEB_RUNTIME_MODULE_IDS) {\n webRuntimeModules.set(id, requireFromWebRuntime.resolve(id))\n }\n webRuntimeModules.set(RUNTIME_ID, resolveRuntimePolyfillPath())\n resolveMiniProgramModuleId = createMiniProgramPackageResolver(requireFromProject.resolve)\n srcRoot = resolve(root, options.srcDir ?? 'src')\n stylePreprocessOptions = resolveStylePreprocessOptions(config.css?.preprocessorOptions, root)\n enableHmr = config.command === 'serve'\n const resolveViteModuleId = config.createResolver?.()\n resolveWebModuleId = resolveViteModuleId\n ? async (source, importer) => {\n const resolved = await resolveViteModuleId(source, importer)\n return await resolveMiniProgramModuleId?.(resolved ?? source, importer)\n ?? await resolveMiniProgramModuleId?.(source, importer)\n ?? resolved\n }\n : undefined\n resolveWebAutoImportTag = createAutoImportTagResolver()\n await scan(this)\n const componentDependencies = await collectExternalComponentOptimizeDeps(state.scanResult.components)\n const uniAppIncludes = options.__uniApp?.include ?? []\n config.optimizeDeps ??= {}\n config.optimizeDeps.exclude = Array.from(new Set([\n ...(config.optimizeDeps.exclude ?? []),\n ...uniAppIncludes,\n ]))\n config.optimizeDeps.include = Array.from(new Set([\n ...(config.optimizeDeps.include ?? []),\n ...componentDependencies,\n ])).filter(dependency => !isUniAppDependency(dependency, uniAppIncludes))\n },\n configureServer(server: WebDevServer) {\n devServer = server\n server.middlewares.use(createWebAssetMiddleware(srcRoot))\n },\n async buildStart(this: WebPluginContext) {\n if (!resolveWebModuleId && this.resolve) {\n resolveWebModuleId = async (source, importer) => {\n const resolved = await this.resolve?.(source, importer, { skipSelf: true })\n return await resolveMiniProgramModuleId?.(resolved?.id ?? source, importer)\n ?? await resolveMiniProgramModuleId?.(source, importer)\n ?? resolved?.id\n }\n }\n resolveWebAutoImportTag = createAutoImportTagResolver()\n await scan(this)\n if (!enableHmr) {\n await emitWebAssets(this, srcRoot)\n }\n },\n resolveId(id: string, importer?: string) {\n const runtimeModule = webRuntimeModules.get(id)\n if (runtimeModule) {\n return runtimeModule\n }\n if (id === '/@weapp-vite/web/entry' || id === '@weapp-vite/web/entry') {\n return ENTRY_ID\n }\n if (id === AUTO_ROUTES_ID) {\n return RESOLVED_AUTO_ROUTES_ID\n }\n if (id.startsWith(WEB_COMPONENT_PREFIX)) {\n const request = decodeURIComponent(id.slice(WEB_COMPONENT_PREFIX.length))\n const resolvedId = componentImportIdMap.get(request)\n return resolvedId ? `${cleanUrl(resolvedId)}?${WEB_COMPONENT_QUERY}` : null\n }\n if (id.startsWith('.') && importer && cleanUrl(importer).endsWith('.vue') && !extname(id)) {\n const resolvedScript = resolveFileWithExtensionsSync(resolve(dirname(cleanUrl(importer)), id), SCRIPT_EXTS)\n if (resolvedScript?.endsWith('.vue')) {\n return resolvedScript\n }\n }\n if (hasQuery(id, SFC_STYLE_QUERY)) {\n const queryIndex = id.indexOf('?')\n const pathname = queryIndex >= 0 ? id.slice(0, queryIndex) : id\n const query = queryIndex >= 0 ? id.slice(queryIndex) : ''\n if (pathname.startsWith('.') && importer) {\n return `${resolve(dirname(cleanUrl(importer)), pathname)}${query}`\n }\n return id\n }\n return resolveMiniProgramModuleId?.(id, importer).then(resolved => resolved ?? null) ?? null\n },\n async load(this: WebPluginContext, id: string) {\n if (id === ENTRY_ID) {\n return generateEntryModule(state.scanResult, root, wxssOptions, options)\n }\n if (id === RESOLVED_AUTO_ROUTES_ID) {\n return generateAutoRoutesModule(state.scanResult)\n }\n if (hasQuery(id, TEMPLATE_QUERY)) {\n const filename = cleanUrl(id)\n let source = await readFile(filename, 'utf8')\n const pageMeta = resolveMetaByTemplate(filename)\n if (pageMeta?.kind === 'page' && state.scanResult.layouts.length) {\n source = wrapPageTemplate(source, state.scanResult.layouts)\n }\n const navigationConfig = state.pageNavigationMap.get(normalizePath(filename))\n const componentTags = state.templateComponentMap.get(normalizePath(filename))\n const compiled = compileWxml({\n id: filename,\n source,\n resolveTemplatePath,\n resolveWxsPath,\n navigationBar: navigationConfig ? { config: navigationConfig } : undefined,\n componentTags,\n })\n for (const dependency of compiled.dependencies) {\n this.addWatchFile?.(dependency)\n }\n for (const warning of compiled.warnings ?? []) {\n this.warn?.(warning)\n }\n return compiled.code\n }\n if (hasWxsQuery(id)) {\n const filename = cleanUrl(id)\n const source = await readFile(filename, 'utf8')\n const compiled = transformWxsToEsm(source, filename, {\n resolvePath: resolveWxsPath,\n toImportPath: (resolved, importer) => normalizePath(toRelativeImport(importer, resolved)),\n })\n for (const dependency of compiled.dependencies) {\n this.addWatchFile?.(dependency)\n }\n for (const warning of compiled.warnings ?? []) {\n this.warn?.(warning)\n }\n return compiled.code\n }\n if (hasQuery(id, STYLE_QUERY)) {\n const source = await readFile(cleanUrl(id), 'utf8')\n const { css } = transformWxssToCss(source, wxssOptions)\n return createInlineStyleModule(css)\n }\n if (id.includes(`?${SFC_TEMPLATE_QUERY}`) || id.includes(`&${SFC_TEMPLATE_QUERY}`)) {\n const filename = cleanUrl(id)\n const meta = state.moduleMeta.get(normalizePath(filename))\n if (!meta) {\n return null\n }\n const result = await ensureWebVueSfcResult({\n filename,\n meta,\n srcRoot,\n state,\n resolveId: resolveWebModuleId,\n resolveAutoImportTag: resolveWebAutoImportTag,\n uniApp: options.__uniApp,\n stylePreprocessOptions,\n })\n const compiled = generateWebVueSfcTemplate(result, meta, filename, srcRoot)\n for (const dependency of compiled.dependencies) {\n this.addWatchFile?.(dependency)\n }\n for (const warning of compiled.warnings ?? []) {\n this.warn?.(warning)\n }\n return compiled.code\n }\n if (id.includes(`?${SFC_STYLE_QUERY}`) || id.includes(`&${SFC_STYLE_QUERY}`)) {\n const filename = resolveSfcStyleSourceFilename(id)\n const meta = state.moduleMeta.get(normalizePath(filename))\n if (!meta) {\n return null\n }\n const result = await ensureWebVueSfcResult({\n filename,\n meta,\n srcRoot,\n state,\n resolveId: resolveWebModuleId,\n resolveAutoImportTag: resolveWebAutoImportTag,\n uniApp: options.__uniApp,\n stylePreprocessOptions,\n })\n return generateWebVueSfcStyle(result)\n }\n return null\n },\n watchChange: {\n order: 'post',\n sequential: true,\n async handler(this: WebPluginContext, id, change) {\n // Vite 的 handleHotUpdate 不处理增删;必须在结构性 HMR 前发布完整入口。\n if (enableHmr && change.event !== 'update') {\n await scanChangedFile(this, id)\n }\n },\n },\n async handleHotUpdate(this: WebPluginContext, ctx: WebHmrContext) {\n await scanChangedFile(this, ctx.file)\n },\n async transform(this: WebPluginContext, code: string, id: string) {\n const clean = cleanUrl(id)\n let uniAppTransformed = false\n\n if (\n options.__uniApp\n && isUniAppCompatibilityFile(clean, srcRoot, options.__uniApp.include)\n && !clean.endsWith('.vue')\n ) {\n const transformed = transformUniAppSource(code, { filename: clean, target: 'h5' })\n if (transformed.changed) {\n code = transformed.code\n uniAppTransformed = true\n }\n }\n\n if (\n hasQuery(id, TEMPLATE_QUERY)\n || hasWxsQuery(id)\n || hasQuery(id, STYLE_QUERY)\n || hasQuery(id, SFC_TEMPLATE_QUERY)\n || hasQuery(id, SFC_STYLE_QUERY)\n ) {\n return null\n }\n\n if (clean.endsWith('.vue')) {\n const normalized = normalizePath(clean)\n const meta = state.moduleMeta.get(normalized) ?? {\n kind: 'component' as const,\n id: getStableWebComponentId(clean, srcRoot),\n scriptPath: clean,\n sourceType: 'vue-sfc' as const,\n }\n state.moduleMeta.set(normalized, meta)\n const result = await ensureWebVueSfcResult({\n filename: clean,\n meta,\n srcRoot,\n state,\n source: code,\n resolveId: resolveWebModuleId,\n resolveAutoImportTag: resolveWebAutoImportTag,\n uniApp: options.__uniApp,\n stylePreprocessOptions,\n })\n return transformWebVueSfcScript({\n code: result.script!,\n filename: clean,\n meta,\n runtimeModuleId: runtimeProvider?.moduleId ?? toViteFsImport(resolveRuntimePolyfillPath()),\n styleLanguage: resolveWebVueSfcStyleLanguage(result, clean),\n enableHmr,\n hmrAcceptCode,\n })\n }\n\n if (isTemplateFile(clean)) {\n if (isHtmlEntry(clean, root)) {\n return null\n }\n const normalizedId = normalizePath(clean)\n if (state.templatePathSet.size > 0) {\n if (!isInsideDir(clean, srcRoot)) {\n return null\n }\n if (!state.templatePathSet.has(normalizedId)) {\n return null\n }\n }\n let templateSource = code\n const pageMeta = resolveMetaByTemplate(clean)\n if (pageMeta?.kind === 'page' && state.scanResult.layouts.length) {\n templateSource = wrapPageTemplate(code, state.scanResult.layouts)\n }\n const navigationConfig = state.pageNavigationMap.get(normalizedId)\n const componentTags = state.templateComponentMap.get(normalizedId)\n const { code: compiled, dependencies, warnings } = compileWxml({\n id: clean,\n source: templateSource,\n resolveTemplatePath,\n resolveWxsPath,\n navigationBar: navigationConfig ? { config: navigationConfig } : undefined,\n componentTags,\n })\n const addWatchFile = this.addWatchFile\n if (dependencies.length > 0 && addWatchFile) {\n for (const dep of dependencies) {\n addWatchFile.call(this, dep)\n }\n }\n const warn = this.warn\n if (warnings?.length && warn) {\n for (const warning of warnings) {\n warn.call(this, warning)\n }\n }\n return { code: compiled, map: null }\n }\n\n if (isWxsFile(clean) || hasWxsQuery(id)) {\n const { code: compiled, dependencies, warnings } = transformWxsToEsm(code, clean, {\n resolvePath: resolveWxsPath,\n toImportPath: (resolved, importer) => normalizePath(toRelativeImport(importer, resolved)),\n })\n const addWatchFile = this.addWatchFile\n if (dependencies.length > 0 && addWatchFile) {\n for (const dep of dependencies) {\n addWatchFile.call(this, dep)\n }\n }\n const warn = this.warn\n if (warnings?.length && warn) {\n for (const warning of warnings) {\n warn.call(this, warning)\n }\n }\n return { code: compiled, map: null }\n }\n\n if (TRANSFORM_STYLE_EXTS.some(ext => clean.endsWith(ext))) {\n const { css } = transformWxssToCss(code, wxssOptions)\n return {\n code: createInlineStyleModule(css),\n map: null,\n }\n }\n\n if (STYLE_EXTS.some(ext => clean.endsWith(ext)) && !clean.endsWith('.wxss')) {\n const { css } = transformWxssToCss(code, wxssOptions)\n return { code: css, map: null }\n }\n\n if (!SCRIPT_EXTS.some(ext => clean.endsWith(ext))) {\n return uniAppTransformed ? { code, map: null } : null\n }\n if (clean.includes('node_modules') && !hasQuery(id, WEB_COMPONENT_QUERY)) {\n return options.__uniApp && isUniAppCompatibilityFile(clean, srcRoot, options.__uniApp.include)\n ? { code, map: null }\n : null\n }\n\n const meta = state.moduleMeta.get(normalizePath(clean))\n if (!meta) {\n return null\n }\n\n return transformScriptModule({\n code,\n cleanId: clean,\n meta,\n enableHmr,\n runtimeModuleId: runtimeProvider?.moduleId,\n hmrAcceptCode,\n })\n },\n }\n}\n\nexport type { WeappWebPluginOptions } from './types'\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type { WeappWebVitePlugin, WebCssConfig, WebDevServer, WebHmrContext, WebPluginContext, WebResolvedConfig, WebUserConfig } from './hostTypes'\nimport type { ResolveWebAutoImportTag, ResolveWebModuleId, WeappWebPluginOptions, WebResolvedComponent, WebStylePreprocessOptions } from './types'\nimport { readFile } from 'node:fs/promises'\nimport process from 'node:process'\n\nimport { dirname, extname, resolve } from 'pathe'\nimport { isUniAppCompatibilityFile, transformUniAppSource } from 'wevu/compiler'\nimport { compileWxml } from '../compiler/wxml'\nimport { transformWxsToEsm } from '../compiler/wxs'\nimport { createWxssPostcssPlugin, transformWxssToCss } from '../css/wxss'\nimport { createWebAssetMiddleware, emitWebAssets } from './assets'\nimport { AUTO_ROUTES_ID, ENTRY_ID, RESOLVED_AUTO_ROUTES_ID, RUNTIME_ID, SCRIPT_EXTS, SFC_STYLE_QUERY, SFC_TEMPLATE_QUERY, STYLE_EXTS, STYLE_QUERY, TEMPLATE_EXTS, TEMPLATE_QUERY, TRANSFORM_STYLE_EXTS, WEB_COMPONENT_PREFIX, WEB_COMPONENT_QUERY, WXS_EXTS } from './constants'\nimport { collectExternalComponentOptimizeDeps } from './dependencyScan'\nimport { generateAutoRoutesModule, generateEntryModule } from './entry'\nimport { wrapPageTemplate } from './layout'\nimport { createMiniProgramPackageResolver, getAncestorNodeModulesPaths } from './packageResolution'\nimport { cleanUrl, isHtmlEntry, isInsideDir, normalizePath, resolveFileWithExtensionsSync, resolveRuntimePolyfillPath, resolveTemplatePathSync, resolveWxsPathSync, toRelativeImport, toViteFsImport } from './path'\nimport { transformScriptModule } from './register'\nimport { getStableWebComponentId, scanProject } from './scan'\nimport { collectSfcHmrFiles } from './sfcHmr'\nimport { createEmptyScanState } from './state'\nimport { createInlineStyleModule } from './styleModule'\nimport { ensureWebVueSfcResult, generateWebVueSfcStyle, generateWebVueSfcTemplate, resolveWebVueSfcStyleLanguage, transformWebVueSfcScript } from './vueSfc'\n\nconst WEB_RUNTIME_MODULE_IDS = [\n 'lit',\n 'lit/async-directive.js',\n 'lit/directives/repeat.js',\n] as const\n\nconst SCAN_VIRTUAL_MODULE_IDS = [ENTRY_ID, RESOLVED_AUTO_ROUTES_ID] as const\n\nfunction isTemplateFile(id: string) {\n const lower = id.toLowerCase()\n return TEMPLATE_EXTS.some(ext => lower.endsWith(ext))\n}\n\nfunction isWxsFile(id: string) {\n const lower = id.toLowerCase()\n return WXS_EXTS.some(ext => lower.endsWith(ext))\n}\n\nfunction hasWxsQuery(id: string) {\n return id.includes('?wxs') || id.includes('&wxs')\n}\n\nfunction hasQuery(id: string, query: string) {\n return id.includes(`?${query}`) || id.includes(`&${query}`)\n}\n\nfunction isUniAppDependency(id: string, includes: readonly string[]) {\n return includes.some(packageName => id === packageName || id.startsWith(`${packageName}/`))\n}\n\nfunction resolveSfcStyleSourceFilename(id: string) {\n const filename = cleanUrl(id)\n const vueSuffixIndex = filename.lastIndexOf('.vue.')\n return vueSuffixIndex >= 0\n ? filename.slice(0, vueSuffixIndex + '.vue'.length)\n : filename\n}\n\nfunction createWebCssConfig(\n config: WebUserConfig,\n wxssOptions: WeappWebPluginOptions['wxss'],\n warn?: (message: string) => void,\n): WebCssConfig | undefined {\n const postcssConfig = config.css?.postcss\n if (typeof postcssConfig === 'string') {\n warn?.('[@weapp-vite/web] css.postcss 使用配置文件路径时无法注入 WXSS 转换插件。')\n return undefined\n }\n\n const plugins = postcssConfig?.plugins ?? []\n if (plugins.some(plugin => 'postcssPlugin' in plugin && plugin.postcssPlugin === 'weapp-vite-web-wxss')) {\n return undefined\n }\n\n return {\n postcss: {\n ...postcssConfig,\n plugins: [...plugins, createWxssPostcssPlugin(wxssOptions)],\n },\n preprocessorOptions: config.css?.preprocessorOptions,\n }\n}\n\nfunction resolveStylePreprocessOptions(\n options: WebStylePreprocessOptions | undefined,\n root: string,\n): WebStylePreprocessOptions | undefined {\n if (!options) {\n return undefined\n }\n\n const nodeModules = getAncestorNodeModulesPaths(root)\n return Object.fromEntries(Object.entries(options).map(([language, languageOptions]) => {\n if (!['sass', 'scss'].includes(language)) {\n return [language, languageOptions]\n }\n\n const loadPaths = Array.isArray(languageOptions.loadPaths)\n ? languageOptions.loadPaths.filter((value): value is string => typeof value === 'string')\n : []\n return [language, {\n ...languageOptions,\n loadPaths: Array.from(new Set([...loadPaths, ...nodeModules])),\n }]\n }))\n}\n\nexport function weappWebPlugin(options: WeappWebPluginOptions = {}): WeappWebVitePlugin {\n let root = process.cwd()\n let srcRoot = resolve(root, options.srcDir ?? 'src')\n let enableHmr = false\n let devServer: WebDevServer | undefined\n let resolveWebModuleId: ResolveWebModuleId | undefined\n let resolveMiniProgramModuleId: ResolveWebModuleId | undefined\n let resolveWebAutoImportTag: ResolveWebAutoImportTag | undefined\n const webRuntimeModules = new Map<string, string>()\n let stylePreprocessOptions: WebStylePreprocessOptions | undefined\n let componentImportIdMap = new Map<string, string>()\n\n let state = createEmptyScanState()\n let scanQueue: Promise<void> = Promise.resolve()\n const wxssOptions = options.wxss\n const runtimeProvider = options.__runtimeProvider\n const hmrAcceptCode = runtimeProvider\n ? runtimeProvider.hmrAcceptCode\n : 'if (import.meta.hot) { import.meta.hot.accept() }'\n\n const resolveTemplatePath = (raw: string, importer: string) => resolveTemplatePathSync(raw, importer, srcRoot)\n const resolveWxsPath = (raw: string, importer: string) => resolveWxsPathSync(raw, importer, srcRoot)\n const resolveMetaByTemplate = (filename: string) => {\n const normalized = normalizePath(filename)\n for (const meta of state.moduleMeta.values()) {\n if (meta.templatePath && normalizePath(meta.templatePath) === normalized) {\n return meta\n }\n }\n return undefined\n }\n\n const createAutoImportTagResolver = (): ResolveWebAutoImportTag | undefined => {\n const resolvers = options.__autoImportResolvers\n if (!resolvers?.length) {\n return undefined\n }\n return async (tag, importer) => {\n for (const resolver of resolvers) {\n let matched: WebResolvedComponent | void\n if (typeof resolver === 'function') {\n matched = resolver(tag, importer)\n }\n else if (typeof resolver.resolve === 'function') {\n matched = resolver.resolve(tag, importer)\n }\n else {\n const from = resolver.components?.[tag]\n matched = from ? { name: tag, from } : undefined\n }\n if (!matched) {\n continue\n }\n const request = matched.resolvedId ?? matched.from\n const resolvedId = await resolveWebModuleId?.(request, importer)\n return {\n ...matched,\n resolvedId: resolvedId ?? matched.resolvedId,\n sourceType: matched.sourceType ?? (resolvedId?.endsWith('.vue') ? 'wevu-sfc' : 'native'),\n }\n }\n return undefined\n }\n }\n\n const scan = (context: WebPluginContext) => {\n const result = scanQueue.then(async () => {\n const nextState = createEmptyScanState()\n await scanProject({\n srcRoot,\n warn: context.warn?.bind(context),\n state: nextState,\n resolveId: resolveWebModuleId,\n resolveAutoImportTag: resolveWebAutoImportTag,\n resolveAppConfig: options.__resolveAppConfig,\n uniApp: options.__uniApp,\n stylePreprocessOptions,\n })\n const nextComponentImportIdMap = new Map<string, string>()\n for (const component of nextState.scanResult.components) {\n if (component.importId) {\n nextComponentImportIdMap.set(component.importId, component.script)\n }\n }\n const graph = devServer?.moduleGraph\n const files = graph ? new Set<string>() : undefined\n if (files) {\n for (const snapshot of [state, nextState]) {\n for (const file of snapshot.moduleMeta.keys()) {\n files.add(file)\n }\n for (const file of snapshot.templatePathSet) {\n files.add(file)\n }\n for (const [file, result] of snapshot.sfcResults) {\n files.add(`${file}.${resolveWebVueSfcStyleLanguage(result, file)}`)\n }\n }\n }\n // 虚拟模块始终读取最后一次完整快照,不暴露扫描过程中的空映射。\n state = nextState\n componentImportIdMap = nextComponentImportIdMap\n if (graph && files) {\n for (const id of SCAN_VIRTUAL_MODULE_IDS) {\n const module = graph.getModuleById(id)\n if (module) {\n graph.invalidateModule(module)\n }\n }\n // 入口失效不会向下传播;脚本、模板和合成样式同样属于扫描快照。\n for (const file of files) {\n const modules = graph.getModulesByFile(file)\n if (modules) {\n for (const module of modules) {\n graph.invalidateModule(module)\n }\n }\n }\n }\n })\n // 调用方仍接收原始错误;队尾只负责允许下一次文件变更恢复扫描。\n scanQueue = result.catch(() => {})\n return result\n }\n\n const scanChangedFile = async (context: WebPluginContext, file: string) => {\n const clean = cleanUrl(file)\n const normalized = normalizePath(clean)\n if (!isInsideDir(clean, srcRoot) && !state.moduleMeta.has(normalized) && !state.templatePathSet.has(normalized)) {\n return\n }\n if (state.templatePathSet.has(normalized) || clean.endsWith('.json') || isTemplateFile(clean) || isWxsFile(clean) || clean.endsWith('.wxss') || SCRIPT_EXTS.includes(extname(clean))) {\n await scan(context)\n }\n }\n\n return {\n name: '@weapp-vite/web',\n enforce: 'pre',\n config(this: WebPluginContext, config: WebUserConfig) {\n const css = createWebCssConfig(config, wxssOptions, this.warn?.bind(this))\n return css ? { css } : undefined\n },\n async configResolved(this: WebPluginContext, config: WebResolvedConfig) {\n root = config.root\n const { createRequire } = await import('node:module')\n const requireFromWebRuntime = createRequire(import.meta.url)\n const requireFromProject = createRequire(resolve(root, 'package.json'))\n for (const id of WEB_RUNTIME_MODULE_IDS) {\n webRuntimeModules.set(id, requireFromWebRuntime.resolve(id))\n }\n webRuntimeModules.set(RUNTIME_ID, resolveRuntimePolyfillPath())\n resolveMiniProgramModuleId = createMiniProgramPackageResolver(requireFromProject.resolve)\n srcRoot = resolve(root, options.srcDir ?? 'src')\n stylePreprocessOptions = resolveStylePreprocessOptions(config.css?.preprocessorOptions, root)\n enableHmr = config.command === 'serve'\n const resolveViteModuleId = config.createResolver?.()\n resolveWebModuleId = resolveViteModuleId\n ? async (source, importer) => {\n const resolved = await resolveViteModuleId(source, importer)\n return await resolveMiniProgramModuleId?.(resolved ?? source, importer)\n ?? await resolveMiniProgramModuleId?.(source, importer)\n ?? resolved\n }\n : undefined\n resolveWebAutoImportTag = createAutoImportTagResolver()\n await scan(this)\n const componentDependencies = await collectExternalComponentOptimizeDeps(state.scanResult.components)\n const uniAppIncludes = options.__uniApp?.include ?? []\n config.optimizeDeps ??= {}\n config.optimizeDeps.exclude = Array.from(new Set([\n ...(config.optimizeDeps.exclude ?? []),\n ...uniAppIncludes,\n ]))\n config.optimizeDeps.include = Array.from(new Set([\n ...(config.optimizeDeps.include ?? []),\n ...componentDependencies,\n ])).filter(dependency => !isUniAppDependency(dependency, uniAppIncludes))\n },\n configureServer(server: WebDevServer) {\n devServer = server\n server.middlewares.use(createWebAssetMiddleware(srcRoot))\n },\n async buildStart(this: WebPluginContext) {\n if (!resolveWebModuleId && this.resolve) {\n resolveWebModuleId = async (source, importer) => {\n const resolved = await this.resolve?.(source, importer, { skipSelf: true })\n return await resolveMiniProgramModuleId?.(resolved?.id ?? source, importer)\n ?? await resolveMiniProgramModuleId?.(source, importer)\n ?? resolved?.id\n }\n }\n resolveWebAutoImportTag = createAutoImportTagResolver()\n await scan(this)\n if (!enableHmr) {\n await emitWebAssets(this, srcRoot)\n }\n },\n resolveId(id: string, importer?: string) {\n const runtimeModule = webRuntimeModules.get(id)\n if (runtimeModule) {\n return runtimeModule\n }\n if (id === '/@weapp-vite/web/entry' || id === '@weapp-vite/web/entry') {\n return ENTRY_ID\n }\n if (id === AUTO_ROUTES_ID) {\n return RESOLVED_AUTO_ROUTES_ID\n }\n if (id.startsWith(WEB_COMPONENT_PREFIX)) {\n const request = decodeURIComponent(id.slice(WEB_COMPONENT_PREFIX.length))\n const resolvedId = componentImportIdMap.get(request)\n return resolvedId ? `${cleanUrl(resolvedId)}?${WEB_COMPONENT_QUERY}` : null\n }\n if (id.startsWith('.') && importer && cleanUrl(importer).endsWith('.vue') && !extname(id)) {\n const resolvedScript = resolveFileWithExtensionsSync(resolve(dirname(cleanUrl(importer)), id), SCRIPT_EXTS)\n if (resolvedScript?.endsWith('.vue')) {\n return resolvedScript\n }\n }\n if (hasQuery(id, SFC_STYLE_QUERY)) {\n const queryIndex = id.indexOf('?')\n const pathname = queryIndex >= 0 ? id.slice(0, queryIndex) : id\n const query = queryIndex >= 0 ? id.slice(queryIndex) : ''\n if (pathname.startsWith('.') && importer) {\n return `${resolve(dirname(cleanUrl(importer)), pathname)}${query}`\n }\n return id\n }\n return resolveMiniProgramModuleId?.(id, importer).then(resolved => resolved ?? null) ?? null\n },\n async load(this: WebPluginContext, id: string) {\n if (id === ENTRY_ID) {\n return generateEntryModule(state.scanResult, root, wxssOptions, options)\n }\n if (id === RESOLVED_AUTO_ROUTES_ID) {\n return generateAutoRoutesModule(state.scanResult)\n }\n if (hasQuery(id, TEMPLATE_QUERY)) {\n const filename = cleanUrl(id)\n let source = await readFile(filename, 'utf8')\n const pageMeta = resolveMetaByTemplate(filename)\n if (pageMeta?.kind === 'page' && state.scanResult.layouts.length) {\n source = wrapPageTemplate(source, state.scanResult.layouts)\n }\n const navigationConfig = state.pageNavigationMap.get(normalizePath(filename))\n const componentTags = state.templateComponentMap.get(normalizePath(filename))\n const compiled = compileWxml({\n id: filename,\n source,\n resolveTemplatePath,\n resolveWxsPath,\n navigationBar: navigationConfig ? { config: navigationConfig } : undefined,\n componentTags,\n })\n for (const dependency of compiled.dependencies) {\n this.addWatchFile?.(dependency)\n }\n for (const warning of compiled.warnings ?? []) {\n this.warn?.(warning)\n }\n return compiled.code\n }\n if (hasWxsQuery(id)) {\n const filename = cleanUrl(id)\n const source = await readFile(filename, 'utf8')\n const compiled = transformWxsToEsm(source, filename, {\n resolvePath: resolveWxsPath,\n toImportPath: (resolved, importer) => normalizePath(toRelativeImport(importer, resolved)),\n })\n for (const dependency of compiled.dependencies) {\n this.addWatchFile?.(dependency)\n }\n for (const warning of compiled.warnings ?? []) {\n this.warn?.(warning)\n }\n return compiled.code\n }\n if (hasQuery(id, STYLE_QUERY)) {\n const source = await readFile(cleanUrl(id), 'utf8')\n const { css } = transformWxssToCss(source, wxssOptions)\n return createInlineStyleModule(css)\n }\n if (id.includes(`?${SFC_TEMPLATE_QUERY}`) || id.includes(`&${SFC_TEMPLATE_QUERY}`)) {\n const filename = cleanUrl(id)\n const meta = state.moduleMeta.get(normalizePath(filename))\n if (!meta) {\n return null\n }\n const result = await ensureWebVueSfcResult({\n filename,\n meta,\n srcRoot,\n state,\n resolveId: resolveWebModuleId,\n resolveAutoImportTag: resolveWebAutoImportTag,\n uniApp: options.__uniApp,\n stylePreprocessOptions,\n })\n const compiled = generateWebVueSfcTemplate(result, meta, filename, srcRoot)\n for (const dependency of compiled.dependencies) {\n this.addWatchFile?.(dependency)\n }\n for (const warning of compiled.warnings ?? []) {\n this.warn?.(warning)\n }\n return compiled.code\n }\n if (id.includes(`?${SFC_STYLE_QUERY}`) || id.includes(`&${SFC_STYLE_QUERY}`)) {\n const filename = resolveSfcStyleSourceFilename(id)\n const meta = state.moduleMeta.get(normalizePath(filename))\n if (!meta) {\n return null\n }\n const result = await ensureWebVueSfcResult({\n filename,\n meta,\n srcRoot,\n state,\n resolveId: resolveWebModuleId,\n resolveAutoImportTag: resolveWebAutoImportTag,\n uniApp: options.__uniApp,\n stylePreprocessOptions,\n })\n this.addWatchFile?.(filename)\n for (const dependency of result.meta?.sfcSrcDeps ?? []) {\n this.addWatchFile?.(dependency)\n }\n return generateWebVueSfcStyle(result)\n }\n return null\n },\n watchChange: {\n order: 'post',\n sequential: true,\n async handler(this: WebPluginContext, id, change) {\n // Vite 的 handleHotUpdate 不处理增删;必须在结构性 HMR 前发布完整入口。\n if (enableHmr && change.event !== 'update') {\n await scanChangedFile(this, id)\n }\n },\n },\n async handleHotUpdate<Module extends object>(this: WebPluginContext, ctx: WebHmrContext<Module>) {\n const graph = devServer?.moduleGraph\n const affected = new Set(ctx.modules)\n if (graph) {\n for (const file of collectSfcHmrFiles(state, cleanUrl(ctx.file))) {\n // 在扫描替换入口快照前保留旧节点,覆盖外部块删除及样式后缀变更。\n for (const module of graph.getModulesByFile(file) ?? []) {\n // 图与本次 HMR 上下文来自同一 Vite server,保留宿主模块节点的具体类型。\n affected.add(module as Module)\n }\n }\n }\n await scanChangedFile(this, ctx.file)\n return ctx.modules || affected.size ? [...affected] : undefined\n },\n async transform(this: WebPluginContext, code: string, id: string) {\n const clean = cleanUrl(id)\n let uniAppTransformed = false\n\n if (\n options.__uniApp\n && isUniAppCompatibilityFile(clean, srcRoot, options.__uniApp.include)\n && !clean.endsWith('.vue')\n ) {\n const transformed = transformUniAppSource(code, { filename: clean, target: 'h5' })\n if (transformed.changed) {\n code = transformed.code\n uniAppTransformed = true\n }\n }\n\n if (\n hasQuery(id, TEMPLATE_QUERY)\n || hasWxsQuery(id)\n || hasQuery(id, STYLE_QUERY)\n || hasQuery(id, SFC_TEMPLATE_QUERY)\n || hasQuery(id, SFC_STYLE_QUERY)\n ) {\n return null\n }\n\n if (clean.endsWith('.vue')) {\n const normalized = normalizePath(clean)\n const meta = state.moduleMeta.get(normalized) ?? {\n kind: 'component' as const,\n id: getStableWebComponentId(clean, srcRoot),\n scriptPath: clean,\n sourceType: 'vue-sfc' as const,\n }\n state.moduleMeta.set(normalized, meta)\n const result = await ensureWebVueSfcResult({\n filename: clean,\n meta,\n srcRoot,\n state,\n source: code,\n resolveId: resolveWebModuleId,\n resolveAutoImportTag: resolveWebAutoImportTag,\n uniApp: options.__uniApp,\n stylePreprocessOptions,\n })\n return transformWebVueSfcScript({\n code: result.script!,\n filename: clean,\n meta,\n runtimeModuleId: runtimeProvider?.moduleId ?? toViteFsImport(resolveRuntimePolyfillPath()),\n styleLanguage: resolveWebVueSfcStyleLanguage(result, clean),\n enableHmr,\n hmrAcceptCode,\n })\n }\n\n if (isTemplateFile(clean)) {\n if (isHtmlEntry(clean, root)) {\n return null\n }\n const normalizedId = normalizePath(clean)\n if (state.templatePathSet.size > 0) {\n if (!isInsideDir(clean, srcRoot)) {\n return null\n }\n if (!state.templatePathSet.has(normalizedId)) {\n return null\n }\n }\n let templateSource = code\n const pageMeta = resolveMetaByTemplate(clean)\n if (pageMeta?.kind === 'page' && state.scanResult.layouts.length) {\n templateSource = wrapPageTemplate(code, state.scanResult.layouts)\n }\n const navigationConfig = state.pageNavigationMap.get(normalizedId)\n const componentTags = state.templateComponentMap.get(normalizedId)\n const { code: compiled, dependencies, warnings } = compileWxml({\n id: clean,\n source: templateSource,\n resolveTemplatePath,\n resolveWxsPath,\n navigationBar: navigationConfig ? { config: navigationConfig } : undefined,\n componentTags,\n })\n const addWatchFile = this.addWatchFile\n if (dependencies.length > 0 && addWatchFile) {\n for (const dep of dependencies) {\n addWatchFile.call(this, dep)\n }\n }\n const warn = this.warn\n if (warnings?.length && warn) {\n for (const warning of warnings) {\n warn.call(this, warning)\n }\n }\n return { code: compiled, map: null }\n }\n\n if (isWxsFile(clean) || hasWxsQuery(id)) {\n const { code: compiled, dependencies, warnings } = transformWxsToEsm(code, clean, {\n resolvePath: resolveWxsPath,\n toImportPath: (resolved, importer) => normalizePath(toRelativeImport(importer, resolved)),\n })\n const addWatchFile = this.addWatchFile\n if (dependencies.length > 0 && addWatchFile) {\n for (const dep of dependencies) {\n addWatchFile.call(this, dep)\n }\n }\n const warn = this.warn\n if (warnings?.length && warn) {\n for (const warning of warnings) {\n warn.call(this, warning)\n }\n }\n return { code: compiled, map: null }\n }\n\n if (TRANSFORM_STYLE_EXTS.some(ext => clean.endsWith(ext))) {\n const { css } = transformWxssToCss(code, wxssOptions)\n return {\n code: createInlineStyleModule(css),\n map: null,\n }\n }\n\n if (STYLE_EXTS.some(ext => clean.endsWith(ext)) && !clean.endsWith('.wxss')) {\n const { css } = transformWxssToCss(code, wxssOptions)\n return { code: css, map: null }\n }\n\n if (!SCRIPT_EXTS.some(ext => clean.endsWith(ext))) {\n return uniAppTransformed ? { code, map: null } : null\n }\n if (clean.includes('node_modules') && !hasQuery(id, WEB_COMPONENT_QUERY)) {\n return options.__uniApp && isUniAppCompatibilityFile(clean, srcRoot, options.__uniApp.include)\n ? { code, map: null }\n : null\n }\n\n const meta = state.moduleMeta.get(normalizePath(clean))\n if (!meta) {\n return null\n }\n\n return transformScriptModule({\n code,\n cleanId: clean,\n meta,\n enableHmr,\n runtimeModuleId: runtimeProvider?.moduleId,\n hmrAcceptCode,\n })\n },\n }\n}\n\nexport type { WeappWebPluginOptions } from './types'\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { normalizePath } from "./path.mjs";
|
|
2
|
+
import { resolveWebVueSfcStyleLanguage } from "./vueSfc.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/plugin/sfcHmr.ts
|
|
5
|
+
/** 将外部 SFC 块还原为其注册模块和合成样式,交给 Vite 的 HMR 传播与写入生命周期。 */
|
|
6
|
+
function collectSfcHmrFiles(state, changedFile) {
|
|
7
|
+
const changed = normalizePath(changedFile);
|
|
8
|
+
const files = /* @__PURE__ */ new Set();
|
|
9
|
+
for (const [filename, result] of state.sfcResults) {
|
|
10
|
+
if (filename !== changed && !result.meta?.sfcSrcDeps?.some((dependency) => normalizePath(dependency) === changed)) continue;
|
|
11
|
+
files.add(filename);
|
|
12
|
+
files.add(`${filename}.${resolveWebVueSfcStyleLanguage(result, filename)}`);
|
|
13
|
+
}
|
|
14
|
+
return files;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { collectSfcHmrFiles };
|
|
19
|
+
//# sourceMappingURL=sfcHmr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sfcHmr.mjs","names":[],"sources":["../../src/plugin/sfcHmr.ts"],"sourcesContent":["import type { ScanState } from './types'\nimport { normalizePath } from './path'\nimport { resolveWebVueSfcStyleLanguage } from './vueSfc'\n\n/** 将外部 SFC 块还原为其注册模块和合成样式,交给 Vite 的 HMR 传播与写入生命周期。 */\nexport function collectSfcHmrFiles(state: ScanState, changedFile: string) {\n const changed = normalizePath(changedFile)\n const files = new Set<string>()\n for (const [filename, result] of state.sfcResults) {\n if (filename !== changed && !result.meta?.sfcSrcDeps?.some(dependency => normalizePath(dependency) === changed)) {\n continue\n }\n files.add(filename)\n files.add(`${filename}.${resolveWebVueSfcStyleLanguage(result, filename)}`)\n }\n return files\n}\n"],"mappings":";;;;;AAKA,SAAgB,mBAAmB,OAAkB,aAAqB;CACxE,MAAM,UAAU,cAAc,WAAW;CACzC,MAAM,wBAAQ,IAAI,IAAY;CAC9B,KAAK,MAAM,CAAC,UAAU,WAAW,MAAM,YAAY;EACjD,IAAI,aAAa,WAAW,CAAC,OAAO,MAAM,YAAY,MAAK,eAAc,cAAc,UAAU,MAAM,OAAO,GAC5G;EAEF,MAAM,IAAI,QAAQ;EAClB,MAAM,IAAI,GAAG,SAAS,GAAG,8BAA8B,QAAQ,QAAQ,GAAG;CAC5E;CACA,OAAO;AACT"}
|
package/dist/plugin/vueSfc.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { compileWxml } from "../compiler/wxml/compile.mjs";
|
|
2
|
-
import { appendInlineQuery, resolveTemplatePathSync, resolveWxsPathSync, toRelativeImport } from "./path.mjs";
|
|
2
|
+
import { appendInlineQuery, normalizePath, resolveTemplatePathSync, resolveWxsPathSync, toRelativeImport } from "./path.mjs";
|
|
3
3
|
import { resolveScriptFile } from "./files.mjs";
|
|
4
4
|
import path from "pathe";
|
|
5
|
-
import { compileVueFile, isUniAppCompatibilityFile, transformUniAppSource } from "wevu/compiler";
|
|
5
|
+
import { compileVueFile, getMiniProgramTemplatePlatform, isUniAppCompatibilityFile, transformUniAppSource } from "wevu/compiler";
|
|
6
6
|
import { transform } from "esbuild";
|
|
7
7
|
import { fs } from "@weapp-core/shared/fs";
|
|
8
8
|
import { parse } from "@babel/parser";
|
|
@@ -12,6 +12,10 @@ import MagicString from "magic-string";
|
|
|
12
12
|
|
|
13
13
|
//#region src/plugin/vueSfc.ts
|
|
14
14
|
const traverse = _babelTraverse;
|
|
15
|
+
const webTemplatePlatform = {
|
|
16
|
+
...getMiniProgramTemplatePlatform("weapp"),
|
|
17
|
+
nativeSlotContext: false
|
|
18
|
+
};
|
|
15
19
|
async function resolveSfcSrc(request, importer, srcRoot, resolveId) {
|
|
16
20
|
if (request.startsWith("@/")) return path.resolve(srcRoot, request.slice(2));
|
|
17
21
|
if (request.startsWith(".")) return path.resolve(path.dirname(importer), request);
|
|
@@ -28,6 +32,7 @@ async function compileWebVueSfc(options) {
|
|
|
28
32
|
isApp: meta.kind === "app",
|
|
29
33
|
isPage: meta.kind === "page",
|
|
30
34
|
sourceMap: false,
|
|
35
|
+
template: { platform: webTemplatePlatform },
|
|
31
36
|
style: {
|
|
32
37
|
preprocessOptions: stylePreprocessOptions,
|
|
33
38
|
preserveDeepSelectors: true,
|
|
@@ -56,12 +61,12 @@ async function compileWebVueSfc(options) {
|
|
|
56
61
|
return resolveSfcSrc(request, importer, srcRoot, resolveId);
|
|
57
62
|
} }
|
|
58
63
|
});
|
|
59
|
-
state.sfcResults.set(filename, result);
|
|
64
|
+
state.sfcResults.set(normalizePath(filename), result);
|
|
60
65
|
for (const dependency of result.meta?.sfcSrcDeps ?? []) state.templatePathSet.add(dependency);
|
|
61
66
|
return result;
|
|
62
67
|
}
|
|
63
68
|
async function ensureWebVueSfcResult(options) {
|
|
64
|
-
const cached = options.state.sfcResults.get(options.filename);
|
|
69
|
+
const cached = options.state.sfcResults.get(normalizePath(options.filename));
|
|
65
70
|
if (cached) return cached;
|
|
66
71
|
const source = options.source ?? await fs.readFile(options.filename, "utf8");
|
|
67
72
|
return await compileWebVueSfc({
|
|
@@ -91,7 +96,7 @@ async function transformWebVueSfcScript(options) {
|
|
|
91
96
|
});
|
|
92
97
|
const s = new MagicString(code);
|
|
93
98
|
const templateIdent = meta.kind === "app" ? void 0 : "__weapp_sfc_template__";
|
|
94
|
-
const styleIdent =
|
|
99
|
+
const styleIdent = "__weapp_sfc_style__";
|
|
95
100
|
const registerName = getSfcRegisterName(meta.kind);
|
|
96
101
|
const factoryName = getSfcFactoryName(meta.kind);
|
|
97
102
|
const registerMetaCode = createRegisterMetaCode(meta, templateIdent, styleIdent);
|
|
@@ -106,10 +111,8 @@ async function transformWebVueSfcScript(options) {
|
|
|
106
111
|
if (!transformed) throw new Error(`[@weapp-vite/web] Vue SFC 未生成 ${factoryName} 注册调用: ${filename}`);
|
|
107
112
|
const imports = [`import { ${registerName} } from '${runtimeModuleId}'`];
|
|
108
113
|
if (templateIdent) imports.push(`import ${templateIdent} from '${toRelativeImport(filename, filename)}?weapp-web-sfc-template'`);
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
imports.push(`import ${styleIdent} from '${appendInlineQuery(`${toRelativeImport(filename, styleFilename)}?weapp-web-sfc-style`)}'`);
|
|
112
|
-
}
|
|
114
|
+
const styleFilename = `${filename}.${styleLanguage}`;
|
|
115
|
+
imports.push(`import ${styleIdent} from '${appendInlineQuery(`${toRelativeImport(filename, styleFilename)}?weapp-web-sfc-style`)}'`);
|
|
113
116
|
s.prepend(`${imports.join("\n")}\n`);
|
|
114
117
|
if (enableHmr && hmrAcceptCode) s.append(`\n${hmrAcceptCode}\n`);
|
|
115
118
|
const transpiled = await transform(s.toString(), {
|