解决方案 1
我找到了另一个解决方案,使用html-loader
withinterpolate
选项。
https://github.com/webpack-contrib/html-loader#interpolation
{ test: /\.(html)$/,
include: path.join(__dirname, 'src/views'),
use: {
loader: 'html-loader',
options: {
interpolate: true
}
}
}
然后在 html 页面中,您可以导入部分 html 和 javascript 变量。
<!-- Importing top <head> section -->
${require('./partials/top.html')}
<title>Home</title>
</head>
<body>
<!-- Importing navbar -->
${require('./partials/nav.html')}
<!-- Importing variable from javascript file -->
<h1>${require('../js/html-variables.js').hello}</h1>
<!-- Importing footer -->
${require('./partials/footer.html')}
</body>
唯一的缺点是你不能HtmlWebpackPlugin
像这样导入其他变量<%= htmlWebpackPlugin.options.title %>
(至少我找不到导入它们的方法)但对我来说这不是问题,只需在你的 html 中写标题或使用单独的 javascript 文件用于句柄变量。
解决方案 2
旧答案
不确定这是否适合您,但我将分享我的工作流程(在 Webpack 3 中测试)。
而不是html-loader
你可以使用这个插件github.com/bazilio91/ejs-compiled-loader:
{ test: /\.ejs$/, use: 'ejs-compiled-loader' }
更改您的.html
文件.ejs
并HtmlWebpackPlugin
指向正确的.ejs
模板:
new HtmlWebpackPlugin({
template: 'src/views/index.ejs',
filename: 'index.html',
title: 'Home',
chunks: ['index']
})
您可以在文件中导入部分、变量和资产.ejs
:
src/views/partials/head.ejs
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
src/js/ejs_variables.js
:
const hello = 'Hello!';
const bye = 'Bye!';
export {hello, bye}
src/views/index.ejs
:
<% include src/views/partials/head.ejs %>
<body>
<h2><%= require("../js/ejs_variables.js").hello %></h2>
<img src=<%= require("../../assets/sample_image.jpg") %> />
<h2><%= require("../js/ejs_variables.js").bye %></h2>
</body>
注意,当您包含部分路径时,路径必须相对于项目的根目录。