Skip to content

Commit 54fa5e8

Browse files
committed
feat: add support for dynamic import of styles
1 parent 32f46ee commit 54fa5e8

23 files changed

Lines changed: 160 additions & 5 deletions

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
# Change log
22

3+
## 3.9.0 (2024-04-07)
4+
5+
- feat: add support for dynamic import of styles
6+
```
7+
const loadStyles = () => import('./component.scss');
8+
loadStyles();
9+
```
10+
- fix: extract CSS from styles imported in dynamically imported JS
11+
312
## 3.8.0 (2024-04-06)
413

514
- feat(Pug): add experimental (undocumented) syntax to include (using `?include` query) compiled CSS directly into style tag to allow keep tag attributes

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "html-bundler-webpack-plugin",
3-
"version": "3.8.0",
3+
"version": "3.9.0",
44
"description": "HTML bundler plugin for webpack handles a template as an entry point, extracts CSS and JS from their sources referenced in HTML, supports template engines like Eta, EJS, Handlebars, Nunjucks.",
55
"keywords": [
66
"html",

src/Plugin/Collection.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -486,23 +486,36 @@ class Collection {
486486
let order = '';
487487

488488
const walk = (module) => {
489-
const { dependencies } = module;
489+
// dependencies contains modules from normal imports, e.g. import './main.js'
490+
// blocks contains modules from dynamic imports, e.g. import('./main.js')
491+
const { dependencies, blocks } = module;
490492
const result = [];
493+
let allDependencies = dependencies;
491494

492495
// avoid an infinity walk by circular dependency
493496
if (circularDependencyIds.has(module.debugId)) {
494497
return result;
495498
}
496499
circularDependencyIds.add(module.debugId);
497500

498-
for (const dependency of dependencies) {
501+
// add dynamic imports
502+
if (blocks.length > 0) {
503+
for (const block of blocks) {
504+
if (block.dependencies.length > 0) {
505+
allDependencies = allDependencies.concat(block.dependencies);
506+
}
507+
}
508+
}
509+
510+
for (const dependency of allDependencies) {
499511
// TODO: detect whether the userRequest is a file, not a runtime, e.g. of vue
500512
if (
501513
!dependency.userRequest ||
502514
// skip vue runtime dependencies
503515
dependency.userRequest === 'vue'
504-
)
516+
) {
505517
continue;
518+
}
506519

507520
let depModule = moduleGraph.getModule(dependency);
508521

@@ -519,7 +532,7 @@ class Collection {
519532

520533
const index = moduleGraph.getParentBlockIndex(dependency);
521534

522-
if (depModule.dependencies.length > 0) {
535+
if (depModule.dependencies.length > 0 || depModule.blocks.length > 0) {
523536
// save current order before recursive walking
524537
orderStack.push(order);
525538
order += (order ? '.' : '') + index;

test/cases/js-import-css-dynamic-import/expected/120.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
(self.webpackChunk=self.webpackChunk||[]).push([[70],{70:()=>{}}]);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
(self.webpackChunk=self.webpackChunk||[]).push([[758],{758:()=>{}}]);

test/cases/js-import-css-dynamic-import/expected/851.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
(self.webpackChunk=self.webpackChunk||[]).push([[942],{942:()=>{}}]);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Home</title>
5+
<link href="main.879f66d3.css" rel="stylesheet">
6+
<script src="main.8a1510f2.js" defer="defer"></script>
7+
</head>
8+
<body>
9+
<h1>Home</h1>
10+
<div class="a1">lawngreen</div>
11+
<div class="a2">slateblue</div>
12+
<div class="b1">darkmagenta</div>
13+
<div class="c1">indianred</div>
14+
</body>
15+
</html>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.b1 {
2+
color: darkmagenta;
3+
}
4+
h1 {
5+
color: orangered;
6+
}
7+
.a1 {
8+
color: lawngreen;
9+
}
10+
.a2 {
11+
color: slateblue;
12+
}
13+
.c1 {
14+
color: indianred;
15+
}

0 commit comments

Comments
 (0)