Webpack 2 设置 Hot Module Replacement 问题
看了许多关于 Hot Module Replacement 设置的文章,设置貌似有多种不同的方案。
但我发现只设定:
output.publicPath
devServer.hot
HotModuleReplacementPlugin
module.hot.accept()
使用 webpack-dev-server 就可以开启 HMR。
因此想请问关于 entry 中的:
'webpack-dev-server/client?http://localhost:8080',
'webpack/hot/dev-server',
'webpack/hot/only-dev-server',
以及 devServer 中的:
inline: true
以上的详细用途是什么?对 HMR 来说是必要的吗?
附上 webpack.config.js:
const path = require('path');
const webpack = require('webpack');
module.exports = {
context: path.join(__dirname, 'src'),
entry: ['./index.js'],
output: {
path: path.join(__dirname, 'dist/js'),
filename: 'bundle.js',
publicPath: '/js/'
},
module: {
rules: [{
test: /\.js$/,
exclude: /node_modules/,
use: [{
loader: 'babel-loader',
options: {
"presets": [
["es2015", { "modules": false }]
]
}
}]
}]
},
devServer: {
contentBase: path.join(__dirname, 'dist'),
hot: true,
open: true
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin()
]
};
以及 index.js:
if (module.hot) {
module.hot.accept();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
概略從觀念與 live reload 談起(我的理解,如果有誤歡迎其他大牛指教),當我們要使用 live reload 的功能時需要讓瀏覽器可以接收或觀察到檔案發生改變。通常會使用 socket 來跟 dev server 溝通,這也是在以前使用 live reload 時要多加入 chrome/firefox plugin 或 js 到源碼的原因,就是要加入 socket 溝通相關的部分。
先不談 HRM,在 webpack 裡等價於 live reload 的功能即自動刷新頁面,而 webpack 又提供兩種模式。
iframe mode - 瀏覽 webpack-dev-server 提供的頁面(HTML裡面自帶溝通相關源碼)http://localhost:8080/webpack...
inline mode - 把溝通相關源碼之間加到我們的 bundle。當要用 HRM 時推薦使用這種。從源碼觀察參數說明
總結來說就是關於這些附加的 scripts 該怎麼匯入與設定。是自己在 entry 加入或透過指令參數,設定檔參數設定。因為方法不只一種導致很多教學有不同的作法。
以下開始回答您的問題
webpack-dev-server/client?http://localhost:8080
加入溝通的 client script 的部分和設定參數即 live reload 的部分。既然熱替換是 live reload 的加強版,那我們總要改變溝通何時更新的規則吧。於是有了
webpack/hot/dev-server
源碼至於
dev-server
和only-dev-server
的差異這邊就不著墨了。簡單節錄文件上的說明:最後,有需要在 entry 加入設定嗎?從 utils/addDevServerEntryPoints 源碼 和 webpack-dev-server.js 看來如果你有設定參數是不需要的,就如同您觀察到的一樣。
output.publicPath
其实也没必要设的