Skip to content

Commit 972f53a

Browse files
fix: implement CSS imports render
1 parent 2f43008 commit 972f53a

4 files changed

Lines changed: 70 additions & 23 deletions

File tree

lib/CssModule.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,21 @@
88
const NormalModule = require("./NormalModule");
99
const makeSerializable = require("./util/makeSerializable");
1010

11-
/** @typedef {import("./RequestShortener")} RequestShortener */
1211
/** @typedef {import("./Module")} Module */
12+
/** @typedef {import("./NormalModule").NormalModuleCreateData} NormalModuleCreateData */
13+
/** @typedef {import("./RequestShortener")} RequestShortener */
1314

1415
class CssModule extends NormalModule {
15-
constructor(args) {
16-
super(args);
16+
/**
17+
* @param {NormalModuleCreateData & { cssLayer: string|undefined|null, supports: string|undefined|null, media: string|undefined|null }} options options object
18+
*/
19+
constructor(options) {
20+
super(options);
1721

1822
// Avoid override `layer` for `Module` class, because it is a feature to run module in specific layer
19-
this.csslayer = args.layer;
20-
this.supports = args.supports;
21-
this.media = args.media;
23+
this.csslayer = options.cssLayer;
24+
this.supports = options.supports;
25+
this.media = options.media;
2226
}
2327

2428
/**
@@ -96,7 +100,10 @@ class CssModule extends NormalModule {
96100
parserOptions: null,
97101
generator: null,
98102
generatorOptions: null,
99-
resolveOptions: null
103+
resolveOptions: null,
104+
cssLayer: null,
105+
supports: null,
106+
media: null
100107
});
101108
obj.deserialize(context);
102109
return obj;

lib/NormalModuleFactory.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ class NormalModuleFactory extends ModuleFactory {
234234
generator: new HookMap(
235235
() => new SyncHook(["generator", "generatorOptions"])
236236
),
237-
getModuleClass: new HookMap(
237+
createModuleClass: new HookMap(
238238
() => new SyncBailHook(["createData", "resolveData"])
239239
)
240240
});
@@ -311,17 +311,18 @@ class NormalModuleFactory extends ModuleFactory {
311311
return callback(new Error("Empty dependency (no request)"));
312312
}
313313

314-
// TODO webpack 6 make it required
315-
const module_class =
316-
this.hooks.getModuleClass
317-
.for(createData.settings.type)
318-
.call(createData, resolveData) || NormalModule;
314+
// TODO webpack 6 make it required and move javascript/wasm/asset properties to own module
315+
createdModule = this.hooks.createModuleClass
316+
.for(createData.settings.type)
317+
.call(createData, resolveData);
319318

320-
createdModule = /** @type {Module} */ (
321-
new module_class(
322-
/** @type {NormalModuleCreateData} */ (createData)
323-
)
324-
);
319+
if (!createdModule) {
320+
createdModule = /** @type {Module} */ (
321+
new NormalModule(
322+
/** @type {NormalModuleCreateData} */ (createData)
323+
)
324+
);
325+
}
325326
}
326327

327328
createdModule = this.hooks.module.call(

lib/css/CssModulesPlugin.js

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
"use strict";
77

8-
const { ConcatSource } = require("webpack-sources");
8+
const { ConcatSource, PrefixSource } = require("webpack-sources");
9+
const CssModule = require("../CssModule");
910
const HotUpdateChunk = require("../HotUpdateChunk");
1011
const RuntimeGlobals = require("../RuntimeGlobals");
1112
const SelfModuleFactory = require("../SelfModuleFactory");
12-
const CssModule = require("../CssModule");
1313
const CssExportDependency = require("../dependencies/CssExportDependency");
1414
const CssImportDependency = require("../dependencies/CssImportDependency");
1515
const CssLocalIdentifierDependency = require("../dependencies/CssLocalIdentifierDependency");
@@ -154,9 +154,22 @@ class CssModulesPlugin {
154154
? new CssExportsGenerator()
155155
: new CssGenerator();
156156
});
157-
normalModuleFactory.hooks.getModuleClass
157+
normalModuleFactory.hooks.createModuleClass
158158
.for(type)
159-
.tap(plugin, () => CssModule);
159+
.tap(plugin, (createData, resolveData) => {
160+
if (resolveData.dependencies.length > 0) {
161+
const dependency = resolveData.dependencies[0];
162+
163+
return new CssModule({
164+
...createData,
165+
cssLayer: dependency.layer,
166+
supports: dependency.supports,
167+
media: dependency.media
168+
});
169+
}
170+
171+
return new CssModule(createData);
172+
});
160173
}
161174
const orderedCssModulesPerChunk = new WeakMap();
162175
compilation.hooks.afterCodeGeneration.tap("CssModulesPlugin", () => {
@@ -387,9 +400,34 @@ class CssModulesPlugin {
387400
try {
388401
const codeGenResult = codeGenerationResults.get(module, chunk.runtime);
389402

390-
const s =
403+
let s =
391404
codeGenResult.sources.get("css") ||
392405
codeGenResult.sources.get("css-import");
406+
407+
if (module.cssLayer) {
408+
s = new ConcatSource(
409+
`@layer (${module.cssLayer}) {\n`,
410+
new PrefixSource("\t", s),
411+
"}"
412+
);
413+
}
414+
415+
if (module.media) {
416+
s = new ConcatSource(
417+
`@media (${module.media}) {\n`,
418+
new PrefixSource("\t", s),
419+
"}"
420+
);
421+
}
422+
423+
if (module.supports) {
424+
s = new ConcatSource(
425+
`@supports (${module.supports}) {\n`,
426+
new PrefixSource("\t", s),
427+
"}"
428+
);
429+
}
430+
393431
if (s) {
394432
source.add(s);
395433
source.add("\n");

test/configCases/css/css-import/style.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
@import url(print.css?foo=18) screen ;
2222
@import url("print.css?foo=19") screen ;
2323
@import "print.css?foo=20" screen ;
24+
@import "print.css?foo=21" ;
2425

2526
body {
2627
background: red;

0 commit comments

Comments
 (0)