@taro-minify-pack/plugin-async-pack 0.1.2 → 0.1.3-alpha.1

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 CHANGED
@@ -57,10 +57,19 @@ module.exports = {
57
57
  },
58
58
  plugins: [
59
59
  ['@taro-minify-pack/plugin-async-pack', {
60
- // 异步分包名前缀,默认为 'dynamic-common'
61
- dynamicPackageNamePrefix: 'dynamic-common',
60
+ // 异步分包名前缀,默认为 'dynamic-package'
61
+ dynamicPackageNamePrefix: 'dynamic-package',
62
62
  // 异步分包数量,默认为 1
63
- dynamicPackageCount: 2
63
+ dynamicPackageCount: 2,
64
+ // 自定义异步分包,最终输出目录格式为 `${dynamicPackageNamePrefix}-${name}`
65
+ customDynamicPackages: [
66
+ {
67
+ name: 'report',
68
+ test: (module) => /src[\\/]pages[\\/]report[\\/]/.test(module.resource || ''),
69
+ // 异步分包是否异步加载样式,默认为 false,设置为 true 后,该分包下的样式文件会被异步加载(由于异步加载样式存在延时时机不可控,建议仅用于非页面首屏组件)
70
+ asyncStyle: true
71
+ }
72
+ ]
64
73
  }],
65
74
  ],
66
75
  };
@@ -120,8 +129,11 @@ const AsyncComponent = defineAsyncComponent(() => import('./async-component')
120
129
  - 修改 `runtime.js` 输出,确保异步模块的`js`文件能通过`require.async`正确引入
121
130
 
122
131
  2. **样式处理**:
123
- - 为每个异步分包生成样式组件
124
- - 自动收集该分包下的所有样式文件并通过 `@import` 引入主包`app.wxss`同步引入
132
+ - 默认会先把未开启异步样式的分包样式合并成 `${dynamicPackageNamePrefix}.wxss`
133
+ - 编译 `app.wxss` 时自动补上一条 `@import './${dynamicPackageNamePrefix}.wxss'`,让这部分样式继续跟随主包同步加载
134
+ - 当 `customDynamicPackages[].asyncStyle = true` 时,会在对应自定义分包下额外生成一个 `inject-style` 组件
135
+ - 这个组件会收集该分包目录下的所有 `.wxss` 文件,并生成多个 `@import './xxx.wxss'` 引用,让样式跟随分包一起下发
136
+ - 构建结束后会继续改写 `app.json` 和页面 `wxml`:把 `inject-style` 注册到 `usingComponents` / `componentPlaceholder`,再把组件节点追加到页面模板中,借此触发该分包样式的异步加载
125
137
 
126
138
  3. **小程序配置修改**:
127
139
  - 自动修改 `app.json`,添加异步分包配置
@@ -133,14 +145,52 @@ const AsyncComponent = defineAsyncComponent(() => import('./async-component')
133
145
  3. **Babel 配置**:需要正确配置 Babel 的 `dynamic-import-node` 选项
134
146
  4. **Webpack 版本**:仅支持 Webpack 5 编译器
135
147
  5. **分包数量**:根据项目实际情况配置 `dynamicPackageCount`,过多的分包可能会影响性能
136
- 6. **版本要求**:插件版本`0.0.5-alpha.x`尝试实现样式文件异步加载受微信机制影响存在无法优化的「闪屏样式丢失」,故`0.0.5`及以后版本不支持样式文件异步加载。
137
148
 
138
149
  ## 🔧 配置选项
139
150
 
140
- | 选项名 | 类型 | 默认值 | 描述 |
141
- |----------------------------|----------|--------------------|----------|
142
- | `dynamicPackageNamePrefix` | `string` | `'dynamic-common'` | 异步分包名称前缀 |
143
- | `dynamicPackageCount` | `number` | `1` | 异步分包数量 |
151
+ | 选项名 | 类型 | 默认值 | 描述 |
152
+ |----------------------------|--------------------------|--------------------|-----------|
153
+ | `dynamicPackageNamePrefix` | `string` | `'dynamic-package'` | 异步分包名称前缀 |
154
+ | `dynamicPackageCount` | `number` | `1` | 异步分包数量 |
155
+ | `customDynamicPackages` | `CustomDynamicPackage[]` | `[]` | 自定义异步分包配置 |
156
+
157
+ ### `customDynamicPackages` 配置说明
158
+
159
+ ```ts
160
+ interface CustomDynamicPackage {
161
+ name: string
162
+ test: string | RegExp | ((module, context) => boolean)
163
+ asyncStyle?: boolean
164
+ }
165
+ ```
166
+
167
+ - `name`:自定义异步分包标识,最终会拼成 `${dynamicPackageNamePrefix}-${name}`,例如 `dynamic-package-report`
168
+ - `test`:直接透传给 webpack `splitChunks.cacheGroups[packageName].test`,命中的异步模块会被拆到该分包
169
+ - `asyncStyle`:默认 `false`。开启后会为该分包额外生成 `inject-style` 组件,并自动注入到页面模板中,让该分包内样式跟随组件异步加载
170
+
171
+ ### `customDynamicPackages` 配置示例
172
+
173
+ ```js
174
+ plugins: [
175
+ ['@taro-minify-pack/plugin-async-pack', {
176
+ dynamicPackageNamePrefix: 'dynamic-package',
177
+ dynamicPackageCount: 2,
178
+ customDynamicPackages: [
179
+ {
180
+ name: 'sync-style',
181
+ test: (module) => /src[\\/]pages[\\/]sync-style[\\/]/.test(module.resource || ''),
182
+ },
183
+ {
184
+ name: 'async-style',
185
+ test: (module) => /src[\\/]pages[\\/]async-style[\\/]/.test(module.resource || ''),
186
+ asyncStyle: true
187
+ }
188
+ ]
189
+ }]
190
+ ]
191
+ ```
192
+
193
+ 上述配置会额外生成 `dynamic-package-sync-style` 和 `dynamic-package-async-style` 两个异步分包;其中 `async-style` 分包会同时产出 `inject-style` 组件,并在编译时自动追加到 `app.json` 与页面模板中。
144
194
 
145
195
  ## 🤝 常见问题
146
196
 
@@ -176,4 +226,3 @@ MIT License
176
226
  欢迎提交 Issue 和 Pull Request!
177
227
 
178
228
  > 该插件是 @taro-minify-pack 系列插件的一部分,致力于提供完整的 Taro 项目优化解决方案。
179
-
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { IPluginContext } from '@tarojs/service';
2
2
  import { AsyncPackOpts } from './types';
3
3
  export { AsyncPackOpts } from './types';
4
- declare const _default: (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => void;
4
+ declare const _default: (ctx: IPluginContext, pluginOpts: Partial<AsyncPackOpts>) => void;
5
5
  export default _default;
package/dist/index.js CHANGED
@@ -2,13 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const transform_webpack_runtime_1 = require("./transform-webpack-runtime");
4
4
  const transform_before_compression_plugin_1 = require("./transform-before-compression-plugin");
5
+ const inject_style_component_1 = require("./inject-style-component");
5
6
  const transform_app_config_1 = require("./transform-app-config");
7
+ const transform_pages_wxml_1 = require("./transform-pages-wxml");
6
8
  const utils_1 = require("./utils");
7
9
  const transform_app_stylesheet_1 = require("./transform-app-stylesheet");
8
10
  const merge_output_1 = require("./merge-output");
9
11
  const dynamicPackOptsDefaultOpt = {
10
- dynamicPackageNamePrefix: 'dynamic-common',
11
- dynamicPackageCount: 1
12
+ dynamicPackageNamePrefix: 'dynamic-package',
13
+ dynamicPackageCount: 1,
14
+ customDynamicPackages: []
12
15
  };
13
16
  exports.default = (ctx, pluginOpts) => {
14
17
  const finalOpts = Object.assign(Object.assign({}, dynamicPackOptsDefaultOpt), pluginOpts);
@@ -20,17 +23,19 @@ exports.default = (ctx, pluginOpts) => {
20
23
  const { common, vendors } = existingSplitChunks.cacheGroups;
21
24
  const newCommonChunks = common ? Object.assign(Object.assign({}, common), { chunks: 'initial' }) : common;
22
25
  const newVendorsChunks = vendors ? Object.assign(Object.assign({}, vendors), { chunks: 'initial' }) : vendors;
23
- const generateChunkFilename = (pathData, ext) => {
24
- const { chunk } = pathData;
25
- const order = (0, utils_1.hashModBigInt)((chunk === null || chunk === void 0 ? void 0 : chunk.hash) || '', finalOpts.dynamicPackageCount);
26
- return `${(0, utils_1.generateDynamicPackageName)(Object.assign(Object.assign({}, finalOpts), { order }))}/[chunkhash]${ext}`;
27
- };
26
+ const customPackageCacheGroups = finalOpts.customDynamicPackages.reduce((result, item) => {
27
+ const { name: packageName, test } = item;
28
+ const customDynamicPackageName = (0, utils_1.generateCustomDynamicPackageName)(finalOpts, packageName);
29
+ const name = (module) => { var _a; return `${customDynamicPackageName}/${((_a = module.buildInfo) === null || _a === void 0 ? void 0 : _a.hash) || module.id}`; };
30
+ const cacheGroup = { chunks: 'async', test, name };
31
+ return Object.assign(Object.assign({}, result), { [customDynamicPackageName]: cacheGroup });
32
+ }, {});
28
33
  chain.optimization.merge({
29
- splitChunks: Object.assign(Object.assign({}, existingSplitChunks), { cacheGroups: Object.assign(Object.assign({}, existingSplitChunks.cacheGroups), { common: newCommonChunks, vendors: newVendorsChunks }) })
34
+ splitChunks: Object.assign(Object.assign({}, existingSplitChunks), { cacheGroups: Object.assign(Object.assign(Object.assign({}, customPackageCacheGroups), existingSplitChunks.cacheGroups), { common: newCommonChunks, vendors: newVendorsChunks }) })
30
35
  });
31
36
  chain.merge({
32
37
  output: {
33
- chunkFilename: (pathData) => generateChunkFilename(pathData, '.js'),
38
+ chunkFilename: (pathData) => (0, utils_1.generateChunkFilename)(Object.assign(Object.assign({}, finalOpts), { pathData, ext: '.js' })),
34
39
  path: ctx.paths.outputPath,
35
40
  clean: true
36
41
  }
@@ -38,7 +43,7 @@ exports.default = (ctx, pluginOpts) => {
38
43
  chain.plugin('miniCssExtractPlugin')
39
44
  .tap((args) => {
40
45
  const [options] = args;
41
- const chunkFilename = (pathData) => generateChunkFilename(pathData, '.wxss');
46
+ const chunkFilename = (pathData) => (0, utils_1.generateChunkFilename)(Object.assign(Object.assign({}, finalOpts), { pathData, ext: '.wxss' }));
42
47
  return [Object.assign(Object.assign({}, options), { chunkFilename })];
43
48
  });
44
49
  chain.plugin(transform_before_compression_plugin_1.PLUGIN_NAME).use(transform_before_compression_plugin_1.TransformBeforeCompressionPlugin, [{
@@ -54,15 +59,23 @@ exports.default = (ctx, pluginOpts) => {
54
59
  }
55
60
  }]);
56
61
  chain.plugin(merge_output_1.PLUGIN_NAME).use(merge_output_1.MergeOutputPlugin, [{
57
- test: (assetName) => (0, utils_1.isDynamicPackageWXssAsset)(finalOpts.dynamicPackageNamePrefix, assetName),
62
+ test: (assetName) => (0, utils_1.matchSuffix)('wxss', assetName) && (0, utils_1.isSyncStyleDynamicPackageAsset)(finalOpts, assetName),
58
63
  outputFile: `${finalOpts.dynamicPackageNamePrefix}.wxss`
59
64
  }]);
65
+ chain.plugin(inject_style_component_1.PLUGIN_NAME).use(inject_style_component_1.InjectStyleComponentPlugin, [finalOpts]);
60
66
  });
61
67
  ctx.modifyBuildAssets(({ assets }) => {
62
- const hasDynamicModule = Object.keys(assets).some((key) => (0, utils_1.isDynamicPackageName)(finalOpts.dynamicPackageNamePrefix, key));
68
+ const hasDynamicModule = Object.keys(assets).some((key) => (0, utils_1.isDynamicPackageAsset)(finalOpts, key));
63
69
  if (!hasDynamicModule)
64
70
  return;
65
- (0, transform_app_config_1.transformAppConfig)(Object.assign(Object.assign({}, finalOpts), { assets }));
71
+ const asyncComponents = finalOpts.customDynamicPackages.filter(item => item.asyncStyle).reduce((result, item) => {
72
+ const { name: packageName } = item;
73
+ const componentName = `${inject_style_component_1.InjectStyleComponentName}-${packageName}`;
74
+ const customDynamicPackageName = (0, utils_1.generateCustomDynamicPackageName)(finalOpts, packageName);
75
+ return Object.assign(Object.assign({}, result), { [componentName]: `${customDynamicPackageName}/${inject_style_component_1.InjectStyleComponentName}` });
76
+ }, {});
77
+ (0, transform_app_config_1.transformAppConfig)(Object.assign(Object.assign({}, finalOpts), { assets, asyncComponents }));
78
+ (0, transform_pages_wxml_1.transformPagesWXml)({ assets, asyncComponents });
66
79
  });
67
80
  };
68
81
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Compiler } from 'webpack';
2
+ import { AsyncPackOpts } from './types';
3
+ export declare const PLUGIN_NAME = "InjectStyleComponent";
4
+ export declare const InjectStyleComponentName = "inject-style";
5
+ type Opt = AsyncPackOpts;
6
+ export declare class InjectStyleComponentPlugin {
7
+ private readonly opt;
8
+ private readonly WXmlContent;
9
+ private readonly JsonContent;
10
+ private readonly JsContent;
11
+ constructor(opt: Opt);
12
+ apply(compiler: Compiler): void;
13
+ }
14
+ export {};
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.InjectStyleComponentPlugin = exports.InjectStyleComponentName = exports.PLUGIN_NAME = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const webpack_sources_1 = require("webpack-sources");
9
+ const utils_1 = require("./utils");
10
+ exports.PLUGIN_NAME = 'InjectStyleComponent';
11
+ exports.InjectStyleComponentName = 'inject-style';
12
+ class InjectStyleComponentPlugin {
13
+ constructor(opt) {
14
+ this.WXmlContent = '<block/>';
15
+ this.JsonContent = '{"component": true,"styleIsolation": "shared"}';
16
+ this.JsContent = 'Component({})';
17
+ this.opt = opt;
18
+ }
19
+ apply(compiler) {
20
+ compiler.hooks.compilation.tap(exports.PLUGIN_NAME, (compilation) => {
21
+ const stage = compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL; // 最早阶段,在优化前
22
+ compilation.hooks.processAssets.tap({ name: exports.PLUGIN_NAME, stage }, (assets) => {
23
+ const { customDynamicPackages } = this.opt;
24
+ customDynamicPackages.forEach(customDynamicPackageItem => {
25
+ if (!customDynamicPackageItem.asyncStyle)
26
+ return;
27
+ const customDynamicPackageName = (0, utils_1.generateCustomDynamicPackageName)(this.opt, customDynamicPackageItem.name);
28
+ const styleFileContent = Object.keys(assets).reduce((result, assetPath) => {
29
+ if (!new RegExp(`^${customDynamicPackageName}\\/.*\\.wxss$`).test(assetPath))
30
+ return result;
31
+ const relativePath = path_1.default.posix.relative(customDynamicPackageName, assetPath);
32
+ const code = `@import './${relativePath}';`;
33
+ return result + code + '\n';
34
+ }, '');
35
+ const componentPath = `${customDynamicPackageName}/${exports.InjectStyleComponentName}`;
36
+ compilation.assets[`${componentPath}.wxss`] = new webpack_sources_1.RawSource(styleFileContent);
37
+ compilation.assets[`${componentPath}.wxml`] = new webpack_sources_1.RawSource(this.WXmlContent);
38
+ compilation.assets[`${componentPath}.json`] = new webpack_sources_1.RawSource(this.JsonContent);
39
+ compilation.assets[`${componentPath}.js`] = new webpack_sources_1.RawSource(this.JsContent);
40
+ });
41
+ });
42
+ });
43
+ }
44
+ }
45
+ exports.InjectStyleComponentPlugin = InjectStyleComponentPlugin;
46
+ //# sourceMappingURL=inject-style-component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-style-component.js","sourceRoot":"","sources":["../src/inject-style-component.ts"],"names":[],"mappings":";;;;;;AACA,gDAAuB;AAEvB,qDAA2C;AAC3C,mCAA0D;AAE7C,QAAA,WAAW,GAAG,sBAAsB,CAAA;AAEpC,QAAA,wBAAwB,GAAG,cAAc,CAAA;AAItD,MAAa,0BAA0B;IASrC,YAAa,GAAQ;QANJ,gBAAW,GAAW,UAAU,CAAA;QAEhC,gBAAW,GAAU,gDAAgD,CAAA;QAErE,cAAS,GAAW,eAAe,CAAA;QAGlD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,KAAK,CAAE,QAAkB;QACvB,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAW,EAAE,CAAC,WAAwB,EAAE,EAAE;YACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,+BAA+B,CAAA,CAAC,YAAY;YAEvF,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,mBAAW,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC3E,MAAM,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAA;gBAE1C,qBAAqB,CAAC,OAAO,CAAC,wBAAwB,CAAC,EAAE;oBACvD,IAAI,CAAC,wBAAwB,CAAC,UAAU;wBAAE,OAAM;oBAEhD,MAAM,wBAAwB,GAAG,IAAA,wCAAgC,EAAC,IAAI,CAAC,GAAG,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAA;oBAE1G,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;wBACxE,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,wBAAwB,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;4BAAE,OAAO,MAAM,CAAA;wBAC3F,MAAM,YAAY,GAAG,cAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA;wBAC7E,MAAM,IAAI,GAAG,cAAc,YAAY,IAAI,CAAA;wBAC3C,OAAO,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;oBAC7B,CAAC,EAAE,EAAE,CAAC,CAAA;oBAEN,MAAM,aAAa,GAAG,GAAG,wBAAwB,IAAI,gCAAwB,EAAE,CAAA;oBAC/E,WAAW,CAAC,MAAM,CAAC,GAAG,aAAa,OAAO,CAAC,GAAG,IAAI,2BAAS,CAAC,gBAAgB,CAAC,CAAA;oBAC7E,WAAW,CAAC,MAAM,CAAC,GAAG,aAAa,OAAO,CAAC,GAAG,IAAI,2BAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;oBAC7E,WAAW,CAAC,MAAM,CAAC,GAAG,aAAa,OAAO,CAAC,GAAG,IAAI,2BAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;oBAC7E,WAAW,CAAC,MAAM,CAAC,GAAG,aAAa,KAAK,CAAC,GAAG,IAAI,2BAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBAC3E,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAzCD,gEAyCC"}
@@ -2,6 +2,7 @@ import type { AsyncPackOpts } from './types';
2
2
  import { RawSource } from 'webpack-sources';
3
3
  interface Opts extends AsyncPackOpts {
4
4
  assets: Record<string, RawSource>;
5
+ asyncComponents: Record<string, string>;
5
6
  }
6
7
  export declare const transformAppConfig: (opts: Opts) => void;
7
8
  export {};
@@ -16,14 +16,20 @@ const webpack_sources_1 = require("webpack-sources");
16
16
  const utils_1 = require("./utils");
17
17
  const appConfigAssetKey = 'app.json';
18
18
  const transformAppConfig = (opts) => {
19
- const { dynamicPackageCount, assets } = opts;
19
+ const { dynamicPackageCount, customDynamicPackages, asyncComponents, assets } = opts;
20
20
  const curAppConfig = JSON.parse(assets[appConfigAssetKey].source());
21
21
  const { subPackages, subpackages, resolveAlias = {}, usingComponents = {}, componentPlaceholder = {} } = curAppConfig, otherAppJSON = __rest(curAppConfig, ["subPackages", "subpackages", "resolveAlias", "usingComponents", "componentPlaceholder"]);
22
22
  const finalSubPackages = subPackages || subpackages || [];
23
- const dynamicPackagesConfigs = new Array(dynamicPackageCount).fill(null).map((_, order) => {
24
- return { root: (0, utils_1.generateDynamicPackageName)(Object.assign(Object.assign({}, opts), { order })), pages: [] };
23
+ const defaultDynamicPackagesConfig = new Array(dynamicPackageCount).fill(null).map((_, order) => {
24
+ return { root: (0, utils_1.generateDefaultDynamicPackageName)(Object.assign(Object.assign({}, opts), { order })), pages: [] };
25
25
  });
26
- const finalAppConfig = Object.assign(Object.assign({}, otherAppJSON), { subPackages: [...finalSubPackages, ...dynamicPackagesConfigs], resolveAlias: Object.assign(Object.assign({}, resolveAlias), { '~/*': '/*' }) });
26
+ const customDynamicPackagesConfig = customDynamicPackages.map(customDynamicPackageItem => {
27
+ return { root: (0, utils_1.generateCustomDynamicPackageName)(opts, customDynamicPackageItem.name), pages: [] };
28
+ });
29
+ const asyncComponentPlaceholder = Object.keys(asyncComponents).reduce((result, item) => {
30
+ return Object.assign(Object.assign({}, result), { [item]: 'block' });
31
+ }, {});
32
+ const finalAppConfig = Object.assign(Object.assign({}, otherAppJSON), { usingComponents: Object.assign(Object.assign({}, usingComponents), asyncComponents), componentPlaceholder: Object.assign(Object.assign({}, componentPlaceholder), asyncComponentPlaceholder), subPackages: [...finalSubPackages, ...defaultDynamicPackagesConfig, ...customDynamicPackagesConfig], resolveAlias: Object.assign(Object.assign({}, resolveAlias), { '~/*': '/*' }) });
27
33
  assets[appConfigAssetKey] = new webpack_sources_1.RawSource(JSON.stringify(finalAppConfig));
28
34
  };
29
35
  exports.transformAppConfig = transformAppConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"transform-app-config.js","sourceRoot":"","sources":["../src/transform-app-config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,qDAA2C;AAC3C,mCAAoD;AAMpD,MAAM,iBAAiB,GAAG,UAAU,CAAA;AAE7B,MAAM,kBAAkB,GAAG,CAAC,IAAU,EAAE,EAAE;IAC/C,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAE5C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAY,CAAC,CAAA;IAE7E,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,GAAG,EAAE,EAAE,eAAe,GAAG,EAAE,EAAE,oBAAoB,GAAG,EAAE,KAAsB,YAAY,EAA7B,YAAY,UAAK,YAAY,EAAhI,yFAAiH,CAAe,CAAA;IAEtI,MAAM,gBAAgB,GAAG,WAAW,IAAI,WAAW,IAAI,EAAE,CAAA;IAEzD,MAAM,sBAAsB,GAAG,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QACxF,OAAO,EAAE,IAAI,EAAE,IAAA,kCAA0B,kCAAM,IAAI,KAAE,KAAK,IAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,MAAM,cAAc,mCACf,YAAY,KACf,WAAW,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,sBAAsB,CAAC,EAC7D,YAAY,kCAAO,YAAY,KAAE,KAAK,EAAE,IAAI,MAC7C,CAAA;IAED,MAAM,CAAC,iBAAiB,CAAC,GAAG,IAAI,2BAAS,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAA;AAC3E,CAAC,CAAA;AApBY,QAAA,kBAAkB,sBAoB9B"}
1
+ {"version":3,"file":"transform-app-config.js","sourceRoot":"","sources":["../src/transform-app-config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,qDAA2C;AAC3C,mCAA6F;AAO7F,MAAM,iBAAiB,GAAG,UAAU,CAAA;AAE7B,MAAM,kBAAkB,GAAG,CAAC,IAAU,EAAE,EAAE;IAC/C,MAAM,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAEpF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAY,CAAC,CAAA;IAE7E,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,GAAG,EAAE,EAAE,eAAe,GAAG,EAAE,EAAE,oBAAoB,GAAG,EAAE,KAAsB,YAAY,EAA7B,YAAY,UAAK,YAAY,EAAhI,yFAAiH,CAAe,CAAA;IAEtI,MAAM,gBAAgB,GAAG,WAAW,IAAI,WAAW,IAAI,EAAE,CAAA;IAEzD,MAAM,4BAA4B,GAAG,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QAC9F,OAAO,EAAE,IAAI,EAAE,IAAA,yCAAiC,kCAAM,IAAI,KAAE,KAAK,IAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,MAAM,2BAA2B,GAAG,qBAAqB,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE;QACvF,OAAO,EAAE,IAAI,EAAE,IAAA,wCAAgC,EAAC,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACnG,CAAC,CAAC,CAAA;IAEF,MAAM,yBAAyB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACrF,uCAAY,MAAM,KAAE,CAAC,IAAI,CAAC,EAAE,OAAO,IAAE;IACvC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,cAAc,mCACf,YAAY,KACf,eAAe,kCAAO,eAAe,GAAK,eAAe,GACzD,oBAAoB,kCAAO,oBAAoB,GAAK,yBAAyB,GAC7E,WAAW,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,4BAA4B,EAAE,GAAG,2BAA2B,CAAC,EACnG,YAAY,kCAAO,YAAY,KAAE,KAAK,EAAE,IAAI,MAC7C,CAAA;IAED,MAAM,CAAC,iBAAiB,CAAC,GAAG,IAAI,2BAAS,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAA;AAC3E,CAAC,CAAA;AA9BY,QAAA,kBAAkB,sBA8B9B"}
@@ -0,0 +1,7 @@
1
+ import { RawSource } from 'webpack-sources';
2
+ interface Opts {
3
+ assets: Record<string, RawSource>;
4
+ asyncComponents: Record<string, string>;
5
+ }
6
+ export declare const transformPagesWXml: (opts: Opts) => void;
7
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transformPagesWXml = void 0;
4
+ const webpack_sources_1 = require("webpack-sources");
5
+ const appConfigAssetKey = 'app.json';
6
+ const transformPagesWXml = (opts) => {
7
+ const { assets, asyncComponents } = opts;
8
+ const curAppConfig = JSON.parse(assets[appConfigAssetKey].source());
9
+ const pageWXmlPaths = (() => {
10
+ var _a;
11
+ const { pages = [], subpackages, subPackages, tabBar } = curAppConfig;
12
+ const tabBarPagePaths = ((_a = tabBar === null || tabBar === void 0 ? void 0 : tabBar.list) === null || _a === void 0 ? void 0 : _a.map((item) => item.pagePath)) || [];
13
+ const curSubPackages = subPackages || subpackages || [];
14
+ const subPackagePagePaths = curSubPackages.reduce((result, item) => {
15
+ const subPackagePagePath = item.root || '';
16
+ return [...result, ...(item.pages || []).map((page) => `${subPackagePagePath}/${page}`)];
17
+ }, []);
18
+ return [...pages, ...tabBarPagePaths, ...subPackagePagePaths].map((item) => `${item}.wxml`);
19
+ })();
20
+ Object.keys(assets).forEach((assetPath) => {
21
+ if (!pageWXmlPaths.includes(assetPath))
22
+ return;
23
+ const source = assets[assetPath].source();
24
+ const asyncComponentCode = Object.keys(asyncComponents).map((item) => `<${item}/>`);
25
+ const tempCode = [source, ...asyncComponentCode].join('\n');
26
+ assets[assetPath] = new webpack_sources_1.RawSource(tempCode);
27
+ });
28
+ };
29
+ exports.transformPagesWXml = transformPagesWXml;
30
+ //# sourceMappingURL=transform-pages-wxml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-pages-wxml.js","sourceRoot":"","sources":["../src/transform-pages-wxml.ts"],"names":[],"mappings":";;;AACA,qDAA2C;AAO3C,MAAM,iBAAiB,GAAG,UAAU,CAAA;AAE7B,MAAM,kBAAkB,GAAG,CAAC,IAAU,EAAE,EAAE;IAC/C,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAA;IAExC,MAAM,YAAY,GAAc,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAY,CAAC,CAAA;IAExF,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;;QAC1B,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,YAAY,CAAA;QACrE,MAAM,eAAe,GAAG,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,0CAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAI,EAAE,CAAA;QACxE,MAAM,cAAc,GAAG,WAAW,IAAI,WAAW,IAAI,EAAE,CAAA;QACvD,MAAM,mBAAmB,GAAG,cAAc,CAAC,MAAM,CAAW,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YAC3E,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;YAC1C,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,kBAAkB,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1F,CAAC,EAAE,EAAE,CAAC,CAAA;QACN,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,eAAe,EAAE,GAAG,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,OAAO,CAAC,CAAA;IAC7F,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACxC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAM;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAY,CAAA;QACnD,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;QACnF,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,GAAG,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3D,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,2BAAS,CAAC,QAAQ,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAvBY,QAAA,kBAAkB,sBAuB9B"}
@@ -96,9 +96,9 @@ const replaceWebpackLoadScriptFn = (assignmentExpressionNodePath, opts) => {
96
96
  });
97
97
  if (isProcessed)
98
98
  return;
99
- const { assets, dynamicPackageNamePrefix } = opts;
99
+ const { assets } = opts;
100
100
  const dynamicJsAssets = Object.keys(assets).filter((assetName) => {
101
- return (0, utils_1.isDynamicPackageJsAsset)(dynamicPackageNamePrefix, assetName);
101
+ return (0, utils_1.isDynamicPackageAsset)(opts, assetName) && (0, utils_1.matchSuffix)('js', assetName);
102
102
  });
103
103
  const loadDynamicModuleFnMapCode = (() => {
104
104
  const dynamicAssetsRequireTempCode = dynamicJsAssets.map((dynamicJsAsset) => {
@@ -1 +1 @@
1
- {"version":3,"file":"transform-webpack-runtime.js","sourceRoot":"","sources":["../src/transform-webpack-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform-webpack-runtime.js","sourceRoot":"","sources":["../src/transform-webpack-runtime.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAAgD;AAChD,iEAAwC;AACxC,sDAAuC;AACvC,+DAAsC;AACtC,oDAAqC;AAMrC,mCAA4D;AAM5D,MAAM,mCAAmC,GAAG;;;;;;;;;;;;;;;;;CAiB3C,CAAA;AAED,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;;;CAmBxC,CAAA;AAED,MAAM,0BAA0B,GAAG,CAAC,4BAA4D,EAAE,IAAU,EAAE,EAAE;IAC9G,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,4BAA4B,CAAC,IAAI,IAAI,EAAE,CAAA;IAE/D,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAAE,OAAM;IAE3C,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAAE,OAAM;IAE9C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;QAAE,OAAM;IAE7E,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAE,OAAM;IAE7D,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7C,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,IAAI,WAAW;QAAE,OAAM;IAEvB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAEvB,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;QAC/D,OAAO,IAAA,6BAAqB,EAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAA,mBAAW,EAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IAEF,MAAM,0BAA0B,GAAG,CAAC,GAAG,EAAE;QACvC,MAAM,4BAA4B,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE;YAC1E,OAAO,KAAK,cAAc,0CAA0C,cAAc,OAAO,CAAA;QAC3F,CAAC,CAAC,CAAA;QAEF,OAAO,iCAAiC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;IACnF,CAAC,CAAC,EAAE,CAAA;IAEJ,MAAM,eAAe,GAAG,eAAQ,CAAC,GAAG,CAAC,gCAAgC,CAAc,CAAA;IAEnF,MAAM,yBAAyB,GAAG,eAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IAE1E,MAAM,kBAAkB,GAAG,eAAQ,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;IAE5E,4BAA4B,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;IAEzD,4BAA4B,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAA;IAEpE,4BAA4B,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAA;AAC/D,CAAC,CAAA;AAED,MAAM,oCAAoC,GAAG;;;;;;;;;CAS5C,CAAA;AAED,MAAM,2CAA2C,GAAG,CAAC,IAA+B,EAAE,IAAU,EAAE,EAAE;IAClG,IAAI,aAAa,GAAG,KAAK,CAAA;IAEzB,IAAI,CAAC,QAAQ,CAAC;QACZ,oBAAoB,EAAE,CAAC,QAAwC,EAAE,EAAE;YACjE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAA;YAE3C,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC;gBAAE,OAAM;YAE3C,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC;gBAAE,OAAM;YAE9C,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,OAAM;YAElD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;gBAAE,OAAM;YAEpF,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;gBAAE,OAAM;YAEpE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBAAE,OAAM;YAEnE,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBAAE,OAAM;YAEvG,aAAa,GAAG,IAAI,CAAA;QACtB,CAAC;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,aAAa;QAAE,OAAM;IAE1B,MAAM,eAAe,GAAG,eAAQ,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;IAE1E,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,eAA4B,CAAC,CAAA;AAC3D,CAAC,CAAA;AAEM,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAE,IAAU,EAAE,EAAE;IAClE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA,CAAC,aAAa;IAC5C,IAAA,kBAAQ,EAAC,GAAG,EAAE;QACZ,eAAe,EAAE,CAAC,QAAmC,EAAE,EAAE;YACvD,2CAA2C,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC7D,CAAC;QACD,oBAAoB,EAAE,CAAC,QAAwC,EAAE,EAAE;YACjE,0BAA0B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC5C,CAAC;KACF,CAAC,CAAA;IACF,OAAO,IAAA,mBAAS,EAAC,GAAG,CAAC,CAAC,IAAI,CAAA;AAC5B,CAAC,CAAA;AAXY,QAAA,uBAAuB,2BAWnC"}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,18 @@
1
1
  import { Source } from 'webpack-sources';
2
+ import type { ChunkGraph, Module, ModuleGraph } from 'webpack';
3
+ interface CacheGroupsContext {
4
+ moduleGraph: ModuleGraph;
5
+ chunkGraph: ChunkGraph;
6
+ }
7
+ interface CustomDynamicPackage {
8
+ name: string;
9
+ asyncStyle?: boolean;
10
+ test: string | RegExp | ((module: Module, context: CacheGroupsContext) => boolean);
11
+ }
2
12
  export interface AsyncPackOpts {
3
13
  dynamicPackageNamePrefix: string;
4
14
  dynamicPackageCount: number;
15
+ customDynamicPackages: CustomDynamicPackage[];
5
16
  }
6
17
  export type CompilationAssets = Record<string, Source>;
18
+ export {};
package/dist/utils.d.ts CHANGED
@@ -1,10 +1,19 @@
1
1
  import { AsyncPackOpts } from './types';
2
- export declare const generateKeyByOrder: (order: number) => string;
2
+ import type { PathData } from 'webpack';
3
3
  export declare const hashModBigInt: (hash: string, mod: number) => number;
4
- export declare const isNumber: (val: any) => boolean;
5
- export declare const isDynamicPackageName: (prefix: string, packageName: string) => boolean;
6
- export declare const isDynamicPackageJsAsset: (prefix: string, assetName: string) => boolean;
7
- export declare const isDynamicPackageWXssAsset: (prefix: string, assetName: string) => boolean;
8
- export declare const generateDynamicPackageName: (opt: AsyncPackOpts & {
4
+ export declare const generateKeyByOrder: (order: number) => string;
5
+ export declare const generateDefaultDynamicPackageName: (opt: AsyncPackOpts & {
9
6
  order?: number;
10
7
  }) => string;
8
+ export declare const generateCustomDynamicPackageName: (opt: AsyncPackOpts, packageName: string) => string;
9
+ export declare const generateChunkFilename: (opt: AsyncPackOpts & {
10
+ pathData: PathData;
11
+ ext: string;
12
+ }) => string;
13
+ export declare const isNumber: (val: any) => boolean;
14
+ export declare const isDefaultDynamicPackageAsset: (opt: AsyncPackOpts, assetName: string) => boolean;
15
+ export declare const isCustomDynamicPackageAsset: (opt: AsyncPackOpts, assetName: string) => boolean;
16
+ export declare const isDynamicPackageAsset: (opt: AsyncPackOpts, assetName: string) => boolean;
17
+ export declare const isAsyncStyleDynamicPackageAsset: (opt: AsyncPackOpts, assetName: string) => boolean;
18
+ export declare const isSyncStyleDynamicPackageAsset: (opt: AsyncPackOpts, assetName: string) => boolean;
19
+ export declare const matchSuffix: (suffix: string, assetName: string) => boolean;
package/dist/utils.js CHANGED
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateDynamicPackageName = exports.isDynamicPackageWXssAsset = exports.isDynamicPackageJsAsset = exports.isDynamicPackageName = exports.isNumber = exports.hashModBigInt = exports.generateKeyByOrder = void 0;
3
+ exports.matchSuffix = exports.isSyncStyleDynamicPackageAsset = exports.isAsyncStyleDynamicPackageAsset = exports.isDynamicPackageAsset = exports.isCustomDynamicPackageAsset = exports.isDefaultDynamicPackageAsset = exports.isNumber = exports.generateChunkFilename = exports.generateCustomDynamicPackageName = exports.generateDefaultDynamicPackageName = exports.generateKeyByOrder = exports.hashModBigInt = void 0;
4
+ const hashModBigInt = (hash, mod) => {
5
+ if (!hash || mod <= 0)
6
+ return 0;
7
+ return Number(BigInt('0x' + hash) % BigInt(mod));
8
+ };
9
+ exports.hashModBigInt = hashModBigInt;
4
10
  const generateKeyByOrder = (order) => {
5
11
  const startStr = 'a'.charCodeAt(0);
6
12
  const firstLetter = String.fromCharCode(startStr + Math.floor(order / 26));
@@ -8,35 +14,57 @@ const generateKeyByOrder = (order) => {
8
14
  return `${firstLetter}${secondLetter}`;
9
15
  };
10
16
  exports.generateKeyByOrder = generateKeyByOrder;
11
- const hashModBigInt = (hash, mod) => {
12
- if (!hash)
13
- return 0;
14
- return Number(BigInt('0x' + hash) % BigInt(mod));
17
+ const generateDefaultDynamicPackageName = (opt) => {
18
+ if (!(0, exports.isNumber)(opt.order) || opt.dynamicPackageCount <= 1)
19
+ return opt.dynamicPackageNamePrefix;
20
+ return `${opt.dynamicPackageNamePrefix}-${(0, exports.generateKeyByOrder)(opt.order)}`;
15
21
  };
16
- exports.hashModBigInt = hashModBigInt;
22
+ exports.generateDefaultDynamicPackageName = generateDefaultDynamicPackageName;
23
+ const generateCustomDynamicPackageName = (opt, packageName) => {
24
+ return `${opt.dynamicPackageNamePrefix}-${packageName}`;
25
+ };
26
+ exports.generateCustomDynamicPackageName = generateCustomDynamicPackageName;
27
+ const generateChunkFilename = (opt) => {
28
+ const { chunk } = opt.pathData;
29
+ if (chunk === null || chunk === void 0 ? void 0 : chunk.name)
30
+ return `${chunk === null || chunk === void 0 ? void 0 : chunk.name}${opt.ext}`;
31
+ const order = (0, exports.hashModBigInt)((chunk === null || chunk === void 0 ? void 0 : chunk.hash) || '', opt.dynamicPackageCount);
32
+ return `${(0, exports.generateDefaultDynamicPackageName)(Object.assign(Object.assign({}, opt), { order }))}/[chunkhash]${opt.ext}`;
33
+ };
34
+ exports.generateChunkFilename = generateChunkFilename;
17
35
  const isNumber = (val) => {
18
36
  return typeof val === 'number' && Number.isFinite(val);
19
37
  };
20
38
  exports.isNumber = isNumber;
21
- const isDynamicPackageName = (prefix, packageName) => {
22
- const dynamicModuleRegExp = new RegExp(`^${prefix}(?:-[a-z]{2})?/`);
23
- return dynamicModuleRegExp.test(packageName);
24
- };
25
- exports.isDynamicPackageName = isDynamicPackageName;
26
- const isDynamicPackageJsAsset = (prefix, assetName) => {
27
- const dynamicJsAssetRegExp = new RegExp(`^${prefix}(?:-[a-z]{2})?\\/.*\\.js$`);
28
- return dynamicJsAssetRegExp.test(assetName);
29
- };
30
- exports.isDynamicPackageJsAsset = isDynamicPackageJsAsset;
31
- const isDynamicPackageWXssAsset = (prefix, assetName) => {
32
- const dynamicWXssAssetRegExp = new RegExp(`^${prefix}(?:-[a-z]{2})?\\/.*\\.wxss$`);
33
- return dynamicWXssAssetRegExp.test(assetName);
34
- };
35
- exports.isDynamicPackageWXssAsset = isDynamicPackageWXssAsset;
36
- const generateDynamicPackageName = (opt) => {
37
- if (!(0, exports.isNumber)(opt.order) || opt.dynamicPackageCount <= 1)
38
- return opt.dynamicPackageNamePrefix;
39
- return `${opt.dynamicPackageNamePrefix}-${(0, exports.generateKeyByOrder)(opt.order)}`;
39
+ const isDefaultDynamicPackageAsset = (opt, assetName) => {
40
+ const dynamicModuleRegExp = new RegExp(`^${opt.dynamicPackageNamePrefix}(?:-[a-z]{2})?/`);
41
+ return dynamicModuleRegExp.test(assetName);
42
+ };
43
+ exports.isDefaultDynamicPackageAsset = isDefaultDynamicPackageAsset;
44
+ const isCustomDynamicPackageAsset = (opt, assetName) => {
45
+ const customDynamicPackageNames = opt.customDynamicPackages.map(item => (0, exports.generateCustomDynamicPackageName)(opt, item.name));
46
+ if (!customDynamicPackageNames.length)
47
+ return false;
48
+ return new RegExp(`^(${customDynamicPackageNames.join('|')})/`).test(assetName);
49
+ };
50
+ exports.isCustomDynamicPackageAsset = isCustomDynamicPackageAsset;
51
+ const isDynamicPackageAsset = (opt, assetName) => {
52
+ return (0, exports.isDefaultDynamicPackageAsset)(opt, assetName) || (0, exports.isCustomDynamicPackageAsset)(opt, assetName);
53
+ };
54
+ exports.isDynamicPackageAsset = isDynamicPackageAsset;
55
+ const isAsyncStyleDynamicPackageAsset = (opt, assetName) => {
56
+ const asyncStylDynamicPackageNames = opt.customDynamicPackages.filter(item => item.asyncStyle).map(item => `${opt.dynamicPackageNamePrefix}-${item.name}`);
57
+ if (!asyncStylDynamicPackageNames.length)
58
+ return false;
59
+ return new RegExp(`^(${asyncStylDynamicPackageNames.join('|')})/`).test(assetName);
60
+ };
61
+ exports.isAsyncStyleDynamicPackageAsset = isAsyncStyleDynamicPackageAsset;
62
+ const isSyncStyleDynamicPackageAsset = (opt, assetName) => {
63
+ return (0, exports.isDynamicPackageAsset)(opt, assetName) && !(0, exports.isAsyncStyleDynamicPackageAsset)(opt, assetName);
64
+ };
65
+ exports.isSyncStyleDynamicPackageAsset = isSyncStyleDynamicPackageAsset;
66
+ const matchSuffix = (suffix, assetName) => {
67
+ return new RegExp(`\\.${suffix}$`).test(assetName);
40
68
  };
41
- exports.generateDynamicPackageName = generateDynamicPackageName;
69
+ exports.matchSuffix = matchSuffix;
42
70
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAEO,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAA;IAC1E,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,GAAG,KAAK,GAAG,EAAE,CAAC,CAAA;IAC/D,OAAO,GAAG,WAAW,GAAG,YAAY,EAAE,CAAA;AACxC,CAAC,CAAA;AALY,QAAA,kBAAkB,sBAK9B;AAEM,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAA;IACnB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAClD,CAAC,CAAA;AAHY,QAAA,aAAa,iBAGzB;AAEM,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAE,EAAE;IACnC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACxD,CAAC,CAAA;AAFY,QAAA,QAAQ,YAEpB;AAEM,MAAM,oBAAoB,GAAG,CAAC,MAAc,EAAE,WAAmB,EAAE,EAAE;IAC1E,MAAM,mBAAmB,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,iBAAiB,CAAC,CAAA;IACnE,OAAO,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;AAC9C,CAAC,CAAA;AAHY,QAAA,oBAAoB,wBAGhC;AAEM,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAE;IAC3E,MAAM,oBAAoB,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,2BAA2B,CAAC,CAAA;IAC9E,OAAO,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAC7C,CAAC,CAAA;AAHY,QAAA,uBAAuB,2BAGnC;AAEM,MAAM,yBAAyB,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAE;IAC7E,MAAM,sBAAsB,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,6BAA6B,CAAC,CAAA;IAClF,OAAO,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAC/C,CAAC,CAAA;AAHY,QAAA,yBAAyB,6BAGrC;AAEM,MAAM,0BAA0B,GAAG,CAAC,GAAuC,EAAE,EAAE;IACpF,IAAI,CAAC,IAAA,gBAAQ,EAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,mBAAmB,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,wBAAwB,CAAA;IAC7F,OAAO,GAAG,GAAG,CAAC,wBAAwB,IAAI,IAAA,0BAAkB,EAAC,GAAG,CAAC,KAAM,CAAC,EAAE,CAAA;AAC5E,CAAC,CAAA;AAHY,QAAA,0BAA0B,8BAGtC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAGO,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE;IACzD,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAClD,CAAC,CAAA;AAHY,QAAA,aAAa,iBAGzB;AAEM,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAA;IAC1E,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,GAAG,KAAK,GAAG,EAAE,CAAC,CAAA;IAC/D,OAAO,GAAG,WAAW,GAAG,YAAY,EAAE,CAAA;AACxC,CAAC,CAAA;AALY,QAAA,kBAAkB,sBAK9B;AAEM,MAAM,iCAAiC,GAAG,CAAC,GAAuC,EAAE,EAAE;IAC3F,IAAI,CAAC,IAAA,gBAAQ,EAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,mBAAmB,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,wBAAwB,CAAA;IAC7F,OAAO,GAAG,GAAG,CAAC,wBAAwB,IAAI,IAAA,0BAAkB,EAAC,GAAG,CAAC,KAAM,CAAC,EAAE,CAAA;AAC5E,CAAC,CAAA;AAHY,QAAA,iCAAiC,qCAG7C;AAEM,MAAM,gCAAgC,GAAG,CAAC,GAAkB,EAAE,WAAmB,EAAE,EAAE;IAC1F,OAAO,GAAG,GAAG,CAAC,wBAAwB,IAAI,WAAW,EAAE,CAAA;AACzD,CAAC,CAAA;AAFY,QAAA,gCAAgC,oCAE5C;AAEM,MAAM,qBAAqB,GAAG,CAAC,GAAwD,EAAE,EAAE;IAChG,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAA;IAC9B,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI;QAAE,OAAO,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,CAAA;IAClD,MAAM,KAAK,GAAG,IAAA,qBAAa,EAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,KAAI,EAAE,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAA;IACvE,OAAO,GAAG,IAAA,yCAAiC,kCAAM,GAAG,KAAE,KAAK,IAAG,eAAe,GAAG,CAAC,GAAG,EAAE,CAAA;AACxF,CAAC,CAAA;AALY,QAAA,qBAAqB,yBAKjC;AAEM,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAE,EAAE;IACnC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACxD,CAAC,CAAA;AAFY,QAAA,QAAQ,YAEpB;AAEM,MAAM,4BAA4B,GAAG,CAAC,GAAkB,EAAE,SAAiB,EAAE,EAAE;IACpF,MAAM,mBAAmB,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,wBAAwB,iBAAiB,CAAC,CAAA;IACzF,OAAO,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAC5C,CAAC,CAAA;AAHY,QAAA,4BAA4B,gCAGxC;AAEM,MAAM,2BAA2B,GAAG,CAAC,GAAkB,EAAE,SAAiB,EAAE,EAAE;IACnF,MAAM,yBAAyB,GAAG,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,wCAAgC,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACzH,IAAI,CAAC,yBAAyB,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACnD,OAAO,IAAI,MAAM,CAAC,KAAK,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACjF,CAAC,CAAA;AAJY,QAAA,2BAA2B,+BAIvC;AAEM,MAAM,qBAAqB,GAAG,CAAC,GAAkB,EAAE,SAAiB,EAAE,EAAE;IAC7E,OAAO,IAAA,oCAA4B,EAAC,GAAG,EAAE,SAAS,CAAC,IAAI,IAAA,mCAA2B,EAAC,GAAG,EAAE,SAAS,CAAC,CAAA;AACpG,CAAC,CAAA;AAFY,QAAA,qBAAqB,yBAEjC;AAEM,MAAM,+BAA+B,GAAG,CAAC,GAAkB,EAAE,SAAiB,EAAE,EAAE;IACvF,MAAM,4BAA4B,GAAG,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,wBAAwB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1J,IAAI,CAAC,4BAA4B,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACtD,OAAO,IAAI,MAAM,CAAC,KAAK,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACpF,CAAC,CAAA;AAJY,QAAA,+BAA+B,mCAI3C;AAEM,MAAM,8BAA8B,GAAG,CAAC,GAAkB,EAAE,SAAiB,EAAE,EAAE;IACtF,OAAO,IAAA,6BAAqB,EAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,IAAA,uCAA+B,EAAC,GAAG,EAAE,SAAS,CAAC,CAAA;AAClG,CAAC,CAAA;AAFY,QAAA,8BAA8B,kCAE1C;AAEM,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAE;IAC/D,OAAO,IAAI,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACpD,CAAC,CAAA;AAFY,QAAA,WAAW,eAEvB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taro-minify-pack/plugin-async-pack",
3
- "version": "0.1.2",
3
+ "version": "0.1.3-alpha.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -1,9 +1,23 @@
1
1
  import type { IPluginContext } from '@tarojs/service'
2
- import type { PathData } from 'webpack'
2
+ import type { Module, PathData } from 'webpack'
3
3
  import { transformWebpackRuntime } from './transform-webpack-runtime'
4
- import { TransformOpt, TransformBeforeCompressionPlugin, PLUGIN_NAME as TransformBeforeCompressionPluginName } from './transform-before-compression-plugin'
4
+ import {
5
+ TransformOpt,
6
+ TransformBeforeCompressionPlugin,
7
+ PLUGIN_NAME as TransformBeforeCompressionPluginName
8
+ } from './transform-before-compression-plugin'
9
+ import {
10
+ InjectStyleComponentPlugin,
11
+ PLUGIN_NAME as InjectStyleComponentPluginName,
12
+ InjectStyleComponentName
13
+ } from './inject-style-component'
5
14
  import { transformAppConfig } from './transform-app-config'
6
- import { generateDynamicPackageName, hashModBigInt, isDynamicPackageName, isDynamicPackageWXssAsset } from './utils'
15
+ import { transformPagesWXml } from './transform-pages-wxml'
16
+ import {
17
+ generateChunkFilename,
18
+ isSyncStyleDynamicPackageAsset, isDynamicPackageAsset,
19
+ matchSuffix, generateCustomDynamicPackageName
20
+ } from './utils'
7
21
  import { AsyncPackOpts } from './types'
8
22
  import { transformAppStylesheet } from './transform-app-stylesheet'
9
23
  import { MergeOutputPlugin, PLUGIN_NAME as MergeOutputPluginName } from './merge-output'
@@ -11,11 +25,12 @@ import { MergeOutputPlugin, PLUGIN_NAME as MergeOutputPluginName } from './merge
11
25
  export { AsyncPackOpts } from './types'
12
26
 
13
27
  const dynamicPackOptsDefaultOpt: AsyncPackOpts = {
14
- dynamicPackageNamePrefix: 'dynamic-common',
15
- dynamicPackageCount: 1
28
+ dynamicPackageNamePrefix: 'dynamic-package',
29
+ dynamicPackageCount: 1,
30
+ customDynamicPackages: []
16
31
  }
17
32
 
18
- export default (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => {
33
+ export default (ctx: IPluginContext, pluginOpts: Partial<AsyncPackOpts>) => {
19
34
  const finalOpts = { ...dynamicPackOptsDefaultOpt, ...pluginOpts }
20
35
 
21
36
  if (process.env.TARO_ENV !== 'weapp') return
@@ -30,16 +45,19 @@ export default (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => {
30
45
 
31
46
  const newVendorsChunks = vendors ? { ...vendors, chunks: 'initial' } : vendors
32
47
 
33
- const generateChunkFilename = (pathData:PathData, ext:string) => {
34
- const { chunk } = pathData
35
- const order = hashModBigInt(chunk?.hash || '', finalOpts.dynamicPackageCount)
36
- return `${generateDynamicPackageName({ ...finalOpts, order })}/[chunkhash]${ext}`
37
- }
48
+ const customPackageCacheGroups = finalOpts.customDynamicPackages.reduce((result, item) => {
49
+ const { name: packageName, test } = item
50
+ const customDynamicPackageName = generateCustomDynamicPackageName(finalOpts, packageName)
51
+ const name = (module: Module) => `${customDynamicPackageName}/${module.buildInfo?.hash || module.id}`
52
+ const cacheGroup = { chunks: 'async', test, name }
53
+ return { ...result, [customDynamicPackageName]: cacheGroup }
54
+ }, {})
38
55
 
39
56
  chain.optimization.merge({
40
57
  splitChunks: {
41
58
  ...existingSplitChunks,
42
59
  cacheGroups: {
60
+ ...customPackageCacheGroups,
43
61
  ...existingSplitChunks.cacheGroups,
44
62
  common: newCommonChunks,
45
63
  vendors: newVendorsChunks
@@ -49,7 +67,7 @@ export default (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => {
49
67
 
50
68
  chain.merge({
51
69
  output: {
52
- chunkFilename: (pathData:PathData) => generateChunkFilename(pathData, '.js'),
70
+ chunkFilename: (pathData: PathData) => generateChunkFilename({ ...finalOpts, pathData, ext: '.js' }),
53
71
  path: ctx.paths.outputPath,
54
72
  clean: true
55
73
  }
@@ -58,7 +76,7 @@ export default (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => {
58
76
  chain.plugin('miniCssExtractPlugin')
59
77
  .tap((args) => {
60
78
  const [options] = args
61
- const chunkFilename = (pathData:PathData) => generateChunkFilename(pathData, '.wxss')
79
+ const chunkFilename = (pathData: PathData) => generateChunkFilename({ ...finalOpts, pathData, ext: '.wxss' })
62
80
  return [{ ...options, chunkFilename }]
63
81
  })
64
82
 
@@ -74,16 +92,27 @@ export default (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => {
74
92
  }])
75
93
 
76
94
  chain.plugin(MergeOutputPluginName).use(MergeOutputPlugin, [{
77
- test: (assetName: string) => isDynamicPackageWXssAsset(finalOpts.dynamicPackageNamePrefix, assetName),
95
+ test: (assetName: string) => matchSuffix('wxss', assetName) && isSyncStyleDynamicPackageAsset(finalOpts, assetName),
78
96
  outputFile: `${finalOpts.dynamicPackageNamePrefix}.wxss`
79
97
  }])
98
+
99
+ chain.plugin(InjectStyleComponentPluginName).use(InjectStyleComponentPlugin, [finalOpts])
80
100
  })
81
101
 
82
102
  ctx.modifyBuildAssets(({ assets }) => {
83
- const hasDynamicModule = Object.keys(assets).some((key) => isDynamicPackageName(finalOpts.dynamicPackageNamePrefix, key))
103
+ const hasDynamicModule = Object.keys(assets).some((key) => isDynamicPackageAsset(finalOpts, key))
84
104
 
85
105
  if (!hasDynamicModule) return
86
106
 
87
- transformAppConfig({ ...finalOpts, assets })
107
+ const asyncComponents = finalOpts.customDynamicPackages.filter(item => item.asyncStyle).reduce((result, item) => {
108
+ const { name: packageName } = item
109
+ const componentName = `${InjectStyleComponentName}-${packageName}`
110
+ const customDynamicPackageName = generateCustomDynamicPackageName(finalOpts, packageName)
111
+ return { ...result, [componentName]: `${customDynamicPackageName}/${InjectStyleComponentName}` }
112
+ }, {})
113
+
114
+ transformAppConfig({ ...finalOpts, assets, asyncComponents })
115
+
116
+ transformPagesWXml({ assets, asyncComponents })
88
117
  })
89
118
  }
@@ -0,0 +1,54 @@
1
+ import { Compiler, Compilation } from 'webpack'
2
+ import path from 'path'
3
+ import { AsyncPackOpts } from './types'
4
+ import { RawSource } from 'webpack-sources'
5
+ import { generateCustomDynamicPackageName } from './utils'
6
+
7
+ export const PLUGIN_NAME = 'InjectStyleComponent'
8
+
9
+ export const InjectStyleComponentName = 'inject-style'
10
+
11
+ type Opt = AsyncPackOpts
12
+
13
+ export class InjectStyleComponentPlugin {
14
+ private readonly opt: Opt
15
+
16
+ private readonly WXmlContent: string = '<block/>'
17
+
18
+ private readonly JsonContent:string = '{"component": true,"styleIsolation": "shared"}'
19
+
20
+ private readonly JsContent: string = 'Component({})'
21
+
22
+ constructor (opt: Opt) {
23
+ this.opt = opt
24
+ }
25
+
26
+ apply (compiler: Compiler) {
27
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation: Compilation) => {
28
+ const stage = compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL // 最早阶段,在优化前
29
+
30
+ compilation.hooks.processAssets.tap({ name: PLUGIN_NAME, stage }, (assets) => {
31
+ const { customDynamicPackages } = this.opt
32
+
33
+ customDynamicPackages.forEach(customDynamicPackageItem => {
34
+ if (!customDynamicPackageItem.asyncStyle) return
35
+
36
+ const customDynamicPackageName = generateCustomDynamicPackageName(this.opt, customDynamicPackageItem.name)
37
+
38
+ const styleFileContent = Object.keys(assets).reduce((result, assetPath) => {
39
+ if (!new RegExp(`^${customDynamicPackageName}\\/.*\\.wxss$`).test(assetPath)) return result
40
+ const relativePath = path.posix.relative(customDynamicPackageName, assetPath)
41
+ const code = `@import './${relativePath}';`
42
+ return result + code + '\n'
43
+ }, '')
44
+
45
+ const componentPath = `${customDynamicPackageName}/${InjectStyleComponentName}`
46
+ compilation.assets[`${componentPath}.wxss`] = new RawSource(styleFileContent)
47
+ compilation.assets[`${componentPath}.wxml`] = new RawSource(this.WXmlContent)
48
+ compilation.assets[`${componentPath}.json`] = new RawSource(this.JsonContent)
49
+ compilation.assets[`${componentPath}.js`] = new RawSource(this.JsContent)
50
+ })
51
+ })
52
+ })
53
+ }
54
+ }
@@ -1,15 +1,16 @@
1
1
  import type { AsyncPackOpts } from './types'
2
2
  import { RawSource } from 'webpack-sources'
3
- import { generateDynamicPackageName } from './utils'
3
+ import { generateCustomDynamicPackageName, generateDefaultDynamicPackageName } from './utils'
4
4
 
5
5
  interface Opts extends AsyncPackOpts {
6
6
  assets: Record<string, RawSource>
7
+ asyncComponents: Record<string, string>
7
8
  }
8
9
 
9
10
  const appConfigAssetKey = 'app.json'
10
11
 
11
12
  export const transformAppConfig = (opts: Opts) => {
12
- const { dynamicPackageCount, assets } = opts
13
+ const { dynamicPackageCount, customDynamicPackages, asyncComponents, assets } = opts
13
14
 
14
15
  const curAppConfig = JSON.parse(assets[appConfigAssetKey].source() as string)
15
16
 
@@ -17,13 +18,23 @@ export const transformAppConfig = (opts: Opts) => {
17
18
 
18
19
  const finalSubPackages = subPackages || subpackages || []
19
20
 
20
- const dynamicPackagesConfigs = new Array(dynamicPackageCount).fill(null).map((_, order) => {
21
- return { root: generateDynamicPackageName({ ...opts, order }), pages: [] }
21
+ const defaultDynamicPackagesConfig = new Array(dynamicPackageCount).fill(null).map((_, order) => {
22
+ return { root: generateDefaultDynamicPackageName({ ...opts, order }), pages: [] }
22
23
  })
23
24
 
25
+ const customDynamicPackagesConfig = customDynamicPackages.map(customDynamicPackageItem => {
26
+ return { root: generateCustomDynamicPackageName(opts, customDynamicPackageItem.name), pages: [] }
27
+ })
28
+
29
+ const asyncComponentPlaceholder = Object.keys(asyncComponents).reduce((result, item) => {
30
+ return { ...result, [item]: 'block' }
31
+ }, {})
32
+
24
33
  const finalAppConfig = {
25
34
  ...otherAppJSON,
26
- subPackages: [...finalSubPackages, ...dynamicPackagesConfigs],
35
+ usingComponents: { ...usingComponents, ...asyncComponents },
36
+ componentPlaceholder: { ...componentPlaceholder, ...asyncComponentPlaceholder },
37
+ subPackages: [...finalSubPackages, ...defaultDynamicPackagesConfig, ...customDynamicPackagesConfig],
27
38
  resolveAlias: { ...resolveAlias, '~/*': '/*' }
28
39
  }
29
40
 
@@ -0,0 +1,34 @@
1
+ import { AppConfig } from '@tarojs/taro'
2
+ import { RawSource } from 'webpack-sources'
3
+
4
+ interface Opts {
5
+ assets: Record<string, RawSource>;
6
+ asyncComponents: Record<string, string>;
7
+ }
8
+
9
+ const appConfigAssetKey = 'app.json'
10
+
11
+ export const transformPagesWXml = (opts: Opts) => {
12
+ const { assets, asyncComponents } = opts
13
+
14
+ const curAppConfig: AppConfig = JSON.parse(assets[appConfigAssetKey].source() as string)
15
+
16
+ const pageWXmlPaths = (() => {
17
+ const { pages = [], subpackages, subPackages, tabBar } = curAppConfig
18
+ const tabBarPagePaths = tabBar?.list?.map((item) => item.pagePath) || []
19
+ const curSubPackages = subPackages || subpackages || []
20
+ const subPackagePagePaths = curSubPackages.reduce<string[]>((result, item) => {
21
+ const subPackagePagePath = item.root || ''
22
+ return [...result, ...(item.pages || []).map((page) => `${subPackagePagePath}/${page}`)]
23
+ }, [])
24
+ return [...pages, ...tabBarPagePaths, ...subPackagePagePaths].map((item) => `${item}.wxml`)
25
+ })()
26
+
27
+ Object.keys(assets).forEach((assetPath) => {
28
+ if (!pageWXmlPaths.includes(assetPath)) return
29
+ const source = assets[assetPath].source() as string
30
+ const asyncComponentCode = Object.keys(asyncComponents).map((item) => `<${item}/>`)
31
+ const tempCode = [source, ...asyncComponentCode].join('\n')
32
+ assets[assetPath] = new RawSource(tempCode)
33
+ })
34
+ }
@@ -8,7 +8,7 @@ import type {
8
8
  Statement, UnaryExpression
9
9
  } from '@babel/types'
10
10
  import type { CompilationAssets, AsyncPackOpts } from './types'
11
- import { isDynamicPackageJsAsset } from './utils'
11
+ import { isDynamicPackageAsset, matchSuffix } from './utils'
12
12
 
13
13
  interface Opts extends AsyncPackOpts {
14
14
  assets: CompilationAssets;
@@ -71,10 +71,10 @@ const replaceWebpackLoadScriptFn = (assignmentExpressionNodePath: NodePath<Assig
71
71
 
72
72
  if (isProcessed) return
73
73
 
74
- const { assets, dynamicPackageNamePrefix } = opts
74
+ const { assets } = opts
75
75
 
76
76
  const dynamicJsAssets = Object.keys(assets).filter((assetName) => {
77
- return isDynamicPackageJsAsset(dynamicPackageNamePrefix, assetName)
77
+ return isDynamicPackageAsset(opts, assetName) && matchSuffix('js', assetName)
78
78
  })
79
79
 
80
80
  const loadDynamicModuleFnMapCode = (() => {
package/src/types.ts CHANGED
@@ -1,8 +1,21 @@
1
1
  import { Source } from 'webpack-sources'
2
+ import type { ChunkGraph, Module, ModuleGraph } from 'webpack'
3
+
4
+ interface CacheGroupsContext {
5
+ moduleGraph: ModuleGraph;
6
+ chunkGraph: ChunkGraph;
7
+ }
8
+
9
+ interface CustomDynamicPackage {
10
+ name: string
11
+ asyncStyle?: boolean
12
+ test: string | RegExp | ((module: Module, context: CacheGroupsContext) => boolean);
13
+ }
2
14
 
3
15
  export interface AsyncPackOpts {
4
16
  dynamicPackageNamePrefix: string;
5
17
  dynamicPackageCount: number;
18
+ customDynamicPackages: CustomDynamicPackage[]
6
19
  }
7
20
 
8
21
  export type CompilationAssets = Record<string, Source>;
package/src/utils.ts CHANGED
@@ -1,4 +1,10 @@
1
1
  import { AsyncPackOpts } from './types'
2
+ import type { PathData } from 'webpack'
3
+
4
+ export const hashModBigInt = (hash: string, mod: number) => {
5
+ if (!hash || mod <= 0) return 0
6
+ return Number(BigInt('0x' + hash) % BigInt(mod))
7
+ }
2
8
 
3
9
  export const generateKeyByOrder = (order: number) => {
4
10
  const startStr = 'a'.charCodeAt(0)
@@ -7,31 +13,51 @@ export const generateKeyByOrder = (order: number) => {
7
13
  return `${firstLetter}${secondLetter}`
8
14
  }
9
15
 
10
- export const hashModBigInt = (hash: string, mod: number) => {
11
- if (!hash) return 0
12
- return Number(BigInt('0x' + hash) % BigInt(mod))
16
+ export const generateDefaultDynamicPackageName = (opt: AsyncPackOpts & { order?: number }) => {
17
+ if (!isNumber(opt.order) || opt.dynamicPackageCount <= 1) return opt.dynamicPackageNamePrefix
18
+ return `${opt.dynamicPackageNamePrefix}-${generateKeyByOrder(opt.order!)}`
19
+ }
20
+
21
+ export const generateCustomDynamicPackageName = (opt: AsyncPackOpts, packageName: string) => {
22
+ return `${opt.dynamicPackageNamePrefix}-${packageName}`
23
+ }
24
+
25
+ export const generateChunkFilename = (opt: AsyncPackOpts & { pathData: PathData, ext: string }) => {
26
+ const { chunk } = opt.pathData
27
+ if (chunk?.name) return `${chunk?.name}${opt.ext}`
28
+ const order = hashModBigInt(chunk?.hash || '', opt.dynamicPackageCount)
29
+ return `${generateDefaultDynamicPackageName({ ...opt, order })}/[chunkhash]${opt.ext}`
13
30
  }
14
31
 
15
32
  export const isNumber = (val: any) => {
16
33
  return typeof val === 'number' && Number.isFinite(val)
17
34
  }
18
35
 
19
- export const isDynamicPackageName = (prefix: string, packageName: string) => {
20
- const dynamicModuleRegExp = new RegExp(`^${prefix}(?:-[a-z]{2})?/`)
21
- return dynamicModuleRegExp.test(packageName)
36
+ export const isDefaultDynamicPackageAsset = (opt: AsyncPackOpts, assetName: string) => {
37
+ const dynamicModuleRegExp = new RegExp(`^${opt.dynamicPackageNamePrefix}(?:-[a-z]{2})?/`)
38
+ return dynamicModuleRegExp.test(assetName)
22
39
  }
23
40
 
24
- export const isDynamicPackageJsAsset = (prefix: string, assetName: string) => {
25
- const dynamicJsAssetRegExp = new RegExp(`^${prefix}(?:-[a-z]{2})?\\/.*\\.js$`)
26
- return dynamicJsAssetRegExp.test(assetName)
41
+ export const isCustomDynamicPackageAsset = (opt: AsyncPackOpts, assetName: string) => {
42
+ const customDynamicPackageNames = opt.customDynamicPackages.map(item => generateCustomDynamicPackageName(opt, item.name))
43
+ if (!customDynamicPackageNames.length) return false
44
+ return new RegExp(`^(${customDynamicPackageNames.join('|')})/`).test(assetName)
27
45
  }
28
46
 
29
- export const isDynamicPackageWXssAsset = (prefix: string, assetName: string) => {
30
- const dynamicWXssAssetRegExp = new RegExp(`^${prefix}(?:-[a-z]{2})?\\/.*\\.wxss$`)
31
- return dynamicWXssAssetRegExp.test(assetName)
47
+ export const isDynamicPackageAsset = (opt: AsyncPackOpts, assetName: string) => {
48
+ return isDefaultDynamicPackageAsset(opt, assetName) || isCustomDynamicPackageAsset(opt, assetName)
32
49
  }
33
50
 
34
- export const generateDynamicPackageName = (opt: AsyncPackOpts & { order?: number }) => {
35
- if (!isNumber(opt.order) || opt.dynamicPackageCount <= 1) return opt.dynamicPackageNamePrefix
36
- return `${opt.dynamicPackageNamePrefix}-${generateKeyByOrder(opt.order!)}`
51
+ export const isAsyncStyleDynamicPackageAsset = (opt: AsyncPackOpts, assetName: string) => {
52
+ const asyncStylDynamicPackageNames = opt.customDynamicPackages.filter(item => item.asyncStyle).map(item => `${opt.dynamicPackageNamePrefix}-${item.name}`)
53
+ if (!asyncStylDynamicPackageNames.length) return false
54
+ return new RegExp(`^(${asyncStylDynamicPackageNames.join('|')})/`).test(assetName)
55
+ }
56
+
57
+ export const isSyncStyleDynamicPackageAsset = (opt: AsyncPackOpts, assetName: string) => {
58
+ return isDynamicPackageAsset(opt, assetName) && !isAsyncStyleDynamicPackageAsset(opt, assetName)
59
+ }
60
+
61
+ export const matchSuffix = (suffix: string, assetName: string) => {
62
+ return new RegExp(`\\.${suffix}$`).test(assetName)
37
63
  }