3-8 使用 WebpackdevServer 提升開發(fā)效率

1. 簡介

webpack-dev-server 是 webpack 集成的開發(fā)者服務(wù)器,用于幫助開發(fā)者快速開發(fā)應(yīng)用程序错森。

2. 如何展示頁面

我們來回顧一下,之前是如何展示頁面的。我用的是 webstorm翘瓮,點擊 html 文件右上角


image.png

即可打開網(wǎng)頁箱舞,當(dāng)然也可以直接將 html 文件拖到瀏覽器遍坟,也會為我們打開。這兩種方式有什么不同呢晴股?

  1. 直接將文件拖到瀏覽器愿伴,使用的是 file 協(xié)議


    image.png
  2. 使用 webstorm 的瀏覽器標(biāo)簽打開,使用的是 http 協(xié)議


    image.png

    簡單來講电湘,F(xiàn)ile 協(xié)議主要用于訪問本地計算機中的文件隔节,就如同在Windows資源管理器中打開文件一樣鹅经,而 http 協(xié)議是超文本傳輸協(xié)議,指定了客戶端可能發(fā)送給服務(wù)器什么樣的消息以及得到什么樣的響應(yīng)怎诫。目前這兩種方案都是 okay 的瘾晃,但是我們的網(wǎng)頁文件開發(fā)出來一般肯定是放在網(wǎng)上供其他用戶瀏覽的,另外刽虹,file 協(xié)議也會遇到跨域問題酗捌,所以開發(fā)時應(yīng)該使用 http 協(xié)議。
    webstorm 實際上就是為我們開了一個本地服務(wù)器用來存放網(wǎng)頁文件涌哲,如果大家不使用 webstorm胖缤,也可以使用其他 ide 的該功能,或者使用 http-server阀圾,apache 等幫助實現(xiàn)一個本地服務(wù)器哪廓。這里就不細(xì)述了。

3. 頻繁編譯和刷新

我們編寫代碼以后如果想要更新網(wǎng)頁內(nèi)容初烘,需要在編寫代碼后涡真,需要重新運行一遍打包命令,然后刷新網(wǎng)頁肾筐,才能看到新增的代碼生效哆料。可以嘗試以下吗铐,將 sidebar.js 中的 sidebar 改為 sidebar2东亦,可以看到重新編譯,然后刷新網(wǎng)頁后生效唬渗。

// sidebar.js
export default function Sidebar() {
    var dom = document.getElementById('root');
    var sidebar = document.createElement('div');
    sidebar.innerText = 'sidebar2';
    dom.appendChild(sidebar);
}
image.png

這無疑是影響開發(fā)效率的典阵。有沒有辦法能讓我們對代碼的修改能及時顯示到網(wǎng)頁上呢?

4. watch

我們在 build 命令后加一個參數(shù)镊逝,--watch壮啊,如下:

  "scripts": {
    "build": "webpack --watch"
  },

重新運行編譯命令,然后修改 sidebar2 為 sidebar 3撑蒜,此時直接刷新網(wǎng)頁歹啼,發(fā)現(xiàn)內(nèi)容已經(jīng)更新。說明我們修改源文件后座菠,webpack 自動幫我們做了編譯染突。
事實上,啟用 Watch 模式辈灼。意味著在初始構(gòu)建之后,webpack 將繼續(xù)監(jiān)聽任何已解析文件的更改也榄。Watch 模式默認(rèn)關(guān)閉巡莹。
開啟 watch 模式的另一種方法是在 webpack.config.js 配置司志。

  watch: true

或者使用 watchOptions 進(jìn)行更多的監(jiān)聽配置。

5. webpack-dev-server

上面我們已經(jīng)講到了降宅,html 文件應(yīng)該展示在服務(wù)器上骂远。使用 watch 能夠幫助我們監(jiān)聽文件的變動從而自動編譯,但是我們?nèi)匀灰謩铀⑿聣好娌拍苷故拘碌膬?nèi)容腰根,因為服務(wù)器是 ide 幫我們建立的激才,那么 webpack 是否能幫助我們建立服務(wù)器,并且提供一些配置额嘿,比如自動刷新呢瘸恼,答案是有的。
添加如下配置:

// webpack.config.js
    devServer: {
        contentBase: path.resolve(__dirname, 'dist')
    },
// package.json
  "scripts": {
    "build": "webpack",
    "start": "webpack-dev-server"
  },

運行命令 npm i webpack-dev-server -D 下載該模塊册养。
然后運行命令 npm start东帅,如下:

image.png

打開 http://localhost:8080/,可以看到:
image.png

修改 sidebar 內(nèi)容后球拦,切到網(wǎng)頁靠闭,發(fā)現(xiàn)內(nèi)容已經(jīng)自動刷新:
image.png

其實,devServr 還為我們提供了很多配置選項來滿足開發(fā)者的需求坎炼,打開webpack-dev-server可以查看這些配置的使用方法愧膀。舉幾個簡單的例子如下:

// webpack.config.js
    devServer: {
        contentBase: path.resolve(__dirname, 'dist'),
        open: true,
        port: 3000
    },

運行 npm start 后,瀏覽器自動為我們打開頁面:


image.png

6. 使用 webpack-dev-middleware

其實谣光,早起的一些項目中檩淋,大家肯能會看見并沒有使用 devServer 這個配置項來開啟配置服務(wù)器,而是開發(fā)者新增一個 server.js 文件來實現(xiàn)這個服務(wù)器抢肛。這是由于早期 devServer 的功能還不穩(wěn)定狼钮,配置項也不豐富,但是現(xiàn)在大部分情況下這個配置已經(jīng)可以滿足了捡絮,如果大家想要定制化服務(wù)器熬芜,也可以手?jǐn)]一個并借助webpack-dev-middleware 來使用。
webpack-dev-middleware 是一個容器(wrapper)福稳,它可以把 webpack 處理后的文件傳遞給一個服務(wù)器(server)涎拉。 webpack-dev-server 在內(nèi)部使用了它,同時的圆,它也可以作為一個單獨的包來使用鼓拧,以便進(jìn)行更多自定義設(shè)置來實現(xiàn)更多的需求。
我們利用 express 來實現(xiàn)服務(wù)器越妈。首先季俩,安裝 express 和 webpack-dev-middleware::

npm i -D express webpack-dev-middleware

在 webpack.config.js 的同級目錄添加一個文件 server.js

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);

// Tell express to use the webpack-dev-middleware and use the webpack.config.js
// configuration file as a base.
app.use(webpackDevMiddleware(compiler, {
  publicPath: config.output.publicPath
}));

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

在 scripts 新增一個腳本:

  "scripts": {
    "build": "webpack",
    "start": "webpack-dev-server",
    "server": "node server.js"
  },

運行腳本,npm run server梅掠。
打開 http://localhost:3000/ 即可看見網(wǎng)頁內(nèi)容酌住。修改內(nèi)容后會自動編譯店归,刷新頁面后頁面內(nèi)容更新。如果要實現(xiàn)上述 devServer 的其他配置項支持酪我,我們就需要不斷完善這個 server.js 的功能消痛。
關(guān)于 上述代碼中的 webpack 和 compiler 可以點擊 webpack-node-api 查看詳細(xì)內(nèi)容。

參考

百度百科-file
百度百科-http
webpack-watch
webpack-dev-server
webpack-dev-middleware
webpack-node-api

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末都哭,一起剝皮案震驚了整個濱河市秩伞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欺矫,老刑警劉巖纱新,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汇陆,居然都是意外死亡怒炸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門毡代,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阅羹,“玉大人,你說我怎么就攤上這事教寂∧笥悖” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵酪耕,是天一觀的道長导梆。 經(jīng)常有香客問我,道長迂烁,這世上最難降的妖魔是什么看尼? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮盟步,結(jié)果婚禮上藏斩,老公的妹妹穿的比我還像新娘。我一直安慰自己却盘,他們只是感情好狰域,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黄橘,像睡著了一般兆览。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塞关,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天抬探,我揣著相機與錄音,去河邊找鬼帆赢。 笑死小压,一個胖子當(dāng)著我的面吹牛砰左,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播场航,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼廉羔!你這毒婦竟也來了溉痢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤憋他,失蹤者是張志新(化名)和其女友劉穎孩饼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竹挡,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡镀娶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揪罕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梯码。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖好啰,靈堂內(nèi)的尸體忽然破棺而出轩娶,到底是詐尸還是另有隱情,我是刑警寧澤框往,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布鳄抒,位于F島的核電站,受9級特大地震影響椰弊,放射性物質(zhì)發(fā)生泄漏许溅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一秉版、第九天 我趴在偏房一處隱蔽的房頂上張望贤重。 院中可真熱鬧,春花似錦沐飘、人聲如沸游桩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽借卧。三九已至,卻和暖如春筛峭,著一層夾襖步出監(jiān)牢的瞬間铐刘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工影晓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镰吵,地道東北人檩禾。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像疤祭,于是被迫代替她去往敵國和親盼产。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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