Skip to content
This repository was archived by the owner on Aug 7, 2021. It is now read-only.

Commit 68bf3c5

Browse files
author
Dimitar Tachev
authored
Merge pull request #873 from NativeScript/tachev/fix-hmr-runtime-chunk
fix: ignore the Webpack runtime chunks when sending HMR updates
2 parents ff226b2 + e9b52b6 commit 68bf3c5

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

Diff for: lib/compiler.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ exports.runWebpackCompiler = function runWebpackCompiler(config, $projectData, $
8080
return;
8181
}
8282

83-
const result = getUpdatedEmittedFiles(message.emittedFiles);
83+
const result = getUpdatedEmittedFiles(message.emittedFiles, message.webpackRuntimeFiles);
8484

8585
if (hookArgs.hmrData) {
8686
hookArgs.hmrData[platform] = {

Diff for: lib/utils.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function buildEnvData($projectData, platform, env) {
3434
* if yes this is a HMR update and remove all bundle files as we don't need them to be synced,
3535
* but only the update chunks
3636
*/
37-
function getUpdatedEmittedFiles(emittedFiles) {
37+
function getUpdatedEmittedFiles(emittedFiles, webpackRuntimeFiles) {
3838
let fallbackFiles = [];
3939
let hotHash;
4040
if (emittedFiles.some(x => x.endsWith('.hot-update.json'))) {
@@ -45,6 +45,10 @@ function getUpdatedEmittedFiles(emittedFiles) {
4545
hotHash = hash;
4646
// remove bundle/vendor.js files if there's a bundle.XXX.hot-update.js or vendor.XXX.hot-update.js
4747
result = result.filter(file => file !== `${name}.js`);
48+
if (webpackRuntimeFiles && webpackRuntimeFiles.length) {
49+
// remove files containing only the Webpack runtime (e.g. runtime.js)
50+
result = result.filter(file => webpackRuntimeFiles.indexOf(file) === -1);
51+
}
4852
});
4953
//if applying of hot update fails, we must fallback to the full files
5054
fallbackFiles = emittedFiles.filter(file => result.indexOf(file) === -1);

Diff for: plugins/WatchStateLoggerPlugin.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export class WatchStateLoggerPlugin {
3131
console.log(messages.compilationComplete);
3232
}
3333

34+
const runtimeOnlyFiles = getWebpackRuntimeOnlyFiles(compilation, compiler.context);
3435
let emittedFiles = Object
3536
.keys(compilation.assets)
3637
.filter(assetKey => compilation.assets[assetKey].emitted);
@@ -42,7 +43,27 @@ export class WatchStateLoggerPlugin {
4243

4344
process.send && process.send(messages.compilationComplete, error => null);
4445
// Send emitted files so they can be LiveSynced if need be
45-
process.send && process.send({ emittedFiles: emittedFilesFakePaths }, error => null);
46+
process.send && process.send({ emittedFiles: emittedFilesFakePaths, webpackRuntimeFiles: runtimeOnlyFiles }, error => null);
4647
});
4748
}
4849
}
50+
51+
function getWebpackRuntimeOnlyFiles(compilation, basePath) {
52+
let runtimeOnlyFiles = [];
53+
try {
54+
runtimeOnlyFiles = [].concat(...Array.from<any>(compilation.entrypoints.values())
55+
.map(entrypoint => entrypoint.runtimeChunk)
56+
// filter embedded runtime chunks (e.g. part of bundle.js or inspector-modules.js)
57+
.filter(runtimeChunk => !!runtimeChunk && runtimeChunk.preventIntegration)
58+
.map(runtimeChunk => runtimeChunk.files))
59+
// get only the unique files in case of "single" runtime (e.g. runtime.js)
60+
.filter((value, index, self) => self.indexOf(value) === index)
61+
// convert to absolute paths
62+
.map(fileName => join(basePath, fileName));
63+
} catch (e) {
64+
// breaking change in the Webpack API
65+
console.log("Warning: Unable to find Webpack runtime files.");
66+
}
67+
68+
return runtimeOnlyFiles;
69+
}

0 commit comments

Comments
 (0)