@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
|
@@ -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
|
|
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,
|
|
71
|
+
const { assets, dynamicPackageNamePrefix } = opts
|
|
72
72
|
|
|
73
|
-
const
|
|
74
|
-
return
|
|
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
|
|
79
|
-
return `'/${
|
|
82
|
+
const dynamicAssetsRequireTempCode = dynamicJsAssets.map((dynamicJsAsset) => {
|
|
83
|
+
return `'/${dynamicJsAsset}':function (){ return require.async('~/${dynamicJsAsset}'); }`
|
|
80
84
|
})
|
|
81
|
-
|
|
85
|
+
|
|
86
|
+
return `var loadDynamicModuleFnMap = {${dynamicAssetsRequireTempCode.join(',')}}`
|
|
82
87
|
})()
|
|
83
88
|
|
|
84
|
-
const
|
|
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
|
|
97
|
+
const templateCodeAst = template.ast(webpackLoadDynamicModuleTemplate) as Statement
|
|
87
98
|
|
|
88
99
|
const loadDynamicModuleFnMapAst = template.ast(loadDynamicModuleFnMapCode)
|
|
89
100
|
|
|
90
|
-
|
|
101
|
+
const hasStyleDynamicAssetsListAst = template.ast(hasStyleDynamicAssetsListCode)
|
|
91
102
|
|
|
92
|
-
|
|
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
|
-
|
|
99
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
}
|