diff --git a/lib/WebpackOptionsApply.js b/lib/WebpackOptionsApply.js index fc50a472519..c6d59400001 100644 --- a/lib/WebpackOptionsApply.js +++ b/lib/WebpackOptionsApply.js @@ -35,6 +35,7 @@ const ResolverCachePlugin = require("./cache/ResolverCachePlugin"); const CommonJsPlugin = require("./dependencies/CommonJsPlugin"); const HarmonyModulesPlugin = require("./dependencies/HarmonyModulesPlugin"); +const ImportMetaContextPlugin = require("./dependencies/ImportMetaContextPlugin"); const ImportMetaPlugin = require("./dependencies/ImportMetaPlugin"); const ImportPlugin = require("./dependencies/ImportPlugin"); const LoaderPlugin = require("./dependencies/LoaderPlugin"); @@ -361,6 +362,7 @@ class WebpackOptionsApply extends OptionsApply { new RequireEnsurePlugin().apply(compiler); new RequireContextPlugin().apply(compiler); new ImportPlugin().apply(compiler); + new ImportMetaContextPlugin().apply(compiler); new SystemPlugin().apply(compiler); new ImportMetaPlugin().apply(compiler); new URLPlugin().apply(compiler); diff --git a/lib/dependencies/ImportMetaContextPlugin.js b/lib/dependencies/ImportMetaContextPlugin.js new file mode 100644 index 00000000000..1d7d7ce8156 --- /dev/null +++ b/lib/dependencies/ImportMetaContextPlugin.js @@ -0,0 +1,59 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Ivan Kopeykin @vankop +*/ + +"use strict"; + +const ContextElementDependency = require("./ContextElementDependency"); +const ImportMetaContextDependency = require("./ImportMetaContextDependency"); +const ImportMetaContextDependencyParserPlugin = require("./ImportMetaContextDependencyParserPlugin"); + +/** @typedef {import("../../declarations/WebpackOptions").ResolveOptions} ResolveOptions */ +/** @typedef {import("../Compiler")} Compiler */ + +class ImportMetaContextPlugin { + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + compiler.hooks.compilation.tap( + "RequireContextPlugin", + (compilation, { contextModuleFactory, normalModuleFactory }) => { + compilation.dependencyFactories.set( + ImportMetaContextDependency, + contextModuleFactory + ); + compilation.dependencyTemplates.set( + ImportMetaContextDependency, + new ImportMetaContextDependency.Template() + ); + compilation.dependencyFactories.set( + ContextElementDependency, + normalModuleFactory + ); + + const handler = (parser, parserOptions) => { + if ( + parserOptions.importMetaContext !== undefined && + !parserOptions.importMetaContext + ) + return; + + new ImportMetaContextDependencyParserPlugin().apply(parser); + }; + + normalModuleFactory.hooks.parser + .for("javascript/auto") + .tap("ImportMetaContextPlugin", handler); + normalModuleFactory.hooks.parser + .for("javascript/esm") + .tap("ImportMetaContextPlugin", handler); + } + ); + } +} + +module.exports = ImportMetaContextPlugin; diff --git a/lib/dependencies/RequireContextPlugin.js b/lib/dependencies/RequireContextPlugin.js index 782a076a4c7..d34c85e452a 100644 --- a/lib/dependencies/RequireContextPlugin.js +++ b/lib/dependencies/RequireContextPlugin.js @@ -7,8 +7,6 @@ const { cachedSetProperty } = require("../util/cleverMerge"); const ContextElementDependency = require("./ContextElementDependency"); -const ImportMetaContextDependency = require("./ImportMetaContextDependency"); -const ImportMetaContextDependencyParserPlugin = require("./ImportMetaContextDependencyParserPlugin"); const RequireContextDependency = require("./RequireContextDependency"); const RequireContextDependencyParserPlugin = require("./RequireContextDependencyParserPlugin"); @@ -36,14 +34,6 @@ class RequireContextPlugin { RequireContextDependency, new RequireContextDependency.Template() ); - compilation.dependencyFactories.set( - ImportMetaContextDependency, - contextModuleFactory - ); - compilation.dependencyTemplates.set( - ImportMetaContextDependency, - new ImportMetaContextDependency.Template() - ); compilation.dependencyFactories.set( ContextElementDependency, @@ -60,16 +50,6 @@ class RequireContextPlugin { new RequireContextDependencyParserPlugin().apply(parser); }; - const handlerImportMeta = (parser, parserOptions) => { - new ImportMetaContextDependencyParserPlugin().apply(parser); - }; - - normalModuleFactory.hooks.parser - .for("javascript/auto") - .tap("RequireContextPlugin", handlerImportMeta); - normalModuleFactory.hooks.parser - .for("javascript/esm") - .tap("RequireContextPlugin", handlerImportMeta); normalModuleFactory.hooks.parser .for("javascript/auto") .tap("RequireContextPlugin", handler); diff --git a/test/cases/chunks/context-weak/index.js b/test/cases/chunks/context-weak/index.js index a3f34d8d18a..e4f711141f5 100644 --- a/test/cases/chunks/context-weak/index.js +++ b/test/cases/chunks/context-weak/index.js @@ -1,4 +1,11 @@ it("should not bundle context requires with asyncMode === 'weak'", function() { + var contextRequire = require.context(".", false, /two/, "weak"); + expect(function() { + contextRequire("./two") + }).toThrowError(/not available/); +}); + +it("should not bundle context requires with asyncMode === 'weak' using import.meta.webpackContext", function() { const contextRequire = import.meta.webpackContext(".", { recursive: false, regExp: /two/, @@ -10,13 +17,13 @@ it("should not bundle context requires with asyncMode === 'weak'", function() { }); it("should find module with asyncMode === 'weak' when required elsewhere", function() { - const contextRequire = require.context(".", false, /.+/, "weak"); + var contextRequire = require.context(".", false, /.+/, "weak"); expect(contextRequire("./three")).toBe(3); require("./three"); // in a real app would be served as a separate chunk }); it("should find module with asyncMode === 'weak' when required elsewhere (recursive)", function() { - const contextRequire = require.context(".", true, /.+/, "weak"); + var contextRequire = require.context(".", true, /.+/, "weak"); expect(contextRequire("./dir/four")).toBe(4); require("./dir/four"); // in a real app would be served as a separate chunk });