webpack之文件監(jiān)聽及熱更新

webpack 的文件監(jiān)聽

文件監(jiān)聽是在源碼發(fā)生變化時,自動重新構建出新的輸出文件。
webpack開啟監(jiān)聽模式擎场,有兩種方式:

  • 啟動 webpack 命令時,帶上 --watch 參數(shù)讳推。
    {
      "name": "project",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "build": "webpack",
        "watch": "webpack --watch"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
    }
    
  • 在配置 webpack.config.js 中設置 watch: true
    但是顶籽,這種方式需要每次手動刷新瀏覽器

webpack文件監(jiān)聽的原理

webpack會輪詢判斷文件的最后編輯時間是否變化。
某個文件發(fā)生了變化银觅,并不會立即告訴監(jiān)聽者礼饱,而是先緩存起來,等 aggregateTimeout

module.exports = {
    // 默認是false,即不開啟
    watch: true,
    // 只有開啟監(jiān)聽模式時镊绪,watchOptions才有意義
    watchOptions: {
        // 默認為空匀伏,不監(jiān)聽的文件或者文件夾,支持正則匹配
        ignored: /node_modules/,
        // 監(jiān)聽到變化發(fā)生后會等300ms再去執(zhí)行蝴韭,默認300ms
        aggregateTimeout: 300,
        // 判斷文件是否發(fā)生變化是通過不停詢問系統(tǒng)指定文件有沒有變化實現(xiàn)的够颠,默認每秒問1000次
        poll: 1000
    },
};

熱更新

使用webpack-dev-server

安裝依賴

npm i -D webpack-dev-server
  • WDS 不刷新瀏覽器
  • WDS 不輸出文件,而是放在內存中
  • 使用 Hot ModuleReplacementPlugin插件
{
  "name": "project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "webpack",
    "dev": "webpack-dev-server --open"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
}

因為WDS主要是在開發(fā)過程中使用榄鉴,生產環(huán)境是用不到的履磨,所以我們將mode改為development,然后再引入webpack自帶的Hot ModuleReplacementPlugin插件庆尘,由于該插件是內置的剃诅,所以我們先引入webpack,再將插件加進來驶忌,最后還要配置一下devServer矛辕。

const webpack = require('webpack');

module.exports = {
    plugins: [
        new webpack.HotModuleReplacementPlugin()
    ],
    devServer: {
        contentBase: './dist', // 服務的基礎目錄
        hot: true   // 開啟熱更新
    }
};

升級填坑

但是,當你升級webpack4 ---->webpack5時付魔,如果你的版本是webpack-cli 4*時聊品,就會報錯

Error: Cannot find module 'webpack-cli/bin/config-yargs'

{
  "webpack": "^5.36.0",
  "webpack-cli": "^4.6.0",
  "webpack-dev-server": "^3.11.2"
}

這是,因為在webpack-cli 4*中几苍,作者刪除了config-yargs翻屈,所以會報錯
這里有兩種解決方案:

  • 臨時解決方案:將webpack-cli版本降級到webpack-cli 3*
  • 終極解決方案:修改配置文件,使用webpack serve替代webpack-dev-server也就是將配置項的 "dev": "webpack-dev-server --open"改為"dev": "webpack serve --open"

使用webpack-dev-middleware

WDM將webpack輸出的文件傳輸給服務器妻坝,適用于靈活的定制場景妖胀。
使用這種方式,通常需要再引入一個server惠勒,一般是express或者koa

const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');

const app = express();
const config = require('./webpack.config.js');
const compiler = webpack(config);

app.use(webpackDevMiddleware(compiler, {
  publicPath: config.output.publicPath
}));

app.listen(3000, function(){
  console.log('Example app listening on port 3000!\n');
})

熱更新原理分析

  • Webpack Compile(webpack的編譯器):將JS的源代碼編譯成Bundle
  • HMR Server:將熱更新的文件輸出給 HMR Runtime
  • Bundle server:提供文件在瀏覽器的訪問赚抡,可以讓你的文件以服務器的方式訪問,比如“http://localhost:8080/search.html
  • HMR Runtime:會被注入到瀏覽器端的bundle.js里面纠屋,bundle.js就可以與服務器建立一個連接涂臣,通常這個連接是一個websocket,當它收到一些數(shù)據(jù)售担,一些回包之后赁遗,就會自動更新文件
  • bundle.js:構建輸出的文件

熱更新的過程

  • 啟動階段,是在文件系統(tǒng)里面族铆,文件系統(tǒng)的一個編譯岩四,就是將初始的代碼經過Webpack Compile進行一個打包,打包好以后哥攘,將打包好的文件傳輸給bundle server剖煌,也就是一個服務器材鹦,bundle server就可以讓這個文件以server的方式讓瀏覽器訪問到
  • 更新階段,如果本地開發(fā)時耕姊,有文件發(fā)生了變化桶唐,這時的流程是一個文件系統(tǒng)的變化,然后代碼還是會經過Webpack Compile進行編譯茉兰,編譯好以后會將代碼發(fā)送給HMR Server尤泽,HMR Server就可以知道哪些模塊(源代碼部分的模塊)發(fā)生了變化,然后HMR Server就會通知HMR runtimeHMR Server是在服務端规脸,HMR runtime是在客戶端)坯约。通常是以json的格式進行數(shù)據(jù)傳輸,傳遞給HMR runtime之后莫鸭,HMR runtime就會更新我們的代碼鬼店,最后我們的代碼進行了改變,并且不需要刷新瀏覽器黔龟。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滥玷,隨后出現(xiàn)的幾起案子氏身,更是在濱河造成了極大的恐慌,老刑警劉巖惑畴,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛋欣,死亡現(xiàn)場離奇詭異,居然都是意外死亡如贷,警方通過查閱死者的電腦和手機陷虎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杠袱,“玉大人尚猿,你說我怎么就攤上這事¢垢唬” “怎么了凿掂?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纹蝴。 經常有香客問我庄萎,道長,這世上最難降的妖魔是什么塘安? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任糠涛,我火速辦了婚禮,結果婚禮上兼犯,老公的妹妹穿的比我還像新娘忍捡。我一直安慰自己集漾,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布锉罐。 她就那樣靜靜地躺著帆竹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脓规。 梳的紋絲不亂的頭發(fā)上栽连,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音侨舆,去河邊找鬼秒紧。 笑死,一個胖子當著我的面吹牛挨下,可吹牛的內容都是我干的熔恢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼臭笆,長吁一口氣:“原來是場噩夢啊……” “哼叙淌!你這毒婦竟也來了?” 一聲冷哼從身側響起愁铺,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤鹰霍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茵乱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茂洒,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年瓶竭,在試婚紗的時候發(fā)現(xiàn)自己被綠了督勺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡斤贰,死狀恐怖智哀,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情荧恍,我是刑警寧澤盏触,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站块饺,受9級特大地震影響赞辩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜授艰,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一辨嗽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淮腾,春花似錦糟需、人聲如沸屉佳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽武花。三九已至,卻和暖如春杈帐,著一層夾襖步出監(jiān)牢的瞬間体箕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工挑童, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留累铅,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓站叼,卻偏偏與公主長得像娃兽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尽楔,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容