webpack/lib/dependencies/WorkerDependency.js

125 lines
4.0 KiB
JavaScript
Raw Normal View History

/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Ivan Kopeykin @vankop
*/
"use strict";
const Dependency = require("../Dependency");
const RuntimeGlobals = require("../RuntimeGlobals");
const makeSerializable = require("../util/makeSerializable");
const ModuleDependency = require("./ModuleDependency");
/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
/** @typedef {import("../AsyncDependenciesBlock")} AsyncDependenciesBlock */
/** @typedef {import("../ChunkGraph")} ChunkGraph */
/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
/** @typedef {import("../Entrypoint")} Entrypoint */
/** @typedef {import("../ModuleGraph")} ModuleGraph */
/** @typedef {import("../util/Hash")} Hash */
/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
class WorkerDependency extends ModuleDependency {
/**
* @param {string} request request
* @param {[number, number]} range range
2022-10-22 07:30:43 +08:00
* @param {Object} workerDependencyOptions options
* @param {string} workerDependencyOptions.publicPath public path for the worker
*/
2022-10-22 07:30:43 +08:00
constructor(request, range, workerDependencyOptions) {
super(request);
this.range = range;
2023-01-27 02:47:01 +08:00
// If options are updated, don't forget to update the hash and serialization functions
2022-10-22 07:30:43 +08:00
this.options = workerDependencyOptions;
2023-01-27 02:47:01 +08:00
/** Cache the hash */
this._hashUpdate = undefined;
}
/**
* Returns list of exports referenced by this dependency
* @param {ModuleGraph} moduleGraph module graph
* @param {RuntimeSpec} runtime the runtime for which the module is analysed
* @returns {(string[] | ReferencedExport)[]} referenced exports
*/
getReferencedExports(moduleGraph, runtime) {
return Dependency.NO_EXPORTS_REFERENCED;
}
get type() {
return "new Worker()";
}
get category() {
return "worker";
}
2023-01-27 02:47:01 +08:00
/**
* Update the hash
* @param {Hash} hash hash to be updated
2023-01-27 06:44:01 +08:00
* @param {UpdateHashContext} context context
2023-01-27 02:47:01 +08:00
* @returns {void}
*/
2023-01-27 06:44:01 +08:00
updateHash(hash, context) {
2023-01-27 02:47:01 +08:00
if (this._hashUpdate === undefined) {
this._hashUpdate = JSON.stringify(this.options);
2023-01-27 02:47:01 +08:00
}
hash.update(this._hashUpdate);
}
serialize(context) {
const { write } = context;
write(this.options);
2023-01-27 02:47:01 +08:00
super.serialize(context);
}
deserialize(context) {
const { read } = context;
this.options = read();
2023-01-27 02:47:01 +08:00
super.deserialize(context);
}
}
2020-11-26 17:52:55 +08:00
WorkerDependency.Template = class WorkerDependencyTemplate extends (
ModuleDependency.Template
) {
/**
* @param {Dependency} dependency the dependency for which the template should be applied
* @param {ReplaceSource} source the current replace source which can be modified
* @param {DependencyTemplateContext} templateContext the context object
* @returns {void}
*/
apply(dependency, source, templateContext) {
const { chunkGraph, moduleGraph, runtimeRequirements } = templateContext;
const dep = /** @type {WorkerDependency} */ (dependency);
2021-05-11 15:31:46 +08:00
const block = /** @type {AsyncDependenciesBlock} */ (
moduleGraph.getParentBlock(dependency)
);
const entrypoint = /** @type {Entrypoint} */ (
chunkGraph.getBlockChunkGroup(block)
);
const chunk = entrypoint.getEntrypointChunk();
// We use the workerPublicPath option if provided, else we fallback to the RuntimeGlobal publicPath
const workerImportBaseUrl = dep.options.publicPath
? `"${dep.options.publicPath}"`
: RuntimeGlobals.publicPath;
runtimeRequirements.add(RuntimeGlobals.publicPath);
runtimeRequirements.add(RuntimeGlobals.baseURI);
runtimeRequirements.add(RuntimeGlobals.getChunkScriptFilename);
source.replace(
dep.range[0],
dep.range[1] - 1,
`/* worker import */ ${workerImportBaseUrl} + ${
RuntimeGlobals.getChunkScriptFilename
}(${JSON.stringify(chunk.id)}), ${RuntimeGlobals.baseURI}`
);
}
};
makeSerializable(WorkerDependency, "webpack/lib/dependencies/WorkerDependency");
module.exports = WorkerDependency;