diff --git a/lib/DllPlugin.js b/lib/DllPlugin.js index 884c21c5821..ffd62cfc523 100644 --- a/lib/DllPlugin.js +++ b/lib/DllPlugin.js @@ -5,8 +5,8 @@ "use strict"; const DllEntryPlugin = require("./DllEntryPlugin"); +const FlagAllModulesAsUsedPlugin = require("./FlagAllModulesAsUsedPlugin"); const LibManifestPlugin = require("./LibManifestPlugin"); -const FlagInitialModulesAsUsedPlugin = require("./FlagInitialModulesAsUsedPlugin"); const validateOptions = require("schema-utils"); const schema = require("../schemas/plugins/DllPlugin.json"); @@ -41,7 +41,7 @@ class DllPlugin { }); new LibManifestPlugin(this.options).apply(compiler); if (!this.options.entryOnly) { - new FlagInitialModulesAsUsedPlugin("DllPlugin").apply(compiler); + new FlagAllModulesAsUsedPlugin("DllPlugin").apply(compiler); } } } diff --git a/lib/FlagAllModulesAsUsedPlugin.js b/lib/FlagAllModulesAsUsedPlugin.js new file mode 100644 index 00000000000..db783cf927b --- /dev/null +++ b/lib/FlagAllModulesAsUsedPlugin.js @@ -0,0 +1,38 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** @typedef {import("./Compiler")} Compiler */ + +class FlagAllModulesAsUsedPlugin { + constructor(explanation) { + this.explanation = explanation; + } + + /** + * @param {Compiler} compiler webpack compiler + * @returns {void} + */ + apply(compiler) { + compiler.hooks.compilation.tap( + "FlagAllModulesAsUsedPlugin", + compilation => { + compilation.hooks.optimizeDependencies.tap( + "FlagAllModulesAsUsedPlugin", + modules => { + for (const module of modules) { + module.used = true; + module.usedExports = true; + module.addReason(null, null, this.explanation); + } + } + ); + } + ); + } +} + +module.exports = FlagAllModulesAsUsedPlugin; diff --git a/lib/FlagDependencyUsagePlugin.js b/lib/FlagDependencyUsagePlugin.js index 85c22160892..2f2a52ee727 100644 --- a/lib/FlagDependencyUsagePlugin.js +++ b/lib/FlagDependencyUsagePlugin.js @@ -93,7 +93,7 @@ class FlagDependencyUsagePlugin { }; for (const module of modules) { - module.used = false; + if (!module.used) module.used = false; } /** @type {[Module, DependenciesBlock, UsedExports][]} */ diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/dependency.js b/test/configCases/dll-plugin-side-effects/0-create-dll/dependency.js new file mode 100644 index 00000000000..1946cd07cb8 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/dependency.js @@ -0,0 +1,3 @@ +export default function createB() { + return "b"; +} diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/dependency2.js b/test/configCases/dll-plugin-side-effects/0-create-dll/dependency2.js new file mode 100644 index 00000000000..0809fdd0180 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/dependency2.js @@ -0,0 +1,3 @@ +export default function createC() { + return "c"; +} diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/index.js b/test/configCases/dll-plugin-side-effects/0-create-dll/index.js new file mode 100644 index 00000000000..3a02fe46bff --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/index.js @@ -0,0 +1,3 @@ +import { a } from "./module"; + +export default a(); diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/module.js b/test/configCases/dll-plugin-side-effects/0-create-dll/module.js new file mode 100644 index 00000000000..257c5b97d93 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/module.js @@ -0,0 +1,12 @@ +import createB from "./dependency"; +import createC from "./dependency2"; + +export function a() { + return "a"; +} + +export { createB as b }; + +export function c() { + return createC(); +} diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/test.config.js b/test/configCases/dll-plugin-side-effects/0-create-dll/test.config.js new file mode 100644 index 00000000000..08ea6c319c8 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/test.config.js @@ -0,0 +1 @@ +exports.noTests = true; diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/webpack.config.js b/test/configCases/dll-plugin-side-effects/0-create-dll/webpack.config.js new file mode 100644 index 00000000000..390ae2422d6 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/webpack.config.js @@ -0,0 +1,31 @@ +var path = require("path"); +var webpack = require("../../../../"); + +module.exports = { + entry: ["./index"], + output: { + filename: "dll.js", + chunkFilename: "[id].dll.js", + libraryTarget: "commonjs2" + }, + module: { + rules: [ + { + test: /0-create-dll.(module|dependency)/, + sideEffects: false + } + ] + }, + optimization: { + usedExports: true, + sideEffects: true + }, + plugins: [ + new webpack.DllPlugin({ + path: path.resolve( + __dirname, + "../../../js/config/dll-plugin-side-effects/manifest0.json" + ) + }) + ] +}; diff --git a/test/configCases/dll-plugin-side-effects/1-use-dll/index.js b/test/configCases/dll-plugin-side-effects/1-use-dll/index.js new file mode 100644 index 00000000000..db354f9f5d6 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/1-use-dll/index.js @@ -0,0 +1,9 @@ +it("should include all exports and modules in the dll", function() { + const { a, b, c } = require("dll/module"); + expect(typeof a).toBe("function"); + expect(a()).toBe("a"); + expect(typeof b).toBe("function"); + expect(b()).toBe("b"); + expect(typeof c).toBe("function"); + expect(c()).toBe("c"); +}); diff --git a/test/configCases/dll-plugin-side-effects/1-use-dll/webpack.config.js b/test/configCases/dll-plugin-side-effects/1-use-dll/webpack.config.js new file mode 100644 index 00000000000..8d1738807ab --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/1-use-dll/webpack.config.js @@ -0,0 +1,12 @@ +var webpack = require("../../../../"); + +module.exports = { + plugins: [ + new webpack.DllReferencePlugin({ + manifest: require("../../../js/config/dll-plugin-side-effects/manifest0.json"), // eslint-disable-line node/no-missing-require + name: "../0-create-dll/dll.js", + scope: "dll", + sourceType: "commonjs2" + }) + ] +}; diff --git a/test/configCases/dll-plugin/0-create-dll/webpack.config.js b/test/configCases/dll-plugin/0-create-dll/webpack.config.js index 527195e32b5..00d9ddb4f54 100644 --- a/test/configCases/dll-plugin/0-create-dll/webpack.config.js +++ b/test/configCases/dll-plugin/0-create-dll/webpack.config.js @@ -27,6 +27,7 @@ module.exports = { ] }, optimization: { + usedExports: true, sideEffects: true }, plugins: [ diff --git a/test/configCases/dll-plugin/0-issue-10475/index.js b/test/configCases/dll-plugin/0-issue-10475/index.js new file mode 100644 index 00000000000..e34a6754188 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/index.js @@ -0,0 +1,3 @@ +import { constants } from "test-package"; + +var x = constants; diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/constants.js b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/constants.js new file mode 100644 index 00000000000..84fc2484ce4 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/constants.js @@ -0,0 +1,2 @@ +export const constant1 = 'constant1'; +export const constant2 = 'constant2'; diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/index.js b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/index.js new file mode 100644 index 00000000000..d2616fb6e1c --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/index.js @@ -0,0 +1,5 @@ +import * as _constants from './constants'; +export var constants = _constants; +export { default as someFunction } from './someFunction'; + +console.log(constants); diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/package.json b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/package.json new file mode 100644 index 00000000000..ce5fa639dd0 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/package.json @@ -0,0 +1,4 @@ +{ + "main": "index.js", + "sideEffects": false +} diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/someFunction.js b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/someFunction.js new file mode 100644 index 00000000000..757d25c6ae7 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/someFunction.js @@ -0,0 +1,3 @@ +export default function someFunction() { + console.log('This is some function'); +} diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/working-constants.js b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/working-constants.js new file mode 100644 index 00000000000..cd433005d3a --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/working-constants.js @@ -0,0 +1,7 @@ +export const constant1 = 'constant1'; +export const constant2 = 'constant2'; + +export default { + constant1, + constant2, +}; diff --git a/test/configCases/dll-plugin/0-issue-10475/test.config.js b/test/configCases/dll-plugin/0-issue-10475/test.config.js new file mode 100644 index 00000000000..08ea6c319c8 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/test.config.js @@ -0,0 +1 @@ +exports.noTests = true; diff --git a/test/configCases/dll-plugin/0-issue-10475/webpack.config.js b/test/configCases/dll-plugin/0-issue-10475/webpack.config.js new file mode 100644 index 00000000000..04ed7a06a1c --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/webpack.config.js @@ -0,0 +1,19 @@ +var path = require("path"); +var webpack = require("../../../../"); + +module.exports = { + entry: ["./index.js"], + output: { + filename: "dll.js", + chunkFilename: "[id].dll.js", + libraryTarget: "commonjs2" + }, + plugins: [ + new webpack.DllPlugin({ + path: path.resolve( + __dirname, + "../../../js/config/dll-plugin/issue-10475.json" + ) + }) + ] +}; diff --git a/test/configCases/dll-plugin/1-issue-10475/index.js b/test/configCases/dll-plugin/1-issue-10475/index.js new file mode 100644 index 00000000000..ae5367529b1 --- /dev/null +++ b/test/configCases/dll-plugin/1-issue-10475/index.js @@ -0,0 +1,3 @@ +it("should have all modules", () => { + require("dll/index.js"); +}); diff --git a/test/configCases/dll-plugin/1-issue-10475/webpack.config.js b/test/configCases/dll-plugin/1-issue-10475/webpack.config.js new file mode 100644 index 00000000000..06546bf81b1 --- /dev/null +++ b/test/configCases/dll-plugin/1-issue-10475/webpack.config.js @@ -0,0 +1,12 @@ +var webpack = require("../../../../"); + +module.exports = { + plugins: [ + new webpack.DllReferencePlugin({ + manifest: require("../../../js/config/dll-plugin/issue-10475.json"), // eslint-disable-line node/no-missing-require + name: "../0-issue-10475/dll.js", + scope: "dll", + sourceType: "commonjs2" + }) + ] +};