This repository was archived by the owner on Sep 9, 2021. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 276
/
Copy pathindex.js
114 lines (92 loc) · 3.3 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, import/extensions
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);
}
}