@taro-minify-pack/plugin-async-pack 0.0.4 → 0.0.5-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -10
- package/dist/index.js +46 -37
- package/dist/index.js.map +1 -1
- package/dist/inject-style-component.d.ts +14 -0
- package/dist/inject-style-component.js +55 -0
- package/dist/inject-style-component.js.map +1 -0
- package/dist/singleton-promise.d.ts +12 -0
- package/dist/singleton-promise.js +37 -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-react-lazy.d.ts +7 -0
- package/dist/transform-react-lazy.js +139 -0
- package/dist/transform-react-lazy.js.map +1 -0
- package/dist/transform-webpack-runtime.js +62 -16
- 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 -3
- package/src/index.ts +46 -40
- package/src/inject-style-component.ts +63 -0
- package/src/singleton-promise.ts +41 -0
- package/src/transform-app-config.ts +38 -0
- package/src/transform-pages-wxml.ts +35 -0
- package/src/transform-react-lazy.ts +132 -0
- package/src/transform-webpack-runtime.ts +78 -20
- 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
|
@@ -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,15 +67,14 @@ const webpackLoadDynamicModuleTemplate = `
|
|
|
66
67
|
inProgress[dynamicModulePath].push(done);
|
|
67
68
|
return;
|
|
68
69
|
}
|
|
69
|
-
|
|
70
|
+
|
|
70
71
|
const target = { src: dynamicModulePath };
|
|
71
72
|
|
|
72
73
|
if (loadedDynamicModules[dynamicModulePath]) return done({ type: 'loaded', target });
|
|
73
74
|
|
|
74
75
|
promiseRetry(function () {
|
|
75
76
|
return loadDynamicModule(dynamicModulePath)
|
|
76
|
-
})
|
|
77
|
-
.then(function () {
|
|
77
|
+
}).then(function () {
|
|
78
78
|
return done({ type: 'loaded', target })
|
|
79
79
|
}).catch(function () {
|
|
80
80
|
return done({ type:'error', target })
|
|
@@ -96,29 +96,73 @@ const replaceWebpackLoadScriptFn = (assignmentExpressionNodePath, opts) => {
|
|
|
96
96
|
});
|
|
97
97
|
if (isProcessed)
|
|
98
98
|
return;
|
|
99
|
-
const { assets,
|
|
100
|
-
const
|
|
101
|
-
return
|
|
99
|
+
const { assets, dynamicPackageNamePrefix } = opts;
|
|
100
|
+
const dynamicJsAssets = Object.keys(assets).filter((assetName) => {
|
|
101
|
+
return (0, utils_1.isDynamicPackageJsAsset)(dynamicPackageNamePrefix, assetName);
|
|
102
|
+
});
|
|
103
|
+
const dynamicWXssAssets = Object.keys(assets).filter((assetName) => {
|
|
104
|
+
return (0, utils_1.isDynamicPackageWXssAsset)(dynamicPackageNamePrefix, assetName);
|
|
102
105
|
});
|
|
103
106
|
const loadDynamicModuleFnMapCode = (() => {
|
|
104
|
-
const
|
|
105
|
-
return `'/${
|
|
107
|
+
const dynamicAssetsRequireTempCode = dynamicJsAssets.map((dynamicJsAsset) => {
|
|
108
|
+
return `'/${dynamicJsAsset}':function (){ return require.async('~/${dynamicJsAsset}'); }`;
|
|
106
109
|
});
|
|
107
|
-
return `var loadDynamicModuleFnMap = {${
|
|
110
|
+
return `var loadDynamicModuleFnMap = {${dynamicAssetsRequireTempCode.join(',')}}`;
|
|
111
|
+
})();
|
|
112
|
+
const hasStyleDynamicAssetsListCode = (() => {
|
|
113
|
+
const hasStyleDynamicAssetsList = dynamicJsAssets.filter((dynamicJsAsset) => {
|
|
114
|
+
const matchWXssAssets = dynamicJsAsset.replace(/\.js$/, '.wxss');
|
|
115
|
+
return dynamicWXssAssets.includes(matchWXssAssets);
|
|
116
|
+
});
|
|
117
|
+
return `var hasStyleDynamicModuleList = [${hasStyleDynamicAssetsList.map(item => `'/${item}'`).join(',')}]`;
|
|
108
118
|
})();
|
|
109
119
|
const templateCodeAst = core_1.template.ast(webpackLoadDynamicModuleTemplate);
|
|
110
|
-
const templateCodeDepAst = core_1.template.ast(webpackLoadDynamicModuleTemplateDep);
|
|
111
120
|
const loadDynamicModuleFnMapAst = core_1.template.ast(loadDynamicModuleFnMapCode);
|
|
121
|
+
const hasStyleDynamicAssetsListAst = core_1.template.ast(hasStyleDynamicAssetsListCode);
|
|
122
|
+
const templateCodeDepAst = core_1.template.ast(webpackLoadDynamicModuleTemplateDep);
|
|
112
123
|
assignmentExpressionNodePath.replaceWith(templateCodeAst);
|
|
113
|
-
assignmentExpressionNodePath.insertBefore(templateCodeDepAst);
|
|
114
124
|
assignmentExpressionNodePath.insertBefore(loadDynamicModuleFnMapAst);
|
|
125
|
+
assignmentExpressionNodePath.insertBefore(hasStyleDynamicAssetsListAst);
|
|
126
|
+
assignmentExpressionNodePath.insertBefore(templateCodeDepAst);
|
|
115
127
|
};
|
|
116
128
|
const webpackLoadDynamicModuleStylesheetTemplate = `
|
|
117
|
-
|
|
118
|
-
|
|
129
|
+
__webpack_require__.f.miniCss = function (dynamicStylesheetChunkId, promises) {
|
|
130
|
+
promises.push(loadStylesheet(dynamicStylesheetChunkId))
|
|
131
|
+
}
|
|
132
|
+
`;
|
|
133
|
+
const replaceWebpackLoadDynamicModuleStylesheetFn = (assignmentExpressionNodePath) => {
|
|
134
|
+
const { left, right } = assignmentExpressionNodePath.node || {};
|
|
135
|
+
if (!types.isMemberExpression(left))
|
|
136
|
+
return;
|
|
137
|
+
if (!types.isFunctionExpression(right))
|
|
138
|
+
return;
|
|
139
|
+
if (!types.isMemberExpression(left.object))
|
|
140
|
+
return;
|
|
141
|
+
if (!types.isIdentifier(left.object.object, { name: '__webpack_require__' }))
|
|
142
|
+
return;
|
|
143
|
+
if (!types.isIdentifier(left.object.property, { name: 'f' }))
|
|
144
|
+
return;
|
|
145
|
+
if (!types.isIdentifier(left.property, { name: 'miniCss' }))
|
|
146
|
+
return;
|
|
147
|
+
const isProcessed = right.params.some((item) => {
|
|
148
|
+
return types.isIdentifier(item, { name: 'dynamicStylesheetChunkId' });
|
|
149
|
+
});
|
|
150
|
+
if (isProcessed)
|
|
151
|
+
return;
|
|
152
|
+
const templateCodeAst = core_1.template.expression(webpackLoadDynamicModuleStylesheetTemplate)();
|
|
153
|
+
assignmentExpressionNodePath.replaceWith(templateCodeAst);
|
|
154
|
+
};
|
|
155
|
+
const webpackLoadStylesheetTemplate = `
|
|
156
|
+
loadStylesheet = function (chunkId) {
|
|
157
|
+
const href = __webpack_require__.miniCssF(chunkId);
|
|
158
|
+
const fullHref = __webpack_require__.p + href;
|
|
159
|
+
const dynamicPackageNameRegex = DYNAMIC_PACKAGE_NAME_REGEX;
|
|
160
|
+
const [,dynamicPackageName] = fullHref.match(dynamicPackageNameRegex) || [];
|
|
161
|
+
const { SingletonPromise } = require('~/singleton-promise.js');
|
|
162
|
+
return SingletonPromise.wait(dynamicPackageName)
|
|
119
163
|
}
|
|
120
164
|
`;
|
|
121
|
-
const replaceLoadStylesheetFn = (nodePath) => {
|
|
165
|
+
const replaceLoadStylesheetFn = (nodePath, opts) => {
|
|
122
166
|
const { id, init } = nodePath.node || {};
|
|
123
167
|
if (!types.isIdentifier(id, { name: 'loadStylesheet' }))
|
|
124
168
|
return;
|
|
@@ -127,7 +171,9 @@ const replaceLoadStylesheetFn = (nodePath) => {
|
|
|
127
171
|
const isProcessed = !init.params.length;
|
|
128
172
|
if (isProcessed)
|
|
129
173
|
return;
|
|
130
|
-
const
|
|
174
|
+
const { dynamicPackageNamePrefix } = opts;
|
|
175
|
+
const DYNAMIC_PACKAGE_NAME_REGEX = types.regExpLiteral(`(${dynamicPackageNamePrefix}(?:-[a-z]{2})?)\\/`);
|
|
176
|
+
const templateCodeAst = core_1.template.expression(webpackLoadStylesheetTemplate)({ DYNAMIC_PACKAGE_NAME_REGEX });
|
|
131
177
|
nodePath.replaceWith(templateCodeAst);
|
|
132
178
|
};
|
|
133
179
|
const removeCreateStylesheetFn = (nodePath) => {
|
|
@@ -149,7 +195,7 @@ const transformWebpackRuntime = (code, opts) => {
|
|
|
149
195
|
replaceWebpackLoadScriptFn(nodePath, opts);
|
|
150
196
|
},
|
|
151
197
|
VariableDeclarator(nodePath) {
|
|
152
|
-
replaceLoadStylesheetFn(nodePath);
|
|
198
|
+
replaceLoadStylesheetFn(nodePath, opts);
|
|
153
199
|
removeCreateStylesheetFn(nodePath);
|
|
154
200
|
removeFindStylesheetFn(nodePath);
|
|
155
201
|
}
|
|
@@ -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,+
|
|
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.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -25,12 +25,12 @@
|
|
|
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",
|
|
32
33
|
"@types/babel__traverse": "^7.20.6",
|
|
33
|
-
"@types/md5": "^2.3.5",
|
|
34
34
|
"@types/node": "^18.19.130",
|
|
35
35
|
"@types/webpack-sources": "^3.2.3",
|
|
36
36
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
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,52 @@ 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 }]
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
chain.module
|
|
69
|
+
.rule('script')
|
|
70
|
+
.use('babelLoader')
|
|
71
|
+
.tap((opts) => {
|
|
72
|
+
const pluginConfig = path.resolve(__dirname, './transform-react-lazy')
|
|
73
|
+
return { ...opts, plugins: [pluginConfig, ...(opts.plugins || [])] }
|
|
61
74
|
})
|
|
62
75
|
|
|
63
76
|
chain.plugin(TransformBeforeCompressionPluginName).use(TransformBeforeCompressionPlugin, [{
|
|
64
|
-
test: /^(runtime\.js
|
|
77
|
+
test: /^(runtime\.js)$/,
|
|
65
78
|
transform: (opt: TransformOpt) => {
|
|
66
|
-
const { source,
|
|
79
|
+
const { source, assets } = opt
|
|
67
80
|
const transformOpts = { ...finalOpts, assets }
|
|
68
|
-
|
|
69
|
-
if (/^runtime\.js$/.test(assetName)) return transformWebpackRuntime(source as string, transformOpts)
|
|
70
|
-
return source as string
|
|
81
|
+
return transformWebpackRuntime(source as string, transformOpts)
|
|
71
82
|
}
|
|
72
83
|
}])
|
|
73
84
|
|
|
74
|
-
chain.plugin(
|
|
75
|
-
test: new RegExp(`^${finalOpts.dynamicModuleStyleFile}\\/.*\\.wxss$`),
|
|
76
|
-
outputFile: `${finalOpts.dynamicModuleStyleFile}.wxss`
|
|
77
|
-
}])
|
|
85
|
+
chain.plugin(InjectStyleComponentPluginName).use(InjectStyleComponentPlugin, [finalOpts])
|
|
78
86
|
})
|
|
79
87
|
|
|
80
88
|
ctx.modifyBuildAssets(({ assets }) => {
|
|
81
|
-
const
|
|
89
|
+
const hasDynamicModule = Object.keys(assets).some((key) => isDynamicPackageName(finalOpts.dynamicPackageNamePrefix, key))
|
|
82
90
|
|
|
83
|
-
if (!
|
|
91
|
+
if (!hasDynamicModule) return
|
|
84
92
|
|
|
85
|
-
const
|
|
93
|
+
const asyncComponents = (() => {
|
|
94
|
+
if (finalOpts.dynamicPackageCount <= 1) { return { [InjectStyleComponentName]: `${generateDynamicPackageName(finalOpts)}/${InjectStyleComponentName}` } }
|
|
95
|
+
return new Array(finalOpts.dynamicPackageCount).fill(null).reduce((result, _, order) => {
|
|
96
|
+
const dynamicPackageName = generateDynamicPackageName({ ...finalOpts, order })
|
|
97
|
+
const componentName = `${InjectStyleComponentName}-${generateKeyByOrder(order)}`
|
|
98
|
+
return { ...result, [componentName]: `${dynamicPackageName}/${InjectStyleComponentName}` }
|
|
99
|
+
}, {})
|
|
100
|
+
})()
|
|
86
101
|
|
|
87
|
-
const
|
|
102
|
+
const filePath = path.resolve(__dirname, './singleton-promise.js')
|
|
88
103
|
|
|
89
|
-
const
|
|
104
|
+
const fileContent = fs.readFileSync(filePath, { encoding: 'utf-8' })
|
|
90
105
|
|
|
91
|
-
|
|
106
|
+
assets['singleton-promise.js'] = new RawSource(fileContent)
|
|
92
107
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const newAppJSONContent = {
|
|
96
|
-
...otherAppJSON,
|
|
97
|
-
subPackages: hasDynamicModule ? [...finalSubPackages, dynamicPackagesConfig] : finalSubPackages,
|
|
98
|
-
resolveAlias: {
|
|
99
|
-
...resolveAlias,
|
|
100
|
-
[`${finalOpts.dynamicModuleJsDir}/*`]: `/${finalOpts.dynamicModuleJsDir}/*`
|
|
101
|
-
}
|
|
102
|
-
}
|
|
108
|
+
transformAppConfig({ ...finalOpts, assets, asyncComponents })
|
|
103
109
|
|
|
104
|
-
|
|
110
|
+
transformPagesWXml({ assets, asyncComponents })
|
|
105
111
|
})
|
|
106
112
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
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({
|
|
15
|
+
lifetimes: {
|
|
16
|
+
attached: () => SingletonPromise.loaded("DYNAMIC_PACKAGE_NAME"),
|
|
17
|
+
detached: () => SingletonPromise.unloaded("DYNAMIC_PACKAGE_NAME")
|
|
18
|
+
}
|
|
19
|
+
})
|
|
20
|
+
`
|
|
21
|
+
|
|
22
|
+
type Opt = AsyncPackOpts
|
|
23
|
+
|
|
24
|
+
export class InjectStyleComponentPlugin {
|
|
25
|
+
private readonly opt: Opt
|
|
26
|
+
|
|
27
|
+
private readonly WXmlContent: string = '<block/>'
|
|
28
|
+
|
|
29
|
+
private readonly JsonContent:string = '{"component": true,"styleIsolation": "shared"}'
|
|
30
|
+
|
|
31
|
+
private readonly JsContent: string = injectStyleComponentCode
|
|
32
|
+
|
|
33
|
+
constructor (opt: Opt) {
|
|
34
|
+
this.opt = opt
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
apply (compiler: Compiler) {
|
|
38
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation: Compilation) => {
|
|
39
|
+
const stage = compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL // 最早阶段,在优化前
|
|
40
|
+
|
|
41
|
+
compilation.hooks.processAssets.tap({ name: PLUGIN_NAME, stage }, (assets) => {
|
|
42
|
+
for (let order = 0; order < this.opt.dynamicPackageCount; order++) {
|
|
43
|
+
const dynamicPackageName = generateDynamicPackageName({ ...this.opt, order })
|
|
44
|
+
|
|
45
|
+
const { code: jsFileContent } = generator(template.program(this.JsContent)({ DYNAMIC_PACKAGE_NAME: dynamicPackageName }))
|
|
46
|
+
const styleFileContent = Object.keys(assets).reduce((result, assetPath) => {
|
|
47
|
+
if (!isDynamicPackageWXssAssetWithOrder({ ...this.opt, order }, assetPath)) return result
|
|
48
|
+
const relativePath = path.relative(dynamicPackageName, assetPath)
|
|
49
|
+
const code = `@import './${relativePath}';`
|
|
50
|
+
return result + code + '\n'
|
|
51
|
+
}, '')
|
|
52
|
+
|
|
53
|
+
const { RawSource } = compiler.webpack.sources
|
|
54
|
+
const componentPath = `${dynamicPackageName}/${InjectStyleComponentName}`
|
|
55
|
+
compilation.assets[`${componentPath}.js`] = new RawSource(jsFileContent)
|
|
56
|
+
compilation.assets[`${componentPath}.wxss`] = new RawSource(styleFileContent)
|
|
57
|
+
compilation.assets[`${componentPath}.wxml`] = new RawSource(this.WXmlContent)
|
|
58
|
+
compilation.assets[`${componentPath}.json`] = new RawSource(this.JsonContent)
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class SingletonPromise {
|
|
2
|
+
// 静态属性存放单例
|
|
3
|
+
private static instance?: Record<string, SingletonPromise>
|
|
4
|
+
|
|
5
|
+
private loadTimes = 0
|
|
6
|
+
|
|
7
|
+
private promise?: Promise<void>
|
|
8
|
+
|
|
9
|
+
private resolve?: () => void
|
|
10
|
+
|
|
11
|
+
constructor () {
|
|
12
|
+
this.resetPromise()
|
|
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
|
+
private resetPromise () {
|
|
22
|
+
this.promise = new Promise<void>((resolve) => {
|
|
23
|
+
this.resolve = resolve
|
|
24
|
+
})
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static wait (key:string) {
|
|
28
|
+
return this.getInstance(key).promise
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static loaded (key:string) {
|
|
32
|
+
this.getInstance(key).resolve?.()
|
|
33
|
+
this.getInstance(key).loadTimes += 1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static unloaded (key:string) {
|
|
37
|
+
this.getInstance(key).loadTimes -= 1
|
|
38
|
+
if (this.getInstance(key).loadTimes > 0) return
|
|
39
|
+
this.getInstance(key).resetPromise()
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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: { ...resolveAlias, '~/*': '/*' }
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
assets[appConfigAssetKey] = new RawSource(JSON.stringify(finalAppConfig))
|
|
38
|
+
}
|
|
@@ -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
|
+
}
|