@taro-minify-pack/plugin-async-pack 0.1.2 → 0.1.3-alpha.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 +55 -8
- package/dist/index.d.ts +1 -1
- package/dist/index.js +26 -13
- package/dist/index.js.map +1 -1
- package/dist/inject-style-component.d.ts +14 -0
- package/dist/inject-style-component.js +46 -0
- package/dist/inject-style-component.js.map +1 -0
- package/dist/transform-app-config.d.ts +1 -0
- package/dist/transform-app-config.js +10 -4
- package/dist/transform-app-config.js.map +1 -1
- package/dist/transform-pages-wxml.d.ts +7 -0
- package/dist/transform-pages-wxml.js +30 -0
- package/dist/transform-pages-wxml.js.map +1 -0
- package/dist/transform-webpack-runtime.js +2 -2
- package/dist/transform-webpack-runtime.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/utils.d.ts +15 -6
- package/dist/utils.js +54 -26
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +45 -16
- package/src/inject-style-component.ts +54 -0
- package/src/transform-app-config.ts +16 -5
- package/src/transform-pages-wxml.ts +34 -0
- package/src/transform-webpack-runtime.ts +3 -3
- package/src/types.ts +13 -0
- package/src/utils.ts +41 -15
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-
|
|
61
|
-
dynamicPackageNamePrefix: 'dynamic-
|
|
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
|
};
|
|
@@ -137,10 +146,49 @@ const AsyncComponent = defineAsyncComponent(() => import('./async-component')
|
|
|
137
146
|
|
|
138
147
|
## 🔧 配置选项
|
|
139
148
|
|
|
140
|
-
| 选项名 | 类型
|
|
141
|
-
|
|
142
|
-
| `dynamicPackageNamePrefix` | `string`
|
|
143
|
-
| `dynamicPackageCount` | `number`
|
|
149
|
+
| 选项名 | 类型 | 默认值 | 描述 |
|
|
150
|
+
|----------------------------|--------------------------|--------------------|-----------|
|
|
151
|
+
| `dynamicPackageNamePrefix` | `string` | `'dynamic-package'` | 异步分包名称前缀 |
|
|
152
|
+
| `dynamicPackageCount` | `number` | `1` | 异步分包数量 |
|
|
153
|
+
| `customDynamicPackages` | `CustomDynamicPackage[]` | `[]` | 自定义异步分包配置 |
|
|
154
|
+
|
|
155
|
+
### `customDynamicPackages` 配置说明
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
interface CustomDynamicPackage {
|
|
159
|
+
name: string
|
|
160
|
+
test: string | RegExp | ((module, context) => boolean)
|
|
161
|
+
asyncStyle?: boolean
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
- `name`:自定义异步分包标识,最终会拼成 `${dynamicPackageNamePrefix}-${name}`,例如 `dynamic-package-report`
|
|
166
|
+
- `test`:直接透传给 webpack `splitChunks.cacheGroups[packageName].test`,命中的异步模块会被拆到该分包
|
|
167
|
+
- `asyncStyle`:默认 `false`。开启后会为该分包额外生成 `inject-style` 组件,并自动注入到页面模板中,让该分包内样式跟随组件异步加载
|
|
168
|
+
|
|
169
|
+
### `customDynamicPackages` 配置示例
|
|
170
|
+
|
|
171
|
+
```js
|
|
172
|
+
plugins: [
|
|
173
|
+
['@taro-minify-pack/plugin-async-pack', {
|
|
174
|
+
dynamicPackageNamePrefix: 'dynamic-package',
|
|
175
|
+
dynamicPackageCount: 2,
|
|
176
|
+
customDynamicPackages: [
|
|
177
|
+
{
|
|
178
|
+
name: 'vendors',
|
|
179
|
+
test: /[\\/]node_modules[\\/](lodash-es|dayjs)[\\/]/
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: 'report',
|
|
183
|
+
test: (module) => /src[\\/]pages[\\/]report[\\/]/.test(module.resource || ''),
|
|
184
|
+
asyncStyle: true
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
}]
|
|
188
|
+
]
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
上述配置会额外生成 `dynamic-package-vendors` 和 `dynamic-package-report` 两个异步分包;其中 `report` 分包会同时产出 `inject-style` 组件,并在编译时自动追加到 `app.json` 与页面模板中。
|
|
144
192
|
|
|
145
193
|
## 🤝 常见问题
|
|
146
194
|
|
|
@@ -176,4 +224,3 @@ MIT License
|
|
|
176
224
|
欢迎提交 Issue 和 Pull Request!
|
|
177
225
|
|
|
178
226
|
> 该插件是 @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-
|
|
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
|
|
24
|
-
const {
|
|
25
|
-
const
|
|
26
|
-
return `${(
|
|
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.
|
|
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.
|
|
68
|
+
const hasDynamicModule = Object.keys(assets).some((key) => (0, utils_1.isDynamicPackageAsset)(finalOpts, key));
|
|
63
69
|
if (!hasDynamicModule)
|
|
64
70
|
return;
|
|
65
|
-
(
|
|
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":";;AAEA,2EAAqE;AACrE,+
|
|
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
|
|
24
|
-
return { root: (0, utils_1.
|
|
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
|
|
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,
|
|
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,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
|
|
99
|
+
const { assets } = opts;
|
|
100
100
|
const dynamicJsAssets = Object.keys(assets).filter((assetName) => {
|
|
101
|
-
return (0, utils_1.
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAAgD;AAChD,iEAAwC;AACxC,sDAAuC;AACvC,+DAAsC;AACtC,oDAAqC;AAMrC,
|
|
1
|
+
{"version":3,"file":"transform-webpack-runtime.js","sourceRoot":"","sources":["../src/transform-webpack-runtime.ts"],"names":[],"mappings":"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"}
|
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
|
-
|
|
2
|
+
import type { PathData } from 'webpack';
|
|
3
3
|
export declare const hashModBigInt: (hash: string, mod: number) => number;
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
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.
|
|
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
|
|
12
|
-
if (!
|
|
13
|
-
return
|
|
14
|
-
return
|
|
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.
|
|
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
|
|
22
|
-
const dynamicModuleRegExp = new RegExp(`^${
|
|
23
|
-
return dynamicModuleRegExp.test(
|
|
24
|
-
};
|
|
25
|
-
exports.
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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.
|
|
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":";;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
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 {
|
|
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 {
|
|
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-
|
|
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
|
|
34
|
-
const {
|
|
35
|
-
const
|
|
36
|
-
|
|
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) =>
|
|
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) =>
|
|
103
|
+
const hasDynamicModule = Object.keys(assets).some((key) => isDynamicPackageAsset(finalOpts, key))
|
|
84
104
|
|
|
85
105
|
if (!hasDynamicModule) return
|
|
86
106
|
|
|
87
|
-
|
|
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 {
|
|
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
|
|
21
|
-
return { root:
|
|
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
|
-
|
|
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 {
|
|
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
|
|
74
|
+
const { assets } = opts
|
|
75
75
|
|
|
76
76
|
const dynamicJsAssets = Object.keys(assets).filter((assetName) => {
|
|
77
|
-
return
|
|
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
|
|
11
|
-
if (!
|
|
12
|
-
return
|
|
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
|
|
20
|
-
const dynamicModuleRegExp = new RegExp(`^${
|
|
21
|
-
return dynamicModuleRegExp.test(
|
|
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
|
|
25
|
-
const
|
|
26
|
-
|
|
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
|
|
30
|
-
|
|
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
|
|
35
|
-
|
|
36
|
-
|
|
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
|
}
|