Skip to content

Commit 4fbe63c

Browse files
committed
fix: template rendering error in serve/watch mode with JS templates, #174
1 parent 22a1e4a commit 4fbe63c

File tree

22 files changed

+187
-8
lines changed

22 files changed

+187
-8
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 4.20.4 (2025-06-28)
4+
5+
- fix: template rendering error in serve/watch mode with JS templates, #174
6+
This issue was introduced in v4. In v3 works fine.
7+
38
## 4.20.3 (2025-06-27)
49

510
- fix: handlebars preprocessor when a partial is used in both a Handlebars template and a JS template, #174

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": "4.20.3",
3+
"version": "4.20.4",
44
"description": "Generates complete single-page or multi-page website from source assets. Built-in support for Markdown, Eta, EJS, Handlebars, Nunjucks, Pug. Alternative to html-webpack-plugin.",
55
"keywords": [
66
"html",

src/Loader/Option.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ class Option {
8181
options.contextDir = loaderOptions.context || '';
8282

8383
// whether it should be used ESM export for the rendered/compiled result
84-
options.esModule = options?.esModule === true;
84+
options.esModule = options.esModule === true;
85+
86+
// save the initial value defined in the webpack config
87+
options.originalPreprocessorMode = options.preprocessorMode;
8588

8689
// set reference to sources defined directly in plugin options
8790
if (this.#pluginOption.options?.sources != null) {
@@ -148,7 +151,6 @@ class Option {
148151
const queryData = this.#queryData;
149152
const options = this.#options;
150153
const issuer = loaderContext._module.resourceResolveData?.context?.issuer || '';
151-
152154
let [defaultPreprocessorMode] = this.preprocessorModes;
153155
let isIssuerScript = false;
154156
let preprocessorMode;
@@ -177,6 +179,10 @@ class Option {
177179
}
178180
}
179181

182+
// reset the original option value, also no cached state,
183+
// because the loader works in different modes depend on the context
184+
options.preprocessorMode = options.originalPreprocessorMode;
185+
180186
if (preprocessorMode && this.preprocessorModes.has(preprocessorMode)) {
181187
options.preprocessorMode = preprocessorMode;
182188
} else if (!this.preprocessorModes.has(options.preprocessorMode)) {

src/Loader/Preprocessors/Handlebars/index.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
const path = require('path');
2+
const LoaderFactory = require('../../LoaderFactory');
23
const { stringifyJSON, stringifyFn } = require('../../Utils');
34
const { loadModule, readDirRecursiveSync } = require('../../../Common/FileUtils');
45
const { isWin, pathToPosix } = require('../../../Common/Helpers');
5-
const LoaderFactory = require('../../LoaderFactory');
66

77
// node module name
88
const moduleName = 'handlebars';
@@ -239,11 +239,11 @@ const preprocessor = (loaderContext, options) => {
239239
}
240240

241241
// normalize the name to variable-safe name
242-
const varName = name.replace(/[\/-]/g, '_');
242+
const varName = 'partial_' + name.replace(/[\/-]/g, '_');
243243

244244
precompiledPartials += `
245-
var partial_${varName} = ${compiled};
246-
Handlebars.partials['${name}'] = Handlebars.template(partial_${varName});
245+
var ${varName} = ${compiled};
246+
Handlebars.partials['${name}'] = Handlebars.template(${varName});
247247
`;
248248
}
249249

@@ -286,7 +286,7 @@ const preprocessor = (loaderContext, options) => {
286286
${precompiledHelpers}
287287
${precompiledTemplate}
288288
var ${exportFunctionName} = (context) => {
289-
var template = (Handlebars['default'] || Handlebars).template(precompiledTemplate);
289+
var template = (Handlebars.default || Handlebars).template(precompiledTemplate);
290290
return template(Object.assign({}, data, context));
291291
};
292292
${exportCode}${exportFunctionName};`;

src/Plugin/Resolver.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
const fs = require('fs');
12
const path = require('path');
23
const Collection = require('./Collection');
34
const { resolveException } = require('./Messages/Exception');
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"scripts": {
3+
"start": "webpack serve",
4+
"watch": "webpack watch --mode development",
5+
"build": "webpack --mode=production --progress"
6+
},
7+
"devDependencies": {
8+
"html-bundler-webpack-plugin": "file:../../.."
9+
}
10+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{{#> layout}}
2+
{{#*inline "navContainer"}}
3+
{{> nav}}
4+
{{/inline}}
5+
{{#*inline "contentContainer"}}
6+
{{> content}}
7+
{{/inline}}
8+
{{#*inline "footerContainer"}}
9+
{{> footer}}
10+
{{/inline}}
11+
{{/layout}}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import tmpl from './app.hbs';
2+
3+
const locals = {
4+
helloName: 'World',
5+
name: 'Max',
6+
age: 21,
7+
navText: 'Navigation',
8+
};
9+
10+
document.getElementById('app').innerHTML = tmpl(locals);
11+
12+
console.log('>> app');
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// import { productsDB } from './productsDB';
2+
3+
export default {
4+
projectName: 'projectName',
5+
copyright: 'copyright',
6+
// smallSliderProductCards: [
7+
// productsDB[874],
8+
// productsDB[8711],
9+
// productsDB[8711],
10+
// productsDB[874],
11+
// productsDB[8711],
12+
// ]
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export const productsDB = {
2+
874: {
3+
id: '874',
4+
currentPrice: '5 489',
5+
prevPrice: false,
6+
},
7+
8711: {
8+
id: '8711',
9+
currentPrice: '7 103',
10+
prevPrice: '7 896',
11+
},
12+
};

0 commit comments

Comments
 (0)