webpack熱模塊替換(HMR)/熱更新的方法
這是一篇關(guān)于webpack熱模塊替換的最簡(jiǎn)單的配置(不需要react),也稱(chēng)作熱更新。
模塊熱替換(HMR)的作用是,在應(yīng)用運(yùn)行時(shí),無(wú)需刷新頁(yè)面,便能替換、增加、刪除必要的模塊。 HMR 對(duì)于那些由單一狀態(tài)樹(shù)構(gòu)成的應(yīng)用非常有用。因?yàn)檫@些應(yīng)用的組件是 “dumb” (相對(duì)于 “smart”) 的,所以在組件的代碼更改后,組件的狀態(tài)依然能夠正確反映應(yīng)用的最新?tīng)顟B(tài)。
webpack-dev-server內(nèi)置“l(fā)ive reload”,會(huì)自動(dòng)刷新頁(yè)面。
文件目錄如下:
- app
- a.js
- component.js
- index.js
- node_modules
- package.json
- webpack.config.js
component.js中導(dǎo)入了a.js。index.js導(dǎo)入了component.js。修改任意一個(gè)文件,都能達(dá)到熱更新功能。
最重要的是,在index.js中,有這樣一段代碼:(完成熱更新必須需要)
if(module.hot){
module.hot.accept(moduleId, callback);
}
下面是package.json配置:
{
"name": "webpack-hmr",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "nodemon --watch webpack.config.js --exec \"webpack-dev-server --env development\"",
"build": "webpack --env production"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"html-webpack-plugin": "^2.28.0",
"nodemon": "^1.11.0",
"webpack": "^2.2.1",
"webpack-dev-server": "^2.4.1"
}
}
從依賴就可以看到,這真的是一個(gè)最簡(jiǎn)單的配置了。其中nodemon用來(lái)監(jiān)聽(tīng)webpack.config.js文件的狀態(tài),只要發(fā)生改變,就重新執(zhí)行命令。
關(guān)于”html-webpack-plugin”,在這里是可以省略的。具體的配置請(qǐng)看:https://www.npmjs.com/package/html-webpack-plugin 。
在這里,定義了兩個(gè)命令,一個(gè)是start,用于開(kāi)發(fā)環(huán)境;一個(gè)是build,用于生產(chǎn)環(huán)境。--watch用來(lái)監(jiān)聽(tīng)一個(gè)或者多個(gè)文件,--exec是nodemon用來(lái)執(zhí)行其它的命令。具體的配置請(qǐng)看:https://c9.io/remy/nodemon。
接下來(lái)是webpack.config.js了,既然package.json的scripts中定義了兩種命令,我們還是要在配置文件中實(shí)現(xiàn)兩種情況(development和production,你也可以修改配置其中一種)。
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
const PATHS = {
app: path.join(__dirname, 'app'),
build: path.join(__dirname, 'build'),
};
const commonConfig={
entry: {
app: PATHS.app + '/index.js',
},
output: {
path: PATHS.build,
filename: '[name].js',
},
watch: true,
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack demo',
}),
],
}
function developmentConfig(){
const config ={
devServer:{
historyApiFallback:true, //404s fallback to ./index.html
// hotOnly:true, 使用hotOnly和hot都可以
hot: true,
stats:'errors-only', //只在發(fā)生錯(cuò)誤時(shí)輸出
// host:process.env.Host, 這里是undefined,參考的別人文章有這個(gè)
// port:process.env.PORT, 這里是undefined,參考的別人文章有這個(gè)
overlay:{ //當(dāng)有編譯錯(cuò)誤或者警告的時(shí)候顯示一個(gè)全屏overlay
errors:true,
warnings:true,
}
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // 更新組件時(shí)在控制臺(tái)輸出組件的路徑而不是數(shù)字ID,用在開(kāi)發(fā)模式
// new webpack.HashedModuleIdsPlugin(), // 用在生產(chǎn)模式
],
};
return Object.assign(
{},
commonConfig,
config,
{
plugins: commonConfig.plugins.concat(config.plugins),
}
);
}
module.exports = function(env){
console.log("env",env);
if(env=='development'){
return developmentConfig();
}
return commonConfig;
};
關(guān)于Object.assign,第一個(gè)參數(shù)是目標(biāo)對(duì)象,如果目標(biāo)對(duì)象中的屬性具有相同的鍵,則屬性將被源中的屬性覆蓋。后來(lái)的源的屬性將類(lèi)似地覆蓋早先的屬性。淺賦值,對(duì)于對(duì)象的復(fù)制使用=,即引用復(fù)制。
env參數(shù)通過(guò)cli傳入。
然后打開(kāi)命令行到當(dāng)前目錄,運(yùn)行npm start或者npm run build就好啦。注意,前者是在開(kāi)發(fā)環(huán)境下,是沒(méi)有輸出文件的(在內(nèi)存),只有運(yùn)行后者才會(huì)有輸出文件。
demo的代碼在:https://github.com/yuwanlin/webpackHMR
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一文詳解JavaScript如何安全的進(jìn)行數(shù)據(jù)獲取
這篇文章主要為大家介紹了JavaScript如何安全的進(jìn)行數(shù)據(jù)獲取方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
web開(kāi)發(fā)js字符串拼接占位符及conlose對(duì)象Api詳解
本篇文章主要為大家介紹了web開(kāi)發(fā)中字符串的拼接,占位符的使用以及conlose對(duì)象Api的使用,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
JavaScript canvas實(shí)現(xiàn)動(dòng)態(tài)點(diǎn)線效果
這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)動(dòng)態(tài)點(diǎn)線效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Electron autoUpdater實(shí)現(xiàn)Windows安裝包自動(dòng)更新的方法
這篇文章主要介紹了Electron autoUpdater實(shí)現(xiàn)Windows安裝包自動(dòng)更新的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
可以用鼠標(biāo)拖動(dòng)的DIV實(shí)現(xiàn)思路及代碼
DIV可以拖動(dòng)的效果,想必大家都有見(jiàn)到過(guò)吧,在本文也為大家實(shí)現(xiàn)一個(gè)不錯(cuò)的可以用鼠標(biāo)拖動(dòng)的div,感興趣的各位不要錯(cuò)過(guò)2013-10-10
淺析JavaScript中的變量復(fù)制、參數(shù)傳遞和作用域鏈
這篇文章主要介紹了淺析JavaScript中的變量復(fù)制、參數(shù)傳遞和作用域鏈 的相關(guān)資料,需要的朋友可以參考下2016-01-01
JavaScript惰性載入函數(shù)實(shí)例分析
這篇文章主要介紹了JavaScript惰性載入函數(shù),結(jié)合實(shí)例形式分析了JavaScript惰性載入函數(shù)的概念、原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-03-03
Document.body.scrollTop的值總為零的快速解決辦法
這篇文章主要介紹了Document.body.scrollTop的值總為零的解決方法的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
微信小程序自定義彈出模態(tài)框禁止底部滾動(dòng)功能
這篇文章主要介紹了微信小程序自定義彈出模態(tài)框禁止底部滾動(dòng)效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
javascript簡(jiǎn)易畫(huà)板開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了javascript簡(jiǎn)易畫(huà)板開(kāi)發(fā)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10

