@taro-hmr-compile/plugin-webpack 0.0.1-alpha.7 → 0.0.1-alpha.9
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/dist/compile/hmr-compiler-loader.js +44 -7
- package/dist/compile/hmr-compiler-loader.js.map +1 -1
- package/dist/compile/hmr-compiler-plugin.d.ts +4 -2
- package/dist/compile/hmr-compiler-plugin.js +11 -14
- package/dist/compile/hmr-compiler-plugin.js.map +1 -1
- package/dist/compile/lazy-compiler-loader.d.ts +1 -0
- package/dist/compile/lazy-compiler-loader.js +7 -3
- package/dist/compile/lazy-compiler-loader.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/patch/hmr-patch-plugin.d.ts +6 -5
- package/dist/patch/hmr-patch-plugin.js +33 -179
- package/dist/patch/hmr-patch-plugin.js.map +1 -1
- package/dist/patch/hmr-patch-processor.d.ts +29 -0
- package/dist/patch/hmr-patch-processor.js +106 -0
- package/dist/patch/hmr-patch-processor.js.map +1 -0
- package/dist/patch/hmr-patch-runtime-plugin.js +1 -1
- package/dist/patch/types.d.ts +16 -0
- package/dist/patch/types.js +3 -0
- package/dist/patch/types.js.map +1 -0
- package/dist/patch/utils.d.ts +28 -0
- package/dist/patch/utils.js +179 -0
- package/dist/patch/utils.js.map +1 -0
- package/package.json +2 -2
- package/src/compile/hmr-compiler-loader.ts +43 -7
- package/src/compile/hmr-compiler-plugin.ts +18 -16
- package/src/compile/lazy-compiler-loader.ts +9 -3
- package/src/index.ts +2 -0
- package/src/patch/hmr-patch-plugin.ts +42 -168
- package/src/patch/hmr-patch-processor.ts +151 -0
- package/src/patch/hmr-patch-runtime-plugin.ts +1 -1
- package/src/patch/types.ts +20 -0
- package/src/patch/utils.ts +179 -0
- package/dist/patch/hmr-patch-manager.d.ts +0 -30
- package/dist/patch/hmr-patch-manager.js +0 -75
- package/dist/patch/hmr-patch-manager.js.map +0 -1
- package/src/patch/hmr-patch-manager.ts +0 -102
|
@@ -51,22 +51,29 @@ const CORE_RUNTIME_REQUEST = require.resolve('@taro-hmr-compile/core/runtime');
|
|
|
51
51
|
const injectAppHmrRuntime = (source, debugNamespaces = '') => {
|
|
52
52
|
const ast = parser.parse(source, { sourceType: 'module' });
|
|
53
53
|
const buildHmrCode = template_1.default.statements(`
|
|
54
|
-
import {
|
|
54
|
+
import { updatePatchContext, mergePatches, enableLog as enableHmrCoreLog } from ${JSON.stringify(CORE_RUNTIME_REQUEST)}
|
|
55
55
|
import { log, enableLog as enableHmrWebpackLog } from ${JSON.stringify(LOG_REQUEST)}
|
|
56
56
|
enableHmrCoreLog(${JSON.stringify(debugNamespaces)})
|
|
57
57
|
enableHmrWebpackLog(${JSON.stringify(debugNamespaces)})
|
|
58
58
|
globalThis.log = log.extend('runtime')
|
|
59
|
+
updatePatchContext.initialize(${webpack_1.default.RuntimeGlobals.getFullHash}())
|
|
59
60
|
globalThis.miniHmrApplyPatch = async (patches)=>{
|
|
61
|
+
let transaction
|
|
60
62
|
try {
|
|
61
63
|
const { miniHmr } = __webpack_require__
|
|
62
64
|
const bootstrapPatch = patches.find(patch => patch.type === 'bootstrap')
|
|
65
|
+
const shouldApplyBootstrapPatch = miniHmr.shouldApplyBootstrapPatch(bootstrapPatch)
|
|
66
|
+
const currentHash = ${webpack_1.default.RuntimeGlobals.getFullHash}()
|
|
67
|
+
const updatePatch = mergePatches(currentHash, patches)
|
|
63
68
|
|
|
64
|
-
if (
|
|
69
|
+
if (shouldApplyBootstrapPatch) miniHmr.applyBootstrapPatch(bootstrapPatch)
|
|
70
|
+
if (!updatePatch) return
|
|
65
71
|
|
|
66
|
-
|
|
67
|
-
hmrState.setLastFullHash(updatePatch?.toHash ?? ${webpack_1.default.RuntimeGlobals.getFullHash}())
|
|
72
|
+
transaction = updatePatchContext.beginTransaction({fromHash: currentHash,toHash: updatePatch.toHash})
|
|
68
73
|
await miniHmr.applyUpdatePatch(updatePatch)
|
|
74
|
+
updatePatchContext.completeTransaction(transaction.id)
|
|
69
75
|
} catch (error) {
|
|
76
|
+
if (transaction) updatePatchContext.abortTransaction(transaction.id)
|
|
70
77
|
console.error('[taro-hmr-compile] patch apply failed', error)
|
|
71
78
|
return Promise.resolve()
|
|
72
79
|
}
|
|
@@ -102,6 +109,29 @@ const transformPageConfig = (source, sourceFileName) => {
|
|
|
102
109
|
});
|
|
103
110
|
});
|
|
104
111
|
};
|
|
112
|
+
const isHotAcceptCall = (node) => {
|
|
113
|
+
if (!t.isCallExpression(node))
|
|
114
|
+
return false;
|
|
115
|
+
const { callee } = node;
|
|
116
|
+
if (!t.isMemberExpression(callee) || !t.isIdentifier(callee.property, { name: 'accept' }))
|
|
117
|
+
return false;
|
|
118
|
+
const hot = callee.object;
|
|
119
|
+
return t.isMemberExpression(hot) && t.isIdentifier(hot.object, { name: 'module' }) && t.isIdentifier(hot.property, { name: 'hot' });
|
|
120
|
+
};
|
|
121
|
+
const hasHotAccept = (programPath) => {
|
|
122
|
+
return programPath.node.body.some(statement => {
|
|
123
|
+
if (t.isExpressionStatement(statement))
|
|
124
|
+
return isHotAcceptCall(statement.expression);
|
|
125
|
+
if (!t.isIfStatement(statement))
|
|
126
|
+
return false;
|
|
127
|
+
const { consequent } = statement;
|
|
128
|
+
if (t.isExpressionStatement(consequent))
|
|
129
|
+
return isHotAcceptCall(consequent.expression);
|
|
130
|
+
if (!t.isBlockStatement(consequent))
|
|
131
|
+
return false;
|
|
132
|
+
return consequent.body.some(node => t.isExpressionStatement(node) && isHotAcceptCall(node.expression));
|
|
133
|
+
});
|
|
134
|
+
};
|
|
105
135
|
(0, traverse_1.default)(ast, {
|
|
106
136
|
Program(programPath) {
|
|
107
137
|
// 判断是否存在 createPageConfig 引用
|
|
@@ -119,6 +149,7 @@ const transformPageConfig = (source, sourceFileName) => {
|
|
|
119
149
|
return;
|
|
120
150
|
// 判断是否存在 withHmrPageConfig 引用
|
|
121
151
|
const hasWithHmrPageConfigBinding = programPath.scope.hasBinding(WITH_HMR_PAGE_CONFIG);
|
|
152
|
+
const shouldInjectHotAccept = !hasHotAccept(programPath);
|
|
122
153
|
// 生成 withHmrPageConfig 的别名
|
|
123
154
|
const wrapperIdentifier = hasWithHmrPageConfigBinding ? programPath.scope.generateUidIdentifier(WITH_HMR_PAGE_CONFIG) : t.identifier(WITH_HMR_PAGE_CONFIG);
|
|
124
155
|
// 生成 runtime import
|
|
@@ -127,23 +158,29 @@ const transformPageConfig = (source, sourceFileName) => {
|
|
|
127
158
|
return template_1.default.statement(`import { ${WITH_HMR_PAGE_CONFIG} } from ${JSON.stringify(CORE_RUNTIME_REQUEST)};`)();
|
|
128
159
|
return template_1.default.statement(`import { ${WITH_HMR_PAGE_CONFIG} as %%WRAPPER%% } from ${JSON.stringify(CORE_RUNTIME_REQUEST)};`)({ WRAPPER: wrapperIdentifier });
|
|
129
160
|
})();
|
|
161
|
+
let transformedPageConfig = false;
|
|
130
162
|
programPath.traverse({
|
|
131
163
|
CallExpression(CallExpressionPath) {
|
|
132
164
|
const { node: CallExpressionNode } = CallExpressionPath;
|
|
133
165
|
if (!t.isIdentifier(CallExpressionNode.callee, { name: CREATE_PAGE_CONFIG }))
|
|
134
166
|
return;
|
|
135
167
|
const [_, pageName] = CallExpressionNode.arguments;
|
|
136
|
-
const wrappedPageConfig = template_1.default.expression(`%%WRAPPER%%(%%PAGE_CONFIG%%, %%PAGE_NAME
|
|
168
|
+
const wrappedPageConfig = template_1.default.expression(`%%WRAPPER%%(%%PAGE_CONFIG%%, %%PAGE_NAME%%, typeof module !== 'undefined' ? module.hot : undefined)`)({
|
|
137
169
|
WRAPPER: wrapperIdentifier,
|
|
138
170
|
PAGE_CONFIG: CallExpressionNode,
|
|
139
171
|
PAGE_NAME: pageName,
|
|
140
172
|
});
|
|
141
|
-
if (!hasImportWithHmrPageConfig(programPath))
|
|
142
|
-
programPath.unshiftContainer('body', runtimeImport);
|
|
143
173
|
CallExpressionPath.replaceWith(wrappedPageConfig);
|
|
144
174
|
CallExpressionPath.skip();
|
|
175
|
+
transformedPageConfig = true;
|
|
145
176
|
}
|
|
146
177
|
});
|
|
178
|
+
if (!transformedPageConfig)
|
|
179
|
+
return;
|
|
180
|
+
programPath.unshiftContainer('body', runtimeImport);
|
|
181
|
+
if (shouldInjectHotAccept) {
|
|
182
|
+
programPath.pushContainer('body', template_1.default.statement(`if (typeof module !== 'undefined' && module.hot) module.hot.accept();`)());
|
|
183
|
+
}
|
|
147
184
|
},
|
|
148
185
|
});
|
|
149
186
|
return (0, generator_1.default)(ast, { sourceMaps: true, sourceFileName }, source).code;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmr-compiler-loader.js","sourceRoot":"","sources":["../../src/compile/hmr-compiler-loader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iEAAwC;AACxC,sDAAuC;AACvC,+DAAsC;AACtC,+DAAkD;AAClD,gDAAiC;AAEjC,sDAA6B;AAE7B,MAAM,kBAAkB,GAAG,kBAAkB,CAAA;AAE7C,MAAM,oBAAoB,GAAG,mBAAmB,CAAA;AAEhD,MAAM,oBAAoB,GAAG,iBAAiB,CAAA;AAE9C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE7C,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAA;AAEvE,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,eAAe,GAAG,EAAE,EAAE,EAAE;IAGxE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAC,UAAU,EAAE,QAAQ,EAAC,CAAC,CAAA;IAExD,MAAM,YAAY,GAAG,kBAAQ,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"hmr-compiler-loader.js","sourceRoot":"","sources":["../../src/compile/hmr-compiler-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,11 +11,13 @@ export interface HmrCompilerPluginOptions {
|
|
|
11
11
|
styleFilename?: StyleFilename;
|
|
12
12
|
debugNamespaces?: string;
|
|
13
13
|
}
|
|
14
|
+
type CompileRequested = SyncHook<[page: string]>;
|
|
15
|
+
type ChunkModulesRendered = SyncHook<[source: string, isPageChunk: boolean]>;
|
|
14
16
|
export interface HmrCompilerHooks {
|
|
15
|
-
compileRequested:
|
|
17
|
+
compileRequested: CompileRequested;
|
|
16
18
|
}
|
|
17
19
|
export interface HmrCompilationHooks {
|
|
18
|
-
|
|
20
|
+
chunkModulesRendered: ChunkModulesRendered;
|
|
19
21
|
}
|
|
20
22
|
export declare const applyPatchBeforeStartup: (source: Source, request: string) => ConcatSource;
|
|
21
23
|
export declare class HmrCompilerPlugin {
|
|
@@ -29,20 +29,18 @@ class HmrCompilerPlugin {
|
|
|
29
29
|
this.options = options;
|
|
30
30
|
}
|
|
31
31
|
static getCompilerHooks(compiler) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
HmrCompilerPlugin.compilerHooksMap.set(compiler, hooks);
|
|
32
|
+
if (!HmrCompilerPlugin.compilerHooksMap.get(compiler)) {
|
|
33
|
+
const compileRequested = new tapable_1.SyncHook(['page']);
|
|
34
|
+
HmrCompilerPlugin.compilerHooksMap.set(compiler, { compileRequested });
|
|
36
35
|
}
|
|
37
|
-
return
|
|
36
|
+
return HmrCompilerPlugin.compilerHooksMap.get(compiler);
|
|
38
37
|
}
|
|
39
38
|
static getCompilationHooks(compilation) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
HmrCompilerPlugin.compilationHooksMap.set(compilation, hooks);
|
|
39
|
+
if (!HmrCompilerPlugin.compilationHooksMap.get(compilation)) {
|
|
40
|
+
const chunkModulesRendered = new tapable_1.SyncHook(['source', 'isBootstrapChunk']);
|
|
41
|
+
HmrCompilerPlugin.compilationHooksMap.set(compilation, { chunkModulesRendered });
|
|
44
42
|
}
|
|
45
|
-
return
|
|
43
|
+
return HmrCompilerPlugin.compilationHooksMap.get(compilation);
|
|
46
44
|
}
|
|
47
45
|
apply(compiler) {
|
|
48
46
|
this.compiler = compiler;
|
|
@@ -83,10 +81,9 @@ class HmrCompilerPlugin {
|
|
|
83
81
|
// 只修改 Page Chunk 的 JS transport。Webpack 的 ModuleGraph / ChunkGraph 保持不变,
|
|
84
82
|
// 因而 hash、HMR diff 和 hot-update 仍以完整模块图为准。
|
|
85
83
|
javascriptHooks.renderChunk.tap({ name: PLUGIN_NAME, stage: -10000 }, (source, { chunk }) => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return new webpack_sources_1.RawSource('{}');
|
|
84
|
+
const isBootstrapChunk = isPageChunk(chunk);
|
|
85
|
+
hmrHooks.chunkModulesRendered.call(source.source().toString(), isBootstrapChunk);
|
|
86
|
+
return isBootstrapChunk ? new webpack_sources_1.RawSource('{}') : source;
|
|
90
87
|
});
|
|
91
88
|
javascriptHooks.renderStartup.tap(PLUGIN_NAME, (source, _module, { chunk }) => {
|
|
92
89
|
if (!isPageChunk(chunk))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmr-compiler-plugin.js","sourceRoot":"","sources":["../../src/compile/hmr-compiler-plugin.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AACvB,2CAAkD;AAGlD,qCAAgC;AAEhC,qDAAuD;AAEvD,4CAA4C;AAC5C,mDAAoF;AACpF,oCAAoC;AACpC,gCAA2B;AAE3B,MAAM,WAAW,GAAG,SAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAA;AAEnD,MAAM,WAAW,GAAG,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"hmr-compiler-plugin.js","sourceRoot":"","sources":["../../src/compile/hmr-compiler-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,12 @@ const path_1 = __importDefault(require("path"));
|
|
|
8
8
|
const utils_1 = require("../utils");
|
|
9
9
|
const compile_state_1 = require("./compile-state");
|
|
10
10
|
const createReactShell = (opt) => {
|
|
11
|
-
const { page, compileUrl } = opt;
|
|
11
|
+
const { page, compileUrl, memo } = opt;
|
|
12
12
|
return `
|
|
13
13
|
import { PageShell } from ${JSON.stringify(require.resolve('@taro-hmr-compile/core/runtime'))}
|
|
14
|
+
${memo ? "import React from 'react'" : ''}
|
|
14
15
|
const Page = () => <PageShell page={${JSON.stringify(page)}} compileUrl={${JSON.stringify(compileUrl)}}/>
|
|
15
|
-
export default Page
|
|
16
|
+
export default ${memo ? 'React.memo(Page)' : 'Page'}
|
|
16
17
|
`;
|
|
17
18
|
};
|
|
18
19
|
exports.createReactShell = createReactShell;
|
|
@@ -21,6 +22,9 @@ const createShell = (opt) => {
|
|
|
21
22
|
return (0, exports.createReactShell)(opt);
|
|
22
23
|
throw new Error(`unsupported framework: ${opt.framework}`);
|
|
23
24
|
};
|
|
25
|
+
const isMemoPage = (source) => {
|
|
26
|
+
return /\bexport\s+default\s+(?:(?:React\.)?memo|observer)\s*\(/.test(source);
|
|
27
|
+
};
|
|
24
28
|
const lazyCompilerLoader = function (source) {
|
|
25
29
|
const { appPath, framework, appConfig, sourcePath, compileUrl } = this.getOptions();
|
|
26
30
|
const { dir: resourceDir, name: resourceName } = path_1.default.parse(path_1.default.relative(sourcePath, this.resourcePath));
|
|
@@ -28,7 +32,7 @@ const lazyCompilerLoader = function (source) {
|
|
|
28
32
|
const isPageEntry = (0, utils_1.getAllPages)(appConfig).includes(resourcePath);
|
|
29
33
|
if (!isPageEntry || (0, compile_state_1.isPageCompiled)(appPath, resourcePath))
|
|
30
34
|
return source;
|
|
31
|
-
return createShell({ page: resourcePath, framework, compileUrl });
|
|
35
|
+
return createShell({ page: resourcePath, framework, compileUrl, memo: isMemoPage(source) });
|
|
32
36
|
};
|
|
33
37
|
exports.default = lazyCompilerLoader;
|
|
34
38
|
//# sourceMappingURL=lazy-compiler-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-compiler-loader.js","sourceRoot":"","sources":["../../src/compile/lazy-compiler-loader.ts"],"names":[],"mappings":";;;;;;AACA,gDAAwB;AACxB,oCAAoC;AACpC,mDAA8C;
|
|
1
|
+
{"version":3,"file":"lazy-compiler-loader.js","sourceRoot":"","sources":["../../src/compile/lazy-compiler-loader.ts"],"names":[],"mappings":";;;;;;AACA,gDAAwB;AACxB,oCAAoC;AACpC,mDAA8C;AAWvC,MAAM,gBAAgB,GAAG,CAAC,GAAmB,EAAE,EAAE;IACpD,MAAM,EAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAC,GAAG,GAAG,CAAA;IACpC,OAAO;gCACqB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;MAC3F,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE;0CACH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;qBACpF,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM;KAClD,CAAA;AACL,CAAC,CAAA;AARY,QAAA,gBAAgB,oBAQ5B;AAED,MAAM,WAAW,GAAG,CAAC,GAAmB,EAAE,EAAE;IACxC,IAAI,GAAG,CAAC,SAAS,KAAK,OAAO;QAAE,OAAO,IAAA,wBAAgB,EAAC,GAAG,CAAC,CAAA;IAC3D,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;AAC9D,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE;IAClC,OAAO,yDAAyD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACjF,CAAC,CAAA;AAWD,MAAM,kBAAkB,GAA4C,UAAU,MAAM;IAChF,MAAM,EAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;IAEjF,MAAM,EAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAC,GAAG,cAAI,CAAC,KAAK,CAAC,cAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;IAEvG,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;IAEzD,MAAM,WAAW,GAAG,IAAA,mBAAW,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;IAEjE,IAAI,CAAC,WAAW,IAAI,IAAA,8BAAc,EAAC,OAAO,EAAE,YAAY,CAAC;QAAE,OAAO,MAAM,CAAA;IAExE,OAAO,WAAW,CAAC,EAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EAAC,CAAC,CAAA;AAC7F,CAAC,CAAA;AAED,kBAAe,kBAAkB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -44,6 +44,7 @@ exports.default = (ctx, pluginOpts) => {
|
|
|
44
44
|
const compileUrl = `http://${host}:${port}/compile`;
|
|
45
45
|
if (port !== preferredPort)
|
|
46
46
|
console.warn(`[taro-hmr-compile] 端口 ${preferredPort} 已被占用,自动使用端口 ${port}`);
|
|
47
|
+
chain.optimization.usedExports(false);
|
|
47
48
|
chain.module
|
|
48
49
|
.rule('lazy-compiler')
|
|
49
50
|
.test(/\.[jt]sx?$/)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Compiler } from 'webpack';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
2
|
+
import { HmrPatchProcessorOptions } from "./hmr-patch-processor";
|
|
3
|
+
type HmrPatchPluginOptions = Partial<HmrPatchProcessorOptions>;
|
|
5
4
|
export declare class HmrPatchPlugin {
|
|
6
|
-
private
|
|
7
|
-
private
|
|
5
|
+
private previousHash;
|
|
6
|
+
private initialBuildDone;
|
|
7
|
+
private readonly patchProcessor;
|
|
8
8
|
private readonly emittedAssetSources;
|
|
9
9
|
constructor(options: HmrPatchPluginOptions);
|
|
10
10
|
apply(compiler: Compiler): void;
|
|
@@ -14,3 +14,4 @@ export declare class HmrPatchPlugin {
|
|
|
14
14
|
private emitPatchAsset;
|
|
15
15
|
private reset;
|
|
16
16
|
}
|
|
17
|
+
export {};
|
|
@@ -1,215 +1,68 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
3
|
exports.HmrPatchPlugin = void 0;
|
|
40
|
-
const generator_1 = __importDefault(require("@babel/generator"));
|
|
41
|
-
const parser_1 = require("@babel/parser");
|
|
42
|
-
const template_1 = __importDefault(require("@babel/template"));
|
|
43
|
-
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
44
|
-
const t = __importStar(require("@babel/types"));
|
|
45
4
|
const webpack_sources_1 = require("webpack-sources");
|
|
46
5
|
const constants_1 = require("../constants");
|
|
47
6
|
const hmr_compiler_plugin_1 = require("../compile/hmr-compiler-plugin");
|
|
48
|
-
const hmr_patch_manager_1 = require("./hmr-patch-manager");
|
|
49
7
|
const hmr_patch_runtime_plugin_1 = require("./hmr-patch-runtime-plugin");
|
|
8
|
+
const hmr_patch_processor_1 = require("./hmr-patch-processor");
|
|
50
9
|
const PLUGIN_NAME = 'HmrPatchPlugin';
|
|
51
10
|
const HOT_UPDATE_MANIFEST_SUFFIX = '.hot-update.json';
|
|
52
11
|
const HOT_UPDATE_SCRIPT_SUFFIX = '.hot-update.js';
|
|
53
|
-
const HOT_UPDATE_HASH_PATTERN = /\.([0-9a-f]+)\.hot-update\.json$/i;
|
|
54
12
|
const STYLE_ASSET_PATTERN = /\.(?:css|wxss|acss|ttss|qss|jxss)(?:\.map)?$/i;
|
|
55
13
|
const TEMPLATE_RUNTIME_ASSET_PATTERN = /(?:^|\/)(?:base\.wxml|utils\.wxs)$/i;
|
|
56
|
-
const collectModuleFactories = (source, moduleFactories) => {
|
|
57
|
-
const ast = (0, parser_1.parse)(`(${source})`, { sourceType: 'script' });
|
|
58
|
-
const statement = ast.program.body[0];
|
|
59
|
-
if (!t.isExpressionStatement(statement) || !t.isObjectExpression(statement.expression)) {
|
|
60
|
-
throw new Error('[taro-hmr-compile] Page Chunk 模块段不是对象表达式');
|
|
61
|
-
}
|
|
62
|
-
statement.expression.properties.forEach(property => {
|
|
63
|
-
if (!t.isObjectProperty(property) || !t.isExpression(property.value)) {
|
|
64
|
-
throw new Error('[taro-hmr-compile] Page Chunk 模块对象包含无法识别的属性');
|
|
65
|
-
}
|
|
66
|
-
const { key } = property;
|
|
67
|
-
let moduleId;
|
|
68
|
-
if (t.isStringLiteral(key) || t.isNumericLiteral(key))
|
|
69
|
-
moduleId = String(key.value);
|
|
70
|
-
else if (t.isIdentifier(key) && !property.computed)
|
|
71
|
-
moduleId = key.name;
|
|
72
|
-
else
|
|
73
|
-
throw new Error('[taro-hmr-compile] Page Chunk 模块对象包含无法识别的模块 ID');
|
|
74
|
-
moduleFactories.set(moduleId, property.value);
|
|
75
|
-
});
|
|
76
|
-
};
|
|
77
|
-
/** 将本轮 Webpack hot-update 产物转换为内部 update 表示。 */
|
|
78
|
-
const createUpdatePatch = (toHash, assets) => {
|
|
79
|
-
const manifestAsset = assets.manifests[0];
|
|
80
|
-
const hashMatch = manifestAsset.name.match(HOT_UPDATE_HASH_PATTERN);
|
|
81
|
-
if (!hashMatch)
|
|
82
|
-
throw new Error(`[taro-hmr-compile] 无法从 ${manifestAsset.name} 提取 HMR 基线 hash`);
|
|
83
|
-
const moduleFactories = new Map();
|
|
84
|
-
assets.scripts.forEach(asset => {
|
|
85
|
-
const ast = (0, parser_1.parse)(asset.source.source().toString(), { sourceType: 'script' });
|
|
86
|
-
(0, traverse_1.default)(ast, {
|
|
87
|
-
CallExpression(nodePath) {
|
|
88
|
-
const { callee } = nodePath.node;
|
|
89
|
-
if (!t.isMemberExpression(callee) || !t.isIdentifier(callee.object, { name: 'wx' }))
|
|
90
|
-
return;
|
|
91
|
-
if (!t.isStringLiteral(callee.property) || !callee.property.value.startsWith('webpackHotUpdate'))
|
|
92
|
-
return;
|
|
93
|
-
const modules = nodePath.node.arguments[1];
|
|
94
|
-
if (!t.isObjectExpression(modules))
|
|
95
|
-
return;
|
|
96
|
-
modules.properties.forEach(property => {
|
|
97
|
-
if (!t.isObjectProperty(property) || !t.isExpression(property.value)) {
|
|
98
|
-
throw new Error('[taro-hmr-compile] HMR 模块对象包含无法识别的属性');
|
|
99
|
-
}
|
|
100
|
-
const { key } = property;
|
|
101
|
-
let moduleId;
|
|
102
|
-
if (t.isStringLiteral(key) || t.isNumericLiteral(key))
|
|
103
|
-
moduleId = String(key.value);
|
|
104
|
-
else if (t.isIdentifier(key) && !property.computed)
|
|
105
|
-
moduleId = key.name;
|
|
106
|
-
else
|
|
107
|
-
throw new Error('[taro-hmr-compile] HMR 模块对象包含无法识别的模块 ID');
|
|
108
|
-
moduleFactories.set(moduleId, property.value);
|
|
109
|
-
});
|
|
110
|
-
},
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
const removedModules = new Set();
|
|
114
|
-
assets.manifests.forEach(asset => {
|
|
115
|
-
var _a;
|
|
116
|
-
const manifest = JSON.parse(asset.source.source().toString());
|
|
117
|
-
(_a = manifest.m) === null || _a === void 0 ? void 0 : _a.forEach(moduleId => removedModules.add(String(moduleId)));
|
|
118
|
-
});
|
|
119
|
-
return {
|
|
120
|
-
type: 'update',
|
|
121
|
-
fromHash: hashMatch[1],
|
|
122
|
-
toHash,
|
|
123
|
-
moduleFactories,
|
|
124
|
-
removedModules: Array.from(removedModules),
|
|
125
|
-
};
|
|
126
|
-
};
|
|
127
|
-
/** 将内部 Patch 表示序列化为固定 patch.js。 */
|
|
128
|
-
const createPatchAssetSource = (patches) => {
|
|
129
|
-
const buildBootstrapPatchNode = template_1.default.expression(`({
|
|
130
|
-
type: 'bootstrap',
|
|
131
|
-
modules: %%MODULES%%
|
|
132
|
-
})`);
|
|
133
|
-
const buildUpdatePatchNode = template_1.default.expression(`({
|
|
134
|
-
type: 'update',
|
|
135
|
-
fromHash: %%FROM_HASH%%,
|
|
136
|
-
toHash: %%TO_HASH%%,
|
|
137
|
-
modules: %%MODULES%%,
|
|
138
|
-
removedModules: %%REMOVED_MODULES%%
|
|
139
|
-
})`);
|
|
140
|
-
const patchNodes = patches.map(patch => {
|
|
141
|
-
const modules = t.objectExpression(Array.from(patch.moduleFactories, ([moduleId, factory]) => t.objectProperty(t.stringLiteral(moduleId), factory)));
|
|
142
|
-
if (patch.type === 'bootstrap')
|
|
143
|
-
return buildBootstrapPatchNode({ MODULES: modules });
|
|
144
|
-
return buildUpdatePatchNode({
|
|
145
|
-
FROM_HASH: t.stringLiteral(patch.fromHash),
|
|
146
|
-
TO_HASH: t.stringLiteral(patch.toHash),
|
|
147
|
-
MODULES: modules,
|
|
148
|
-
REMOVED_MODULES: t.arrayExpression(patch.removedModules.map(moduleId => t.stringLiteral(moduleId))),
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
const statements = template_1.default.statements('module.exports = %%PATCHES%%;')({ PATCHES: t.arrayExpression(patchNodes) });
|
|
152
|
-
return (0, generator_1.default)(t.program(statements)).code;
|
|
153
|
-
};
|
|
154
14
|
const isPassthroughAsset = (assetName) => {
|
|
155
15
|
return STYLE_ASSET_PATTERN.test(assetName) || TEMPLATE_RUNTIME_ASSET_PATTERN.test(assetName);
|
|
156
16
|
};
|
|
157
17
|
class HmrPatchPlugin {
|
|
158
18
|
constructor(options) {
|
|
159
|
-
|
|
160
|
-
this.
|
|
19
|
+
this.previousHash = '';
|
|
20
|
+
this.initialBuildDone = false;
|
|
161
21
|
this.emittedAssetSources = new Map();
|
|
162
|
-
this.
|
|
22
|
+
this.patchProcessor = new hmr_patch_processor_1.HmrPatchProcessor(options);
|
|
163
23
|
}
|
|
164
24
|
apply(compiler) {
|
|
165
25
|
new hmr_patch_runtime_plugin_1.HmrPatchRuntimePlugin().apply(compiler);
|
|
166
26
|
compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
collectModuleFactories(source, initialPageFactories);
|
|
27
|
+
hmr_compiler_plugin_1.HmrCompilerPlugin.getCompilationHooks(compilation).chunkModulesRendered.tap(PLUGIN_NAME, (source, isBootstrapChunk) => {
|
|
28
|
+
this.patchProcessor.processChunkModules({ compilation, source, isBootstrapChunk });
|
|
170
29
|
});
|
|
171
30
|
// 等 Webpack 生成完整的 hot-update assets 后,再统一转换成固定的 patch.js。
|
|
172
31
|
const stage = compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT;
|
|
173
|
-
compilation.hooks.processAssets.tap({ name: PLUGIN_NAME, stage }, () =>
|
|
174
|
-
this.processAssets(compilation, initialPageFactories);
|
|
175
|
-
});
|
|
32
|
+
compilation.hooks.processAssets.tap({ name: PLUGIN_NAME, stage }, () => this.processAssets(compilation));
|
|
176
33
|
});
|
|
177
34
|
compiler.hooks.afterEmit.tap(PLUGIN_NAME, compilation => {
|
|
178
35
|
const isSuccessful = compilation.errors.length === 0 && Boolean(compilation.hash);
|
|
179
|
-
this.
|
|
36
|
+
this.initialBuildDone = this.initialBuildDone || isSuccessful;
|
|
180
37
|
});
|
|
181
38
|
compiler.hooks.watchClose.tap(PLUGIN_NAME, () => this.reset());
|
|
182
39
|
}
|
|
183
|
-
processAssets(compilation
|
|
184
|
-
|
|
40
|
+
processAssets(compilation) {
|
|
41
|
+
const { previousHash: fromHash, initialBuildDone } = this;
|
|
42
|
+
const { hash: toHash, errors: compilationErrors } = compilation;
|
|
43
|
+
if (!toHash || compilationErrors.length > 0)
|
|
185
44
|
return;
|
|
186
|
-
|
|
187
|
-
if (!
|
|
188
|
-
this.
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
45
|
+
// 首次编译完成过滤文件输出
|
|
46
|
+
if (!initialBuildDone) {
|
|
47
|
+
this.patchProcessor.commitBootstrapFactories(compilation);
|
|
48
|
+
compilation.getAssets().forEach(asset => {
|
|
49
|
+
if (!isPassthroughAsset(asset.name))
|
|
50
|
+
return;
|
|
51
|
+
this.emittedAssetSources.set(asset.name, asset.source.source().toString());
|
|
194
52
|
});
|
|
195
|
-
this.
|
|
196
|
-
this.emitPatchAsset(compilation, false);
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
const hotUpdateAssets = {
|
|
200
|
-
manifests: originalAssets.filter(asset => asset.name.endsWith(HOT_UPDATE_MANIFEST_SUFFIX)),
|
|
201
|
-
scripts: originalAssets.filter(asset => asset.name.endsWith(HOT_UPDATE_SCRIPT_SUFFIX)),
|
|
202
|
-
};
|
|
203
|
-
if (hotUpdateAssets.manifests.length) {
|
|
204
|
-
this.patchManager.appendUpdate(createUpdatePatch(compilation.hash, hotUpdateAssets));
|
|
205
|
-
this.emitPatchAsset(compilation, true);
|
|
53
|
+
this.previousHash = toHash;
|
|
54
|
+
return this.emitPatchAsset(compilation, false);
|
|
206
55
|
}
|
|
207
|
-
|
|
208
|
-
|
|
56
|
+
const manifests = compilation.getAssets().filter(asset => asset.name.endsWith(HOT_UPDATE_MANIFEST_SUFFIX));
|
|
57
|
+
const scripts = compilation.getAssets().filter(asset => asset.name.endsWith(HOT_UPDATE_SCRIPT_SUFFIX));
|
|
58
|
+
this.patchProcessor.processUpdate({ toHash, fromHash, manifests, scripts });
|
|
59
|
+
this.emitPatchAsset(compilation, true);
|
|
60
|
+
this.removeSupersededAssets(compilation);
|
|
61
|
+
this.previousHash = toHash;
|
|
209
62
|
}
|
|
210
63
|
/** 热更新转换完成后,保留固定 patch 与发生变化的模板、平台样式资产。 */
|
|
211
|
-
removeSupersededAssets(compilation
|
|
212
|
-
|
|
64
|
+
removeSupersededAssets(compilation) {
|
|
65
|
+
compilation.getAssets().forEach(asset => {
|
|
213
66
|
if (asset.name === constants_1.HMR_PATCH_ASSET)
|
|
214
67
|
return;
|
|
215
68
|
if (!isPassthroughAsset(asset.name))
|
|
@@ -222,7 +75,7 @@ class HmrPatchPlugin {
|
|
|
222
75
|
});
|
|
223
76
|
}
|
|
224
77
|
emitPatchAsset(compilation, isHotUpdate) {
|
|
225
|
-
const source = new webpack_sources_1.RawSource(
|
|
78
|
+
const source = new webpack_sources_1.RawSource(this.patchProcessor.generate());
|
|
226
79
|
const assetInfo = { hotModuleReplacement: isHotUpdate };
|
|
227
80
|
if (compilation.getAsset(constants_1.HMR_PATCH_ASSET))
|
|
228
81
|
compilation.updateAsset(constants_1.HMR_PATCH_ASSET, source, assetInfo);
|
|
@@ -230,9 +83,10 @@ class HmrPatchPlugin {
|
|
|
230
83
|
compilation.emitAsset(constants_1.HMR_PATCH_ASSET, source, assetInfo);
|
|
231
84
|
}
|
|
232
85
|
reset() {
|
|
233
|
-
this.
|
|
86
|
+
this.previousHash = '';
|
|
87
|
+
this.initialBuildDone = false;
|
|
234
88
|
this.emittedAssetSources.clear();
|
|
235
|
-
this.
|
|
89
|
+
this.patchProcessor.reset();
|
|
236
90
|
}
|
|
237
91
|
}
|
|
238
92
|
exports.HmrPatchPlugin = HmrPatchPlugin;
|