@taro-minify-pack/plugin-async-pack 0.0.4 → 0.0.5-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 +5 -7
- package/dist/index.js +39 -37
- package/dist/index.js.map +1 -1
- package/dist/inject-style-component.d.ts +14 -0
- package/dist/inject-style-component.js +50 -0
- package/dist/inject-style-component.js.map +1 -0
- package/dist/singleton-promise.d.ts +9 -0
- package/dist/singleton-promise.js +26 -0
- package/dist/singleton-promise.js.map +1 -0
- package/dist/transform-app-config.d.ts +8 -0
- package/dist/transform-app-config.js +33 -0
- package/dist/transform-app-config.js.map +1 -0
- 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 +41 -17
- package/dist/transform-webpack-runtime.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/utils.d.ts +13 -0
- package/dist/utils.js +48 -0
- package/dist/utils.js.map +1 -0
- package/package.json +3 -2
- package/src/index.ts +38 -40
- package/src/inject-style-component.ts +58 -0
- package/src/singleton-promise.ts +28 -0
- package/src/transform-app-config.ts +41 -0
- package/src/transform-pages-wxml.ts +35 -0
- package/src/transform-webpack-runtime.ts +48 -18
- package/src/types.ts +2 -2
- package/src/utils.ts +42 -0
- package/dist/merge-output.d.ts +0 -12
- package/dist/merge-output.js +0 -26
- package/dist/merge-output.js.map +0 -1
- package/dist/transform-app-stylesheet.d.ts +0 -6
- package/dist/transform-app-stylesheet.js +0 -14
- package/dist/transform-app-stylesheet.js.map +0 -1
- package/src/merge-output.ts +0 -33
- package/src/transform-app-stylesheet.ts +0 -17
package/README.md
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
## @taro-minify-pack/plugin-async-pack
|
|
2
|
-
> 异步加载主包代码,
|
|
3
|
-
>
|
|
4
|
-
> 注:异步模块样式文件无法异步加载,已默认在主包样式文件中引入
|
|
2
|
+
> 异步加载主包代码, 优化主包体积(包含异步模块`js`与样式文件)
|
|
5
3
|
|
|
6
4
|
### 安装
|
|
7
5
|
|
|
@@ -49,10 +47,10 @@ module.exports = {
|
|
|
49
47
|
},
|
|
50
48
|
plugins: [
|
|
51
49
|
['@taro-minify-pack/plugin-async-pack', {
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
//
|
|
55
|
-
|
|
50
|
+
// 异步分包名前缀
|
|
51
|
+
dynamicPackageNamePrefix: 'dynamic-common',
|
|
52
|
+
// 异步分包数量
|
|
53
|
+
dynamicPackageCount: 2
|
|
56
54
|
}],
|
|
57
55
|
],
|
|
58
56
|
};
|
package/dist/index.js
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
-
t[p] = s[p];
|
|
6
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
-
t[p[i]] = s[p[i]];
|
|
10
|
-
}
|
|
11
|
-
return t;
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
4
|
};
|
|
13
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
14
8
|
const webpack_sources_1 = require("webpack-sources");
|
|
15
9
|
const transform_webpack_runtime_1 = require("./transform-webpack-runtime");
|
|
16
10
|
const transform_before_compression_plugin_1 = require("./transform-before-compression-plugin");
|
|
17
|
-
const
|
|
18
|
-
const
|
|
11
|
+
const inject_style_component_1 = require("./inject-style-component");
|
|
12
|
+
const transform_app_config_1 = require("./transform-app-config");
|
|
13
|
+
const transform_pages_wxml_1 = require("./transform-pages-wxml");
|
|
14
|
+
const utils_1 = require("./utils");
|
|
19
15
|
const dynamicPackOptsDefaultOpt = {
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
dynamicPackageNamePrefix: 'dynamic-common',
|
|
17
|
+
dynamicPackageCount: 1
|
|
22
18
|
};
|
|
23
19
|
exports.default = (ctx, pluginOpts) => {
|
|
24
20
|
const finalOpts = Object.assign(Object.assign({}, dynamicPackOptsDefaultOpt), pluginOpts);
|
|
@@ -30,12 +26,17 @@ exports.default = (ctx, pluginOpts) => {
|
|
|
30
26
|
const { common, vendors } = existingSplitChunks.cacheGroups;
|
|
31
27
|
const newCommonChunks = common ? Object.assign(Object.assign({}, common), { chunks: 'initial' }) : common;
|
|
32
28
|
const newVendorsChunks = vendors ? Object.assign(Object.assign({}, vendors), { chunks: 'initial' }) : vendors;
|
|
29
|
+
const generateChunkFilename = (pathData, ext) => {
|
|
30
|
+
const { chunk } = pathData;
|
|
31
|
+
const order = (0, utils_1.hashModBigInt)((chunk === null || chunk === void 0 ? void 0 : chunk.hash) || '', finalOpts.dynamicPackageCount);
|
|
32
|
+
return `${(0, utils_1.generateDynamicPackageName)(Object.assign(Object.assign({}, finalOpts), { order }))}/[chunkhash]${ext}`;
|
|
33
|
+
};
|
|
33
34
|
chain.optimization.merge({
|
|
34
35
|
splitChunks: Object.assign(Object.assign({}, existingSplitChunks), { cacheGroups: Object.assign(Object.assign({}, existingSplitChunks.cacheGroups), { common: newCommonChunks, vendors: newVendorsChunks }) })
|
|
35
36
|
});
|
|
36
37
|
chain.merge({
|
|
37
38
|
output: {
|
|
38
|
-
chunkFilename:
|
|
39
|
+
chunkFilename: (pathData) => generateChunkFilename(pathData, '.js'),
|
|
39
40
|
path: ctx.paths.outputPath,
|
|
40
41
|
clean: true
|
|
41
42
|
}
|
|
@@ -43,37 +44,38 @@ exports.default = (ctx, pluginOpts) => {
|
|
|
43
44
|
chain.plugin('miniCssExtractPlugin')
|
|
44
45
|
.tap((args) => {
|
|
45
46
|
const [options] = args;
|
|
46
|
-
const
|
|
47
|
-
return [
|
|
47
|
+
const chunkFilename = (pathData) => generateChunkFilename(pathData, '.wxss');
|
|
48
|
+
return [Object.assign(Object.assign({}, options), { chunkFilename })];
|
|
48
49
|
});
|
|
49
50
|
chain.plugin(transform_before_compression_plugin_1.PLUGIN_NAME).use(transform_before_compression_plugin_1.TransformBeforeCompressionPlugin, [{
|
|
50
|
-
test: /^(runtime\.js
|
|
51
|
+
test: /^(runtime\.js)$/,
|
|
51
52
|
transform: (opt) => {
|
|
52
|
-
const { source,
|
|
53
|
+
const { source, assets } = opt;
|
|
53
54
|
const transformOpts = Object.assign(Object.assign({}, finalOpts), { assets });
|
|
54
|
-
|
|
55
|
-
return (0, transform_app_stylesheet_1.transformAppStylesheet)(source, transformOpts);
|
|
56
|
-
if (/^runtime\.js$/.test(assetName))
|
|
57
|
-
return (0, transform_webpack_runtime_1.transformWebpackRuntime)(source, transformOpts);
|
|
58
|
-
return source;
|
|
55
|
+
return (0, transform_webpack_runtime_1.transformWebpackRuntime)(source, transformOpts);
|
|
59
56
|
}
|
|
60
57
|
}]);
|
|
61
|
-
chain.plugin(
|
|
62
|
-
test: new RegExp(`^${finalOpts.dynamicModuleStyleFile}\\/.*\\.wxss$`),
|
|
63
|
-
outputFile: `${finalOpts.dynamicModuleStyleFile}.wxss`
|
|
64
|
-
}]);
|
|
58
|
+
chain.plugin(inject_style_component_1.PLUGIN_NAME).use(inject_style_component_1.InjectStyleComponentPlugin, [finalOpts]);
|
|
65
59
|
});
|
|
66
60
|
ctx.modifyBuildAssets(({ assets }) => {
|
|
67
|
-
const
|
|
68
|
-
if (!
|
|
61
|
+
const hasDynamicModule = Object.keys(assets).some((key) => (0, utils_1.isDynamicPackageName)(finalOpts.dynamicPackageNamePrefix, key));
|
|
62
|
+
if (!hasDynamicModule)
|
|
69
63
|
return;
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
64
|
+
const asyncComponents = (() => {
|
|
65
|
+
if (finalOpts.dynamicPackageCount <= 1) {
|
|
66
|
+
return { [inject_style_component_1.InjectStyleComponentName]: `${(0, utils_1.generateDynamicPackageName)(finalOpts)}/${inject_style_component_1.InjectStyleComponentName}` };
|
|
67
|
+
}
|
|
68
|
+
return new Array(finalOpts.dynamicPackageCount).fill(null).reduce((result, _, order) => {
|
|
69
|
+
const dynamicPackageName = (0, utils_1.generateDynamicPackageName)(Object.assign(Object.assign({}, finalOpts), { order }));
|
|
70
|
+
const componentName = `${inject_style_component_1.InjectStyleComponentName}-${(0, utils_1.generateKeyByOrder)(order)}`;
|
|
71
|
+
return Object.assign(Object.assign({}, result), { [componentName]: `${dynamicPackageName}/${inject_style_component_1.InjectStyleComponentName}` });
|
|
72
|
+
}, {});
|
|
73
|
+
})();
|
|
74
|
+
const filePath = path_1.default.resolve(__dirname, './singleton-promise.js');
|
|
75
|
+
const fileContent = fs_1.default.readFileSync(filePath, { encoding: 'utf-8' });
|
|
76
|
+
assets['singleton-promise.js'] = new webpack_sources_1.RawSource(fileContent);
|
|
77
|
+
(0, transform_app_config_1.transformAppConfig)(Object.assign(Object.assign({}, finalOpts), { assets, asyncComponents }));
|
|
78
|
+
(0, transform_pages_wxml_1.transformPagesWXml)({ assets, asyncComponents });
|
|
77
79
|
});
|
|
78
80
|
};
|
|
79
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":"
|
|
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,50 @@
|
|
|
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 template_1 = __importDefault(require("@babel/template"));
|
|
9
|
+
const generator_1 = __importDefault(require("@babel/generator"));
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
exports.PLUGIN_NAME = 'InjectStyleComponent';
|
|
12
|
+
exports.InjectStyleComponentName = 'inject-style';
|
|
13
|
+
const injectStyleComponentCode = `
|
|
14
|
+
const { SingletonPromise } = require('~/singleton-promise.js')
|
|
15
|
+
Component({ lifetimes: { attached: () => SingletonPromise.resolve("DYNAMIC_PACKAGE_NAME") } })
|
|
16
|
+
`;
|
|
17
|
+
class InjectStyleComponentPlugin {
|
|
18
|
+
constructor(opt) {
|
|
19
|
+
this.WXmlContent = '<block/>';
|
|
20
|
+
this.JsonContent = '{"component": true,"styleIsolation": "shared"}';
|
|
21
|
+
this.JsContent = injectStyleComponentCode;
|
|
22
|
+
this.opt = opt;
|
|
23
|
+
}
|
|
24
|
+
apply(compiler) {
|
|
25
|
+
compiler.hooks.compilation.tap(exports.PLUGIN_NAME, (compilation) => {
|
|
26
|
+
const stage = compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL; // 最早阶段,在优化前
|
|
27
|
+
compilation.hooks.processAssets.tap({ name: exports.PLUGIN_NAME, stage }, (assets) => {
|
|
28
|
+
for (let order = 0; order < this.opt.dynamicPackageCount; order++) {
|
|
29
|
+
const dynamicPackageName = (0, utils_1.generateDynamicPackageName)(Object.assign(Object.assign({}, this.opt), { order }));
|
|
30
|
+
const { code: jsFileContent } = (0, generator_1.default)(template_1.default.program(this.JsContent)({ DYNAMIC_PACKAGE_NAME: dynamicPackageName }));
|
|
31
|
+
const styleFileContent = Object.keys(assets).reduce((result, assetPath) => {
|
|
32
|
+
if (!(0, utils_1.isDynamicPackageWXssAssetWithOrder)(Object.assign(Object.assign({}, this.opt), { order }), assetPath))
|
|
33
|
+
return result;
|
|
34
|
+
const relativePath = path_1.default.relative(dynamicPackageName, assetPath);
|
|
35
|
+
const code = `@import './${relativePath}';`;
|
|
36
|
+
return result + code + '\n';
|
|
37
|
+
}, '');
|
|
38
|
+
const { RawSource } = compiler.webpack.sources;
|
|
39
|
+
const componentPath = `${dynamicPackageName}/${exports.InjectStyleComponentName}`;
|
|
40
|
+
compilation.assets[`${componentPath}.js`] = new RawSource(jsFileContent);
|
|
41
|
+
compilation.assets[`${componentPath}.wxss`] = new RawSource(styleFileContent);
|
|
42
|
+
compilation.assets[`${componentPath}.wxml`] = new RawSource(this.WXmlContent);
|
|
43
|
+
compilation.assets[`${componentPath}.json`] = new RawSource(this.JsonContent);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.InjectStyleComponentPlugin = InjectStyleComponentPlugin;
|
|
50
|
+
//# 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,+DAAsC;AACtC,iEAAwC;AACxC,mCAAwF;AAE3E,QAAA,WAAW,GAAG,sBAAsB,CAAA;AAEpC,QAAA,wBAAwB,GAAG,cAAc,CAAA;AAEtD,MAAM,wBAAwB,GAAG;;;CAGhC,CAAA;AAID,MAAa,0BAA0B;IASrC,YAAa,GAAQ;QANJ,gBAAW,GAAW,UAAU,CAAA;QAEhC,gBAAW,GAAU,gDAAgD,CAAA;QAErE,cAAS,GAAW,wBAAwB,CAAA;QAG3D,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,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,CAAC;oBAClE,MAAM,kBAAkB,GAAG,IAAA,kCAA0B,kCAAM,IAAI,CAAC,GAAG,KAAE,KAAK,IAAG,CAAA;oBAE7E,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,IAAA,mBAAS,EAAC,kBAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAA;oBACzH,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;wBACxE,IAAI,CAAC,IAAA,0CAAkC,kCAAM,IAAI,CAAC,GAAG,KAAE,KAAK,KAAI,SAAS,CAAC;4BAAE,OAAO,MAAM,CAAA;wBACzF,MAAM,YAAY,GAAG,cAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAA;wBACjE,MAAM,IAAI,GAAG,cAAc,YAAY,IAAI,CAAA;wBAC3C,OAAO,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;oBAC7B,CAAC,EAAE,EAAE,CAAC,CAAA;oBAEN,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAA;oBAC9C,MAAM,aAAa,GAAG,GAAG,kBAAkB,IAAI,gCAAwB,EAAE,CAAA;oBACzE,WAAW,CAAC,MAAM,CAAC,GAAG,aAAa,KAAK,CAAC,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAA;oBACxE,WAAW,CAAC,MAAM,CAAC,GAAG,aAAa,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAA;oBAC7E,WAAW,CAAC,MAAM,CAAC,GAAG,aAAa,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;oBAC7E,WAAW,CAAC,MAAM,CAAC,GAAG,aAAa,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;gBAC/E,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAvCD,gEAuCC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class SingletonPromise {
|
|
2
|
+
private static instance?;
|
|
3
|
+
private promise?;
|
|
4
|
+
private resolve?;
|
|
5
|
+
constructor();
|
|
6
|
+
static getInstance(key: string): SingletonPromise;
|
|
7
|
+
static wait(key: string): Promise<void> | undefined;
|
|
8
|
+
static resolve(key: string): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SingletonPromise = void 0;
|
|
4
|
+
class SingletonPromise {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.promise = new Promise(resolve => {
|
|
7
|
+
this.resolve = resolve;
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
static getInstance(key) {
|
|
11
|
+
if (!SingletonPromise.instance)
|
|
12
|
+
SingletonPromise.instance = {};
|
|
13
|
+
if (!SingletonPromise.instance[key])
|
|
14
|
+
SingletonPromise.instance[key] = new SingletonPromise();
|
|
15
|
+
return SingletonPromise.instance[key];
|
|
16
|
+
}
|
|
17
|
+
static wait(key) {
|
|
18
|
+
return this.getInstance(key).promise;
|
|
19
|
+
}
|
|
20
|
+
static resolve(key) {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
(_b = (_a = this.getInstance(key)).resolve) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.SingletonPromise = SingletonPromise;
|
|
26
|
+
//# sourceMappingURL=singleton-promise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleton-promise.js","sourceRoot":"","sources":["../src/singleton-promise.ts"],"names":[],"mappings":";;;AAAA,MAAa,gBAAgB;IAQ3B;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAE,GAAU;QAC5B,IAAI,CAAC,gBAAgB,CAAC,QAAQ;YAAE,gBAAgB,CAAC,QAAQ,GAAG,EAAE,CAAA;QAC9D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAA;QAC5F,OAAO,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,CAAC,IAAI,CAAE,GAAU;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAA;IACtC,CAAC;IAED,MAAM,CAAC,OAAO,CAAE,GAAU;;QACxB,MAAA,MAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAC,OAAO,kDAAI,CAAA;IACnC,CAAC;CACF;AA3BD,4CA2BC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AsyncPackOpts } from './types';
|
|
2
|
+
import { RawSource } from 'webpack-sources';
|
|
3
|
+
interface Opts extends AsyncPackOpts {
|
|
4
|
+
assets: Record<string, RawSource>;
|
|
5
|
+
asyncComponents: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare const transformAppConfig: (opts: Opts) => void;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.transformAppConfig = void 0;
|
|
15
|
+
const webpack_sources_1 = require("webpack-sources");
|
|
16
|
+
const utils_1 = require("./utils");
|
|
17
|
+
const appConfigAssetKey = 'app.json';
|
|
18
|
+
const transformAppConfig = (opts) => {
|
|
19
|
+
const { dynamicPackageCount, asyncComponents, assets } = opts;
|
|
20
|
+
const curAppConfig = JSON.parse(assets[appConfigAssetKey].source());
|
|
21
|
+
const { subPackages, subpackages, resolveAlias = {}, usingComponents = {}, componentPlaceholder = {} } = curAppConfig, otherAppJSON = __rest(curAppConfig, ["subPackages", "subpackages", "resolveAlias", "usingComponents", "componentPlaceholder"]);
|
|
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: [] };
|
|
25
|
+
});
|
|
26
|
+
const asyncComponentPlaceholder = Object.keys(asyncComponents).reduce((result, item) => {
|
|
27
|
+
return Object.assign(Object.assign({}, result), { [item]: 'block' });
|
|
28
|
+
}, {});
|
|
29
|
+
const finalAppConfig = Object.assign(Object.assign({}, otherAppJSON), { usingComponents: Object.assign(Object.assign({}, usingComponents), asyncComponents), componentPlaceholder: Object.assign(Object.assign({}, componentPlaceholder), asyncComponentPlaceholder), subPackages: [...finalSubPackages, ...dynamicPackagesConfigs], resolveAlias: Object.assign(Object.assign({}, resolveAlias), { '~/*': '/*' }) });
|
|
30
|
+
assets[appConfigAssetKey] = new webpack_sources_1.RawSource(JSON.stringify(finalAppConfig));
|
|
31
|
+
};
|
|
32
|
+
exports.transformAppConfig = transformAppConfig;
|
|
33
|
+
//# sourceMappingURL=transform-app-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform-app-config.js","sourceRoot":"","sources":["../src/transform-app-config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,qDAA2C;AAC3C,mCAAoD;AAOpD,MAAM,iBAAiB,GAAG,UAAU,CAAA;AAE7B,MAAM,kBAAkB,GAAG,CAAC,IAAU,EAAE,EAAE;IAC/C,MAAM,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAE7D,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,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,sBAAsB,CAAC,EAC7D,YAAY,kCACP,YAAY,KACf,KAAK,EAAE,IAAI,MAEd,CAAA;IAED,MAAM,CAAC,iBAAiB,CAAC,GAAG,IAAI,2BAAS,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAA;AAC3E,CAAC,CAAA;AA7BY,QAAA,kBAAkB,sBA6B9B"}
|
|
@@ -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 pagesPath = (() => {
|
|
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
|
+
const asyncComponentCode = Object.keys(asyncComponents).map((item) => `<${item}/>`);
|
|
21
|
+
Object.keys(assets).forEach((assetPath) => {
|
|
22
|
+
if (!pagesPath.includes(assetPath))
|
|
23
|
+
return;
|
|
24
|
+
const source = assets[assetPath].source();
|
|
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,SAAS,GAAG,CAAC,GAAG,EAAE;;QACtB,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,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;IAEnF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACxC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAM;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAY,CAAA;QACnD,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;AAxBY,QAAA,kBAAkB,sBAwB9B"}
|
|
@@ -42,6 +42,7 @@ const generator_1 = __importDefault(require("@babel/generator"));
|
|
|
42
42
|
const parser = __importStar(require("@babel/parser"));
|
|
43
43
|
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
44
44
|
const types = __importStar(require("@babel/types"));
|
|
45
|
+
const utils_1 = require("./utils");
|
|
45
46
|
const webpackLoadDynamicModuleTemplateDep = `
|
|
46
47
|
var loadedDynamicModules = {};
|
|
47
48
|
var loadDynamicModule = function (dynamicModulePath) {
|
|
@@ -66,19 +67,29 @@ const webpackLoadDynamicModuleTemplate = `
|
|
|
66
67
|
inProgress[dynamicModulePath].push(done);
|
|
67
68
|
return;
|
|
68
69
|
}
|
|
70
|
+
|
|
71
|
+
const dynamicPackageNameRegex = DYNAMIC_PACKAGE_NAME_REGEX;
|
|
72
|
+
|
|
73
|
+
const [,dynamicPackageName] = dynamicModulePath.match(dynamicPackageNameRegex) || [];
|
|
69
74
|
|
|
70
75
|
const target = { src: dynamicModulePath };
|
|
71
76
|
|
|
72
77
|
if (loadedDynamicModules[dynamicModulePath]) return done({ type: 'loaded', target });
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
78
|
+
|
|
79
|
+
const { SingletonPromise } = require('~/singleton-promise.js');
|
|
80
|
+
|
|
81
|
+
const waitStyle = hasStyleDynamicModuleList.includes(dynamicModulePath)?SingletonPromise.wait(dynamicPackageName):Promise.resolve();
|
|
82
|
+
|
|
83
|
+
waitStyle.then(()=>{
|
|
84
|
+
promiseRetry(function () {
|
|
85
|
+
return loadDynamicModule(dynamicModulePath)
|
|
86
|
+
})
|
|
87
|
+
.then(function () {
|
|
88
|
+
return done({ type: 'loaded', target })
|
|
89
|
+
}).catch(function () {
|
|
90
|
+
return done({ type:'error', target })
|
|
91
|
+
});
|
|
76
92
|
})
|
|
77
|
-
.then(function () {
|
|
78
|
-
return done({ type: 'loaded', target })
|
|
79
|
-
}).catch(function () {
|
|
80
|
-
return done({ type:'error', target })
|
|
81
|
-
});
|
|
82
93
|
};
|
|
83
94
|
`;
|
|
84
95
|
const replaceWebpackLoadScriptFn = (assignmentExpressionNodePath, opts) => {
|
|
@@ -96,22 +107,35 @@ const replaceWebpackLoadScriptFn = (assignmentExpressionNodePath, opts) => {
|
|
|
96
107
|
});
|
|
97
108
|
if (isProcessed)
|
|
98
109
|
return;
|
|
99
|
-
const { assets,
|
|
100
|
-
const
|
|
101
|
-
return
|
|
110
|
+
const { assets, dynamicPackageNamePrefix } = opts;
|
|
111
|
+
const dynamicJsAssets = Object.keys(assets).filter((assetName) => {
|
|
112
|
+
return (0, utils_1.isDynamicPackageJsAsset)(dynamicPackageNamePrefix, assetName);
|
|
113
|
+
});
|
|
114
|
+
const dynamicWXssAssets = Object.keys(assets).filter((assetName) => {
|
|
115
|
+
return (0, utils_1.isDynamicPackageWXssAsset)(dynamicPackageNamePrefix, assetName);
|
|
102
116
|
});
|
|
103
117
|
const loadDynamicModuleFnMapCode = (() => {
|
|
104
|
-
const
|
|
105
|
-
return `'/${
|
|
118
|
+
const dynamicAssetsRequireTempCode = dynamicJsAssets.map((dynamicJsAsset) => {
|
|
119
|
+
return `'/${dynamicJsAsset}':function (){ return require.async('/${dynamicJsAsset}'); }`;
|
|
106
120
|
});
|
|
107
|
-
return `var loadDynamicModuleFnMap = {${
|
|
121
|
+
return `var loadDynamicModuleFnMap = {${dynamicAssetsRequireTempCode.join(',')}}`;
|
|
108
122
|
})();
|
|
109
|
-
const
|
|
110
|
-
|
|
123
|
+
const hasStyleDynamicAssetsListCode = (() => {
|
|
124
|
+
const hasStyleDynamicAssetsList = dynamicJsAssets.filter((dynamicJsAsset) => {
|
|
125
|
+
const matchWXssAssets = dynamicJsAsset.replace(/\.js$/, '.wxss');
|
|
126
|
+
return dynamicWXssAssets.includes(matchWXssAssets);
|
|
127
|
+
});
|
|
128
|
+
return `var hasStyleDynamicModuleList = [${hasStyleDynamicAssetsList.map(item => `'/${item}'`).join(',')}]`;
|
|
129
|
+
})();
|
|
130
|
+
const DYNAMIC_PACKAGE_NAME_REGEX = types.regExpLiteral(`(${dynamicPackageNamePrefix}(?:-[a-z]{2})?)\\/`);
|
|
131
|
+
const templateCodeAst = core_1.template.statement(webpackLoadDynamicModuleTemplate)({ DYNAMIC_PACKAGE_NAME_REGEX });
|
|
111
132
|
const loadDynamicModuleFnMapAst = core_1.template.ast(loadDynamicModuleFnMapCode);
|
|
133
|
+
const hasStyleDynamicAssetsListAst = core_1.template.ast(hasStyleDynamicAssetsListCode);
|
|
134
|
+
const templateCodeDepAst = core_1.template.ast(webpackLoadDynamicModuleTemplateDep);
|
|
112
135
|
assignmentExpressionNodePath.replaceWith(templateCodeAst);
|
|
113
|
-
assignmentExpressionNodePath.insertBefore(templateCodeDepAst);
|
|
114
136
|
assignmentExpressionNodePath.insertBefore(loadDynamicModuleFnMapAst);
|
|
137
|
+
assignmentExpressionNodePath.insertBefore(hasStyleDynamicAssetsListAst);
|
|
138
|
+
assignmentExpressionNodePath.insertBefore(templateCodeDepAst);
|
|
115
139
|
};
|
|
116
140
|
const webpackLoadDynamicModuleStylesheetTemplate = `
|
|
117
141
|
loadStylesheet = function () {
|
|
@@ -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,+DAAgD;AAChD,oDAAqC;
|
|
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,6 @@
|
|
|
1
1
|
import { Source } from 'webpack-sources';
|
|
2
2
|
export interface AsyncPackOpts {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
dynamicPackageNamePrefix: string;
|
|
4
|
+
dynamicPackageCount: number;
|
|
5
5
|
}
|
|
6
6
|
export type CompilationAssets = Record<string, Source>;
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AsyncPackOpts } from './types';
|
|
2
|
+
export declare const generateKeyByOrder: (order: number) => string;
|
|
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 isDynamicPackageWXssAssetWithOrder: (opt: AsyncPackOpts & {
|
|
9
|
+
order?: number;
|
|
10
|
+
}, assetName: string) => boolean;
|
|
11
|
+
export declare const generateDynamicPackageName: (opt: AsyncPackOpts & {
|
|
12
|
+
order?: number;
|
|
13
|
+
}) => string;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateDynamicPackageName = exports.isDynamicPackageWXssAssetWithOrder = exports.isDynamicPackageWXssAsset = exports.isDynamicPackageJsAsset = exports.isDynamicPackageName = exports.isNumber = exports.hashModBigInt = exports.generateKeyByOrder = void 0;
|
|
4
|
+
const generateKeyByOrder = (order) => {
|
|
5
|
+
const startStr = 'a'.charCodeAt(0);
|
|
6
|
+
const firstLetter = String.fromCharCode(startStr + Math.floor(order / 26));
|
|
7
|
+
const secondLetter = String.fromCharCode(startStr + order % 26);
|
|
8
|
+
return `${firstLetter}${secondLetter}`;
|
|
9
|
+
};
|
|
10
|
+
exports.generateKeyByOrder = generateKeyByOrder;
|
|
11
|
+
const hashModBigInt = (hash, mod) => {
|
|
12
|
+
if (!hash)
|
|
13
|
+
return 0;
|
|
14
|
+
return Number(BigInt('0x' + hash) % BigInt(mod));
|
|
15
|
+
};
|
|
16
|
+
exports.hashModBigInt = hashModBigInt;
|
|
17
|
+
const isNumber = (val) => {
|
|
18
|
+
return typeof val === 'number' && Number.isFinite(val);
|
|
19
|
+
};
|
|
20
|
+
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 isDynamicPackageWXssAssetWithOrder = (opt, assetName) => {
|
|
37
|
+
if (!(0, exports.isNumber)(opt.order) || opt.dynamicPackageCount <= 1)
|
|
38
|
+
return (0, exports.isDynamicPackageWXssAsset)(opt.dynamicPackageNamePrefix, assetName);
|
|
39
|
+
return new RegExp(`^${opt.dynamicPackageNamePrefix}-${(0, exports.generateKeyByOrder)(opt.order)}\\/.*\\.wxss$`).test(assetName);
|
|
40
|
+
};
|
|
41
|
+
exports.isDynamicPackageWXssAssetWithOrder = isDynamicPackageWXssAssetWithOrder;
|
|
42
|
+
const generateDynamicPackageName = (opt) => {
|
|
43
|
+
if (!(0, exports.isNumber)(opt.order) || opt.dynamicPackageCount <= 1)
|
|
44
|
+
return opt.dynamicPackageNamePrefix;
|
|
45
|
+
return `${opt.dynamicPackageNamePrefix}-${(0, exports.generateKeyByOrder)(opt.order)}`;
|
|
46
|
+
};
|
|
47
|
+
exports.generateDynamicPackageName = generateDynamicPackageName;
|
|
48
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +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,kCAAkC,GAAG,CAAC,GAAuC,EAAE,SAAiB,EAAE,EAAE;IAC/G,IAAI,CAAC,IAAA,gBAAQ,EAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,mBAAmB,IAAI,CAAC;QAAE,OAAO,IAAA,iCAAyB,EAAC,GAAG,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA;IACnI,OAAO,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,wBAAwB,IAAI,IAAA,0BAAkB,EAAC,GAAG,CAAC,KAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACtH,CAAC,CAAA;AAHY,QAAA,kCAAkC,sCAG9C;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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taro-minify-pack/plugin-async-pack",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5-alpha.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
"webpack-sources": "^3.2.3"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@tarojs/service": "^4.0.
|
|
28
|
+
"@tarojs/service": "^4.0.8",
|
|
29
|
+
"@tarojs/taro": "^4.0.8",
|
|
29
30
|
"@types/babel__core": "^7.20.5",
|
|
30
31
|
"@types/babel__generator": "^7.6.8",
|
|
31
32
|
"@types/babel__template": "^7.4.4",
|
package/src/index.ts
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
import type { IPluginContext } from '@tarojs/service'
|
|
2
|
+
import type { PathData } from 'webpack'
|
|
3
|
+
import fs from 'fs'
|
|
4
|
+
import path from 'path'
|
|
2
5
|
import { RawSource } from 'webpack-sources'
|
|
3
6
|
import { transformWebpackRuntime } from './transform-webpack-runtime'
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
} from './
|
|
9
|
-
import { MergeOutputPlugin, PLUGIN_NAME as MergeOutputPluginName } from './merge-output'
|
|
7
|
+
import { TransformOpt, TransformBeforeCompressionPlugin, PLUGIN_NAME as TransformBeforeCompressionPluginName } from './transform-before-compression-plugin'
|
|
8
|
+
import { InjectStyleComponentPlugin, PLUGIN_NAME as InjectStyleComponentPluginName, InjectStyleComponentName } from './inject-style-component'
|
|
9
|
+
import { transformAppConfig } from './transform-app-config'
|
|
10
|
+
import { transformPagesWXml } from './transform-pages-wxml'
|
|
11
|
+
import { generateDynamicPackageName, generateKeyByOrder, hashModBigInt, isDynamicPackageName } from './utils'
|
|
10
12
|
import { AsyncPackOpts } from './types'
|
|
11
|
-
import { transformAppStylesheet } from './transform-app-stylesheet'
|
|
12
|
-
import fs from 'fs'
|
|
13
|
-
import path from 'path'
|
|
14
13
|
|
|
15
14
|
export { AsyncPackOpts } from './types'
|
|
16
15
|
|
|
17
16
|
const dynamicPackOptsDefaultOpt: AsyncPackOpts = {
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
dynamicPackageNamePrefix: 'dynamic-common',
|
|
18
|
+
dynamicPackageCount: 1
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
export default (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => {
|
|
@@ -34,6 +33,12 @@ export default (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => {
|
|
|
34
33
|
|
|
35
34
|
const newVendorsChunks = vendors ? { ...vendors, chunks: 'initial' } : vendors
|
|
36
35
|
|
|
36
|
+
const generateChunkFilename = (pathData:PathData, ext:string) => {
|
|
37
|
+
const { chunk } = pathData
|
|
38
|
+
const order = hashModBigInt(chunk?.hash || '', finalOpts.dynamicPackageCount)
|
|
39
|
+
return `${generateDynamicPackageName({ ...finalOpts, order })}/[chunkhash]${ext}`
|
|
40
|
+
}
|
|
41
|
+
|
|
37
42
|
chain.optimization.merge({
|
|
38
43
|
splitChunks: {
|
|
39
44
|
...existingSplitChunks,
|
|
@@ -47,7 +52,7 @@ export default (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => {
|
|
|
47
52
|
|
|
48
53
|
chain.merge({
|
|
49
54
|
output: {
|
|
50
|
-
chunkFilename:
|
|
55
|
+
chunkFilename: (pathData:PathData) => generateChunkFilename(pathData, '.js'),
|
|
51
56
|
path: ctx.paths.outputPath,
|
|
52
57
|
clean: true
|
|
53
58
|
}
|
|
@@ -56,51 +61,44 @@ export default (ctx: IPluginContext, pluginOpts: AsyncPackOpts) => {
|
|
|
56
61
|
chain.plugin('miniCssExtractPlugin')
|
|
57
62
|
.tap((args) => {
|
|
58
63
|
const [options] = args
|
|
59
|
-
const
|
|
60
|
-
return [
|
|
64
|
+
const chunkFilename = (pathData:PathData) => generateChunkFilename(pathData, '.wxss')
|
|
65
|
+
return [{ ...options, chunkFilename }]
|
|
61
66
|
})
|
|
62
67
|
|
|
63
68
|
chain.plugin(TransformBeforeCompressionPluginName).use(TransformBeforeCompressionPlugin, [{
|
|
64
|
-
test: /^(runtime\.js
|
|
69
|
+
test: /^(runtime\.js)$/,
|
|
65
70
|
transform: (opt: TransformOpt) => {
|
|
66
|
-
const { source,
|
|
71
|
+
const { source, assets } = opt
|
|
67
72
|
const transformOpts = { ...finalOpts, assets }
|
|
68
|
-
|
|
69
|
-
if (/^runtime\.js$/.test(assetName)) return transformWebpackRuntime(source as string, transformOpts)
|
|
70
|
-
return source as string
|
|
73
|
+
return transformWebpackRuntime(source as string, transformOpts)
|
|
71
74
|
}
|
|
72
75
|
}])
|
|
73
76
|
|
|
74
|
-
chain.plugin(
|
|
75
|
-
test: new RegExp(`^${finalOpts.dynamicModuleStyleFile}\\/.*\\.wxss$`),
|
|
76
|
-
outputFile: `${finalOpts.dynamicModuleStyleFile}.wxss`
|
|
77
|
-
}])
|
|
77
|
+
chain.plugin(InjectStyleComponentPluginName).use(InjectStyleComponentPlugin, [finalOpts])
|
|
78
78
|
})
|
|
79
79
|
|
|
80
80
|
ctx.modifyBuildAssets(({ assets }) => {
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
if (!curAppJSON) return
|
|
81
|
+
const hasDynamicModule = Object.keys(assets).some((key) => isDynamicPackageName(finalOpts.dynamicPackageNamePrefix, key))
|
|
84
82
|
|
|
85
|
-
|
|
83
|
+
if (!hasDynamicModule) return
|
|
86
84
|
|
|
87
|
-
const
|
|
85
|
+
const asyncComponents = (() => {
|
|
86
|
+
if (finalOpts.dynamicPackageCount <= 1) { return { [InjectStyleComponentName]: `${generateDynamicPackageName(finalOpts)}/${InjectStyleComponentName}` } }
|
|
87
|
+
return new Array(finalOpts.dynamicPackageCount).fill(null).reduce((result, _, order) => {
|
|
88
|
+
const dynamicPackageName = generateDynamicPackageName({ ...finalOpts, order })
|
|
89
|
+
const componentName = `${InjectStyleComponentName}-${generateKeyByOrder(order)}`
|
|
90
|
+
return { ...result, [componentName]: `${dynamicPackageName}/${InjectStyleComponentName}` }
|
|
91
|
+
}, {})
|
|
92
|
+
})()
|
|
88
93
|
|
|
89
|
-
const
|
|
94
|
+
const filePath = path.resolve(__dirname, './singleton-promise.js')
|
|
90
95
|
|
|
91
|
-
const
|
|
96
|
+
const fileContent = fs.readFileSync(filePath, { encoding: 'utf-8' })
|
|
92
97
|
|
|
93
|
-
|
|
98
|
+
assets['singleton-promise.js'] = new RawSource(fileContent)
|
|
94
99
|
|
|
95
|
-
|
|
96
|
-
...otherAppJSON,
|
|
97
|
-
subPackages: hasDynamicModule ? [...finalSubPackages, dynamicPackagesConfig] : finalSubPackages,
|
|
98
|
-
resolveAlias: {
|
|
99
|
-
...resolveAlias,
|
|
100
|
-
[`${finalOpts.dynamicModuleJsDir}/*`]: `/${finalOpts.dynamicModuleJsDir}/*`
|
|
101
|
-
}
|
|
102
|
-
}
|
|
100
|
+
transformAppConfig({ ...finalOpts, assets, asyncComponents })
|
|
103
101
|
|
|
104
|
-
|
|
102
|
+
transformPagesWXml({ assets, asyncComponents })
|
|
105
103
|
})
|
|
106
104
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Compiler, Compilation } from 'webpack'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
import { AsyncPackOpts } from './types'
|
|
4
|
+
import template from '@babel/template'
|
|
5
|
+
import generator from '@babel/generator'
|
|
6
|
+
import { generateDynamicPackageName, isDynamicPackageWXssAssetWithOrder } from './utils'
|
|
7
|
+
|
|
8
|
+
export const PLUGIN_NAME = 'InjectStyleComponent'
|
|
9
|
+
|
|
10
|
+
export const InjectStyleComponentName = 'inject-style'
|
|
11
|
+
|
|
12
|
+
const injectStyleComponentCode = `
|
|
13
|
+
const { SingletonPromise } = require('~/singleton-promise.js')
|
|
14
|
+
Component({ lifetimes: { attached: () => SingletonPromise.resolve("DYNAMIC_PACKAGE_NAME") } })
|
|
15
|
+
`
|
|
16
|
+
|
|
17
|
+
type Opt = AsyncPackOpts
|
|
18
|
+
|
|
19
|
+
export class InjectStyleComponentPlugin {
|
|
20
|
+
private readonly opt: Opt
|
|
21
|
+
|
|
22
|
+
private readonly WXmlContent: string = '<block/>'
|
|
23
|
+
|
|
24
|
+
private readonly JsonContent:string = '{"component": true,"styleIsolation": "shared"}'
|
|
25
|
+
|
|
26
|
+
private readonly JsContent: string = injectStyleComponentCode
|
|
27
|
+
|
|
28
|
+
constructor (opt: Opt) {
|
|
29
|
+
this.opt = opt
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
apply (compiler: Compiler) {
|
|
33
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation: Compilation) => {
|
|
34
|
+
const stage = compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL // 最早阶段,在优化前
|
|
35
|
+
|
|
36
|
+
compilation.hooks.processAssets.tap({ name: PLUGIN_NAME, stage }, (assets) => {
|
|
37
|
+
for (let order = 0; order < this.opt.dynamicPackageCount; order++) {
|
|
38
|
+
const dynamicPackageName = generateDynamicPackageName({ ...this.opt, order })
|
|
39
|
+
|
|
40
|
+
const { code: jsFileContent } = generator(template.program(this.JsContent)({ DYNAMIC_PACKAGE_NAME: dynamicPackageName }))
|
|
41
|
+
const styleFileContent = Object.keys(assets).reduce((result, assetPath) => {
|
|
42
|
+
if (!isDynamicPackageWXssAssetWithOrder({ ...this.opt, order }, assetPath)) return result
|
|
43
|
+
const relativePath = path.relative(dynamicPackageName, assetPath)
|
|
44
|
+
const code = `@import './${relativePath}';`
|
|
45
|
+
return result + code + '\n'
|
|
46
|
+
}, '')
|
|
47
|
+
|
|
48
|
+
const { RawSource } = compiler.webpack.sources
|
|
49
|
+
const componentPath = `${dynamicPackageName}/${InjectStyleComponentName}`
|
|
50
|
+
compilation.assets[`${componentPath}.js`] = new RawSource(jsFileContent)
|
|
51
|
+
compilation.assets[`${componentPath}.wxss`] = new RawSource(styleFileContent)
|
|
52
|
+
compilation.assets[`${componentPath}.wxml`] = new RawSource(this.WXmlContent)
|
|
53
|
+
compilation.assets[`${componentPath}.json`] = new RawSource(this.JsonContent)
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class SingletonPromise {
|
|
2
|
+
// 静态属性存放单例
|
|
3
|
+
private static instance?: Record<string, SingletonPromise>
|
|
4
|
+
|
|
5
|
+
private promise?: Promise<void>
|
|
6
|
+
|
|
7
|
+
private resolve?: () => void
|
|
8
|
+
|
|
9
|
+
constructor () {
|
|
10
|
+
this.promise = new Promise<void>(resolve => {
|
|
11
|
+
this.resolve = resolve
|
|
12
|
+
})
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static getInstance (key:string) {
|
|
16
|
+
if (!SingletonPromise.instance) SingletonPromise.instance = {}
|
|
17
|
+
if (!SingletonPromise.instance[key]) SingletonPromise.instance[key] = new SingletonPromise()
|
|
18
|
+
return SingletonPromise.instance[key]
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static wait (key:string) {
|
|
22
|
+
return this.getInstance(key).promise
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
static resolve (key:string) {
|
|
26
|
+
this.getInstance(key).resolve?.()
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AsyncPackOpts } from './types'
|
|
2
|
+
import { RawSource } from 'webpack-sources'
|
|
3
|
+
import { generateDynamicPackageName } from './utils'
|
|
4
|
+
|
|
5
|
+
interface Opts extends AsyncPackOpts {
|
|
6
|
+
assets: Record<string, RawSource>
|
|
7
|
+
asyncComponents: Record<string, string>
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const appConfigAssetKey = 'app.json'
|
|
11
|
+
|
|
12
|
+
export const transformAppConfig = (opts: Opts) => {
|
|
13
|
+
const { dynamicPackageCount, asyncComponents, assets } = opts
|
|
14
|
+
|
|
15
|
+
const curAppConfig = JSON.parse(assets[appConfigAssetKey].source() as string)
|
|
16
|
+
|
|
17
|
+
const { subPackages, subpackages, resolveAlias = {}, usingComponents = {}, componentPlaceholder = {}, ...otherAppJSON } = curAppConfig
|
|
18
|
+
|
|
19
|
+
const finalSubPackages = subPackages || subpackages || []
|
|
20
|
+
|
|
21
|
+
const dynamicPackagesConfigs = new Array(dynamicPackageCount).fill(null).map((_, order) => {
|
|
22
|
+
return { root: generateDynamicPackageName({ ...opts, order }), pages: [] }
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const asyncComponentPlaceholder = Object.keys(asyncComponents).reduce((result, item) => {
|
|
26
|
+
return { ...result, [item]: 'block' }
|
|
27
|
+
}, {})
|
|
28
|
+
|
|
29
|
+
const finalAppConfig = {
|
|
30
|
+
...otherAppJSON,
|
|
31
|
+
usingComponents: { ...usingComponents, ...asyncComponents },
|
|
32
|
+
componentPlaceholder: { ...componentPlaceholder, ...asyncComponentPlaceholder },
|
|
33
|
+
subPackages: [...finalSubPackages, ...dynamicPackagesConfigs],
|
|
34
|
+
resolveAlias: {
|
|
35
|
+
...resolveAlias,
|
|
36
|
+
'~/*': '/*'
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
assets[appConfigAssetKey] = new RawSource(JSON.stringify(finalAppConfig))
|
|
41
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
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 pagesPath = (() => {
|
|
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
|
+
const asyncComponentCode = Object.keys(asyncComponents).map((item) => `<${item}/>`)
|
|
28
|
+
|
|
29
|
+
Object.keys(assets).forEach((assetPath) => {
|
|
30
|
+
if (!pagesPath.includes(assetPath)) return
|
|
31
|
+
const source = assets[assetPath].source() as string
|
|
32
|
+
const tempCode = [source, ...asyncComponentCode].join('\n')
|
|
33
|
+
assets[assetPath] = new RawSource(tempCode)
|
|
34
|
+
})
|
|
35
|
+
}
|
|
@@ -5,6 +5,7 @@ import traverse, { Node } from '@babel/traverse'
|
|
|
5
5
|
import * as types from '@babel/types'
|
|
6
6
|
import type { AssignmentExpression, VariableDeclarator } from '@babel/types'
|
|
7
7
|
import type { CompilationAssets, AsyncPackOpts } from './types'
|
|
8
|
+
import { isDynamicPackageJsAsset, isDynamicPackageWXssAsset } from './utils'
|
|
8
9
|
|
|
9
10
|
interface Opts extends AsyncPackOpts {
|
|
10
11
|
assets: CompilationAssets;
|
|
@@ -35,19 +36,29 @@ const webpackLoadDynamicModuleTemplate = `
|
|
|
35
36
|
inProgress[dynamicModulePath].push(done);
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
39
|
+
|
|
40
|
+
const dynamicPackageNameRegex = DYNAMIC_PACKAGE_NAME_REGEX;
|
|
41
|
+
|
|
42
|
+
const [,dynamicPackageName] = dynamicModulePath.match(dynamicPackageNameRegex) || [];
|
|
38
43
|
|
|
39
44
|
const target = { src: dynamicModulePath };
|
|
40
45
|
|
|
41
46
|
if (loadedDynamicModules[dynamicModulePath]) return done({ type: 'loaded', target });
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
47
|
+
|
|
48
|
+
const { SingletonPromise } = require('~/singleton-promise.js');
|
|
49
|
+
|
|
50
|
+
const waitStyle = hasStyleDynamicModuleList.includes(dynamicModulePath)?SingletonPromise.wait(dynamicPackageName):Promise.resolve();
|
|
51
|
+
|
|
52
|
+
waitStyle.then(()=>{
|
|
53
|
+
promiseRetry(function () {
|
|
54
|
+
return loadDynamicModule(dynamicModulePath)
|
|
55
|
+
})
|
|
56
|
+
.then(function () {
|
|
57
|
+
return done({ type: 'loaded', target })
|
|
58
|
+
}).catch(function () {
|
|
59
|
+
return done({ type:'error', target })
|
|
60
|
+
});
|
|
45
61
|
})
|
|
46
|
-
.then(function () {
|
|
47
|
-
return done({ type: 'loaded', target })
|
|
48
|
-
}).catch(function () {
|
|
49
|
-
return done({ type:'error', target })
|
|
50
|
-
});
|
|
51
62
|
};
|
|
52
63
|
`
|
|
53
64
|
|
|
@@ -68,30 +79,49 @@ const replaceWebpackLoadScriptFn = (assignmentExpressionNodePath: NodePath<Assig
|
|
|
68
79
|
|
|
69
80
|
if (isProcessed) return
|
|
70
81
|
|
|
71
|
-
const { assets,
|
|
82
|
+
const { assets, dynamicPackageNamePrefix } = opts
|
|
83
|
+
|
|
84
|
+
const dynamicJsAssets = Object.keys(assets).filter((assetName) => {
|
|
85
|
+
return isDynamicPackageJsAsset(dynamicPackageNamePrefix, assetName)
|
|
86
|
+
})
|
|
72
87
|
|
|
73
|
-
const
|
|
74
|
-
return
|
|
88
|
+
const dynamicWXssAssets = Object.keys(assets).filter((assetName) => {
|
|
89
|
+
return isDynamicPackageWXssAsset(dynamicPackageNamePrefix, assetName)
|
|
75
90
|
})
|
|
76
91
|
|
|
77
92
|
const loadDynamicModuleFnMapCode = (() => {
|
|
78
|
-
const
|
|
79
|
-
return `'/${
|
|
93
|
+
const dynamicAssetsRequireTempCode = dynamicJsAssets.map((dynamicJsAsset) => {
|
|
94
|
+
return `'/${dynamicJsAsset}':function (){ return require.async('/${dynamicJsAsset}'); }`
|
|
80
95
|
})
|
|
81
|
-
|
|
96
|
+
|
|
97
|
+
return `var loadDynamicModuleFnMap = {${dynamicAssetsRequireTempCode.join(',')}}`
|
|
82
98
|
})()
|
|
83
99
|
|
|
84
|
-
const
|
|
100
|
+
const hasStyleDynamicAssetsListCode = (() => {
|
|
101
|
+
const hasStyleDynamicAssetsList = dynamicJsAssets.filter((dynamicJsAsset) => {
|
|
102
|
+
const matchWXssAssets = dynamicJsAsset.replace(/\.js$/, '.wxss')
|
|
103
|
+
return dynamicWXssAssets.includes(matchWXssAssets)
|
|
104
|
+
})
|
|
105
|
+
return `var hasStyleDynamicModuleList = [${hasStyleDynamicAssetsList.map(item => `'/${item}'`).join(',')}]`
|
|
106
|
+
})()
|
|
85
107
|
|
|
86
|
-
const
|
|
108
|
+
const DYNAMIC_PACKAGE_NAME_REGEX = types.regExpLiteral(`(${dynamicPackageNamePrefix}(?:-[a-z]{2})?)\\/`)
|
|
109
|
+
|
|
110
|
+
const templateCodeAst = template.statement(webpackLoadDynamicModuleTemplate)({ DYNAMIC_PACKAGE_NAME_REGEX })
|
|
87
111
|
|
|
88
112
|
const loadDynamicModuleFnMapAst = template.ast(loadDynamicModuleFnMapCode)
|
|
89
113
|
|
|
90
|
-
|
|
114
|
+
const hasStyleDynamicAssetsListAst = template.ast(hasStyleDynamicAssetsListCode)
|
|
91
115
|
|
|
92
|
-
|
|
116
|
+
const templateCodeDepAst = template.ast(webpackLoadDynamicModuleTemplateDep)
|
|
117
|
+
|
|
118
|
+
assignmentExpressionNodePath.replaceWith(templateCodeAst)
|
|
93
119
|
|
|
94
120
|
assignmentExpressionNodePath.insertBefore(loadDynamicModuleFnMapAst)
|
|
121
|
+
|
|
122
|
+
assignmentExpressionNodePath.insertBefore(hasStyleDynamicAssetsListAst)
|
|
123
|
+
|
|
124
|
+
assignmentExpressionNodePath.insertBefore(templateCodeDepAst)
|
|
95
125
|
}
|
|
96
126
|
|
|
97
127
|
const webpackLoadDynamicModuleStylesheetTemplate = `
|
package/src/types.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Source } from 'webpack-sources'
|
|
2
2
|
|
|
3
3
|
export interface AsyncPackOpts {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
dynamicPackageNamePrefix: string;
|
|
5
|
+
dynamicPackageCount: number;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export type CompilationAssets = Record<string, Source>;
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AsyncPackOpts } from './types'
|
|
2
|
+
|
|
3
|
+
export const generateKeyByOrder = (order: number) => {
|
|
4
|
+
const startStr = 'a'.charCodeAt(0)
|
|
5
|
+
const firstLetter = String.fromCharCode(startStr + Math.floor(order / 26))
|
|
6
|
+
const secondLetter = String.fromCharCode(startStr + order % 26)
|
|
7
|
+
return `${firstLetter}${secondLetter}`
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const hashModBigInt = (hash: string, mod: number) => {
|
|
11
|
+
if (!hash) return 0
|
|
12
|
+
return Number(BigInt('0x' + hash) % BigInt(mod))
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const isNumber = (val: any) => {
|
|
16
|
+
return typeof val === 'number' && Number.isFinite(val)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const isDynamicPackageName = (prefix: string, packageName: string) => {
|
|
20
|
+
const dynamicModuleRegExp = new RegExp(`^${prefix}(?:-[a-z]{2})?/`)
|
|
21
|
+
return dynamicModuleRegExp.test(packageName)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const isDynamicPackageJsAsset = (prefix: string, assetName: string) => {
|
|
25
|
+
const dynamicJsAssetRegExp = new RegExp(`^${prefix}(?:-[a-z]{2})?\\/.*\\.js$`)
|
|
26
|
+
return dynamicJsAssetRegExp.test(assetName)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const isDynamicPackageWXssAsset = (prefix: string, assetName: string) => {
|
|
30
|
+
const dynamicWXssAssetRegExp = new RegExp(`^${prefix}(?:-[a-z]{2})?\\/.*\\.wxss$`)
|
|
31
|
+
return dynamicWXssAssetRegExp.test(assetName)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const isDynamicPackageWXssAssetWithOrder = (opt: AsyncPackOpts & { order?: number }, assetName: string) => {
|
|
35
|
+
if (!isNumber(opt.order) || opt.dynamicPackageCount <= 1) return isDynamicPackageWXssAsset(opt.dynamicPackageNamePrefix, assetName)
|
|
36
|
+
return new RegExp(`^${opt.dynamicPackageNamePrefix}-${generateKeyByOrder(opt.order!)}\\/.*\\.wxss$`).test(assetName)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const generateDynamicPackageName = (opt: AsyncPackOpts & { order?: number }) => {
|
|
40
|
+
if (!isNumber(opt.order) || opt.dynamicPackageCount <= 1) return opt.dynamicPackageNamePrefix
|
|
41
|
+
return `${opt.dynamicPackageNamePrefix}-${generateKeyByOrder(opt.order!)}`
|
|
42
|
+
}
|
package/dist/merge-output.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Compiler } from 'webpack';
|
|
2
|
-
export declare const PLUGIN_NAME = "MergeOutput";
|
|
3
|
-
interface MergeOutputOpt {
|
|
4
|
-
test: RegExp;
|
|
5
|
-
outputFile: string;
|
|
6
|
-
}
|
|
7
|
-
export declare class MergeOutputPlugin {
|
|
8
|
-
private readonly opts;
|
|
9
|
-
constructor(opts: MergeOutputOpt);
|
|
10
|
-
apply(compiler: Compiler): void;
|
|
11
|
-
}
|
|
12
|
-
export {};
|
package/dist/merge-output.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MergeOutputPlugin = exports.PLUGIN_NAME = void 0;
|
|
4
|
-
exports.PLUGIN_NAME = 'MergeOutput';
|
|
5
|
-
class MergeOutputPlugin {
|
|
6
|
-
constructor(opts) {
|
|
7
|
-
this.opts = opts;
|
|
8
|
-
}
|
|
9
|
-
apply(compiler) {
|
|
10
|
-
compiler.hooks.compilation.tap(exports.PLUGIN_NAME, (compilation) => {
|
|
11
|
-
const stage = compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL; // 最早阶段,在优化前
|
|
12
|
-
compilation.hooks.processAssets.tap({ name: exports.PLUGIN_NAME, stage }, (assets) => {
|
|
13
|
-
const mergedResult = Object.keys(assets).reduce((result, item) => {
|
|
14
|
-
if (!this.opts.test.test(item))
|
|
15
|
-
return result;
|
|
16
|
-
const code = assets[item].source().toString();
|
|
17
|
-
delete assets[item];
|
|
18
|
-
return result + code + '\n';
|
|
19
|
-
}, '');
|
|
20
|
-
compilation.assets[this.opts.outputFile] = new compiler.webpack.sources.RawSource(mergedResult);
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
exports.MergeOutputPlugin = MergeOutputPlugin;
|
|
26
|
-
//# sourceMappingURL=merge-output.js.map
|
package/dist/merge-output.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-output.js","sourceRoot":"","sources":["../src/merge-output.ts"],"names":[],"mappings":";;;AAEa,QAAA,WAAW,GAAG,aAAa,CAAA;AAOxC,MAAa,iBAAiB;IAG5B,YAAa,IAAoB;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,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,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;oBAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,OAAO,MAAM,CAAA;oBAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAA;oBAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;oBACnB,OAAO,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;gBAC7B,CAAC,EAAE,EAAE,CAAC,CAAA;gBAEN,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAW,CAAC,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;YAClG,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAvBD,8CAuBC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.transformAppStylesheet = void 0;
|
|
4
|
-
const transformAppStylesheet = (code, opts) => {
|
|
5
|
-
const { dynamicModuleStyleFile, assets } = opts;
|
|
6
|
-
const isDynamicModuleStyleFileExist = Object.keys(assets).some(assetName => {
|
|
7
|
-
return new RegExp(`${dynamicModuleStyleFile}\\.wxss`).test(assetName);
|
|
8
|
-
});
|
|
9
|
-
if (!isDynamicModuleStyleFileExist)
|
|
10
|
-
return code;
|
|
11
|
-
return code.concat(`@import './${dynamicModuleStyleFile}.wxss';`);
|
|
12
|
-
};
|
|
13
|
-
exports.transformAppStylesheet = transformAppStylesheet;
|
|
14
|
-
//# sourceMappingURL=transform-app-stylesheet.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transform-app-stylesheet.js","sourceRoot":"","sources":["../src/transform-app-stylesheet.ts"],"names":[],"mappings":";;;AAMO,MAAM,sBAAsB,GAAG,CAAC,IAAY,EAAE,IAAU,EAAE,EAAE;IACjE,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAE/C,MAAM,6BAA6B,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QACzE,OAAO,IAAI,MAAM,CAAC,GAAG,sBAAsB,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6BAA6B;QAAE,OAAO,IAAI,CAAA;IAE/C,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,sBAAsB,SAAS,CAAC,CAAA;AACnE,CAAC,CAAA;AAVY,QAAA,sBAAsB,0BAUlC"}
|
package/src/merge-output.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Compiler, Compilation } from 'webpack'
|
|
2
|
-
|
|
3
|
-
export const PLUGIN_NAME = 'MergeOutput'
|
|
4
|
-
|
|
5
|
-
interface MergeOutputOpt {
|
|
6
|
-
test: RegExp,
|
|
7
|
-
outputFile: string,
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export class MergeOutputPlugin {
|
|
11
|
-
private readonly opts: MergeOutputOpt
|
|
12
|
-
|
|
13
|
-
constructor (opts: MergeOutputOpt) {
|
|
14
|
-
this.opts = opts
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
apply (compiler: Compiler) {
|
|
18
|
-
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation: Compilation) => {
|
|
19
|
-
const stage = compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL // 最早阶段,在优化前
|
|
20
|
-
|
|
21
|
-
compilation.hooks.processAssets.tap({ name: PLUGIN_NAME, stage }, (assets) => {
|
|
22
|
-
const mergedResult = Object.keys(assets).reduce((result, item) => {
|
|
23
|
-
if (!this.opts.test.test(item)) return result
|
|
24
|
-
const code = assets[item].source().toString()
|
|
25
|
-
delete assets[item]
|
|
26
|
-
return result + code + '\n'
|
|
27
|
-
}, '')
|
|
28
|
-
|
|
29
|
-
compilation.assets[this.opts.outputFile!] = new compiler.webpack.sources.RawSource(mergedResult)
|
|
30
|
-
})
|
|
31
|
-
})
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { CompilationAssets, AsyncPackOpts } from './types'
|
|
2
|
-
|
|
3
|
-
interface Opts extends AsyncPackOpts {
|
|
4
|
-
assets: CompilationAssets;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export const transformAppStylesheet = (code: string, opts: Opts) => {
|
|
8
|
-
const { dynamicModuleStyleFile, assets } = opts
|
|
9
|
-
|
|
10
|
-
const isDynamicModuleStyleFileExist = Object.keys(assets).some(assetName => {
|
|
11
|
-
return new RegExp(`${dynamicModuleStyleFile}\\.wxss`).test(assetName)
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
if (!isDynamicModuleStyleFileExist) return code
|
|
15
|
-
|
|
16
|
-
return code.concat(`@import './${dynamicModuleStyleFile}.wxss';`)
|
|
17
|
-
}
|