132 lines
3.5 KiB
JavaScript
132 lines
3.5 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = loader;
|
|
exports.pitch = pitch;
|
|
|
|
var _options = require('./options.json');
|
|
|
|
var _options2 = _interopRequireDefault(_options);
|
|
|
|
var _loaderUtils = require('loader-utils');
|
|
|
|
var _loaderUtils2 = _interopRequireDefault(_loaderUtils);
|
|
|
|
var _schemaUtils = require('schema-utils');
|
|
|
|
var _schemaUtils2 = _interopRequireDefault(_schemaUtils);
|
|
|
|
var _NodeTargetPlugin = require('webpack/lib/node/NodeTargetPlugin');
|
|
|
|
var _NodeTargetPlugin2 = _interopRequireDefault(_NodeTargetPlugin);
|
|
|
|
var _SingleEntryPlugin = require('webpack/lib/SingleEntryPlugin');
|
|
|
|
var _SingleEntryPlugin2 = _interopRequireDefault(_SingleEntryPlugin);
|
|
|
|
var _WebWorkerTemplatePlugin = require('webpack/lib/webworker/WebWorkerTemplatePlugin');
|
|
|
|
var _WebWorkerTemplatePlugin2 = _interopRequireDefault(_WebWorkerTemplatePlugin);
|
|
|
|
var _workers = require('./workers/');
|
|
|
|
var _workers2 = _interopRequireDefault(_workers);
|
|
|
|
var _Error = require('./Error');
|
|
|
|
var _Error2 = _interopRequireDefault(_Error);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
/* eslint-disable
|
|
import/first,
|
|
import/order,
|
|
comma-dangle,
|
|
linebreak-style,
|
|
no-param-reassign,
|
|
no-underscore-dangle,
|
|
prefer-destructuring
|
|
*/
|
|
function loader() {}
|
|
|
|
function pitch(request) {
|
|
const options = _loaderUtils2.default.getOptions(this) || {};
|
|
|
|
(0, _schemaUtils2.default)(_options2.default, options, 'Worker Loader');
|
|
|
|
if (!this.webpack) {
|
|
throw new _Error2.default({
|
|
name: 'Worker Loader',
|
|
message: 'This loader is only usable with webpack'
|
|
});
|
|
}
|
|
|
|
this.cacheable(false);
|
|
|
|
const cb = this.async();
|
|
|
|
const filename = _loaderUtils2.default.interpolateName(this, options.name || '[hash].worker.js', {
|
|
context: options.context || this.rootContext || this.options.context,
|
|
regExp: options.regExp
|
|
});
|
|
|
|
const worker = {};
|
|
|
|
worker.options = {
|
|
filename,
|
|
chunkFilename: `[id].${filename}`,
|
|
namedChunkFilename: null
|
|
};
|
|
|
|
worker.compiler = this._compilation.createChildCompiler('worker', worker.options);
|
|
|
|
// Tapable.apply is deprecated in tapable@1.0.0-x.
|
|
// The plugins should now call apply themselves.
|
|
new _WebWorkerTemplatePlugin2.default(worker.options).apply(worker.compiler);
|
|
|
|
if (this.target !== 'webworker' && this.target !== 'web') {
|
|
new _NodeTargetPlugin2.default().apply(worker.compiler);
|
|
}
|
|
|
|
new _SingleEntryPlugin2.default(this.context, `!!${request}`, 'main').apply(worker.compiler);
|
|
|
|
const subCache = `subcache ${__dirname} ${request}`;
|
|
|
|
worker.compilation = compilation => {
|
|
if (compilation.cache) {
|
|
if (!compilation.cache[subCache]) {
|
|
compilation.cache[subCache] = {};
|
|
}
|
|
|
|
compilation.cache = compilation.cache[subCache];
|
|
}
|
|
};
|
|
|
|
if (worker.compiler.hooks) {
|
|
const plugin = { name: 'WorkerLoader' };
|
|
|
|
worker.compiler.hooks.compilation.tap(plugin, worker.compilation);
|
|
} else {
|
|
worker.compiler.plugin('compilation', worker.compilation);
|
|
}
|
|
|
|
worker.compiler.runAsChild((err, entries, compilation) => {
|
|
if (err) return cb(err);
|
|
|
|
if (entries[0]) {
|
|
worker.file = entries[0].files[0];
|
|
|
|
worker.factory = (0, _workers2.default)(worker.file, compilation.assets[worker.file].source(), options);
|
|
|
|
if (options.fallback === false) {
|
|
delete this._compilation.assets[worker.file];
|
|
}
|
|
|
|
return cb(null, `module.exports = function() {\n return ${worker.factory};\n};`);
|
|
}
|
|
|
|
return cb(null, null);
|
|
});
|
|
} |