-
Notifications
You must be signed in to change notification settings - Fork 4
/
PatchHtmlWebpackPluginPlugin.js
125 lines (118 loc) · 4.21 KB
/
PatchHtmlWebpackPluginPlugin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Temporary fix
// See issue: https://github.com/jantimon/html-webpack-plugin/issues/1590
const WebpackOptionsApply = require('webpack/lib/WebpackOptionsApply');
const ResolverFactory = require('webpack/lib/ResolverFactory');
class PatchHtmlWebpackPluginPlugin {
apply(compiler) {
compiler.hooks.compilation.tap(
'PatchHtmlWebpackPluginPlugin',
(compilation) => {
compilation.hooks.childCompiler.tap(
'PatchHtmlWebpackPluginPlugin',
(childCompiler, compilerName) => {
if (compilerName !== 'HtmlWebpackCompiler') {
return;
}
const optionsCopy = { ...childCompiler.options };
optionsCopy.optimization = {
...optionsCopy.optimization,
concatenateModules: false,
};
optionsCopy.resolve = {
...optionsCopy.resolve,
};
optionsCopy.externalsPresets = {
web: false,
node: true,
nwjs: false,
electron: false,
electronMain: false,
electronPreload: false,
electronRenderer: false,
};
optionsCopy.loader = {
target: 'node',
};
optionsCopy.target = 'node';
optionsCopy.node = {
global: false,
__filename: 'eval-only',
__dirname: 'eval-only',
};
optionsCopy.output = {
...childCompiler.options.output,
chunkFormat: 'commonjs',
chunkLoading: 'require',
enabledChunkLoadingTypes: ['require'],
enabledWasmLoadingTypes: ['async-node'],
globalObject: 'global',
wasmLoading: 'async-node',
workerChunkLoading: 'require',
workerWasmLoading: 'async-node',
};
optionsCopy.resolve.conditionNames = [
'webpack',
'development',
'node',
];
optionsCopy.resolve.byDependency = {
wasm: {
conditionNames: ['import', 'module', '...'],
aliasFields: [],
mainFields: ['module', '...'],
},
esm: {
conditionNames: ['import', 'module', '...'],
aliasFields: [],
mainFields: ['module', '...'],
},
worker: {
conditionNames: ['import', 'module', '...'],
aliasFields: [],
mainFields: ['module', '...'],
preferRelative: true,
},
commonjs: {
conditionNames: ['require', 'module', '...'],
aliasFields: [],
mainFields: ['module', '...'],
},
amd: {
conditionNames: ['require', 'module', '...'],
aliasFields: [],
mainFields: ['module', '...'],
},
loader: {
conditionNames: ['require', 'module', '...'],
aliasFields: [],
mainFields: ['module', '...'],
},
unknown: {
conditionNames: ['require', 'module', '...'],
aliasFields: [],
mainFields: ['module', '...'],
},
undefined: {
conditionNames: ['require', 'module', '...'],
aliasFields: [],
mainFields: ['module', '...'],
},
url: {
preferRelative: true,
},
};
// it is needed because `resolverFactory` already exist on childCompiler and it refers to old options.resolve object
// so we need to reinitialize resolverFactory before compilation
childCompiler.resolverFactory = new ResolverFactory();
// but new resolverFactory should be initialized. And it is what WebpackOptionsApply for.
childCompiler.options = new WebpackOptionsApply().process(
optionsCopy,
childCompiler,
);
},
);
},
);
}
}
module.exports = PatchHtmlWebpackPluginPlugin;