forked from webpack-contrib/worker-loader
/
index.js
114 lines (92 loc) · 3.29 KB
/
index.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
import path from 'path';
import { getOptions } from 'loader-utils';
import { validate } from 'schema-utils';
import NodeTargetPlugin from 'webpack/lib/node/NodeTargetPlugin';
import SingleEntryPlugin from 'webpack/lib/SingleEntryPlugin';
import WebWorkerTemplatePlugin from 'webpack/lib/webworker/WebWorkerTemplatePlugin';
import ExternalsPlugin from 'webpack/lib/ExternalsPlugin';
import schema from './options.json';
import supportWebpack5 from './supportWebpack5';
import supportWebpack4 from './supportWebpack4';
import {
getDefaultFilename,
getDefaultChunkFilename,
getExternalsType,
} from './utils';
let FetchCompileWasmPlugin;
let FetchCompileAsyncWasmPlugin;
// determine the version of webpack peer dependency
// eslint-disable-next-line global-require, import/no-unresolved
const useWebpack5 = require('webpack/package.json').version.startsWith('5.');
if (useWebpack5) {
// eslint-disable-next-line global-require, import/no-unresolved
FetchCompileWasmPlugin = require('webpack/lib/web/FetchCompileWasmPlugin');
// eslint-disable-next-line global-require, import/no-unresolved
FetchCompileAsyncWasmPlugin = require('webpack/lib/web/FetchCompileAsyncWasmPlugin');
} else {
// eslint-disable-next-line global-require, import/no-unresolved
FetchCompileWasmPlugin = require('webpack/lib/web/FetchCompileWasmTemplatePlugin');
}
export default function loader() {}
export function pitch(request) {
this.cacheable(false);
const options = getOptions(this);
validate(schema, options, {
name: 'Worker Loader',
baseDataPath: 'options',
});
const workerContext = {};
const compilerOptions = this._compiler.options || {};
const filename = options.filename
? options.filename
: getDefaultFilename(compilerOptions.output.filename);
const chunkFilename = options.chunkFilename
? options.chunkFilename
: getDefaultChunkFilename(compilerOptions.output.chunkFilename);
const publicPath = options.publicPath
? options.publicPath
: compilerOptions.output.publicPath;
workerContext.options = {
filename,
chunkFilename,
publicPath,
globalObject: 'self',
};
workerContext.compiler = this._compilation.createChildCompiler(
`worker-loader ${request}`,
workerContext.options
);
new WebWorkerTemplatePlugin().apply(workerContext.compiler);
if (this.target !== 'webworker' && this.target !== 'web') {
new NodeTargetPlugin().apply(workerContext.compiler);
}
if (FetchCompileWasmPlugin) {
new FetchCompileWasmPlugin({
mangleImports: compilerOptions.optimization.mangleWasmImports,
}).apply(workerContext.compiler);
}
if (FetchCompileAsyncWasmPlugin) {
new FetchCompileAsyncWasmPlugin().apply(workerContext.compiler);
}
if (compilerOptions.externals) {
new ExternalsPlugin(
getExternalsType(compilerOptions),
compilerOptions.externals
).apply(workerContext.compiler);
}
new SingleEntryPlugin(
this.context,
`!!${request}`,
path.parse(this.resourcePath).name
).apply(workerContext.compiler);
workerContext.request = request;
const cb = this.async();
if (
workerContext.compiler.cache &&
typeof workerContext.compiler.cache.get === 'function'
) {
supportWebpack5(this, workerContext, options, cb);
} else {
supportWebpack4(this, workerContext, options, cb);
}
}