【W(wǎng)ebpack2】模塊熱替換失效頁面不自動(dòng)刷新?

問題:

升級(jí) Webpack1 到 Webpack2 之后, 開發(fā)模式下實(shí)時(shí)重載(Live Reloading)不起作用琉雳∮杞瑁控制臺(tái)一直顯示“App hot update...”有决。頁面不自動(dòng)刷新秧秉,沒有變化。

一直hot update...但不自動(dòng)刷新

解決辦法:

去掉WebpackDevServer配置中的hot:true针肥。

new WebpackDevServer(webpack(config), {
  ......
  // hot: true,  //去掉
  inline: true,
  ......
})

不過不知道為什么得去掉...


以下內(nèi)容更新于2018/05/15

以上的方法其實(shí)沒有解決根本問題饼记。當(dāng)時(shí)只知道去掉hot:true配置后,修改文件時(shí)頁面能夠自動(dòng)刷新了慰枕,但不知道為什么這么做具则,問題到底在哪里。近期看到留言才重新研究了這個(gè)問題具帮∠缤荩花費(fèi)了好幾個(gè)小時(shí)踩坑,算是對(duì)這個(gè)問題有了新的認(rèn)識(shí)匕坯。

項(xiàng)目結(jié)構(gòu)是,django + react + webpack拔稳。
版本:

  • react: 0.14.7
  • webpack2.7.0
  • react-hot-loader1.3.0
  • webpack-dev-server1.14.1
  • django-webpack-loader0.5.0

值得參考的樣板項(xiàng)目

問題

升級(jí) webpack v1到v2之后巴比,模塊熱替換(Hot Module Replacement术奖,HMR)失效了礁遵,而 webpack 配置的entry'webpack/hot/only-dev-server'指明了HMR失效時(shí),頁面也不會(huì)重新加載(參考What's the difference between 'webpack/hot/dev-server' and 'webpack/hot/only-dev-server'?)采记,所以開發(fā)模式下修改文件佣耐,頁面不會(huì)自動(dòng)刷新。

模塊熱替換(HMR - Hot Module Replacement)功能會(huì)在應(yīng)用程序運(yùn)行過程中替換唧龄、添加或刪除模塊兼砖,而無需重新加載整個(gè)頁面。主要是通過以下幾種方式既棺,來顯著加快開發(fā)速度:

  • 保留在完全重新加載頁面時(shí)丟失的應(yīng)用程序狀態(tài)讽挟。
  • 只更新變更內(nèi)容,以節(jié)省寶貴的開發(fā)時(shí)間丸冕。
  • 調(diào)整樣式更加快速 - 幾乎相當(dāng)于在瀏覽器調(diào)試器中更改樣式耽梅。

解決辦法

如果不需要HMR,只需要頁面可以自動(dòng)刷新胖烛,那可以去掉WebpackDevServer配置中的hot:true或者把 webpack 配置的entry'webpack/hot/only-dev-server'改成'webpack/hot/dev-server'眼姐。這樣就算HMR 不生效,也不影響開發(fā)過程中實(shí)時(shí)看到頁面的變化佩番。

但升級(jí)webpack v1到v2之后众旗,還是想使用HMR呢?

Webpack升級(jí)到2.7.0之后答捕,react-hot-loader還是v1逝钥,根據(jù) react-hot-loader v1.3.0 stopped working after upgrade to webpack 2.2.1 #474 中的討論,說明需要升級(jí)react-hot-loader拱镐,v1應(yīng)該是不適用 webpack v2艘款。

需要升級(jí)react-hot-loader

提問者還總結(jié)了解決方法,其中第一點(diǎn)沃琅,升級(jí)webpack時(shí)也要升級(jí)webpack-dev-server哗咆。

Make sure your webpack-dev-server AND webpack are both updated. at time of writing this is what i've got

"react-hot-loader": "^3.0.0-beta.6",
"webpack-dev-server": "^2.3.0",
"webpack": "^2.2.1",

以上說明,重點(diǎn)是要升級(jí)react-hot-loaderwebpack-dev-server益眉。

注意晌柬,這個(gè)項(xiàng)目升級(jí)前HMR是啟用的,配置參考django-webpack-loader example郭脂,升級(jí)過程中沒有改動(dòng) webpack 的配置年碘,只是根據(jù) v2 的新特性做了相應(yīng)的用法上的改變(詳情參考遷移到新版本)。因此下面的內(nèi)容不是從0到1地配置 HMR展鸡,而是一個(gè)升級(jí)(主要react-hot-loader)的過程屿衅。

  1. npm升級(jí)react-hot-loader到v3或v4,升級(jí)webpack-dev-server到v2莹弊。
    "react-hot-loader": "^4.0.0",
    "webpack-dev-server": "^2.3.0"
    
  2. 在.babelrc 文件的plugins中添加一項(xiàng):"react-hot-loader/babel"涤久。
  3. 修改 webpack 配置涡尘。
    //webpack.config.local.js
    //1.修改入口
    var config = require('./webpack.base.config.js');
    config.entry.app = [
        'webpack-dev-server/client?http://' + ip + ':3000',
        'webpack/hot/only-dev-server',  //dev-server reloads when applying HMR fails, only-dev-server doesn't.
        'react-hot-loader/patch',  //添加這一項(xiàng)
        './html/app',
    ]
    //2.去掉react-hot-loader
    config.module.rules.push(
      { 
        test: /\.jsx?$/, 
        exclude: /node_modules/, 
        use: ['babel-loader']   //before: ['react-hot-loader','babel-loader']
      }
    );
    
  4. 修改 WebpackDevServer的配置。添加headers响迂。詳情參考React Hot Loader Troubleshooting 考抄。
    //server.js
    new WebpackDevServer(webpack(config), {
      publicPath: config.output.publicPath,
      hot: true,  //enable HMR on the server
      headers:{'Access-Control-Allow-Origin':'*'},  //添加這一項(xiàng)
      inline: true,             
      historyApiFallback: true
    }).listen(3000, 'localhost', function (err, result) {
      if (err) {
        console.log(err);
      }
      console.log('Listening at localhost:3000');
    });
    
  5. 使用 react-hot-loaderAppContainer封裝應(yīng)用的頂?shù)捉M件≌嵬可參考react-hot-loader-minimal-boilerplate川梅。
    import React from 'react'
    import ReactDOM from 'react-dom'
    import { AppContainer } from 'react-hot-loader'
    import Root from './containers/Root'
    const render = Component => {
      ReactDOM.render(
        <AppContainer>
          <Component />
        </AppContainer>,
        document.getElementById('root')
      )
    }
    render(Root)
    if (module.hot) {
      module.hot.accept('./containers/Root', () => { render(Root)})
    }
    

按道理,到這為止react-hot-loader的升級(jí)就完成了幕与。HMR應(yīng)該就生效了挑势。但是我又遇到一個(gè)坑,瀏覽器控制臺(tái)的輸出信息都正常啦鸣,新的打包文件的網(wǎng)絡(luò)請(qǐng)求也正常潮饱,但是頁面上卻依然沒變化。又是坑敖敫香拉!最后在Hot updates not applied #581里面找到相同情況的解決方法。

熱更新依然不生效

效果圖:


熱更新

結(jié)語

這個(gè)問題的解決過程中踩了不少坑中狂,webpack官方文檔只提供了v4版本的凫碌,很多人也都在吐槽看不到歷史版本的文檔。這個(gè)對(duì)開發(fā)者來說確實(shí)很不方便胃榕。非官方的文檔有很多盛险,但卻加大了排錯(cuò)過程花費(fèi)的精力,降低了效率勋又。

畢竟升級(jí)webpack還是挺麻煩的苦掘,v1到v2還好,變化不多楔壤,升級(jí)到v3配置就改變很多了鹤啡。并且一些相關(guān)插件也得升級(jí),比如這次沒有升級(jí)react-hot-loader就出問題了蹲嚣。至于那些插件該一起升級(jí)也沒個(gè)官方說法递瑰,只能出問題了再瘋狂地Google。

吐槽歸吐槽隙畜,坑再多抖部,還是得踩啊~~~

延伸閱讀:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哗总,更是在濱河造成了極大的恐慌,老刑警劉巖倍试,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讯屈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡县习,警方通過查閱死者的電腦和手機(jī)涮母,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躁愿,“玉大人叛本,你說我怎么就攤上這事⊥樱” “怎么了来候?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逸雹。 經(jīng)常有香客問我营搅,道長(zhǎng),這世上最難降的妖魔是什么梆砸? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任转质,我火速辦了婚禮,結(jié)果婚禮上帖世,老公的妹妹穿的比我還像新娘休蟹。我一直安慰自己,他們只是感情好日矫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布赂弓。 她就那樣靜靜地躺著,像睡著了一般搬男。 火紅的嫁衣襯著肌膚如雪拣展。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天缔逛,我揣著相機(jī)與錄音备埃,去河邊找鬼。 笑死褐奴,一個(gè)胖子當(dāng)著我的面吹牛按脚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敦冬,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辅搬,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堪遂,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤介蛉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后溶褪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體币旧,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年猿妈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吹菱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彭则,死狀恐怖鳍刷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俯抖,我是刑警寧澤输瓜,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站蚌成,受9級(jí)特大地震影響前痘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜担忧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一芹缔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓶盛,春花似錦最欠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轧房,卻和暖如春拌阴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奶镶。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工迟赃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厂镇。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓纤壁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親捺信。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酌媒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,164評(píng)論 7 35
  • GitChat技術(shù)雜談 前言 本文較長(zhǎng)秒咨,為了節(jié)省你的閱讀時(shí)間喇辽,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,697評(píng)論 7 110
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載奇徒。 webpack介紹和使用 一雏亚、webpack介紹 1、由來 ...
    it筱竹閱讀 11,123評(píng)論 0 21
  • Hot Reloading in React 本文是Dan Abramov發(fā)表于Medium文章的部分譯文摩钙,只截取...
    RockSAMA閱讀 2,727評(píng)論 0 2
  • 我的心知道要放下罢低!但我的念卻一直都有回想!讓我放不下胖笛! 修自己的心之前先修一下自己的念网持!一切都是泡影!沒有什么比生...
    會(huì)魔法的妮妮閱讀 244評(píng)論 0 0