在模板中使用动态变量将 nunjucks 与 htmlWebpackPlugin 一起使用
Using nunjucks with htmlWebpackPlugin using dynamic vars in the template
我正在寻找一种将 Nunjucks 与 htmlWebpackPlugin 结合使用的方法,以便在 webpack 编译时生成一些 html 文件。
到目前为止我取得了什么
我设法通过 nunjucks-html-loader 从 nunjucks 模板文件实际生成了 HTML,但看起来更接近于所述加载程序的代码,调用渲染方法时没有将变量发送到模板。
所以,现在使用以下插件配置,我生成 HTML 而没有动态插入变量
new HtmlWebpackPlugin({
filename: path.join(__dirname, '/' + page.filename),
template: 'nunjucks-html-loader!assets/templates/' + page.name + '.njk'
})
我试过的
出于测试目的,我尝试对 node_module 本身进行一些更改(我知道,我知道...)并更改了
html = template.render(nunjucksContext);
进入
html = template.render(nunjucksContext, { globals: global.globals });
正在尝试在我的 webpack.config.js
文件中定义 global.globals
,但这会因以下错误而崩溃
ERROR in Error: Child compilation failed:
Module build failed: TypeError: parentFrame.push is not a function
这超出了我的理解。
我想要的
是使用像 nunjucks 这样的可扩展模板引擎,它允许我像下面这样构建我的模板
<html>
<!-- layout structure inherited from every template -->
</html>
我制作的每个页面都扩展了布局并且只覆盖了一些块
我尽量避免的事情
部分例如
头文件:
<html>
<!-- header layout -->
页脚文件
<!-- footer layout -->
</html>
我制作的每一页都包含部分内容
所以我的问题是:是否有可能使用支持继承的模板引擎,如 nunjucks 和 htmlWebpackPlugin,或者是否必须使用另一个像 ejs 的模板引擎,例如将布局分块成部分我不喜欢?
好吧,所以我在这里找到了 nunjucks-isomorphic-loader
的解决方法,它似乎不受超级支持,但仍然如此。目前有效!
这是我的 webPack 配置
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const DEV_ENV = process.env.NODE_ENV === 'dev'
const wpConfig = {
entry: './assets/js/app.js',
output: {
path: path.resolve('./dist/js'),
filename: 'bundle.js'
},
module: {
rules: [
// Javascript
{
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader'
}
},
// Nunjucks - HTML
{
test: /\.njk$/,
use: [
{
loader: 'nunjucks-isomorphic-loader',
query: {
root: [path.resolve(__dirname, 'assets/templates')]
}
}
]
}
]
},
plugins: [
new webpack.DefinePlugin({
DEV_ENV: DEV_ENV
}),
new HtmlWebpackPlugin({
myOptions: { foo: 'bar' },
filename: path.join(__dirname, '/' + page.filename),
template: 'assets/templates/index.njk'
})
]
}
module.exports = wpConfig
具有以下模板
_layout.njk
{% set vars = htmlWebpackPlugin.options.myOptions %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{ vars.foo }}</title>
</head>
<body>
<header>
{% block header %}
<h1 class="header-logo">
<a href="#">{{ vars.foo }}</a><!-- Outputs bar -->
</h1>
{% endblock %}
</header>
{% block content %}
{% endblock %}
</body>
</html>
index.njk
{% extends "_layout.njk" %}
{% block content %}
here's the content of my `foo` var: {{ vars.foo }}
{% endblock %}
我写了 simple-nunjucks-loader,它比其他解决方案有一些优势,例如仅跟踪所需的依赖项和 html-webpack-plugin
开箱即用的支持。
我正在寻找一种将 Nunjucks 与 htmlWebpackPlugin 结合使用的方法,以便在 webpack 编译时生成一些 html 文件。
到目前为止我取得了什么
我设法通过 nunjucks-html-loader 从 nunjucks 模板文件实际生成了 HTML,但看起来更接近于所述加载程序的代码,调用渲染方法时没有将变量发送到模板。
所以,现在使用以下插件配置,我生成 HTML 而没有动态插入变量
new HtmlWebpackPlugin({
filename: path.join(__dirname, '/' + page.filename),
template: 'nunjucks-html-loader!assets/templates/' + page.name + '.njk'
})
我试过的
出于测试目的,我尝试对 node_module 本身进行一些更改(我知道,我知道...)并更改了
html = template.render(nunjucksContext);
进入
html = template.render(nunjucksContext, { globals: global.globals });
正在尝试在我的 webpack.config.js
文件中定义 global.globals
,但这会因以下错误而崩溃
ERROR in Error: Child compilation failed:
Module build failed: TypeError: parentFrame.push is not a function
这超出了我的理解。
我想要的
是使用像 nunjucks 这样的可扩展模板引擎,它允许我像下面这样构建我的模板
<html>
<!-- layout structure inherited from every template -->
</html>
我制作的每个页面都扩展了布局并且只覆盖了一些块
我尽量避免的事情
部分例如
头文件:
<html>
<!-- header layout -->
页脚文件
<!-- footer layout -->
</html>
我制作的每一页都包含部分内容
所以我的问题是:是否有可能使用支持继承的模板引擎,如 nunjucks 和 htmlWebpackPlugin,或者是否必须使用另一个像 ejs 的模板引擎,例如将布局分块成部分我不喜欢?
好吧,所以我在这里找到了 nunjucks-isomorphic-loader
的解决方法,它似乎不受超级支持,但仍然如此。目前有效!
这是我的 webPack 配置
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const DEV_ENV = process.env.NODE_ENV === 'dev'
const wpConfig = {
entry: './assets/js/app.js',
output: {
path: path.resolve('./dist/js'),
filename: 'bundle.js'
},
module: {
rules: [
// Javascript
{
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader'
}
},
// Nunjucks - HTML
{
test: /\.njk$/,
use: [
{
loader: 'nunjucks-isomorphic-loader',
query: {
root: [path.resolve(__dirname, 'assets/templates')]
}
}
]
}
]
},
plugins: [
new webpack.DefinePlugin({
DEV_ENV: DEV_ENV
}),
new HtmlWebpackPlugin({
myOptions: { foo: 'bar' },
filename: path.join(__dirname, '/' + page.filename),
template: 'assets/templates/index.njk'
})
]
}
module.exports = wpConfig
具有以下模板
_layout.njk
{% set vars = htmlWebpackPlugin.options.myOptions %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{ vars.foo }}</title>
</head>
<body>
<header>
{% block header %}
<h1 class="header-logo">
<a href="#">{{ vars.foo }}</a><!-- Outputs bar -->
</h1>
{% endblock %}
</header>
{% block content %}
{% endblock %}
</body>
</html>
index.njk
{% extends "_layout.njk" %}
{% block content %}
here's the content of my `foo` var: {{ vars.foo }}
{% endblock %}
我写了 simple-nunjucks-loader,它比其他解决方案有一些优势,例如仅跟踪所需的依赖项和 html-webpack-plugin
开箱即用的支持。