get rid of hack for remote override module

This commit is contained in:
Tobias Koppers 2020-02-26 17:16:01 +01:00
parent 7fb423704a
commit 83b7faa67c
7 changed files with 96 additions and 26 deletions

View File

@ -8,9 +8,10 @@
const ExternalsPlugin = require("../ExternalsPlugin");
const RuntimeGlobals = require("../RuntimeGlobals");
const RemoteModule = require("./RemoteModule");
const RemoteOverrideModuleFactory = require("./RemoteOverrideModuleFactory");
const RemoteRuntimeModule = require("./RemoteRuntimeModule");
const RemoteOverrideModule = require("./RemoteOverrideModule");
const RemoteToExternalDependency = require("./RemoteToExternalDependency");
const RemoteToOverrideDependency = require("./RemoteToOverrideDependency");
const parseOptions = require("./parseOptions");
/** @typedef {import("../Compiler")} Compiler */
@ -46,6 +47,11 @@ module.exports = class ContainerReferencePlugin {
normalModuleFactory
);
compilation.dependencyFactories.set(
RemoteToOverrideDependency,
new RemoteOverrideModuleFactory()
);
normalModuleFactory.hooks.factorize.tap(
"ContainerReferencePlugin",
data => {
@ -54,9 +60,8 @@ module.exports = class ContainerReferencePlugin {
if (data.request.startsWith(`${key}/`)) {
return new RemoteModule(
data.request,
`${
this.overrides.length ? "remote-override-module/" : ""
}container-reference/${key}`,
this.overrides,
`container-reference/${key}`,
data.request.slice(key.length + 1)
);
}
@ -65,19 +70,6 @@ module.exports = class ContainerReferencePlugin {
}
);
normalModuleFactory.hooks.factorize.tap(
"ContainerReferencePlugin",
data => {
// TODO use a custom dependency and factory instead
if (data.request.startsWith(`remote-override-module/`)) {
return new RemoteOverrideModule(
data.request.slice(`remote-override-module/`.length),
this.overrides
);
}
}
);
compilation.hooks.additionalTreeRuntimeRequirements.tap(
"OverridablesPlugin",
(chunk, set) => {

View File

@ -9,6 +9,7 @@ const { RawSource } = require("webpack-sources");
const Module = require("../Module");
const RuntimeGlobals = require("../RuntimeGlobals");
const RemoteToExternalDependency = require("./RemoteToExternalDependency");
const RemoteToOverrideDependency = require("./RemoteToOverrideDependency");
/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
/** @typedef {import("../ChunkGraph")} ChunkGraph */
@ -26,9 +27,10 @@ const TYPES = new Set(["remote"]);
const RUNTIME_REQUIREMENTS = new Set([RuntimeGlobals.module]);
class RemoteModule extends Module {
constructor(request, externalRequest, internalRequest) {
constructor(request, overrides, externalRequest, internalRequest) {
super("remote-module");
this.request = request;
this.overrides = overrides;
this.externalRequest = externalRequest;
this.internalRequest = internalRequest;
}
@ -63,7 +65,13 @@ class RemoteModule extends Module {
};
this.clearDependenciesAndBlocks();
this.addDependency(new RemoteToExternalDependency(this.externalRequest));
if (this.overrides.length > 0) {
this.addDependency(
new RemoteToOverrideDependency(this.externalRequest, this.overrides)
);
} else {
this.addDependency(new RemoteToExternalDependency(this.externalRequest));
}
callback();
}

View File

@ -6,13 +6,14 @@
"use strict";
const { RawSource } = require("webpack-sources");
const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
const Module = require("../Module");
const RuntimeGlobals = require("../RuntimeGlobals");
const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
const RemoteToExternalDependency = require("./RemoteToExternalDependency");
const Template = require("../Template");
const RemoteToExternalDependency = require("./RemoteToExternalDependency");
/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
/** @typedef {import("../Chunk")} Chunk */
/** @typedef {import("../ChunkGraph")} ChunkGraph */
/** @typedef {import("../ChunkGroup")} ChunkGroup */
/** @typedef {import("../Compilation")} Compilation */
@ -84,6 +85,10 @@ class RemoteModule extends Module {
return chunkGraph.getNumberOfEntryModules(chunk) > 0;
}
/**
* @param {string=} type the source type for which the size should be estimated
* @returns {number} the estimated size of the module (must be non-zero)
*/
size(type) {
return 42;
}

View File

@ -0,0 +1,30 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
*/
"use strict";
const ModuleFactory = require("../ModuleFactory");
const RemoteOverrideModule = require("./RemoteOverrideModule");
/** @typedef {import("../ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
/** @typedef {import("../ModuleFactory").ModuleFactoryResult} ModuleFactoryResult */
/** @typedef {import("./RemoteToOverrideDependency")} RemoteToOverrideDependency */
class RemoteOverrideModuleFactory extends ModuleFactory {
/**
* @param {ModuleFactoryCreateData} data data object
* @param {function(Error=, ModuleFactoryResult=): void} callback callback
* @returns {void}
*/
create(data, callback) {
const dep =
/** @type {RemoteToOverrideDependency} */ (data.dependencies[0]);
callback(null, {
module: new RemoteOverrideModule(dep.request, dep.overrides)
});
}
}
module.exports = RemoteOverrideModuleFactory;

View File

@ -59,16 +59,12 @@ class RemoteRuntimeModule extends RuntimeModule {
`chunkMapping[chunkId].forEach(${runtimeTemplate.basicFunction("id", [
"if(__webpack_modules__[id]) return;",
"var data = idToExternalAndNameMapping[id];",
"console.log(data);",
`promises.push(Promise.resolve(__webpack_require__(data[0]).get(data[1])).then(${runtimeTemplate.basicFunction(
"factory",
[
`__webpack_modules__[id] = ${runtimeTemplate.basicFunction(
"module",
[
"console.log(factory.toString());",
"module.exports = factory();"
]
["module.exports = factory();"]
)}`
]
)}))`

View File

@ -0,0 +1,37 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
const ModuleDependency = require("../dependencies/ModuleDependency");
const makeSerializable = require("../util/makeSerializable");
class RemoteToOverrideDependency extends ModuleDependency {
constructor(request, overrides) {
super(request);
this.overrides = overrides;
}
get type() {
return "remote to override";
}
serialize(context) {
context.write(this.overrides);
super.serialize(context);
}
deserialize(context) {
this.overrides = context.read();
super.deserialize(context);
}
}
makeSerializable(
RemoteToOverrideDependency,
"webpack/lib/container/RemoteToOverrideDependency"
);
module.exports = RemoteToOverrideDependency;

View File

@ -23,6 +23,8 @@ module.exports = {
require("../container/OverridableOriginalDependency"),
"container/RemoteToExternalDependency": () =>
require("../container/RemoteToExternalDependency"),
"container/RemoteToOverrideDependency": () =>
require("../container/RemoteToOverrideDependency"),
"dependencies/AMDDefineDependency": () =>
require("../dependencies/AMDDefineDependency"),
"dependencies/AMDRequireArrayDependency": () =>