This repository has been archived by the owner on Sep 9, 2021. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 271
/
index.js
66 lines (62 loc) · 2.72 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
'use strict';
const path = require('path');
const WebWorkerTemplatePlugin = require('webpack/lib/webworker/WebWorkerTemplatePlugin');
const SingleEntryPlugin = require('webpack/lib/SingleEntryPlugin');
const loaderUtils = require('loader-utils');
const getWorker = (file, content, query) => {
const workerPublicPath = `__webpack_public_path__ + ${JSON.stringify(file)}`;
if (query.inline) {
const createInlineWorkerPath = JSON.stringify(`!!${path.join(__dirname, 'createInlineWorker.js')}`);
const fallbackWorkerPath = query.fallback === false ? 'null' : workerPublicPath;
return `require(${createInlineWorkerPath})(${JSON.stringify(content)}, ${fallbackWorkerPath})`;
}
return `new Worker(${workerPublicPath})`;
};
module.exports = function workerLoader() {};
module.exports.pitch = function pitch(request) {
if (!this.webpack) throw new Error('Only usable with webpack');
this.cacheable(false);
const callback = this.async();
const query = loaderUtils.getOptions(this) || {};
const filename = loaderUtils.interpolateName(this, query.name || '[hash].worker.js', {
context: query.context || this.options.context,
regExp: query.regExp,
});
const outputOptions = {
filename,
chunkFilename: `[id].${filename}`,
namedChunkFilename: null,
};
if (this.options && this.options.worker && this.options.worker.output) {
Object.keys(this.options.worker.output).forEach((name) => {
outputOptions[name] = this.options.worker.output[name];
});
}
const workerCompiler = this._compilation.createChildCompiler('worker', outputOptions);
workerCompiler.apply(new WebWorkerTemplatePlugin(outputOptions));
workerCompiler.apply(new SingleEntryPlugin(this.context, `!!${request}`, 'main'));
if (this.options && this.options.worker && this.options.worker.plugins) {
this.options.worker.plugins.forEach(plugin => workerCompiler.apply(plugin));
}
const subCache = `subcache ${__dirname} ${request}`;
workerCompiler.plugin('compilation', (compilation) => {
if (compilation.cache) {
if (!compilation.cache[subCache]) {
compilation.cache[subCache] = {};
}
compilation.cache = compilation.cache[subCache];
}
});
workerCompiler.runAsChild((err, entries, compilation) => {
if (err) return callback(err);
if (entries[0]) {
const workerFile = entries[0].files[0];
const workerFactory = getWorker(workerFile, compilation.assets[workerFile].source(), query);
if (query.fallback === false) {
delete this._compilation.assets[workerFile];
}
return callback(null, `module.exports = function() {\n\treturn ${workerFactory};\n};`);
}
return callback(null, null);
});
};