diff --git a/lib/NormalModuleFactory.js b/lib/NormalModuleFactory.js index 9a1b22519..4cb2cb65d 100644 --- a/lib/NormalModuleFactory.js +++ b/lib/NormalModuleFactory.js @@ -466,49 +466,68 @@ class NormalModuleFactory extends ModuleFactory { : "") + stringifyLoadersAndResource(loaders, resourceData.resource); - const resourceDataForRules = matchResourceData || resourceData; - const result = this.ruleSet.exec({ - resource: resourceDataForRules.path, - realResource: resourceData.path, - resourceQuery: resourceDataForRules.query, - resourceFragment: resourceDataForRules.fragment, - scheme, - assertions, - mimetype: matchResourceData ? "" : resourceData.data.mimetype || "", - dependency: dependencyType, - descriptionData: matchResourceData - ? undefined - : resourceData.data.descriptionFileData, - issuer: contextInfo.issuer, - compiler: contextInfo.compiler, - issuerLayer: contextInfo.issuerLayer || "" - }); const settings = {}; const useLoadersPost = []; const useLoaders = []; const useLoadersPre = []; - for (const r of result) { - if (r.type === "use") { - if (!noAutoLoaders && !noPrePostAutoLoaders) { - useLoaders.push(r.value); + + // handle .webpack[] suffix + let resource; + let match; + if ( + matchResourceData && + typeof (resource = matchResourceData.resource) === "string" && + (match = /\.webpack\[([^\]]+)\]$/.exec(resource)) + ) { + settings.type = match[1]; + matchResourceData.resource = matchResourceData.resource.slice( + 0, + -settings.type.length - 10 + ); + } else { + settings.type = "javascript/auto"; + const resourceDataForRules = matchResourceData || resourceData; + const result = this.ruleSet.exec({ + resource: resourceDataForRules.path, + realResource: resourceData.path, + resourceQuery: resourceDataForRules.query, + resourceFragment: resourceDataForRules.fragment, + scheme, + assertions, + mimetype: matchResourceData + ? "" + : resourceData.data.mimetype || "", + dependency: dependencyType, + descriptionData: matchResourceData + ? undefined + : resourceData.data.descriptionFileData, + issuer: contextInfo.issuer, + compiler: contextInfo.compiler, + issuerLayer: contextInfo.issuerLayer || "" + }); + for (const r of result) { + if (r.type === "use") { + if (!noAutoLoaders && !noPrePostAutoLoaders) { + useLoaders.push(r.value); + } + } else if (r.type === "use-post") { + if (!noPrePostAutoLoaders) { + useLoadersPost.push(r.value); + } + } else if (r.type === "use-pre") { + if (!noPreAutoLoaders && !noPrePostAutoLoaders) { + useLoadersPre.push(r.value); + } + } else if ( + typeof r.value === "object" && + r.value !== null && + typeof settings[r.type] === "object" && + settings[r.type] !== null + ) { + settings[r.type] = cachedCleverMerge(settings[r.type], r.value); + } else { + settings[r.type] = r.value; } - } else if (r.type === "use-post") { - if (!noPrePostAutoLoaders) { - useLoadersPost.push(r.value); - } - } else if (r.type === "use-pre") { - if (!noPreAutoLoaders && !noPrePostAutoLoaders) { - useLoadersPre.push(r.value); - } - } else if ( - typeof r.value === "object" && - r.value !== null && - typeof settings[r.type] === "object" && - settings[r.type] !== null - ) { - settings[r.type] = cachedCleverMerge(settings[r.type], r.value); - } else { - settings[r.type] = r.value; } } @@ -528,23 +547,6 @@ class NormalModuleFactory extends ModuleFactory { } for (const loader of preLoaders) allLoaders.push(loader); let type = settings.type; - if (!type) { - let resource; - let match; - if ( - matchResourceData && - typeof (resource = matchResourceData.resource) === "string" && - (match = /\.webpack\[([^\]]+)\]$/.exec(resource)) - ) { - type = match[1]; - matchResourceData.resource = matchResourceData.resource.slice( - 0, - -type.length - 10 - ); - } else { - type = "javascript/auto"; - } - } const resolveOptions = settings.resolve; const layer = settings.layer; if (layer !== undefined && !layers) { diff --git a/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js b/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js index 045b29380..af3b1b67c 100644 --- a/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js +++ b/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js @@ -14,8 +14,14 @@ const config = (i, options) => ({ module: { rules: [ { - test: /\.css$/, - use: [MCEP.loader, "css-loader"] + oneOf: [ + { + test: /\.css$/, + use: [MCEP.loader, "css-loader"] + }, + { test: /\.js$/ }, + { type: "asset" } + ] } ] }, diff --git a/test/hotCases/loader-import-module/css/webpack.config.js b/test/hotCases/loader-import-module/css/webpack.config.js index 93bb54984..fbf07de8a 100644 --- a/test/hotCases/loader-import-module/css/webpack.config.js +++ b/test/hotCases/loader-import-module/css/webpack.config.js @@ -8,9 +8,15 @@ module.exports = { }, rules: [ { - test: /\.css\.js$/, - use: "./loader", - type: "asset/source" + oneOf: [ + { + test: /\.css\.js$/, + use: "./loader", + type: "asset/source" + }, + { test: /\.(js|jpg|png)$/ }, + { type: "asset/resource" } + ] } ] },