diff --git a/lib/ContextModule.js b/lib/ContextModule.js index 9ded86611f3..5209d340ac2 100644 --- a/lib/ContextModule.js +++ b/lib/ContextModule.js @@ -64,6 +64,7 @@ const makeSerializable = require("./util/makeSerializable"); * @property {string=} typePrefix * @property {string=} category * @property {string[][]=} referencedExports exports referenced from modules (won't be mangled) + * @property {string=} layer */ /** @@ -107,8 +108,9 @@ class ContextModule extends Module { const resourceQuery = (options && options.resourceQuery) || parsed.query; const resourceFragment = (options && options.resourceFragment) || parsed.fragment; + const layer = options && options.layer; - super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, resource); + super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, resource, layer); /** @type {ContextModuleOptions} */ this.options = { ...options, @@ -117,7 +119,7 @@ class ContextModule extends Module { resourceFragment }; } else { - super(JAVASCRIPT_MODULE_TYPE_DYNAMIC); + super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, undefined, options.layer); /** @type {ContextModuleOptions} */ this.options = { ...options, diff --git a/lib/ContextModuleFactory.js b/lib/ContextModuleFactory.js index bf635a0e7c7..b30447b8788 100644 --- a/lib/ContextModuleFactory.js +++ b/lib/ContextModuleFactory.js @@ -95,6 +95,7 @@ module.exports = class ContextModuleFactory extends ModuleFactory { { context: context, dependencies: dependencies, + layer: data.contextInfo.issuerLayer, resolveOptions, fileDependencies, missingDependencies, diff --git a/test/__snapshots__/StatsTestCases.basictest.js.snap b/test/__snapshots__/StatsTestCases.basictest.js.snap index d5704c42e2e..553d06306f4 100644 --- a/test/__snapshots__/StatsTestCases.basictest.js.snap +++ b/test/__snapshots__/StatsTestCases.basictest.js.snap @@ -751,92 +751,92 @@ exports[`StatsTestCases should print correct stats for concat-and-sideeffects 1` `; exports[`StatsTestCases should print correct stats for context-independence 1`] = ` -"asset main-5a998235f48a10c7522b.js 12.8 KiB [emitted] [immutable] (name: main) - sourceMap main-5a998235f48a10c7522b.js.map 11.1 KiB [emitted] [dev] (auxiliary name: main) +"asset main-6bdf116ffeb138753a9a.js 12.8 KiB [emitted] [immutable] (name: main) + sourceMap main-6bdf116ffeb138753a9a.js.map 11.1 KiB [emitted] [dev] (auxiliary name: main) asset 695-d9846ea7920868a759cd.js 455 bytes [emitted] [immutable] sourceMap 695-d9846ea7920868a759cd.js.map 347 bytes [emitted] [dev] runtime modules 6.61 KiB 9 modules orphan modules 19 bytes [orphan] 1 module built modules 500 bytes [built] - modules by layer 234 bytes - ./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated] - ./a/c/a.js 18 bytes [optional] [built] [code generated] - ./a/cc/b.js 18 bytes [optional] [built] [code generated] - modules by layer (in Xdir/context-independence/a) 266 bytes + modules by path ./a/*.js 266 bytes ./a/index.js (in Xdir/context-independence/a) 200 bytes [built] [code generated] ./a/chunk.js + 1 modules (in Xdir/context-independence/a) 66 bytes [built] [code generated] + modules by path ./a/c/ 216 bytes + ./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object (in Xdir/context-independence/a) 198 bytes [built] [code generated] + ./a/c/a.js (in Xdir/context-independence/a) 18 bytes [optional] [built] [code generated] + ./a/cc/b.js (in Xdir/context-independence/a) 18 bytes [optional] [built] [code generated] webpack x.x.x compiled successfully in X ms -asset main-5a998235f48a10c7522b.js 12.8 KiB [emitted] [immutable] (name: main) - sourceMap main-5a998235f48a10c7522b.js.map 11.1 KiB [emitted] [dev] (auxiliary name: main) +asset main-6bdf116ffeb138753a9a.js 12.8 KiB [emitted] [immutable] (name: main) + sourceMap main-6bdf116ffeb138753a9a.js.map 11.1 KiB [emitted] [dev] (auxiliary name: main) asset 695-d9846ea7920868a759cd.js 455 bytes [emitted] [immutable] sourceMap 695-d9846ea7920868a759cd.js.map 347 bytes [emitted] [dev] runtime modules 6.61 KiB 9 modules orphan modules 19 bytes [orphan] 1 module built modules 500 bytes [built] - modules by layer 234 bytes - ./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated] - ./b/c/a.js 18 bytes [optional] [built] [code generated] - ./b/cc/b.js 18 bytes [optional] [built] [code generated] - modules by layer (in Xdir/context-independence/b) 266 bytes + modules by path ./b/*.js 266 bytes ./b/index.js (in Xdir/context-independence/b) 200 bytes [built] [code generated] ./b/chunk.js + 1 modules (in Xdir/context-independence/b) 66 bytes [built] [code generated] + modules by path ./b/c/ 216 bytes + ./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object (in Xdir/context-independence/b) 198 bytes [built] [code generated] + ./b/c/a.js (in Xdir/context-independence/b) 18 bytes [optional] [built] [code generated] + ./b/cc/b.js (in Xdir/context-independence/b) 18 bytes [optional] [built] [code generated] webpack x.x.x compiled successfully in X ms -asset main-21184090ed4ef75bcb88.js 14.9 KiB [emitted] [immutable] (name: main) +asset main-0a98b6dc7990e85a9e88.js 14.9 KiB [emitted] [immutable] (name: main) asset 695-3a54289b6e0375f1e753.js 1.51 KiB [emitted] [immutable] runtime modules 6.61 KiB 9 modules orphan modules 19 bytes [orphan] 1 module built modules 500 bytes [built] - modules by layer 234 bytes - ./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated] - ./a/c/a.js 18 bytes [optional] [built] [code generated] - ./a/cc/b.js 18 bytes [optional] [built] [code generated] - modules by layer (in Xdir/context-independence/a) 266 bytes + modules by path ./a/*.js 266 bytes ./a/index.js (in Xdir/context-independence/a) 200 bytes [built] [code generated] ./a/chunk.js + 1 modules (in Xdir/context-independence/a) 66 bytes [built] [code generated] + modules by path ./a/c/ 216 bytes + ./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object (in Xdir/context-independence/a) 198 bytes [built] [code generated] + ./a/c/a.js (in Xdir/context-independence/a) 18 bytes [optional] [built] [code generated] + ./a/cc/b.js (in Xdir/context-independence/a) 18 bytes [optional] [built] [code generated] webpack x.x.x compiled successfully in X ms -asset main-21184090ed4ef75bcb88.js 14.9 KiB [emitted] [immutable] (name: main) +asset main-0a98b6dc7990e85a9e88.js 14.9 KiB [emitted] [immutable] (name: main) asset 695-3a54289b6e0375f1e753.js 1.51 KiB [emitted] [immutable] runtime modules 6.61 KiB 9 modules orphan modules 19 bytes [orphan] 1 module built modules 500 bytes [built] - modules by layer 234 bytes - ./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated] - ./b/c/a.js 18 bytes [optional] [built] [code generated] - ./b/cc/b.js 18 bytes [optional] [built] [code generated] - modules by layer (in Xdir/context-independence/b) 266 bytes + modules by path ./b/*.js 266 bytes ./b/index.js (in Xdir/context-independence/b) 200 bytes [built] [code generated] ./b/chunk.js + 1 modules (in Xdir/context-independence/b) 66 bytes [built] [code generated] + modules by path ./b/c/ 216 bytes + ./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object (in Xdir/context-independence/b) 198 bytes [built] [code generated] + ./b/c/a.js (in Xdir/context-independence/b) 18 bytes [optional] [built] [code generated] + ./b/cc/b.js (in Xdir/context-independence/b) 18 bytes [optional] [built] [code generated] webpack x.x.x compiled successfully in X ms -asset main-bd73ac146ff966959dfc.js 13.8 KiB [emitted] [immutable] (name: main) +asset main-691f05a68a2fe9729db1.js 13.8 KiB [emitted] [immutable] (name: main) asset 695-ace208366ce0ce2556ef.js 1.01 KiB [emitted] [immutable] runtime modules 6.61 KiB 9 modules orphan modules 19 bytes [orphan] 1 module built modules 500 bytes [built] - modules by layer 234 bytes - ./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated] - ./a/c/a.js 18 bytes [optional] [built] [code generated] - ./a/cc/b.js 18 bytes [optional] [built] [code generated] - modules by layer (in Xdir/context-independence/a) 266 bytes + modules by path ./a/*.js 266 bytes ./a/index.js (in Xdir/context-independence/a) 200 bytes [built] [code generated] ./a/chunk.js + 1 modules (in Xdir/context-independence/a) 66 bytes [built] [code generated] + modules by path ./a/c/ 216 bytes + ./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object (in Xdir/context-independence/a) 198 bytes [built] [code generated] + ./a/c/a.js (in Xdir/context-independence/a) 18 bytes [optional] [built] [code generated] + ./a/cc/b.js (in Xdir/context-independence/a) 18 bytes [optional] [built] [code generated] webpack x.x.x compiled successfully in X ms -asset main-bd73ac146ff966959dfc.js 13.8 KiB [emitted] [immutable] (name: main) +asset main-691f05a68a2fe9729db1.js 13.8 KiB [emitted] [immutable] (name: main) asset 695-ace208366ce0ce2556ef.js 1.01 KiB [emitted] [immutable] runtime modules 6.61 KiB 9 modules orphan modules 19 bytes [orphan] 1 module built modules 500 bytes [built] - modules by layer 234 bytes - ./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object 198 bytes [built] [code generated] - ./b/c/a.js 18 bytes [optional] [built] [code generated] - ./b/cc/b.js 18 bytes [optional] [built] [code generated] - modules by layer (in Xdir/context-independence/b) 266 bytes + modules by path ./b/*.js 266 bytes ./b/index.js (in Xdir/context-independence/b) 200 bytes [built] [code generated] ./b/chunk.js + 1 modules (in Xdir/context-independence/b) 66 bytes [built] [code generated] + modules by path ./b/c/ 216 bytes + ./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object (in Xdir/context-independence/b) 198 bytes [built] [code generated] + ./b/c/a.js (in Xdir/context-independence/b) 18 bytes [optional] [built] [code generated] + ./b/cc/b.js (in Xdir/context-independence/b) 18 bytes [optional] [built] [code generated] webpack x.x.x compiled successfully in X ms" `; diff --git a/test/configCases/layer/rules/dynamic-module-layer.js b/test/configCases/layer/rules/dynamic-module-layer.js new file mode 100644 index 00000000000..4c082635268 --- /dev/null +++ b/test/configCases/layer/rules/dynamic-module-layer.js @@ -0,0 +1,13 @@ +async function main(name) { + const { object: dynamicModuleObject } = await import(`./dynamic/${name}`); + return dynamicModuleObject; +} + +export const object = { + name: 'module entry', + layer: __webpack_layer__, + modules: [ + main('module1'), + main('module2'), + ] +}; \ No newline at end of file diff --git a/test/configCases/layer/rules/dynamic/module1.js b/test/configCases/layer/rules/dynamic/module1.js new file mode 100644 index 00000000000..2ee153c0c42 --- /dev/null +++ b/test/configCases/layer/rules/dynamic/module1.js @@ -0,0 +1,4 @@ +export const object = { + name: 'module1', + layer: __webpack_layer__, +}; \ No newline at end of file diff --git a/test/configCases/layer/rules/dynamic/module2.js b/test/configCases/layer/rules/dynamic/module2.js new file mode 100644 index 00000000000..1a9d4536add --- /dev/null +++ b/test/configCases/layer/rules/dynamic/module2.js @@ -0,0 +1,4 @@ +export const object = { + name: 'module2', + layer: __webpack_layer__ +}; \ No newline at end of file diff --git a/test/configCases/layer/rules/index.js b/test/configCases/layer/rules/index.js index 27fc81fe4b0..f41c8b5ab27 100644 --- a/test/configCases/layer/rules/index.js +++ b/test/configCases/layer/rules/index.js @@ -14,6 +14,8 @@ import { direct as otherLayerDirect } from "./module-other-layer-change"; import { reexported as otherLayerReexported } from "./module-other-layer-change"; import { __loaderValue as otherLayerValue } from "./module-other-layer-change"; +import { object as dynamicModules } from "./dynamic-module-layer" + it("should allow to duplicate modules with layers", () => { expect(direct).toBe(reexported); expect(layerDirect).toBe(layerReexported); @@ -36,3 +38,10 @@ it("apply externals based on layer", () => { expect(layerExternal1).toBe(43); expect(layerExternal2).toBe(43); }); + +it("apply layer for dynamic imports with dynamic resources", async () => { + const mods = await Promise.all(dynamicModules.modules) + expect(dynamicModules.layer).toBe('dynamic-layer') + expect(mods[0]).toMatchObject({ layer: 'dynamic-layer', name: 'module1' }) + expect(mods[1]).toMatchObject({ layer: 'dynamic-layer', name: 'module2' }) +}) diff --git a/test/configCases/layer/rules/webpack.config.js b/test/configCases/layer/rules/webpack.config.js index 2390c9c0d82..a1dc2986b58 100644 --- a/test/configCases/layer/rules/webpack.config.js +++ b/test/configCases/layer/rules/webpack.config.js @@ -42,6 +42,10 @@ module.exports = { options: { value: "entry" } + }, + { + test: /dynamic-module-layer/, + layer: "dynamic-layer" } ] }, diff --git a/types.d.ts b/types.d.ts index 26bc92ee44a..bd94479bac0 100644 --- a/types.d.ts +++ b/types.d.ts @@ -2685,6 +2685,7 @@ declare interface ContextModuleOptions { * exports referenced from modules (won't be mangled) */ referencedExports?: string[][]; + layer?: string; resource: string | false | string[]; resourceQuery?: string; resourceFragment?: string;