mirror of https://github.com/webpack/webpack.git
fix: tree-shaking unused `RawModule` (#19671)
This commit is contained in:
parent
24b1ec7611
commit
34df7eec7e
|
@ -85,9 +85,11 @@ const memoize = require("./util/memoize");
|
||||||
|
|
||||||
const TRANSITIVE = Symbol("transitive");
|
const TRANSITIVE = Symbol("transitive");
|
||||||
|
|
||||||
const getIgnoredModule = memoize(
|
const getIgnoredModule = memoize(() => {
|
||||||
() => new RawModule("/* (ignored) */", "ignored", "(ignored)")
|
const module = new RawModule("/* (ignored) */", "ignored", "(ignored)");
|
||||||
);
|
module.factoryMeta = { sideEffectFree: true };
|
||||||
|
return module;
|
||||||
|
});
|
||||||
|
|
||||||
class Dependency {
|
class Dependency {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
|
|
@ -80,11 +80,14 @@ class IgnorePlugin {
|
||||||
resolveData.dependencies.length > 0 &&
|
resolveData.dependencies.length > 0 &&
|
||||||
resolveData.dependencies[0] instanceof EntryDependency
|
resolveData.dependencies[0] instanceof EntryDependency
|
||||||
) {
|
) {
|
||||||
resolveData.ignoredModule = new RawModule(
|
const module = new RawModule(
|
||||||
"",
|
"",
|
||||||
"ignored-entry-module",
|
"ignored-entry-module",
|
||||||
"(ignored-entry-module)"
|
"(ignored-entry-module)"
|
||||||
);
|
);
|
||||||
|
module.factoryMeta = { sideEffectFree: true };
|
||||||
|
|
||||||
|
resolveData.ignoredModule = module;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -24,6 +24,8 @@ const makeSerializable = require("./util/makeSerializable");
|
||||||
/** @typedef {import("./Module").NeedBuildCallback} NeedBuildCallback */
|
/** @typedef {import("./Module").NeedBuildCallback} NeedBuildCallback */
|
||||||
/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
|
/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
|
||||||
/** @typedef {import("./Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
|
/** @typedef {import("./Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
|
||||||
|
/** @typedef {import("./ModuleGraph")} ModuleGraph */
|
||||||
|
/** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */
|
||||||
/** @typedef {import("./RequestShortener")} RequestShortener */
|
/** @typedef {import("./RequestShortener")} RequestShortener */
|
||||||
/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
|
/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
|
||||||
/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
|
/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
|
||||||
|
@ -105,6 +107,18 @@ class RawModule extends Module {
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {ModuleGraph} moduleGraph the module graph
|
||||||
|
* @returns {ConnectionState} how this module should be connected to referencing modules when consumed for side-effects only
|
||||||
|
*/
|
||||||
|
getSideEffectsConnectionState(moduleGraph) {
|
||||||
|
if (this.factoryMeta !== undefined) {
|
||||||
|
if (this.factoryMeta.sideEffectFree) return false;
|
||||||
|
if (this.factoryMeta.sideEffectFree === false) return true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {CodeGenerationContext} context context for code generation
|
* @param {CodeGenerationContext} context context for code generation
|
||||||
* @returns {CodeGenerationResult} result
|
* @returns {CodeGenerationResult} result
|
||||||
|
|
|
@ -61,11 +61,13 @@ class ModuleDependency extends Dependency {
|
||||||
* @returns {Module} ignored module
|
* @returns {Module} ignored module
|
||||||
*/
|
*/
|
||||||
createIgnoredModule(context) {
|
createIgnoredModule(context) {
|
||||||
return new RawModule(
|
const module = new RawModule(
|
||||||
"/* (ignored) */",
|
"/* (ignored) */",
|
||||||
`ignored|${context}|${this.request}`,
|
`ignored|${context}|${this.request}`,
|
||||||
`${this.request} (ignored)`
|
`${this.request} (ignored)`
|
||||||
);
|
);
|
||||||
|
module.factoryMeta = { sideEffectFree: true };
|
||||||
|
return module;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = "ignored";
|
|
@ -0,0 +1 @@
|
||||||
|
export default "a";
|
|
@ -0,0 +1 @@
|
||||||
|
export default "b";
|
|
@ -0,0 +1,15 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
import "ignored-module";
|
||||||
|
import "./ignored-module";
|
||||||
|
|
||||||
|
it("should remove all ignored modules", async function() {
|
||||||
|
// Current module + module with runtime code to load context modules
|
||||||
|
expect(Object.keys(__webpack_modules__)).toHaveLength(2);
|
||||||
|
|
||||||
|
const x = "a";
|
||||||
|
const locale = (await import("./locales/" + x)).default;
|
||||||
|
|
||||||
|
expect(locale).toBe("a");
|
||||||
|
expect(Object.keys(__webpack_modules__)).toHaveLength(3);
|
||||||
|
});
|
|
@ -0,0 +1,18 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const webpack = require("../../../../");
|
||||||
|
|
||||||
|
/** @type {import("../../../../").Configuration} */
|
||||||
|
module.exports = {
|
||||||
|
entry: "./test.js",
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
"ignored-module": false,
|
||||||
|
"./ignored-module": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugins: [new webpack.IgnorePlugin({ resourceRegExp: /(b\.js|b)$/ })],
|
||||||
|
optimization: {
|
||||||
|
sideEffects: true
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue