html-webpack-plugin не вставляет js-файл в index.html при использовании webpack-dev-server
Вот мой конфиг веб-пакета:
var path = require('path');
var webpack = require('webpack')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var fs = require('fs'),buildPath='./dist/';
var folder_exists = fs.existsSync(buildPath);
if(folder_exists == true)
{
require('shelljs/global')
rm('-rf', 'dist')
};
module.exports = {
entry: './src/main',
output: {
path: path.join(__dirname, './dist'),
filename: '[name].js',
publicPath: '/dist/'
},
devServer: {
historyApiFallback: true,
hot: false,
inline: true,
grogress: true,
},
// "vue-hot-reload-api": "^1.2.2",
module: {
loaders: [
{ test: /\.vue$/, loader: 'vue' },
{ test: /\.js$/, loader: 'babel', exclude: /node_modules/ },
{ test: /\.css$/, loader: 'style-loader!css-loader'},
//install css-loader style-loader sass-loader node-sass --save-dev
{ test: /\.scss$/, loader: 'style!css!sass?sourceMap'},
{ test: /\.(png|jpg|gif)$/, loader: 'url-loader?limit=8192&name=images/[name].[ext]'},
{ test: /\.(html|tpl)$/, loader: 'html-loader' },
]
},
vue: {
loaders: {
js:'babel',
css: 'style-loader!css-loader',
sass:'style!css!sass?sourceMap'
}
},
babel: {
presets: ['es2015'],
plugins: ['transform-runtime']
},
plugins:[
new HtmlWebpackPlugin({
template: 'index.html',
filename: './index.html',
inject:true
}),
],
resolve: {
extensions: ['', '.js', '.vue'],
alias: {
filter: path.join(__dirname, './src/filters'),
components: path.join(__dirname, './src/components')
}
},
devtool: 'eval-source-map'
};
И в package.json:
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack-dev-server --inline",
"build": "webpack --config webpack.config.prod.js"
},
Когда я запускаю npm start, в localhost файл js не внедряется в index.html
, Если я запускаю webpack или npm run build, файл js вводится успешно. Можно html-webpack-plugin
также введите файл JS в index.html
когда я в localhost?
2 ответа
Эта проблема связана, в частности, с тем, что сервер webpack-development-server не может записывать файлы в локальную файловую систему, а вместо этого записывает свои файлы только в MEMORY Only.
Вот почему вы смогли правильно сгенерировать файлы с помощью Html-Webpack-Plugin при запуске команды сборки webpack по умолчанию (НЕ WDS / Webpack-Development-Server) с:
webpack
С другой стороны, поскольку вы использовали простой проект vue.js Webpack ( https://github.com/vuejs-templates/webpack-simple/tree/master/template), вы также можете использовать сценарии npm, поставляемые с Vue. Пример JS (находится внутри вашего package.json) через:
npm run build
В любом случае файлы записываются в каталог так, как вы могли бы подумать, так как Сборка с веб-пакетом МОЖЕТ записать файловую систему, так как при использовании Webpack-Development-Server файлы не были записаны (опять же, это не работает, потому что WDS пишет в память, а не локальную файловую систему).
Я наткнулся на этот ответ, работая над той же проблемой, благодаря вашему комментарию:
"Если я запускаю webpack или npm run build, файл js успешно внедряется. Может ли html-webpack-plugin также вставить файл js в index.html, когда я нахожусь в localhost?"
Подводя итог: Html-Webpack-Plugin НЕ будет записывать файлы в локальную файловую систему, когда он используется как часть Webpack-Development-Server (WDS), даже если Html-Webpack-Plugin БУДЕТ записывать файлы (с идентичным веб-пакетом). конфигурации) при использовании обычного процесса сборки веб-пакета (без WDS).
У меня та же проблема и ниже конфиг у меня работает.
Раньше у меня был абсолютный путь, и когда он меняется на относительный, он работает.
new HtmlWebpackPlugin({
inject: true,
template:'public/index.html', // relative to project root
filename:'index.html' // relative to build folder
})
Вы можете попробовать настроить как это..
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
})
и Index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>My App</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
Вам нужно будет установить npm i -D html-webpack-plugin vue-loader vue-html-loader
но я рекомендую вам создать проект из шаблона, vue init webpack
Этот шаблон использует html-webpack-plugin