webpack4 系列教程(十五):開發模式與webpack-dev-server

做者按:由於教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步 《webpack4 系列教程(十五):開發模式與 webpack-dev-server》原文地址。更歡迎來個人小站看更多原創內容: godbmw.com,進行「姿式」交流 ♪(^∇^*)

0. 課程介紹和資料

本節課的代碼目錄以下: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"
  }
}

1. 爲何須要開發模式?

在以前的課程中,咱們都沒有指定參數mode。可是執行webpack進行打包的時候,自動設置爲production,可是控制檯會爆出warning的提示。而開發模式就是指定modedevelopmentvue

在開發模式下,咱們須要對代碼進行調試。對應的配置就是:devtool設置爲source-map。在非開發模式下,須要關閉此選項,以減少打包體積。java

在開發模式下,還須要熱重載、路由重定向、掛代理等功能,webpack4已經提供了devServer選項,啓動一個本地服務器,讓開發者使用這些功能。jquery

2. 如何使用開發模式?

根據文章開頭的package.json的配置,只須要在命令行輸入:npm run dev便可啓動開發者模式。webpack

啓動效果以下圖所示:git

雖然控制檯輸出了打包信息(假設咱們已經配置了熱重載),可是磁盤上並無建立/dist/文件夾和打包文件。控制檯的打包文件的相關內容是存儲在內存之中的。github

3. 編寫一些須要的文件

首先,編寫一下入口的 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;
}

好了,準備進入正題。

4. 編寫 webpack 配置文件

4.1 配置代碼

因爲配置內容有點多,因此放代碼,再放講解。

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"
    })
  ]
};

4.2 模塊熱更新

模塊熱更新須要HotModuleReplacementPluginNamedModulesPlugin這兩個插件,而且順序不能錯。而且指定devServer.hottrue

有了這兩個插件,在項目的 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被修改後,均可以自動執行回調函數。

4.3 跨域代理

隨着先後端分離開發的普及,跨域請求變得愈來愈常見。爲了快速開發,能夠利用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);
  }
);

4.4 HTML5--History

當項目使用HTML5 History API 時,任意的 404 響應均可能須要被替代爲 index.html

在 SPA(單頁應用)中,任何響應直接被替代爲index.html

在 vuejs 官方的腳手架vue-cli中,開發模式下配置以下:

// ...
historyApiFallback: {
  rewrites: [{ from: /.*/, to: "/index.html" }];
}
// ...

5. 編寫入口文件

最後,在前面全部的基礎上,讓咱們來編寫下入口文件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");
  });
}

6. 效果檢測

在命令行鍵入:npm run dev開啓服務器後,會自動打開瀏覽器。以下圖所示:

打開控制檯,能夠看到代碼都正常運行沒有出錯。除此以外,因爲開啓了source-map,因此能夠定位代碼位置(下圖綠框內):

7. 參考資料

相關文章
相關標籤/搜索