@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
@@ -0,0 +1,132 @@
1
+ import { PluginObj, NodePath, PluginPass } from '@babel/core'
2
+ import * as types from '@babel/types'
3
+ import { CallExpression, ImportDeclaration, Program, VariableDeclarator } from '@babel/types'
4
+
5
+ const customLazySource = '@taro-minify-pack/react-lazy-enhanced'
6
+
7
+ interface State extends PluginPass {
8
+ reactNamespaces: Set<string>;
9
+ reactLazyBindings: Set<string>;
10
+ }
11
+
12
+ export default (): PluginObj<State> => {
13
+ return {
14
+ visitor: {
15
+ Program: {
16
+ enter (programPath: NodePath<Program>, state: State) {
17
+ const { filename = '' } = state
18
+
19
+ if (new RegExp(customLazySource).test(filename)) return
20
+
21
+ state.reactNamespaces = new Set()
22
+
23
+ state.reactLazyBindings = new Set()
24
+
25
+ programPath.traverse({
26
+ ImportDeclaration (path: NodePath<ImportDeclaration>) {
27
+ if (!types.isStringLiteral(path.node.source, { value: 'react' })) return
28
+
29
+ const { specifiers } = path.node
30
+
31
+ specifiers.forEach((spec) => {
32
+ const { name } = spec.local
33
+
34
+ // import React from 'react'
35
+ if (types.isImportDefaultSpecifier(spec)) return state.reactNamespaces.add(name)
36
+
37
+ // import * as React from 'react'
38
+ if (types.isImportNamespaceSpecifier(spec)) return state.reactNamespaces.add(name)
39
+
40
+ // import { lazy } from 'react'
41
+ if (types.isImportSpecifier(spec) && types.isIdentifier(spec.imported, { name: 'lazy' })) {
42
+ state.reactLazyBindings.add(name)
43
+ }
44
+ })
45
+ }
46
+ })
47
+
48
+ programPath.traverse({
49
+ VariableDeclarator (path: NodePath<VariableDeclarator>) {
50
+ const { id, init } = path.node
51
+
52
+ // const a = React.lazy
53
+ if (types.isIdentifier(id)) {
54
+ if (!types.isMemberExpression(init)) return
55
+
56
+ if (!types.isIdentifier(init.object)) return
57
+
58
+ if (!types.isIdentifier(init.property, { name: 'lazy' })) return
59
+
60
+ if (!state.reactNamespaces.has(init.object.name)) return
61
+
62
+ state.reactLazyBindings.add(id.name)
63
+ }
64
+
65
+ // const { lazy: a } = React;
66
+ if (types.isObjectPattern(id) && types.isIdentifier(init)) {
67
+ const { properties } = id
68
+
69
+ if (!state.reactNamespaces.has(init.name)) return
70
+
71
+ properties.forEach((prop) => {
72
+ if (!types.isObjectProperty(prop)) return
73
+
74
+ if (!types.isIdentifier(prop.key, { name: 'lazy' })) return
75
+
76
+ if (!types.isIdentifier(prop.value)) return
77
+
78
+ state.reactLazyBindings.add(prop.value.name)
79
+ })
80
+ }
81
+ }
82
+ })
83
+ },
84
+
85
+ exit (programPath: NodePath<Program>, state: State) {
86
+ const { filename = '' } = state
87
+
88
+ if (new RegExp(customLazySource).test(filename)) return
89
+
90
+ let needInject = false
91
+
92
+ const customLazyId = programPath.scope.generateUidIdentifier('customLazy')
93
+
94
+ programPath.traverse({
95
+ CallExpression (path: NodePath<CallExpression>) {
96
+ const { callee } = path.node
97
+
98
+ if (types.isMemberExpression(callee)) {
99
+ if (!types.isIdentifier(callee.object)) return
100
+
101
+ if (!state.reactNamespaces.has(callee.object.name)) return
102
+
103
+ if (!types.isIdentifier(callee.property, { name: 'lazy' })) return
104
+
105
+ path.node.callee = customLazyId
106
+
107
+ needInject = true
108
+ }
109
+
110
+ if (types.isIdentifier(callee) && state.reactLazyBindings.has(callee.name)) {
111
+ path.node.callee = customLazyId
112
+ needInject = true
113
+ }
114
+ }
115
+ })
116
+
117
+ const hasImport = programPath.node.body.some((node) => {
118
+ return types.isImportDeclaration(node) && node.source.value === customLazySource
119
+ })
120
+
121
+ if (hasImport || !needInject) return
122
+
123
+ const specifier = types.importSpecifier(customLazyId, types.identifier('lazy'))
124
+
125
+ const nodes = types.importDeclaration([specifier], types.stringLiteral(customLazySource))
126
+
127
+ programPath.unshiftContainer('body', nodes)
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
@@ -1,10 +1,11 @@
1
1
  import { NodePath, template } from '@babel/core'
2
2
  import generator from '@babel/generator'
3
3
  import * as parser from '@babel/parser'
4
- import traverse, { Node } from '@babel/traverse'
4
+ import traverse from '@babel/traverse'
5
5
  import * as types from '@babel/types'
6
- import type { AssignmentExpression, VariableDeclarator } from '@babel/types'
6
+ import type { AssignmentExpression, Statement, 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,15 +36,14 @@ const webpackLoadDynamicModuleTemplate = `
35
36
  inProgress[dynamicModulePath].push(done);
36
37
  return;
37
38
  }
38
-
39
+
39
40
  const target = { src: dynamicModulePath };
40
41
 
41
42
  if (loadedDynamicModules[dynamicModulePath]) return done({ type: 'loaded', target });
42
43
 
43
44
  promiseRetry(function () {
44
45
  return loadDynamicModule(dynamicModulePath)
45
- })
46
- .then(function () {
46
+ }).then(function () {
47
47
  return done({ type: 'loaded', target })
48
48
  }).catch(function () {
49
49
  return done({ type:'error', target })
@@ -68,45 +68,103 @@ const replaceWebpackLoadScriptFn = (assignmentExpressionNodePath: NodePath<Assig
68
68
 
69
69
  if (isProcessed) return
70
70
 
71
- const { assets, dynamicModuleJsDir } = opts
71
+ const { assets, dynamicPackageNamePrefix } = opts
72
72
 
73
- const dynamicAssets = Object.keys(assets).filter((assetName) => {
74
- return new RegExp(`^${dynamicModuleJsDir}/.`).test(assetName)
73
+ const dynamicJsAssets = Object.keys(assets).filter((assetName) => {
74
+ return isDynamicPackageJsAsset(dynamicPackageNamePrefix, assetName)
75
+ })
76
+
77
+ const dynamicWXssAssets = Object.keys(assets).filter((assetName) => {
78
+ return isDynamicPackageWXssAsset(dynamicPackageNamePrefix, assetName)
75
79
  })
76
80
 
77
81
  const loadDynamicModuleFnMapCode = (() => {
78
- const tempCode = dynamicAssets.map((dynamicAsset) => {
79
- return `'/${dynamicAsset}':function (){ return require.async('${dynamicAsset}'); }`
82
+ const dynamicAssetsRequireTempCode = dynamicJsAssets.map((dynamicJsAsset) => {
83
+ return `'/${dynamicJsAsset}':function (){ return require.async('~/${dynamicJsAsset}'); }`
80
84
  })
81
- return `var loadDynamicModuleFnMap = {${tempCode.join(',')}}`
85
+
86
+ return `var loadDynamicModuleFnMap = {${dynamicAssetsRequireTempCode.join(',')}}`
82
87
  })()
83
88
 
84
- const templateCodeAst = template.ast(webpackLoadDynamicModuleTemplate)
89
+ const hasStyleDynamicAssetsListCode = (() => {
90
+ const hasStyleDynamicAssetsList = dynamicJsAssets.filter((dynamicJsAsset) => {
91
+ const matchWXssAssets = dynamicJsAsset.replace(/\.js$/, '.wxss')
92
+ return dynamicWXssAssets.includes(matchWXssAssets)
93
+ })
94
+ return `var hasStyleDynamicModuleList = [${hasStyleDynamicAssetsList.map(item => `'/${item}'`).join(',')}]`
95
+ })()
85
96
 
86
- const templateCodeDepAst = template.ast(webpackLoadDynamicModuleTemplateDep)
97
+ const templateCodeAst = template.ast(webpackLoadDynamicModuleTemplate) as Statement
87
98
 
88
99
  const loadDynamicModuleFnMapAst = template.ast(loadDynamicModuleFnMapCode)
89
100
 
90
- assignmentExpressionNodePath.replaceWith(templateCodeAst as Node)
101
+ const hasStyleDynamicAssetsListAst = template.ast(hasStyleDynamicAssetsListCode)
91
102
 
92
- assignmentExpressionNodePath.insertBefore(templateCodeDepAst)
103
+ const templateCodeDepAst = template.ast(webpackLoadDynamicModuleTemplateDep)
104
+
105
+ assignmentExpressionNodePath.replaceWith(templateCodeAst)
93
106
 
94
107
  assignmentExpressionNodePath.insertBefore(loadDynamicModuleFnMapAst)
108
+
109
+ assignmentExpressionNodePath.insertBefore(hasStyleDynamicAssetsListAst)
110
+
111
+ assignmentExpressionNodePath.insertBefore(templateCodeDepAst)
95
112
  }
96
113
 
97
114
  const webpackLoadDynamicModuleStylesheetTemplate = `
98
- loadStylesheet = function () {
99
- return Promise.resolve()
115
+ __webpack_require__.f.miniCss = function (dynamicStylesheetChunkId, promises) {
116
+ promises.push(loadStylesheet(dynamicStylesheetChunkId))
117
+ }
118
+ `
119
+
120
+ const replaceWebpackLoadDynamicModuleStylesheetFn = (
121
+ assignmentExpressionNodePath: NodePath<AssignmentExpression>
122
+ ) => {
123
+ const { left, right } = assignmentExpressionNodePath.node || {}
124
+
125
+ if (!types.isMemberExpression(left)) return
126
+
127
+ if (!types.isFunctionExpression(right)) return
128
+
129
+ if (!types.isMemberExpression(left.object)) return
130
+
131
+ if (!types.isIdentifier(left.object.object, { name: '__webpack_require__' })) return
132
+
133
+ if (!types.isIdentifier(left.object.property, { name: 'f' })) return
134
+
135
+ if (!types.isIdentifier(left.property, { name: 'miniCss' })) return
136
+
137
+ const isProcessed = right.params.some((item) => {
138
+ return types.isIdentifier(item, { name: 'dynamicStylesheetChunkId' })
139
+ })
140
+
141
+ if (isProcessed) return
142
+
143
+ const templateCodeAst = template.expression(webpackLoadDynamicModuleStylesheetTemplate)()
144
+
145
+ assignmentExpressionNodePath.replaceWith(templateCodeAst)
146
+ }
147
+
148
+ const webpackLoadStylesheetTemplate = `
149
+ loadStylesheet = function (chunkId) {
150
+ const href = __webpack_require__.miniCssF(chunkId);
151
+ const fullHref = __webpack_require__.p + href;
152
+ const dynamicPackageNameRegex = DYNAMIC_PACKAGE_NAME_REGEX;
153
+ const [,dynamicPackageName] = fullHref.match(dynamicPackageNameRegex) || [];
154
+ const { SingletonPromise } = require('~/singleton-promise.js');
155
+ return SingletonPromise.wait(dynamicPackageName)
100
156
  }
101
157
  `
102
158
 
103
- const replaceLoadStylesheetFn = (nodePath: NodePath<VariableDeclarator>) => {
159
+ const replaceLoadStylesheetFn = (nodePath: NodePath<VariableDeclarator>, opts: Opts) => {
104
160
  const { id, init } = nodePath.node || {}
105
161
  if (!types.isIdentifier(id, { name: 'loadStylesheet' })) return
106
162
  if (!types.isFunctionExpression(init)) return
107
163
  const isProcessed = !init.params.length
108
164
  if (isProcessed) return
109
- const templateCodeAst = template.expression(webpackLoadDynamicModuleStylesheetTemplate)()
165
+ const { dynamicPackageNamePrefix } = opts
166
+ const DYNAMIC_PACKAGE_NAME_REGEX = types.regExpLiteral(`(${dynamicPackageNamePrefix}(?:-[a-z]{2})?)\\/`)
167
+ const templateCodeAst = template.expression(webpackLoadStylesheetTemplate)({ DYNAMIC_PACKAGE_NAME_REGEX })
110
168
  nodePath.replaceWith(templateCodeAst)
111
169
  }
112
170
 
@@ -129,7 +187,7 @@ export const transformWebpackRuntime = (code: string, opts: Opts) => {
129
187
  replaceWebpackLoadScriptFn(nodePath, opts)
130
188
  },
131
189
  VariableDeclarator (nodePath: NodePath<VariableDeclarator>) {
132
- replaceLoadStylesheetFn(nodePath)
190
+ replaceLoadStylesheetFn(nodePath, opts)
133
191
  removeCreateStylesheetFn(nodePath)
134
192
  removeFindStylesheetFn(nodePath)
135
193
  }
package/src/types.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Source } from 'webpack-sources'
2
2
 
3
3
  export interface AsyncPackOpts {
4
- dynamicModuleJsDir: string;
5
- dynamicModuleStyleFile: string;
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
+ }
@@ -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 {};
@@ -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
@@ -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,6 +0,0 @@
1
- import type { CompilationAssets, AsyncPackOpts } from './types';
2
- interface Opts extends AsyncPackOpts {
3
- assets: CompilationAssets;
4
- }
5
- export declare const transformAppStylesheet: (code: string, opts: Opts) => string;
6
- export {};
@@ -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"}
@@ -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
- }