做者按:由於教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步 《webpack4 系列教程(十五):開發模式與 webpack-dev-server》原文地址。更歡迎來個人小站看更多原創內容: godbmw.com,進行「姿式」交流 ♪(^∇^*)
本節課的代碼目錄以下:javascript
本節課用的 plugin 和 loader 的配置文件package.json
以下:html
{ "scripts": { "dev": "webpack-dev-server --open" }, "devDependencies": { "clean-webpack-plugin": "^0.1.19", "html-webpack-plugin": "^3.2.0", "jquery": "^3.3.1", "webpack": "^4.16.1", "webpack-cli": "^3.1.0", "webpack-dev-server": "^3.1.4" } }
在以前的課程中,咱們都沒有指定參數mode
。可是執行webpack
進行打包的時候,自動設置爲production
,可是控制檯會爆出warning
的提示。而開發模式就是指定mode
爲development
。vue
在開發模式下,咱們須要對代碼進行調試。對應的配置就是:devtool
設置爲source-map
。在非開發模式下,須要關閉此選項,以減少打包體積。java
在開發模式下,還須要熱重載、路由重定向、掛代理等功能,webpack4
已經提供了devServer
選項,啓動一個本地服務器,讓開發者使用這些功能。jquery
根據文章開頭的package.json
的配置,只須要在命令行輸入:npm run dev
便可啓動開發者模式。webpack
啓動效果以下圖所示:git
雖然控制檯輸出了打包信息(假設咱們已經配置了熱重載),可是磁盤上並無建立/dist/
文件夾和打包文件。控制檯的打包文件的相關內容是存儲在內存之中的。github
首先,編寫一下入口的 html 文件:web
<!-- index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> This is Index html </body> </html>
而後,按照項目目錄,簡單封裝下/vendor/
下的三個 js 文件,以方便app.js
調用:vue-cli
// minus.js module.exports = function(a, b) { return a - b; }; // multi.js define(function(require, factory) { "use strict"; return function(a, b) { return a * b; }; }); // sum.js export default function(a, b) { console.log("I am sum.js"); return a + b; }
好了,準備進入正題。
因爲配置內容有點多,因此放代碼,再放講解。
webpack.config.js
配置以下所示:
const webpack = require("webpack"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const path = require("path"); module.exports = { entry: { app: "./app.js" }, output: { publicPath: "/", path: path.resolve(__dirname, "dist"), filename: "[name]-[hash:5].bundle.js", chunkFilename: "[name]-[hash:5].chunk.js" }, mode: "development", // 開發模式 devtool: "source-map", // 開啓調試 devServer: { contentBase: path.join(__dirname, "dist"), port: 8000, // 本地服務器端口號 hot: true, // 熱重載 overlay: true, // 若是代碼出錯,會在瀏覽器頁面彈出「浮動層」。相似於 vue-cli 等腳手架 proxy: { // 跨域代理轉發 "/comments": { target: "https://m.weibo.cn", changeOrigin: true, logLevel: "debug", headers: { Cookie: "" } } }, historyApiFallback: { // HTML5 history模式 rewrites: [{ from: /.*/, to: "/index.html" }] } }, plugins: [ new HtmlWebpackPlugin({ filename: "index.html", template: "./index.html", chunks: ["app"] }), new webpack.HotModuleReplacementPlugin(), new webpack.NamedModulesPlugin(), new webpack.ProvidePlugin({ $: "jquery" }) ] };
模塊熱更新須要HotModuleReplacementPlugin
和NamedModulesPlugin
這兩個插件,而且順序不能錯。而且指定devServer.hot
爲true
。
有了這兩個插件,在項目的 js 代碼中能夠針對偵測到變動的文件而且作出相關處理。
好比,咱們啓動開發模式後,修改了vendor/sum.js
這個文件,此時,須要在瀏覽器的控制檯打印一些信息。那麼,app.js
中就能夠這麼寫:
if (module.hot) { // 檢測是否有模塊熱更新 module.hot.accept("./vendor/sum.js", function() { // 針對被更新的模塊, 進行進一步操做 console.log("/vendor/sum.js is changed"); }); }
每當sum.js
被修改後,均可以自動執行回調函數。
隨着先後端分離開發的普及,跨域請求變得愈來愈常見。爲了快速開發,能夠利用devServer.proxy
作一個代理轉發,來繞過瀏覽器的跨域限制。
按照前面的配置文件,若是想調用微博的一個接口:https://m.weibo.cn/comments/hotflow
。只須要在代碼中對/comments/hotflow
進行請求便可:
$.get( "/comments/hotflow", { id: "4263554020904293", mid: "4263554020904293", max_id_type: "0" }, function(data) { console.log(data); } );
當項目使用HTML5 History API
時,任意的 404 響應均可能須要被替代爲 index.html
。
在 SPA(單頁應用)中,任何響應直接被替代爲index.html
。
在 vuejs 官方的腳手架vue-cli
中,開發模式下配置以下:
// ... historyApiFallback: { rewrites: [{ from: /.*/, to: "/index.html" }]; } // ...
最後,在前面全部的基礎上,讓咱們來編寫下入口文件app.js
:
import sum from "./vendor/sum"; console.log("sum(1, 2) = ", sum(1, 2)); var minus = require("./vendor/minus"); console.log("minus(1, 2) = ", minus(1, 2)); require(["./vendor/multi"], function(multi) { console.log("multi(1, 2) = ", multi(1, 2)); }); $.get( "/comments/hotflow", { id: "4263554020904293", mid: "4263554020904293", max_id_type: "0" }, function(data) { console.log(data); } ); if (module.hot) { // 檢測是否有模塊熱更新 module.hot.accept("./vendor/sum.js", function() { // 針對被更新的模塊, 進行進一步操做 console.log("/vendor/sum.js is changed"); }); }
在命令行鍵入:npm run dev
開啓服務器後,會自動打開瀏覽器。以下圖所示:
打開控制檯,能夠看到代碼都正常運行沒有出錯。除此以外,因爲開啓了source-map
,因此能夠定位代碼位置(下圖綠框內):