@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.
Files changed (42) hide show
  1. package/README.md +8 -10
  2. package/dist/index.js +46 -37
  3. package/dist/index.js.map +1 -1
  4. package/dist/inject-style-component.d.ts +14 -0
  5. package/dist/inject-style-component.js +55 -0
  6. package/dist/inject-style-component.js.map +1 -0
  7. package/dist/singleton-promise.d.ts +12 -0
  8. package/dist/singleton-promise.js +37 -0
  9. package/dist/singleton-promise.js.map +1 -0
  10. package/dist/transform-app-config.d.ts +8 -0
  11. package/dist/transform-app-config.js +33 -0
  12. package/dist/transform-app-config.js.map +1 -0
  13. package/dist/transform-pages-wxml.d.ts +7 -0
  14. package/dist/transform-pages-wxml.js +30 -0
  15. package/dist/transform-pages-wxml.js.map +1 -0
  16. package/dist/transform-react-lazy.d.ts +7 -0
  17. package/dist/transform-react-lazy.js +139 -0
  18. package/dist/transform-react-lazy.js.map +1 -0
  19. package/dist/transform-webpack-runtime.js +62 -16
  20. package/dist/transform-webpack-runtime.js.map +1 -1
  21. package/dist/types.d.ts +2 -2
  22. package/dist/utils.d.ts +13 -0
  23. package/dist/utils.js +48 -0
  24. package/dist/utils.js.map +1 -0
  25. package/package.json +3 -3
  26. package/src/index.ts +46 -40
  27. package/src/inject-style-component.ts +63 -0
  28. package/src/singleton-promise.ts +41 -0
  29. package/src/transform-app-config.ts +38 -0
  30. package/src/transform-pages-wxml.ts +35 -0
  31. package/src/transform-react-lazy.ts +132 -0
  32. package/src/transform-webpack-runtime.ts +78 -20
  33. package/src/types.ts +2 -2
  34. package/src/utils.ts +42 -0
  35. package/dist/merge-output.d.ts +0 -12
  36. package/dist/merge-output.js +0 -26
  37. package/dist/merge-output.js.map +0 -1
  38. package/dist/transform-app-stylesheet.d.ts +0 -6
  39. package/dist/transform-app-stylesheet.js +0 -14
  40. package/dist/transform-app-stylesheet.js.map +0 -1
  41. package/src/merge-output.ts +0 -33
  42. 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, dynamicModuleJsDir } = opts;
100
- const dynamicAssets = Object.keys(assets).filter((assetName) => {
101
- return new RegExp(`^${dynamicModuleJsDir}/.`).test(assetName);
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 tempCode = dynamicAssets.map((dynamicAsset) => {
105
- return `'/${dynamicAsset}':function (){ return require.async('${dynamicAsset}'); }`;
107
+ const dynamicAssetsRequireTempCode = dynamicJsAssets.map((dynamicJsAsset) => {
108
+ return `'/${dynamicJsAsset}':function (){ return require.async('~/${dynamicJsAsset}'); }`;
106
109
  });
107
- return `var loadDynamicModuleFnMap = {${tempCode.join(',')}}`;
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
- loadStylesheet = function () {
118
- return Promise.resolve()
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 templateCodeAst = core_1.template.expression(webpackLoadDynamicModuleStylesheetTemplate)();
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":"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"}
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
- dynamicModuleJsDir: string;
4
- dynamicModuleStyleFile: string;
3
+ dynamicPackageNamePrefix: string;
4
+ dynamicPackageCount: number;
5
5
  }
6
6
  export type CompilationAssets = Record<string, Source>;
@@ -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.4",
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.9",
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
- TransformOpt,
6
- TransformBeforeCompressionPlugin,
7
- PLUGIN_NAME as TransformBeforeCompressionPluginName
8
- } from './transform-before-compression-plugin'
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
- dynamicModuleJsDir: 'dynamic-common',
19
- dynamicModuleStyleFile: 'dynamic-common'
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: `${finalOpts.dynamicModuleJsDir}/[chunkhash].js`, // 异步模块输出路径
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 finalOption = { ...options, chunkFilename: `${finalOpts.dynamicModuleStyleFile}/[chunkhash].wxss` }
60
- return [finalOption]
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|app\.wxss)$/,
77
+ test: /^(runtime\.js)$/,
65
78
  transform: (opt: TransformOpt) => {
66
- const { source, assetName, assets } = opt
79
+ const { source, assets } = opt
67
80
  const transformOpts = { ...finalOpts, assets }
68
- if (/^app\.wxss$/.test(assetName)) return transformAppStylesheet(source as string, transformOpts)
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(MergeOutputPluginName).use(MergeOutputPlugin, [{
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 curAppJSON = assets['app.json']
89
+ const hasDynamicModule = Object.keys(assets).some((key) => isDynamicPackageName(finalOpts.dynamicPackageNamePrefix, key))
82
90
 
83
- if (!curAppJSON) return
91
+ if (!hasDynamicModule) return
84
92
 
85
- const curAppJSONContent = JSON.parse(curAppJSON.source())
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 dynamicPackagesConfig = { root: finalOpts.dynamicModuleJsDir, pages: [] }
102
+ const filePath = path.resolve(__dirname, './singleton-promise.js')
88
103
 
89
- const hasDynamicModule = Object.keys(assets).some((key) => key.startsWith(`${finalOpts.dynamicModuleJsDir}/`))
104
+ const fileContent = fs.readFileSync(filePath, { encoding: 'utf-8' })
90
105
 
91
- const { resolveAlias = {}, subPackages, subpackages, ...otherAppJSON } = curAppJSONContent
106
+ assets['singleton-promise.js'] = new RawSource(fileContent)
92
107
 
93
- const finalSubPackages = subPackages || subpackages || []
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
- assets['app.json'] = new RawSource(JSON.stringify(newAppJSONContent, null, 2))
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
+ }