Ответ 1
EDIT
(EDIT: 2017-12-20 переместите "загрузчики" в "правила" )
По умолчанию "html-webpack-plugin" анализирует шаблон как " underscore" (также называемый lodash), ваш "template.html" ничего плохого, ошибка вызвана тем, что веб-пакет не смог разрешить "html-loader" для вашего "template.html" ,
<%= require('html-loader!./footer.html') %>
, поэтому вам нужно установить "html-loader" для webpack и настроить его:
В командной строке:
npm install html-loader
И настройте его для webpack, отредактируйте webpack.config.js
:
...
module: {
rules: [
// ...
{
test: /\.html$/, // tells webpack to use this loader for all ".html" files
loader: 'html-loader'
}
]
}
Теперь вы можете запустить "webpack", вы не увидите ошибки, НО > сгенерированный "index.html" не ожидается, потому что ваш файл шаблона имеет расширение ".html", webpack теперь используйте "html-loader" для загрузки "template.html" вместо стандартного "lodash loader", чтобы решить эту проблему, вы можете переименовать "template.html" в "template.html.ejs" (или любое другое расширение), чтобы сделать "html-webpack-plugin". Кроме того, на "template.html" есть немного больше изменений, удалите "html-loader!". от него:
<%= require('./footer.html') %>
теперь он должен работать.
EDIT Отправьте мой код для справки:
/src/template.html.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<title>test</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>template</h1>
<%=require('./footer.html')%>
</body>
</html>
/src/footer.html
<footer>this is a footer</footer>
/webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
let config = {
entry: {
index: './src/js/index'
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js'
},
module: {
rules: [
{
test: /\.html$/,
loader: 'html-loader'
}
],
},
plugins: [
new HtmlWebpackPlugin({
template: './src/template.html.ejs'
})
]
}
module.exports = config;
/package.json
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"html-loader": "^0.5.1",
"html-webpack-plugin": "^2.30.1",
"webpack": "^3.10.0"
}
}
/src/js/index.js
console.log("A test page!");
окружающая среда:
- webpack 3.10.0
- npm 5.6.0
содержимое "/dist/index.html" после запуска webpack:
<!DOCTYPE html>
<html lang="en">
<head>
<title>test</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>template</h1>
<footer>this is a footer</footer>
<script type="text/javascript" src="index.js"></script></body>
</html>
Как вы видите, содержимое "footer.html" правильно вставлено.
OLD ANSWER
Подход 1: Использование шаблона "es6"
- Установите "html-loader" на
npm install html-loader
- Добавьте "html-loader" в ваш "webpack.config.js" для загрузки файлов с расширением ".html", например:
module: { rules: [{ test: /\.html$/, loader: 'html-loader' }], }
- Добавить флаг
interpolate
, чтобы включить синтаксис интерполяции для строк шаблона ES6, например:
plugins: [ new HtmlWebpackPlugin({ template: '!!html-loader?interpolate!src/template.html' }) ]
- Измените свой
template.html
в соответствии с шаблоном ES6:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> template </body> ${require('./footer.html')} </html>
- Запустите
webpack
, он будет работать
Подход 2: Использование шаблона "подчеркивание"
Следуйте "подходу 1", шаг 1 и 2, а затем:
- Переименуйте "template.html" в "template.html.ejs"
- Измените
template: './src/template.html'
наtemplate: './src/template.html.ejs'
в "webpack.config.js" - Запустить webpack