解鎖webpack核心技能(二):配置文件和devtool配置指南

一、配置文件

webpack 提供的 cli 支持很多的參數,例如 --mode 。在我們平時的開發過程中,我們要學習很多的功能,這些很多都是可以用參數來完成的。那么后邊就會導致參數越來越多,我們使用命令特別的不方便,所以我們會使用一種更加靈活的方式---配置文件。

1. webpack 配置文件

1) 配置文件的基本使用

默認情況下,webpack 會讀取 webpack.config.js 文件作為配置文件,但也可以通過 cli 參數 --config 來指定某個配置文件,例如 npx wenpack --config abc.js。

2)配置文件的編寫規范

  • 導出方式:必須使用 CommonJS 模塊規范導出配置對象,即 module.exports = {...} 。不能使用 ES6 的 export default 語法,會導致 webpack 無法識別配置。
  • 配置優先級:當命令行參數與配置文件沖突時,命令行參數優先級更高

3)常見配置屬性

學習 webpack 簡單的來說就是學習配置文件有哪些東西可以配置。有了配置文件就可以在配置文件配置屬性,而不需要再在命令行配置了。

  • mode:編譯模式,字符串,取值為 development 或 production ,指定編譯結果代碼運行的環境,會影響 webpack 對編譯結果代碼格式的處理
  • entry:入口文件配置,字符串,指定打包的起點
  • output:出口配置,對象,指定打包結果的文件名和路徑,指定編譯結果文件

4)配置文件注意事項

配置文件中的代碼必須是有效的 Node.js 代碼,而且自定義配置文件路徑必須正確,否則會報 MODULE_NOT_FOUND 錯誤。

webpack 支持多模塊化,為什么配置文件里邊只能用 commonjs 導出,而不能用 ES6 呢?

webpack 支持多模塊化指的是它在構建依賴關系的時候,無論用 commonjs 還是 es6 它都能識別到。為什么在配置文件里邊識別不了是因為 webpack 在打包過程中或說是在編譯過程中,它是在 node 環境,在這個編譯的過程它要讀取配置文件的內容,而 nodejs 原生支持 CommonJS。

5)配置文件與源代碼的關系

  • 打包結果獨立性:dist 目錄產物完全獨立,不依賴原始配置文件,可脫離項目目錄單獨運行打包結果。
  • 關鍵區別:
    • 配置文件:參與打包過程執行,決定打包行為
    • 源代碼:僅提供內容素材,不影響打包過程本身

2. 配置文件的基本配置

1)mode

  • 配置方式:可通過CLI參數--mode或配置文件設置,推薦使用配置文件
  • 優先級規則:當命令行參數與配置文件沖突時,以命令行參數為準
  • 可選值:
    • development:開發環境,代碼不壓縮
    • production:生產環境,代碼會進行優化壓縮
  • 實踐技巧:可在package.json中配置不同腳本,如"dev": "webpack"和"build": "webpack --mode=production"

2)entry

  • 默認值:./src/index.js
  • 修改方式:在配置文件中通過entry屬性指定
  • 路徑規則:需使用相對路徑,從配置文件所在目錄開始計算
  • 注意事項:修改入口文件后需確保文件存在,否則會報錯Can't resolve './src'
  • 成功打包后生成對應的輸出文件

3)output

  • 默認輸出:./dist/main.js
  • 配置結構:output是一個對象,包含多個配置屬性
  • 常用屬性:
    • filename:指定輸出文件名
  • 保留機制:修改輸出文件名后,舊文件不會被自動刪除

3. 配置文件的總結

a. 1)配置文件的運行環境
  • 參與打包過程:配置文件在打包過程中會參與運行,其導出的結果將影響整個打包流程。
  • Node環境要求:由于運行環境是Node環境,因此配置文件中參與打包過程運行的代碼必須是Node代碼。
b. 2)源代碼處理機制
  • 源代碼讀取方式:webpack通過入口文件讀取源代碼,但僅分析代碼內容而不執行。
  • 模塊化兼容性:源代碼中可以使用任意模塊化規范(如CommonJS/ES Module等),因為webpack只進行依賴分析。
c. 3)打包過程與運行時的區別
  • 錯誤發生時機:
    • 打包階段:不會執行源代碼,因此語法錯誤不會導致打包失敗(如a.abc()調用null值)
    • 運行階段:打包后的代碼在瀏覽器/Node環境執行時才會暴露運行時錯誤
  • 配置文件特殊性:與源代碼不同,配置文件中的代碼會在打包時立即執行,因此必須保證語法正確。

二、devtool配置

1. source map源碼地圖

前端開發中源代碼經過合并、壓縮、轉換后運行,導致報錯時難以定位原始代碼位置。source map僅解決調試問題,與webpack無關,是獨立技術。其核心功能是將轉換后代碼映射回源代碼,不影響實際運行結果。source map 無兼容性問題,因為調試僅面向開發者(使用現代瀏覽器),普通用戶不會觸發調試功能。

1)瀏覽器處理source map的原理
  • 文件結構:
    • 轉換后代碼:如bundle.js,末尾包含注釋//# sourceMappingURL=bundle.map指定映射文件
    • 映射文件:記錄原始代碼內容及與轉換代碼的精確對應關系
  • 工作流程:
    • 瀏覽器請求并執行轉換后代碼
    • 發現source map注釋后自動請求映射文件
    • 報錯時通過映射關系顯示原始代碼錯誤位置
  • 技術本質:映射文件是獨立配置文件,不參與代碼執行,僅提供調試時的代碼映射服務。
2)使用source map的最佳實踐
  • 開發環境:
    • 必要性:必須啟用,提供完整調試支持
    • 優勢:快速定位合并/壓縮后的代碼錯誤源頭
  • 生產環境:
    • 風險1:顯著增加網絡傳輸量(映射文件體積較大)
    • 風險2:暴露原始代碼(可通過工具從映射文件還原源碼)
    • 特殊需求:若需調試生產環境問題,應對映射文件進行特殊處理(如限制訪問、混淆等)
  • 核心原則:source map是純調試工具,不應影響生產環境性能和安全性
2. 構建示例
1)開發環境調試
  • 開發環境配置:
    • 新建webpack.config.js文件,設置mode: "development"
    • 默認使用eval方式運行代碼,瀏覽器會通過注釋識別源碼位置
    • 錯誤信息會顯示在原始文件位置而非打包后文件
  • eval模式特點:
    • 代碼通過eval()執行,末尾添加//# sourceURL注釋
    • 瀏覽器調試時會根據注釋將代碼歸類到虛擬文件結構中
    • 對實際運行無影響,僅用于調試目的
    • 開發環境默認使用此方式
  • 調試體驗:
    • 錯誤信息直接定位到源文件位置
    • 瀏覽器顯示webpack://虛擬目錄結構
    • 可查看原始代碼而非轉換后的代碼
2)生產環境問題
  • 生產環境配置:
    • 設置mode: "production"
    • 默認使用none模式(不生成source map)
    • 錯誤信息直接顯示在打包后的代碼中
  • 調試困難:
    • 錯誤信息指向壓縮后的代碼行
    • 無法直接關聯到原始源文件
    • 難以定位和修復問題
  • devtool關鍵配置:
    • none:不生成source map(生產環境默認)
    • eval:使用eval執行(開發環境默認)
    • source-map:生成獨立source map文件
    • eval-source-map:最佳開發環境品質
    • cheap-module-eval-source-map:平衡速度與準確性
  • 配置建議:
    • 開發環境:使用eval-source-map或cheap-module-eval-source-map
    • 生產環境:使用source-map并確保服務器安全配置
    • 避免同時使用devtool選項和SourceMapDevToolPlugin插件
3.devtool配置

1). eval-source-map
  • 執行方式: 每個模塊使用eval()執行,source map轉換為DataUrl后添加到eval()中
  • 構建特點:
    • 初始化source map時比較慢
    • 重新構建時速度較快
    • 會生成實際文件
  • 映射精度:
    • 行數能夠正確映射到原始代碼
    • 生成開發環境最佳品質的source map
  • 推薦場景: 開發環境首選配置
  • cheap-eval-source-map特點:
    • 類似eval-source-map但只映射行數
    • 不生成列映射(column mapping)
    • 忽略loader的source map
    • 僅顯示轉譯后的代碼
  • 缺點:
    • 錯誤定位不夠精確
    • 同一行長代碼中無法準確定位錯誤位置
2). 開發環境
  • eval-source-map優勢:
    • 準確對應源代碼
    • 能定位行和列的錯誤
    • 文件體積適中
  • source-map單獨文件:
    • 生成獨立.map文件
    • 構建速度較慢
    • 通過//# sourceMappingURL注釋引用
    • 調試時可查看完整源代碼和生成代碼的對應關系
3). 開發環境和生產環境
  • 生產環境默認建議:
    • 不使用source map是最佳選擇
  • 必須使用時的方案:
    • 配置服務器禁止普通用戶訪問.map文件
    • 僅開發者通過特殊方式獲取source map
    • 避免網絡傳輸開銷和代碼暴露風險
4). 生產環境
  • hidden-source-map特點:
    • 生成source map但不添加引用注釋
    • 對用戶隱藏但文件實際存在
    • 需要特殊工具才能讀取
  • 適用場景:
    • 生產環境調試需求
    • 需要保護源代碼不被輕易獲取
    • 通過專業工具進行錯誤分析

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917915.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Gitlab+Jenkins+K8S+Registry 建立 CI/CD 流水線

一、前言 DevOps是一種將開發(Development)和運維(Operations)相結合的軟件開發方法論。它通過自動化和持續交付的方式,將軟件開發、測試和部署等環節緊密集成,以提高效率和產品質量。在本篇博客中&#xf…

【Linux】特效爆滿的Vim的配置方法 and make/Makefile原理

一、軟件包管理器 1、Linux下安裝軟件的常見方式: 1)源代碼安裝——不推薦。 2)rpm包安裝——不推薦。 3)包管理器安裝——推薦 2、安裝軟件命令 # Centos$ sudo yum install -y lrzsz# Ubuntu$ sudo apt install -y lrzsz 3、卸…

Spring Boot Actuator 監控功能的簡介及禁用

Spring Boot Actuator: Production-ready Features 1. 添加依賴 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> </dependencie…

Matlab(1)

一、基本操作1. matlab四則運算規則&#xff1a;先乘除后加減&#xff0c;從左到右2、對數和指數的表示sin(pi^0.5)log(tan(1))exp&#xff08;sin&#xff08;10&#xff09;&#xff09;3、類型&#xff1a;matlab變量默認為double4、who&whos&#xff1a;命令行輸入who&…

Kotlin Android 開發腳手架封裝

Kotlin Android 開發腳手架封裝&#xff08;模塊化版本&#xff09; 我將按照模塊化設計原則&#xff0c;將腳手架拆分為多個文件&#xff0c;每個文件負責特定功能領域&#xff1a; 1. 核心初始化模塊 文件路徑: core/AppScaffold.kt object AppScaffold {lateinit var contex…

Flutter 報錯解析:No TabController for TabBar 的完整解決方案

目錄 Flutter 報錯解析&#xff1a;No TabController for TabBar 的完整解決方案 一、錯誤場景&#xff1a;當 TabBar 失去 "指揮官" 二、為什么 TabBar 必須依賴 Controller&#xff1f; 1. TabBar 與 TabController 的協作關系 2. 狀態管理的核心作用 3. 實戰…

【24】C++實戰篇——【 C++ 外部變量】 C++多個文件共用一個枚舉變量,外部變量 extern,枚舉外部變量 enum

文章目錄1 方法2 外部變量 應用2.1 普通外部全局變量2.2 枚舉外部全局變量 應用2.2.2 枚舉外部變量優化c多個文件中如何共用一個全局變量 c頭文件的使用和多個文件中如何共用一個全局變量 C共享枚舉類型給QML 1 方法 ①頭文件中 聲明外部全局變量&#xff1b; ②在頭文件對…

Linux SELinux 核心概念與管理

Linux SELinux 核心概念與管理一、SELinux 基本概念 SELinux 即安全增強型 Linux&#xff08;Security-Enhanced Linux&#xff09;&#xff0c;由美國國家安全局&#xff08;NSA&#xff09;開發&#xff0c;是一套基于強制訪問控制&#xff08;MAC&#xff09;的安全機制&…

Git 中**未暫存**和**未跟蹤**的區別:

文件狀態分類 Git 中的文件有以下幾種狀態&#xff1a; 工作區文件狀態&#xff1a; ├── 未跟蹤 (Untracked) ├── 已跟蹤 (Tracked)├── 未修改 (Unmodified) ├── 已修改未暫存 (Modified/Unstaged)└── 已暫存 (Staged)1. 未跟蹤 (Untracked) 定義&#xff1a;Gi…

前端1.0

目錄 一、 什么是前端 二、 HTML 1.0 概述 2.0 注釋 三、開發環境的搭建 1.0 插件 2.0 筆記 四、 常見標簽&#xff08;重點&#xff09; 四、案例展示&#xff08;圖片代碼&#xff09; 五、CSS引入 一、 什么是前端 web前端 用來直接給用戶呈現一個一個的網頁 …

Flutter鏡像替換

一、核心鏡像替換&#xff08;針對 Maven 倉庫&#xff09; Flutter 依賴的 Google Maven 倉庫&#xff08;https://maven.google.com 或 https://dl.google.com/dl/android/maven2&#xff09;可替換為國內鏡像&#xff0c;常見的有&#xff1a;阿里云鏡像&#xff08;推薦&am…

MATLAB實現的改進遺傳算法用于有約束優化問題

基于MATLAB實現的改進遺傳算法&#xff08;GA&#xff09;用于有約束優化問題的代碼&#xff0c;包括處理非線性約束。此代碼通過引入懲罰函數和修復機制&#xff0c;有效處理約束條件&#xff0c;提高算法的魯棒性和收斂速度。 1. 定義優化問題 % 定義目標函數 function f ob…

Qt子類化QWidget后,使用setStyleSheet設置樣式無效的解決方案

關鍵代碼&#xff1a; #include <QPainter> #include <QStyleOption>void paintEvent(QPaintEvent *e) {QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(e); }定義…

【python中級】關于Flask服務在同一系統里如何只被運行一次

【python中級】關于Flask服務在同一系統里如何只被運行一次 1.背景 2.方案1 2.方案2 1.背景 python Flask實現的一個http服務,打包成應用程序exe后在windows10系統運行; 由于我會不斷的更新這個http服務,我希望運行這個http服務的時候之前的http服務被停掉; 即實現 Pytho…

git配置公鑰/密鑰

遇到 “gitgithub.com: Permission denied (publickey)” 錯誤通常意味著你嘗試通過 SSH 連接到 GitHub 時&#xff0c;SSH 密鑰沒有被正確設置或者 GitHub 無法識別你的公鑰。這里有幾個步驟可以幫助你解決這個問題&#xff1a; 檢查 SSH 密鑰 首先&#xff0c;確保你已經在本…

【機器學習】“回歸“算法模型的三個評估指標:MAE(衡量預測準確性)、MSE(放大大誤差)、R2(說明模型解釋能力)

文章目錄一、MAE、MSE、r概念說明二、MAE&#xff08;平均絕對誤差&#xff09;&#xff1a;用"房價預測"理解誤差測量三、MSE&#xff08;均方誤差&#xff09;&#xff1a;誤差的"放大鏡"1、概念說明2、 sklearn代碼實踐3、流程總結四、R&#xff1a;理解…

智慧城市SaaS平臺|市容環衛管理系統

【生活垃圾中轉設施監管】1) 設施信息管理a) 設施基本信息支持記錄中轉設施的名稱、位置、類型、容量、負責人等基本信息。b) 設施分布地圖支持通過GIS地圖展示中轉設施的分布情況&#xff0c;支持地圖查詢和導航。2) 垃圾收運監控a) 垃圾收運記錄支持記錄垃圾收運的時間、車輛…

JAVA-13常用類(2025.08.02學習記錄)

String類String類equals方法String類compareTo方法String類valueOf方法boolean參數內存分析_字符串拼接只會在內存中開辟一個對象內存分析_字符串new創建對象內存分析_變量和字符串拼接字節碼執行過程String類內存分析package com.cn;public class test01 {public static void …

QT----簡單的htttp服務器與客戶端

HTTP協議學習 協議的相關學習可以參考這篇 csdn學習連接 總體流程如下 HTTP服務器 監聽ip和端口,有連接時接收請求,發送回復 server.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_httpServer.h" #include <QTcpServer> #include &l…

飛 算 JavaAI 解 析:有 了 它,麻 麻 再 也 不 用 擔 心 我 不 會 寫 代 碼 了!

聲 明&#xff1a;本 篇 博 客 為 測 評 體 驗 非 廣 告。 文 章 目 錄一、產 品 簡 介二、注 冊 與 上 手方 法 一 - - - 從 IDEA 插 件 市 場 安 裝方 法 二產 品 使 用三、產 品 體 驗智 能 引 導 功 能理 解 需 求設 計 接 口表 結 構 設 計處 理 邏 輯生 成 源 碼Java ch…