注:如下教程均在 windows 環境實現,使用其餘操做系統的同窗實踐過程可能會有些出入。html
上一章咱們瞭解了 webpack 的 ES6 編譯環境搭建:webpack 項目構建:(二)ES6 編譯環境搭建
這一章咱們會結合 webpack 的 webpack-dev-server,介紹本地測試服務器的搭建過程。webpack
上一章咱們在 webpack 上結合了 Babel,搭建了一個可使用 ES6 語法的開發構建平臺。(源碼下載地址:https://github.com/xh4722/web...)
項目結構以下:
下面咱們將擴展咱們的 webpackDemo,賦予咱們項目本地開發的能力。git
咱們在項目開發過程當中通常須要經歷三個環境:開發環境、測試環境和生產環境。程序員
不一樣環境的使用場景不一樣,對咱們的 webpack 配置要求也會不同。github
咱們先從開發環境入手,一步步搭建一個高效的 webpack 開發環境。web
webpack 有一些特性是專門用於開發環境的,能夠幫助咱們搭建一個更好的開發環境。express
先讓咱們試用一下自動編譯的第一種方式,在 webpackDemo 的目錄下執行 webpack --watch:
能夠看到在執行了 webpack --watch 命令之後,該命令並不會立刻結束,webpack 啓動了一個監聽服務。
在瀏覽器中打開咱們的 index.html 頁面,過了一秒彈出 Hello world! 彈窗:
npm
如今讓咱們修改當前目錄的 index.js 文件,將彈窗內的 'Hello world!' 信息修改成 'Hello webpack!' 並保存:json
index.js
segmentfault
控制檯信息輸出以下:
能夠看到 webpack 檢測到了入口文件的變動並自動執行了打包工做。
讓咱們刷新咱們的頁面,能夠看到過了一秒彈出 Hello webpack! 彈窗。
webpack --watch 解決了入口文件變動後自動編譯的問題,可是每次修改之後都須要手動刷新頁面才能看到最新的效果。咱們可使用 webpack-dev-server 解決手動刷新的問題。
webpack-dev-server 提供了一個簡單的 web 服務器,並提供了實時加載(live reloading)的功能。在正式使用前咱們先作一些準備工做。
咱們修改了兩個地方:(1)將 output.filename 修改成 './dist/test.js';(2)新增 devServer,並配置資源路徑爲輸出文件的位置 './dist';
如今讓咱們在當前目錄執行服務啓動命令:webpack-dev-server
從控制檯信息能夠看出 webpack-dev-server 啓動了一個默認端口號爲 8080 的本地服務,咱們能夠在瀏覽器中輸入 http://localhost:8080 查看效果:
界面顯示 Cannot GET / 找不到文件,這是由於 webpack-dev-server 會默認打開資源目錄(./dist)下的 index.html 文件,可是咱們的 webpack.config.js 只配置了 output 輸出文件爲 './dist/test.js',在 dist 目錄下並不存在 index.html 文件。
那麼怎麼在 dist 目錄下生成 index.html 文件呢?咱們可使用 HtmlWebpackPlugin 完成 Html 文件的建立過程:
咱們在 webpack.config.js 中聲明瞭 HtmlWebpackPlugin,並經過 webpack.config.js 的 plugins 引入該插件。
如今讓咱們從新啓動 webpack-dev-server 並打開瀏覽器:
服務啓動正常。如今咱們修改 index.js 文件的彈窗信息爲 'Hello webpack-dev-server!',能夠看到控制檯中 webpack-dev-server 自動從新編譯,編譯完成後,頁面自動刷新:
如今讓咱們稍微休息一下,回顧一下上面 webpack-dev-server 的搭建過程,能夠發現幾個比較有意思的地方:
讓咱們在上面的 webpack-dev-server 基礎上作一些優化,讓服務器工做得更好:
還可使用 Node.js API 結合 webpack-dev-server 構建服務器。新建一個 server.js 文件,用於編寫服務器代碼:
server.js
在 server.js 裏咱們引入了 webpack-dev-server,並啓動了 localhost:8080 服務。
接下來打開咱們的 package.json 文件,修改咱們的啓動命令:
package.json
在當前目錄執行命令:npm start
服務啓動成功後在瀏覽器中輸入 http://localhost:8080 打開網頁,代碼執行成功:
可是咱們發現有兩個問題:
讓咱們嘗試解決這兩個問題:
針對問題1,咱們能夠引入 webpack-browser-plugin 實現自動打開瀏覽器的功能:
第三種啓動本地服務的方式是使用 webpack-dev-middleware。webpack-dev-middleware 是 webpack-dev-server 內部使用的一個容器,能夠把 webpack 處理後的文件傳遞給一個服務器。咱們能夠經過 express 配合使用 webpack-dev-middleware 來搭建本地服務。
上一節的 express 服務器能夠實現自動編譯的功能,可是沒法自動從新加載界面,排查問題產生的緣由。
Google 查找問題,解釋以下:
截圖來自:https://blog.cloudboost.io/li...
能夠看出來,產生這個問題的緣由是 webpack-dev-server 內置了熱加載模塊,因此能檢測文件變動並自動加載頁面;而 webpack-dev-middleware 只是用於處理文件的變動,並不能控制瀏覽器的從新加載。要實現 express 的熱加載功能,就須要用到另一箇中間件 webpack-hot-middleware,熱更新的具體實現將在下一章進行介紹。