Webpack 4教程 - 第六部分 增強開發時體驗

来源:https://www.cnblogs.com/powertoolsteam/archive/2019/03/15/10536629.html
-Advertisement-
Play Games

今天我們將介紹mode屬性的development值。它會自動為你配置Webpack以簡化開發過程。除此之外,我們還會介紹webpack-dev-server——包括模塊熱替換。開始吧! ...


轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。
原文出處:https://wanago.io/2018/08/06/webpack-4-course-part-six-increasing-development-experience

 

今天我們將介紹mode屬性的development值。它會自動為你配置Webpack以簡化開發過程。除此之外,我們還會介紹webpack-dev-server——包括模塊熱替換。開始吧!

開發體驗優化的其中一步是讓Webpack運行在watch模式下。試試webpack --watch。現在每當你對源碼做出修改,Webpack會重新編譯你的工程然後輸出。webpack-dev-server則做得更多。它不是把輸出文件寫到文件夾下,而是直接把它們寫入記憶體。在構建完之後,輸出可作為本地伺服器資源被訪問。

運行 webpack-dev-server

首先是安裝它。

npm install webpack-dev-server

 

然後是在你的package.json文件中加入它:

"scripts": {
  "build": "webpack",
  "start": "webpack-dev-server"
}
···

現在就可以使用`npm start`來啟動它。你會看到下麵的提示信息:
```bash
「wds」: Project is running at http://localhost:8080/

剩下的事情只是在瀏覽器中打開http://localhost:8080/了。

模塊熱替換

為進一步優化你的開發體驗,可以使用模塊熱替換,你甚至跳過刷頁面的需求。比如,當你對某些樣式做了修改,不必刷新整個頁面就可以看到效果。

第四節教程我們曾使用了MiniCssExtractPlugin。請註意,在寫文本時,對MiniCssExtractPlugin的熱模塊更新支持還沒有實現。更多信息請可查看Github上的此issue。在當前開發環境,你可能需要使用的是style-loader。

當你運行webpack-dev-server時,它使用與正常構建時相同的配置文件。你可以在webpack.config.js中加入一個叫devServer的參數來進行額外的配置。我們需要它來開啟模塊熱替換。  

// webpack.config.js
const webpack = require('webpack');

module.exports = {
  devServer: {
    hot: true
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ]
};

註意,當開啟 -hot 標誌以運行 webpack-dev-server 時也會在plugins裡加入HotModuleReplacementPlugin。如果你添加了兩次,可能會出現問題。

這對於我們的CSS調試是很有吸引力的。但當修改是JavaScript時,還需點額外步驟。

// index.js
import { divide } from "./divide";

console.log(`6 / 2 = ${divide(6,2)}`);

if(module.hot) {
  module.hot.accept();
}
// divide.js
export function divide(a, b) {
  return a / b;
}

運行module.hot.accept()會讓模塊可熱替換。這同樣適用於它引入的所有其他模塊。上面的代碼意味著,index.js中的accept()讓divide模塊能夠被熱替換。

運行module.hot.accept()函數時可以傳參,如果你感興趣,請查看文檔

當使用HotModuleReplacementPlugin插件時,如果輸出文件名中使用了chunkhash欄位,就可能會出現一些問題。這種情況下,只在開發環境下使用HotModuleReplacementPlugin是個好主意(而且避免使用chunckhash)。

// webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');

const isDevServer = require.main.filename.includes('webpack-dev-server');
const plugins = [
  new HtmlWebpackPlugin({ template: './src/index.html' }),
];
if(isDevServer) {
  plugins.push(new webpack.HotModuleReplacementPlugin());
}

module.exports = {
  output: {
    filename: isDevServer ? '[name].bundle.js' : '[name].[chunkhash].bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  plugins,
    devServer: {
      hot: true
  }
}

webpack-serve

譯者註:由於webpack-serve其實已經不再維護了。推薦仍然使用上面所說的webpack-dev-sever。

mode: "development"

之前的課程,我們介紹了mode屬性的production值。現在該輪到development了。讓我們看看它為我們做了我們。

DefinePlugin

如之前所說,這個插件允許你創建編譯時的全局常量。

因為這個插件也在mode: produnction中使用,更多信息可查看教程的第五部分

這次它的值為process.env.NODE_ENV: JSON。stringify("development"):

module.exports = {
  mode: "development",
  // 使用 mode: "development" 會添加以下配置:
  plugins: [
    new webpack.DefinePlugin({
      "process.env.NODE_ENV": JSON.stringify("development")
    }),
  ]
}

NamedModulesPlugin

這是在使用mode: "development"時預設加入的另一個插件。它在使用模塊熱替換時很有用。有了NamedModulesPlugin,我們能夠看到被替換模塊的相對路徑。  

[WDS] App updated. Recompiling...
[WDS] App hot update...
[HMR] Checking for updates on the server...
[HMR] Updated modules:
[HMR]  - ./src/style.css
[HMR] App is up to date

否則我們只會看到一個id,而不是像./src/style.css這樣的路徑。

NamedChunksPlugin

它的左右和NamedModulesPlugin類似。有了它,不僅模塊能看到名字,chunk也能。當應用在瀏覽器中運行起來是,你可以在window.webpackJsonp屬性中查看它們。

使用NamedModulesPluginNamedChunksPlugin的一個額外好處是,當添加和刪除依賴時,打包不再需要使用模塊的順序id。因為這些id和名字會在最終的輸出產物中使用,修改它們會導致文件哈希值的變化,即使這些文件使用的模塊本身並沒有改變。使用以上兩個插件會幫助你處理瀏覽器的緩存問題。讓我們來比較一下代碼:

沒使用NamedModulesPluginNamedChunksPlugin

// 輸出產物
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{
  /***/ 6:
  (...) // divide.js module output code

  /***/ 7:
  (...) // substract.js module output code
]);

使用了NamedModulesPluginNamedChunksPlugin

(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["utilities~main"],{
  /***/ "./src/utilities/divide.js":
  (...) // divide.js module output code

  /***/ "./src/utilities/substract.js":
  (...) // substract.js module output code
]);

Devtool

除了添加插件,設置mode: "development"還做了一件事,即通過設置devtool的值為eval開啟了源碼映射(Source Map)。  

// webpack.config.js
module.exports = {
  mode: "development",
  // 使用 mode: "development:" 添加了以下配置
  devtool: "eval"
}

轉譯、壓縮和打包你的代碼能讓你的用戶有更好的體驗。經過這些步驟之後,代碼變得更精簡和高效。而調試這樣的代碼則變得非常困難。因此,引入了源碼映射(Source Map)。它們把輸出後的的代碼與源碼對應起來。有了它,相對於瀏覽器真正運行的打包後的輸出,你能看到其對應的源碼,從而更加容易地使用調試工具和設置斷點。我們會在接下來的課程中對源碼映射做進一步介紹,但如果你需要現在就定製它,可查看它的文檔。  

總結

Webpack是開發現代Web應用的強大工具。它不僅讓你優化生產環境的代碼,而且還可以並定製,用以增強開發時的體驗。這次我們介紹瞭如何運行開發時伺服器,以及把mode屬性設成development的一些作用。我們還學習使用了模塊的熱替換。所有這些組合起來,能幫你更容易和更快地開發應用。  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 用到的工具 百度地圖API (web開發 javascript ) 2. 需求 給熱力圖上的點添加點擊事件 3. 遇到的問題 原始的熱力圖上的點不能點擊 4. 解決方法 首先繪製熱力圖,HTML代碼如下: JavaScript代碼如下: 解釋: heatmapOverlay.setDataSe ...
  • 在spring mvc中,雖然有時候,在控制器中設置返回值是json對象,但在攔截器出現錯誤的時候,仍然可能返回html(根據設置的不同),如果要展示這些html,最好把他們放入iframe中,以防這些html對現有頁面造成污染. ...
  • 看了一天的angular.js,只要記住這是關於雙向數據綁定 和單向數據綁定就可以,看看開發文檔,短時間內還是可以直接入手的,看個人理解能力(我是小白)。 這幾天開始著手學習angularjs的有關知識,將一些心得總結如下: (一)為了使用Angular,所有應用必須首先做兩件事情: 1.載入ang ...
  • # jQuery $.on()方法和addEventListener改變this指向 ...
  • 1.語義標簽解決方案 <video></video> 屬性: controls 顯示控制欄 autoplay 自動播放 loop 設置迴圈播放 多媒體標簽在網頁中的相容效果方式 <video> <source src="1.mp4"></source> <source src="1.ogg"></s ...
  • 在簡介、引言中常見:文字只有一排,超出寬度以省略號顯示,像這樣 實現方法:在公共庫定義otw類 其中 text-overflow:ellipsis 顯示省略符號來代表被修剪的文本; white-space:nowrap 文本不會換行,文本會在在同一行上繼續,直到遇到 <br> 標簽為止。 ...
  • 今天我們繼續瞭解我們攻城獅(Ps.工程師)蓋房子(Ps.寫網頁)的時候所需要的建材(Ps.標簽),今天我們先來瞭解一下標簽的種類。 我們在寫網頁的工程中,需要用到各種各樣的標簽,這些標簽也有自己不同的特性,從微觀上講它們不同的特性可以適應不同的頁面情況;從巨集觀上講,它們分為塊級元素回合行內元素。 今 ...
  • 電商項目(上) css3新增選擇器: 選取屬於其父元素的首個子元素的指定選擇器 選取屬於其父元素的最後一個子元素的指定選擇器 匹配屬於其父元素的第n個子元素 選擇器匹配屬於其元素的第n個子元素的每個元素 定義文檔的頁面 定義導航鏈接的部分 定義文檔或節的頁腳 定義文檔中的節 定義其所處內容之外的內容 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...