@epxing/cli 0.5.0-beta.10 → 0.5.0-beta.11
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/API.md +2 -2
- package/README.md +3 -1
- package/dist/lazy-lib.mjs +37 -22
- package/dist/skills/epxing-frontend-vue3-migrate/SKILL.md +2 -0
- package/package.json +1 -1
package/API.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
独立工程命令行工具,终端命令名为 epxing。/vite 提供产品构建插件,根入口不提供业务运行时。
|
|
4
4
|
|
|
5
|
-
本页对应包版本 `0.5.0-beta.
|
|
5
|
+
本页对应包版本 `0.5.0-beta.11`。导出名、子路径和签名从当前源码、package.json 与类型声明生成。
|
|
6
6
|
|
|
7
7
|
## 安装与使用
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
```sh
|
|
11
|
-
npm install -g @epxing/cli@0.5.0-beta.
|
|
11
|
+
npm install -g @epxing/cli@0.5.0-beta.11
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
|
package/README.md
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
独立的工程开发工具,包含交互菜单、开发服务、产品库构建、创建、Vue3 迁移、静态检查和升级技能安装。创建和升级默认使用 `@epxing/*` 独立包,版本留空时查询最新 `beta` 并固定到具体版本,没有 `beta` 时使用 `latest`;可用 `--packages-version` 指定版本或标签。CLI 使用自己的版本号。创建和升级会生成产品使用说明;`@epxing/cli/vite` 提供产品构建插件,不依赖聚合包中的构建工具。
|
|
6
6
|
|
|
7
|
-
本批测试版本:`@epxing/cli@0.5.0-beta.
|
|
7
|
+
本批测试版本:`@epxing/cli@0.5.0-beta.11`,平台包 `5.3.0-beta.5`,均使用 npm 公网 `beta` 标签。CLI 与平台独立版本,本次不升级平台包。完整流程见文档站“CLI 创建、升级与产品使用”;各包公开 API 随安装包的 `API.md` 提供。
|
|
8
|
+
|
|
9
|
+
`0.5.0-beta.11` 将按需库的组件 CSS 放入对应 JS,模块加载完成前同步注入,共享样式去重;index.css 保留空文件兼容已登记 URL,整库兜底自带全部样式。可视化、设计器和预览组件写入预取排除清单,实际使用仍正常加载。新平台选择性预取普通组件;旧平台由新壳关闭后台预取。全量构建仍使用原有整体 CSS。Vite 深层动态导入仍引用的 CSS 文件继续保留并随组件按需加载。
|
|
8
10
|
|
|
9
11
|
`0.5.0-beta.10` 关闭产品库构建的 public 目录复制,避免旧 cmaps 和 index.html 混入 lib。创建模板、已有库配置迁移及 CLI 库构建保持一致;应用构建和源 public 文件保留。动态或展开的库配置仍报告人工核对。修复直接执行 npm 库构建时异步懒加载插件进入自身嵌套构建的问题。
|
|
10
12
|
|
package/dist/lazy-lib.mjs
CHANGED
|
@@ -1,28 +1,43 @@
|
|
|
1
|
-
import h from"node:fs";import
|
|
1
|
+
import h from"node:fs";import d from"node:path";import{build as J}from"epxing:project-vite";import O from"node:path";import{createHash as W}from"node:crypto";function K(e,r,t){let n=t==="es"?"import.meta.url":"((document.currentScript && document.currentScript.src) || document.baseURI)",o=W("sha256").update(e).digest("hex").slice(0,16);return`;(function () {
|
|
2
|
+
if (typeof document === 'undefined') return
|
|
3
|
+
var base = new URL(${JSON.stringify(r)}, ${n}).href
|
|
4
|
+
var id = 'epx-lib-css:' + base + ':${o}'
|
|
5
|
+
if (document.getElementById(id)) return
|
|
6
|
+
var style = document.createElement('style')
|
|
7
|
+
style.id = id
|
|
8
|
+
style.textContent = ${JSON.stringify(e)}.replace(/url\\(\\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\\s*\\)/gi, function (match, double, single, raw) {
|
|
9
|
+
var value = (double || single || raw || '').trim()
|
|
10
|
+
if (!value || /^(?:[a-z][a-z\\d+.-]*:|\\/|#|var\\()/i.test(value)) return match
|
|
11
|
+
return 'url(' + JSON.stringify(new URL(value, base).href) + ')'
|
|
12
|
+
})
|
|
13
|
+
document.head.appendChild(style)
|
|
14
|
+
})()
|
|
15
|
+
`}function j(e,r,t=!1){let n=Object.values(e).filter(i=>i.type==="chunk"),o=Object.values(e).filter(i=>i.type==="asset"&&i.fileName.endsWith(".css")),s=new Set(o.filter(i=>n.some(l=>l.code.includes(O.posix.basename(i.fileName)))).map(i=>i.fileName)),u=new Set;for(let i of n){let l=t?o:o.filter(a=>i.viteMetadata?.importedCss?.has(a.fileName));for(let a of l){let m=typeof a.source=="string"?a.source:Buffer.from(a.source).toString("utf8"),b=O.posix.relative(O.posix.dirname(i.fileName),a.fileName);i.code+=`
|
|
16
|
+
`+K(m,b,r),u.add(a.fileName)}}for(let i of u)s.has(i)||delete e[i]}function z(e=!1){return{name:"epx-lazy-inline-css",generateBundle:{order:"post",handler(r,t){j(t,r.format,e)}}}}import N from"node:fs";import v from"node:path";import{parse as G,babelParse as q}from"epxing:project-sfc";function Z(e){return N.readFileSync(e,"utf8").split(`\r
|
|
2
17
|
`).join(`
|
|
3
|
-
`)}function
|
|
18
|
+
`)}function X(e){let r=e.split(`\r
|
|
4
19
|
`).join(`
|
|
5
|
-
`),t="";try{let{descriptor:
|
|
6
|
-
${
|
|
20
|
+
`),t="";try{let{descriptor:n}=G(r);t=n.script&&n.script.content||n.scriptSetup&&n.scriptSetup.content||""}catch{return null}if(!t)return null;try{let o=q(t,{sourceType:"module",plugins:["jsx","typescript","decorators-legacy"]}).program.body,s=l=>{if(!l||l.type!=="ObjectExpression")return null;for(let a of l.properties){if(a.type!=="ObjectProperty"||a.computed)continue;if((a.key.type==="Identifier"?a.key.name:a.key.type==="StringLiteral"?a.key.value:null)==="name"&&a.value.type==="StringLiteral")return a.value.value}return null},u=o.find(l=>l.type==="ExportDefaultDeclaration");if(!u)return null;let i=s(u.declaration);if(i)return i;if(u.declaration.type==="Identifier"){let l=u.declaration.name;for(let a of o)if(a.type==="VariableDeclaration"){for(let m of a.declarations)if(m.id.type==="Identifier"&&m.id.name===l){let b=s(m.init);if(b)return b}}}if(u.declaration.type==="CallExpression")for(let l of u.declaration.arguments){let a=s(l);if(a)return a}return null}catch{return null}}function H(e){return e.replace(/(\.\/|\.vue|\/)/g,"")}function L(e,r){let t=v.resolve(e,r),n=[],o=s=>{let u=N.readdirSync(s,{withFileTypes:!0}).sort((i,l)=>i.name<l.name?-1:1);for(let i of u){let l=v.join(s,i.name);if(i.isDirectory())o(l);else if(i.name.endsWith(".vue")){let m="./"+v.relative(e,l).split(v.sep).join("/");n.push({globKey:m,file:l,key:X(Z(l))||H(m)})}}};return N.existsSync(t)&&o(t),n.sort((s,u)=>s.globKey<u.globKey?-1:1)}function E(e){let r=new Map;for(let t of e){if(r.has(t.key))throw new Error(`[lazy-lib] \u7EC4\u4EF6\u6CE8\u518C\u540D\u51B2\u7A81\uFF1A'${t.key}' \u540C\u65F6\u6765\u81EA
|
|
21
|
+
${r.get(t.key)}
|
|
7
22
|
${t.file}
|
|
8
|
-
\u5355\u4F53\u5F62\u6001\u4E0B\u662F\u540E\u8005\u9759\u9ED8\u8986\u76D6\u524D\u8005\uFF1B\u6309\u9700\u5F62\u6001\u4E0B\u4E24\u4E2A chunk \u62A2\u540C\u4E00\u4E2A\u540D\u5B57\uFF0C\u5FC5\u987B\u5148\u6539\u6389\u5176\u4E2D\u4E00\u4E2A\u7EC4\u4EF6\u7684 name\uFF08\u6216\u6587\u4EF6\u8DEF\u5F84\uFF09\u3002`);
|
|
23
|
+
\u5355\u4F53\u5F62\u6001\u4E0B\u662F\u540E\u8005\u9759\u9ED8\u8986\u76D6\u524D\u8005\uFF1B\u6309\u9700\u5F62\u6001\u4E0B\u4E24\u4E2A chunk \u62A2\u540C\u4E00\u4E2A\u540D\u5B57\uFF0C\u5FC5\u987B\u5148\u6539\u6389\u5176\u4E2D\u4E00\u4E2A\u7EC4\u4EF6\u7684 name\uFF08\u6216\u6587\u4EF6\u8DEF\u5F84\uFF09\u3002`);r.set(t.key,t.file)}return e}var Y=[{test:e=>e==="vue",global:"window.frame && window.frame.Vue"},{test:e=>e==="vuex",global:"window.frame && window.frame.vuex"},{test:e=>e==="vue-router",global:"window.frame && window.frame.router"},{test:e=>e==="epx-frame"||e.startsWith("epx-frame/"),global:"window.epxFrame"}],F=/^[A-Za-z_$][\w$]*$/,Q=(e,r)=>{if(!r)return null;let t=typeof r=="function"?r(e):r[e];return typeof t=="string"&&t?t:null};function ee(e,r){let t=Y.find(o=>o.test(e));if(t)return t.global;let n=Q(e,r);if(n)return`window.${n}`;throw new Error(`[lazy-lib] external '${e}' \u6CA1\u6709\u5BF9\u5E94\u7684\u8FD0\u884C\u65F6\u5168\u5C40\u6620\u5C04\u3002
|
|
9
24
|
ESM chunk \u91CC\u7684\u88F8\u8BF4\u660E\u7B26\u6D4F\u89C8\u5668\u89E3\u6790\u4E0D\u4E86\uFF0C\u5FC5\u987B\u7ECF shim \u6865\u5230 window \u4E0A\u7684\u5168\u5C40\u3002
|
|
10
25
|
\u5E73\u53F0\u5185\u7F6E\u6620\u5C04\uFF1Avue \u2192 window.frame.Vue\uFF1Bvuex \u2192 window.frame.vuex\uFF1B
|
|
11
26
|
vue-router \u2192 window.frame.router\uFF1Bepx-frame\uFF08\u542B\u5B50\u8DEF\u5F84\uFF09\u2192 window.epxFrame\u3002
|
|
12
27
|
\u4E09\u6761\u51FA\u8DEF\uFF1A
|
|
13
28
|
\u2460 \u5B83\u7531**\u4EA7\u54C1\u9879\u76EE**\u77E5\u9053\u5168\u5C40\u540D \u2192 \u5728 vite.config.mjs \u7684 output.globals \u91CC\u7ED9 '${e}' \u914D\u4E0A\uFF08\u63A8\u8350\uFF09\uFF1B
|
|
14
29
|
\u2461 \u5B83\u7531**\u5E73\u53F0**\u63D0\u4F9B \u2192 \u53BB build/lazy-lib/gen-shims.mjs \u7684 GLOBALS \u8865\u4E00\u6761\u6620\u5C04\uFF1B
|
|
15
|
-
\u2462 \u5B83\u4E0D\u8BE5\u88AB external\uFF08\u7EC4\u4EF6\u771F\u7684\u9700\u8981\u628A\u5B83\u6253\u8FDB\u4EA7\u7269\uFF09\u2192 \u4ECE external \u5217\u8868\u91CC\u53BB\u6389\u5B83\u3002`)}function S(e){return"shims/"+e.replace(/[^\w.-]/g,"_")+".js"}function D(e){let
|
|
30
|
+
\u2462 \u5B83\u4E0D\u8BE5\u88AB external\uFF08\u7EC4\u4EF6\u771F\u7684\u9700\u8981\u628A\u5B83\u6253\u8FDB\u4EA7\u7269\uFF09\u2192 \u4ECE external \u5217\u8868\u91CC\u53BB\u6389\u5B83\u3002`)}function S(e){return"shims/"+e.replace(/[^\w.-]/g,"_")+".js"}function D(e){let r=new Map;for(let t of e){let n=S(t);if(r.has(n)&&r.get(n)!==t)throw new Error(`[lazy-lib] shim \u6587\u4EF6\u540D\u51B2\u7A81\uFF1A'${t}' \u548C '${r.get(n)}' \u90FD\u751F\u6210 '${n}'\u3002
|
|
16
31
|
\u5F53\u524D\u7F16\u7801\u65B9\u6848\uFF08/ \u548C\u975E\u6CD5\u5B57\u7B26\u66FF\u6362\u4E3A _\uFF09\u5728 GLOBALS \u7684\u5C01\u95ED\u96C6\u5185\u662F\u5B89\u5168\u7684\u3002
|
|
17
|
-
\u5C06\u6765\u82E5\u771F\u9700\u8981\u652F\u6301\u4F1A\u78B0\u649E\u7684\u8BF4\u660E\u7B26\uFF0C\u518D\u6362\u7F16\u7801\u65B9\u6848\uFF08\u5982 hash \u540E\u7F00\uFF09\u3002`);
|
|
32
|
+
\u5C06\u6765\u82E5\u771F\u9700\u8981\u652F\u6301\u4F1A\u78B0\u649E\u7684\u8BF4\u660E\u7B26\uFF0C\u518D\u6362\u7F16\u7801\u65B9\u6848\uFF08\u5982 hash \u540E\u7F00\uFF09\u3002`);r.set(n,t)}}function I(e,r,t){let n=ee(e,t),o=[...r],s=o.filter(i=>i!=="default"&&F.test(i)).sort();for(let i of o)if(i!=="default"&&!F.test(i))throw new Error(`[lazy-lib] \u65E0\u6CD5\u4E3A external '${e}' \u751F\u6210 shim\uFF1Aimport binding '${i}' \u4E0D\u662F\u5408\u6CD5 JS \u6807\u8BC6\u7B26\u3002
|
|
18
33
|
\u539F\u56E0\uFF1A'*' \u6765\u81EA import * as ns from '...' \u7C7B\u547D\u540D\u7A7A\u95F4\u5BFC\u5165\uFF1Bshim \u65E0\u6CD5\u9759\u6001\u679A\u4E3E\u4F7F\u7528\u65B9\u4F1A\u8BBF\u95EE\u54EA\u4E9B\u540D\u5B57\u3002
|
|
19
|
-
\u6539\u6CD5\uFF1A\u6539\u7528\u5177\u540D\u5BFC\u5165\uFF0C\u5982 import { someExport } from ... \u800C\u975E import * as ns from ...`);return[`// \u6784\u5EFA\u671F\u751F\u6210\uFF08epx-frame lazy-lib\uFF09\uFF1A\u8FD0\u884C\u65F6\u4ECE ${
|
|
34
|
+
\u6539\u6CD5\uFF1A\u6539\u7528\u5177\u540D\u5BFC\u5165\uFF0C\u5982 import { someExport } from ... \u800C\u975E import * as ns from ...`);return[`// \u6784\u5EFA\u671F\u751F\u6210\uFF08epx-frame lazy-lib\uFF09\uFF1A\u8FD0\u884C\u65F6\u4ECE ${n} \u53D6\u5E73\u53F0\u5355\u4F8B\uFF0C\u52FF\u624B\u6539\u3002`,`const S = ${n}`,...s.map(i=>`export const ${i} = S[${JSON.stringify(i)}]`),"export default (S && S.default) || S"].join(`
|
|
20
35
|
`)+`
|
|
21
|
-
`}function
|
|
36
|
+
`}function A(e){let r=new Map;for(let t in e){let n=e[t];if(n.type==="chunk")for(let o in n.importedBindings||{}){r.has(o)||r.set(o,new Set);for(let s of n.importedBindings[o])r.get(o).add(s)}}return r}import k from"node:path";var te=(e,r)=>{let t=k.resolve(e),n=k.resolve(r);return t===n||t.startsWith(n+k.sep)||t.startsWith(n+"/")},C=e=>k.resolve(String(e).split("?")[0]);function B(e,r,t,n){let o=new Set((n||[]).map(C)),s=[...e()].filter(y=>te(y,t)),u=new Set(s),i=new Map,l=[],a=[],m=y=>{let g=new Set;for(let f of y){let c=C(f);o.has(c)&&g.add(c)}return g.size},b=y=>{let g=i.get(y)||0;if(g===2)return;if(g===1){let c=[...l.slice(l.indexOf(y)),y];m(c)>=2&&a.push(c);return}i.set(y,1),l.push(y);let f=r(y)||{};for(let c of f.importedIds||[])u.has(c)&&b(c);l.pop(),i.set(y,2)};for(let y of s)b(y);return a}var $="\0epx-lazy-glob",P=/import\.meta\.glob\(\s*(['"])([^'"]+)\1\s*,\s*\{\s*(?:import\s*:\s*['"]default['"]\s*,\s*)?eager\s*:\s*true\s*(?:,\s*import\s*:\s*['"]default['"]\s*)?,?\s*\}\s*\)/;function M(e){return/(?:^|[/_-])(?:visual|previews?|page-designer|designer)(?:[/_.-]|$)/i.test(e.globKey)||/(?:^|[-_])(?:visual|preview)(?:[-_]|$)/i.test(e.key)||/(?:Visual|Preview)(?:[A-Z0-9_-]|$)/.test(e.key)}async function V(e){let r=(await Promise.all(e)).flat(1/0);return r.some(t=>t&&typeof t.then=="function")?V(r):r.filter(t=>t&&t.name!=="epx-lazy-lib")}function ne(e={}){let{enabled:r=!1,glob:t,eager:n=[],pkgName:o}=e,s=null,u=null,i=[],l=new Set,a="",m="",b="",y="",g=[];return{name:"epx-lazy-lib",apply:"build",enforce:"pre",config(f){return r?(g=(Array.isArray(f.plugins)?f.plugins.flat(1/0):[]).filter(c=>c&&c.name!=="epx-lazy-lib"),{build:{emptyOutDir:!1}}):null},configResolved(f){s=f,m=d.resolve(f.root,f.build.outDir);let c=f.build.lib&&f.build.lib.entry;b=Array.isArray(c)?c[0]:typeof c=="object"?Object.values(c)[0]:c,a=d.dirname(b),y=o||d.basename(f.root)},async buildStart(){if(!r)return;t||this.error("[lazy-lib] \u7F3A\u5C11 glob \u9009\u9879\uFF08\u5F62\u5982 './<\u4EA7\u54C1\u540D>/**/*.vue'\uFF09"),g=await V(g);let f=se(s.root,m);f&&this.error(f);let c=t.replace(/^\.\//,"").split("/")[0];i=E(L(a,c)),i.length||this.error(`[lazy-lib] \u6309 glob \u4E00\u4E2A .vue \u90FD\u6CA1\u626B\u5230\uFF0C\u65E0\u6CD5\u6309\u9700\u62C6\u5305\u3002
|
|
22
37
|
glob \u9009\u9879\uFF1A${t}
|
|
23
|
-
\u5B9E\u9645\u626B\u63CF\u76EE\u5F55\uFF1A${
|
|
38
|
+
\u5B9E\u9645\u626B\u63CF\u76EE\u5F55\uFF1A${d.join(a,c)}\uFF08= \u5165\u53E3\u6240\u5728\u76EE\u5F55 ${a} + glob \u7B2C\u4E00\u6BB5 ${c}\uFF09
|
|
24
39
|
\u6700\u53EF\u80FD\u7684\u539F\u56E0\uFF1Aglob \u662F\u76F8\u5BF9**\u5165\u53E3\u6587\u4EF6\u6240\u5728\u76EE\u5F55**\u5199\u7684\uFF0C\u522B\u6309\u4ED3\u5E93\u6839\u591A\u5199\u4E00\u5C42 \`src/\`\u2014\u2014
|
|
25
|
-
\u5165\u53E3\u662F src/index.js \u65F6\u5E94\u5199 './<\u4EA7\u54C1\u540D>/**/*.vue'\uFF0C\u4E0D\u662F './src/<\u4EA7\u54C1\u540D>/**/*.vue'\u3002`),l=new Set([...
|
|
40
|
+
\u5165\u53E3\u662F src/index.js \u65F6\u5E94\u5199 './<\u4EA7\u54C1\u540D>/**/*.vue'\uFF0C\u4E0D\u662F './src/<\u4EA7\u54C1\u540D>/**/*.vue'\u3002`),l=new Set([...n,...oe(b,a,i)]),h.rmSync(m,{recursive:!0,force:!0}),h.mkdirSync(m,{recursive:!0});let x=i.filter(p=>!l.has(p.key));u=await ae(s,g,x,m,a,i)},resolveId(f){return f===$?$:null},load(f){return f!==$?null:ce({pkgName:y,entries:i,eagerKeys:l,manifest:u})},transform(f,c){if(!r||d.resolve(c.split("?")[0])!==d.resolve(b))return null;let x=P.exec(f);return x||this.error(`[lazy-lib] \u5165\u53E3\u91CC\u6CA1\u627E\u5230\u671F\u671B\u5F62\u6001\u7684 import.meta.glob\u3002
|
|
26
41
|
\u671F\u671B\uFF1Aconst files = import.meta.glob('./<\u4EA7\u54C1\u540D>/**/*.vue', { eager: true })
|
|
27
42
|
\u6587\u4EF6\uFF1A${b}
|
|
28
43
|
\uFF08\u4E0D\u505A\u9759\u9ED8\u964D\u7EA7\uFF1A\u90A3\u4F1A\u6084\u6084\u6253\u51FA\u4E00\u4E2A\u5355\u4F53\uFF0C\u800C\u4F60\u4EE5\u4E3A\u81EA\u5DF1\u5F00\u4E86\u6309\u9700\u3002\uFF09`),x[2]!==t&&this.error(`[lazy-lib] \u63D2\u4EF6\u7684 glob \u9009\u9879\u4E0E\u5165\u53E3\u91CC import.meta.glob \u7684\u5B57\u9762\u91CF\u4E0D\u4E00\u81F4\uFF0C\u4E24\u8FB9\u5FC5\u987B\u9010\u5B57\u76F8\u540C\u3002
|
|
@@ -30,25 +45,25 @@ import h from"node:fs";import y from"node:path";import{build as B}from"epxing:pr
|
|
|
30
45
|
\u5165\u53E3\u5B57\u9762\u91CF\uFF1A${x[2]}
|
|
31
46
|
\u6587\u4EF6\uFF1A${b}
|
|
32
47
|
\uFF08\u4E0D\u4E00\u81F4\u65F6\u58F3\u7684\u952E\u96C6\u4F1A\u4E0E\u6574\u4F53\u5355\u4F53\u5206\u53C9\uFF0C\u964D\u7EA7\u515C\u5E95\u4F1A\u627E\u4E0D\u5230\u7EC4\u4EF6\u3002\uFF09`),{code:`import __epxLazyGlob from ${JSON.stringify($)}
|
|
33
|
-
`+f.replace(
|
|
34
|
-
`),
|
|
48
|
+
`+f.replace(P,/\bimport\s*:/.test(x[0])?"Object.fromEntries(Object.entries(__epxLazyGlob).map(([key, value]) => [key, value.default]))":"__epxLazyGlob"),map:null}},async closeBundle(){if(!r||!u)return;let f={};for(let c of i)f[c.key]=l.has(c.key)?null:u[c.key]||null;h.writeFileSync(d.join(m,"index.manifest.json"),JSON.stringify({v:1,pkgName:y,components:f,eager:[...l].sort(),css:"inline",prefetchExclude:i.filter(M).map(c=>c.key)},null,2)+`
|
|
49
|
+
`),le(m),await ue(s,g,b,m,y),h.existsSync(d.join(m,"index.css"))||h.writeFileSync(d.join(m,"index.css"),""),T(m,"index.deps.json"),ie(m,s.build.assetsDir)},generateBundle:{order:"post",handler(f,c){r&&j(c,f.format,!0)}}}}function se(e,r){let t=d.resolve(e),n=d.resolve(r);return n===t||!n.startsWith(t+d.sep)?`[lazy-lib] build.outDir \u5FC5\u987B\u662F\u9879\u76EE\u6839**\u4E4B\u5185**\u7684\u5B50\u76EE\u5F55\uFF0C\u4E14\u4E0D\u80FD\u5C31\u662F\u9879\u76EE\u6839\u672C\u8EAB\u3002
|
|
35
50
|
\u9879\u76EE\u6839\uFF1A${t}
|
|
36
|
-
outDir\uFF1A${
|
|
51
|
+
outDir\uFF1A${n}
|
|
37
52
|
\u539F\u56E0\uFF1A\u6309\u9700\u62C6\u5305\u7684\u4E09\u8D9F\u4EA7\u7269\u8981\u843D\u8FDB\u540C\u4E00\u4E2A\u76EE\u5F55\uFF0C\u672C\u63D2\u4EF6\u4F1A\u5728\u6784\u5EFA\u5F00\u59CB\u65F6\u628A outDir \u6574\u4E2A\u5220\u6389\u91CD\u5EFA
|
|
38
53
|
\uFF08\u9012\u5F52\u3001\u5F3A\u5236\uFF09\uFF0C\u8FD9\u4E00\u6B65\u7ED5\u5F00\u4E86 vite \u81EA\u5DF1\u7684 emptyOutDir \u4FDD\u62A4\u3002outDir \u89E3\u6790\u6210\u9879\u76EE\u6839\u65F6\uFF0C
|
|
39
|
-
\u8FD9\u4E00\u5220\u4F1A\u628A\u4EA7\u54C1\u7684\u6E90\u7801\u4E00\u8D77\u5220\u6389\u3002\u6539\u6CD5\uFF1A\u7ED9 build.outDir \u4E00\u4E2A\u771F\u6B63\u7684\u5B50\u76EE\u5F55\uFF0C\u5982 'lib'\u3002`:null}function
|
|
40
|
-
`)),
|
|
54
|
+
\u8FD9\u4E00\u5220\u4F1A\u628A\u4EA7\u54C1\u7684\u6E90\u7801\u4E00\u8D77\u5220\u6389\u3002\u6539\u6CD5\uFF1A\u7ED9 build.outDir \u4E00\u4E2A\u771F\u6B63\u7684\u5B50\u76EE\u5F55\uFF0C\u5982 'lib'\u3002`:null}function re(e,r,t=""){for(let n of h.readdirSync(e,{withFileTypes:!0})){let o=d.join(e,n.name),s=t?t+"/"+n.name:n.name;if(n.isDirectory())re(o,r,s);else if(n.name.endsWith(".css")){if(r&&h.existsSync(d.join(r,s)))continue;h.rmSync(o,{force:!0})}}}function ie(e,r){let t=d.join(e,r||"assets");if(!h.existsSync(t))return[];let n=h.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isFile()).map(s=>s.name);if(!n.length){try{h.rmdirSync(t)}catch{}return[]}let o=r||"assets";return console.warn(["",`[lazy-lib] \u26A0\uFE0F \u4EA7\u51FA\u4E86 ${n.length} \u4E2A\u6587\u4EF6\u578B\u8D44\u6E90\u5230 ${o}/\uFF1A`,...n.map(s=>" "+s)," \u8FD9\u4E9B\u8D44\u6E90\u4F7F\u7528\u5E93\u5185\u76F8\u5BF9\u8DEF\u5F84\uFF0C\u90E8\u7F72\u65F6\u987B\u4E00\u5E76\u4E0A\u4F20\uFF0C\u5426\u5219\u8FD0\u884C\u65F6\u4F1A 404\u3002"," \u5982\u9700\u51CF\u5C11\u72EC\u7ACB\u8D44\u6E90\u8BF7\u6C42\uFF0C\u53EF\u8C03\u6574 build.assetsInlineLimit\uFF0C\u6216\u4F7F\u7528\u6587\u4EF6\u670D\u52A1\u5668\u5B8C\u6574 URL\u3002",""].join(`
|
|
55
|
+
`)),n}var U=e=>({assetsInlineLimit:e.assetsInlineLimit,assetsDir:e.assetsDir,target:e.target,cssTarget:e.cssTarget,sourcemap:e.sourcemap,minify:e.minify});function T(e,r,t=""){for(let n of h.readdirSync(e,{withFileTypes:!0})){let o=d.join(e,n.name),s=t?t+"/"+n.name:n.name;n.isDirectory()?T(o,r,s):n.name.endsWith(".deps.json")&&s!==r&&h.rmSync(o,{force:!0})}}function oe(e,r,t){let n=h.readFileSync(e,"utf8").split(`\r
|
|
41
56
|
`).join(`
|
|
42
|
-
`),
|
|
43
|
-
/*__EPX_FRAME_DEPS__${JSON.stringify(
|
|
44
|
-
`+(
|
|
45
|
-
`:"");h.appendFileSync(t,
|
|
57
|
+
`),o=[],s=/^\s*import\s+\w+\s+from\s+['"](\.[^'"]+\.vue)['"]/gm,u;for(;u=s.exec(n);){let i=d.resolve(d.dirname(e),u[1]),l=t.find(a=>d.resolve(a.file)===i);l&&o.push(l.key)}return o}function le(e){let r=d.join(e,"index.deps.json"),t=d.join(e,"index.js");if(!h.existsSync(r)||!h.existsSync(t))return;let n=[],o=!1;try{let u=JSON.parse(h.readFileSync(r,"utf8"));n=Array.isArray(u.components)?u.components:[],o=!!u.all}catch{return}let s=`
|
|
58
|
+
/*__EPX_FRAME_DEPS__${JSON.stringify(n)}__*/
|
|
59
|
+
`+(o?`/*__EPX_FRAME_DEPS_ALL__*/
|
|
60
|
+
`:"");h.appendFileSync(t,s)}async function ae(e,r,t,n,o,s){let u={};for(let p of t)u[p.key]=p.file;let i=new Set,l=(s||t).map(p=>p.file),a=await J({root:e.root,base:"./",logLevel:"silent",configFile:!1,plugins:[...r,z(),{name:"epx-lazy-lib-cycle-guard",buildEnd(){let p=B(()=>this.getModuleIds(),_=>this.getModuleInfo(_),o,l);p.length&&this.error(`[lazy-lib] \u5165\u53E3\u7EC4\u4EF6\u4E4B\u95F4\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF0C\u6309\u9700\u62C6\u5305\u4F1A\u5728\u8FD0\u884C\u65F6\u89E6\u53D1 TDZ\uFF08Cannot access ... before initialization\uFF09\u5E76\u767D\u5C4F\uFF1A
|
|
46
61
|
`+p.map(_=>" "+_.join(`
|
|
47
62
|
-> `)).join(`
|
|
48
63
|
`)+`
|
|
49
64
|
\u4E00\u4E2A .vue = \u4E00\u4E2A chunk\uFF0C\u6210\u73AF\u7684\u4E24\u4E2A\u7EC4\u4EF6\u8DE8 chunk \u540E\u521D\u59CB\u5316\u987A\u5E8F\u65AD\u88C2\u3002\u4E24\u6761\u51FA\u8DEF\uFF1A
|
|
50
65
|
\u2460 \u628A\u73AF\u62C6\u6389\uFF1A\u62BD\u51FA\u53CC\u65B9\u90FD\u8981\u7684\u90A3\u90E8\u5206\u5230\u72EC\u7ACB\u6A21\u5757\uFF0C\u6539\u6210\u4E24\u4E2A\u7EC4\u4EF6\u90FD import \u5B83\uFF1B
|
|
51
66
|
\u2461 \u8FD9\u4E2A\u5E93\u6682\u65F6\u4E0D\u7528\u6309\u9700\u5F62\u6001\uFF0C\u56DE\u5230\u6574\u4F53\u5355\u4F53\uFF08\u4E0D\u8BBE LAZY_LIB / enabled:false\uFF09\u3002
|
|
52
|
-
\uFF08eager \u9009\u9879\u5E2E\u4E0D\u4E0A\u5FD9\uFF1A\u5B83\u53EA\u628A .vue \u4ECE\u7B2C\u2460\u8D9F\u7684 input \u91CC\u62FF\u6389\uFF0C\u7EC4\u4EF6\u4ECD\u5728\u6A21\u5757\u56FE\u91CC\uFF0C\u73AF\u8FD8\u5728\u3002\uFF09`)}}],css:e.css,resolve:e.resolve,define:e.define,publicDir:!1,build:{outDir:
|
|
67
|
+
\uFF08eager \u9009\u9879\u5E2E\u4E0D\u4E0A\u5FD9\uFF1A\u5B83\u53EA\u628A .vue \u4ECE\u7B2C\u2460\u8D9F\u7684 input \u91CC\u62FF\u6389\uFF0C\u7EC4\u4EF6\u4ECD\u5728\u6A21\u5757\u56FE\u91CC\uFF0C\u73AF\u8FD8\u5728\u3002\uFF09`)}}],css:e.css,resolve:e.resolve,define:e.define,publicDir:!1,build:{outDir:n,emptyOutDir:!1,cssCodeSplit:!0,...U(e.build),rollupOptions:{input:u,external:e.build.rollupOptions.external,preserveEntrySignatures:"strict",output:{format:"es",entryFileNames:"chunks/[name]-[hash].js",chunkFileNames:"chunks/[name]-[hash].js",paths:p=>(i.add(p),"./"+S(p))}}}}),m=Array.isArray(a)?a[0]:a,b=m.output.reduce((p,_)=>(p[_.fileName]=_,p),{}),y=e.build.rollupOptions.output&&e.build.rollupOptions.output.globals,g=A(b),f=new Map([...i].map(p=>["./"+S(p),p])),c=new Map;for(let[p,_]of g){let w=f.get(p);if(w){c.has(w)||c.set(w,new Set);for(let R of _)c.get(w).add(R)}}D([...i]);for(let[p,_]of c){let w=d.join(n,"chunks",S(p));h.mkdirSync(d.dirname(w),{recursive:!0}),h.writeFileSync(w,I(p,_,y))}let x={};for(let p of m.output)p.type==="chunk"&&p.isEntry&&(x[p.name]=p.fileName);return x}async function ue(e,r,t,n,o){await J({root:e.root,logLevel:"silent",configFile:!1,plugins:[...r,z(!0)],css:e.css,resolve:e.resolve,define:e.define,publicDir:!1,build:{outDir:n,emptyOutDir:!1,cssCodeSplit:!1,...U(e.build),lib:{entry:t,name:`__epxFullLibs__.${o}`,formats:["umd"],fileName:()=>"index.full.js"},rollupOptions:{external:e.build.rollupOptions.external,output:{globals:e.build.rollupOptions.output&&e.build.rollupOptions.output.globals,exports:"default",assetFileNames:s=>(s.names||[s.name]).some(u=>String(u).endsWith(".css"))?"index.css":"assets/[name]-[hash][extname]"}}}})}function ce({pkgName:e,entries:r,eagerKeys:t,manifest:n}){let o=r.filter(i=>t.has(i.key)),s=[];o.forEach((i,l)=>{s.push(`import __eager${l} from ${JSON.stringify(i.file.split(d.sep).join("/"))}`)});let u={};for(let i of r)t.has(i.key)||(u[i.key]=n[i.key]);return s.push(""),s.push("// \u6784\u5EFA\u671F\u751F\u6210\uFF08epx-frame lazy-lib\uFF09\uFF1A\u628A import.meta.glob \u7684 eager \u7ED3\u679C\u6362\u6210\u6309\u9700 wrapper\u3002"),s.push(`const __pkg = ${JSON.stringify(e)}`),s.push(`const __manifest = ${JSON.stringify(u,null,2)}`),s.push(`const __prefetchExclude = ${JSON.stringify(r.filter(M).map(i=>i.key))}`),s.push("const __frame = (typeof window !== 'undefined' && window.frame) || {}"),s.push("const __cur = (typeof document !== 'undefined' && document.currentScript && document.currentScript.src) || ''"),s.push("const __base = __cur ? __cur.slice(0, __cur.lastIndexOf('/') + 1) : ''"),s.push("let __lazy = {}"),s.push("if (typeof __frame.registerLazyLibrary === 'function') {"),s.push(" __lazy = __frame.registerLazyLibrary(__pkg, { base: __base, components: __manifest, full: 'index.full.js', prefetchExclude: __prefetchExclude }, __frame.registerLazyLibrary.supportsPrefetchExclude ? undefined : { prefetch: false })"),s.push("} else if (__frame.Vue && __frame.Vue.defineAsyncComponent) {"),s.push(" // \u964D\u7EA7\u2461\uFF1A\u5E73\u53F0\u6CA1\u6709\u8BE5 API\uFF08\u65E7\u7248\u5E73\u53F0\uFF09\u65F6\u58F3\u81EA\u5EFA wrapper\uFF0C\u529F\u80FD\u7B49\u4EF7\uFF0C\u65E0\u96C6\u4E2D\u9884\u53D6\u3002"),s.push(" for (const k in __manifest) {"),s.push(" const f = __manifest[k]"),s.push(" const w = __frame.Vue.defineAsyncComponent(() => import(/* @vite-ignore */ __base + f))"),s.push(" w.name = k"),s.push(" __lazy[k] = w"),s.push(" }"),s.push("} else {"),s.push(" console.error('[frame.lazy] \u5E73\u53F0\u65E2\u6CA1\u6709 registerLazyLibrary \u4E5F\u6CA1\u6709 Vue \u2014\u2014 \u8BF7\u5347\u7EA7\u5E73\u53F0\uFF0C\u6216\u6539\u7528\u6574\u4F53\u5355\u4F53\u5F62\u6001\u6784\u5EFA\u672C\u5E93', __pkg)"),s.push("}"),s.push("const __out = {}"),r.forEach(i=>{let l=o.indexOf(i),a=l>=0?`__eager${l}`:`__lazy[${JSON.stringify(i.key)}]`;s.push(`__out[${JSON.stringify(i.globKey)}] = { default: ${a} }`)}),s.push("export default __out"),s.join(`
|
|
53
68
|
`)+`
|
|
54
|
-
`}export{
|
|
69
|
+
`}export{se as checkOutDir,ne as default,re as rmCssFiles,T as rmStrayDepsJson,ie as warnEmittedAssets,le as writeFrameDepsMarker};
|
|
@@ -204,6 +204,8 @@ Claude Code 项目技能放在 `.claude/skills/epxing-frontend-vue3-migrate/`,
|
|
|
204
204
|
|
|
205
205
|
## 库构建命令约定
|
|
206
206
|
|
|
207
|
+
CLI 0.5.0-beta.11 起,按需库 CSS 随各自 JS 同步注入,index.css 保留空文件兼容旧加载 URL;不能再以它包含全部组件样式验收。检查单组件加载前后样式、共享样式去重、资源路径与整库兜底。可视化、设计器与预览组件不后台预取,实际使用仍加载;新壳在旧平台关闭后台预取,平台支持 supportsPrefetchExclude 后普通组件可选择性预取。产品使用本地 CLI 插件,须更新产品依赖并重建整个 lib,不能只更新全局命令。
|
|
208
|
+
|
|
207
209
|
库构建分支须设置 `build.copyPublicDir: false`,避免旧 `public/cmaps`、`public/index.html` 原样混入 `lib/`;应用构建仍保留所需静态资源,不能删除源 public 目录。验收懒加载和全量库目录均无多余应用入口;若 index.html 不来自 public,继续检查是否误走 app 模式或自定义复制插件。已有动态/展开构建配置由 AI 按实际分支核对,不能跳过报告项。
|
|
208
210
|
|
|
209
211
|
升级收尾必须复查 `package.json`:标准 `build:lib` 应为 `node build-lib.mjs`,不得残留 `--full`;全量参数放在 `build:lib:full`。CLI 0.5.0-beta.9 补齐旧标准入口带 `--full` 的自动迁移。自定义构建或入口文件报告待接入时,由 AI 在已有升级授权内核对并保留必要步骤,不能将“保留原命令”当成默认懒加载已完成。
|