webpack 的 sourse-map 中 eval、cheap、inline 和 module 各是什麼意思?

来源:https://www.cnblogs.com/skychx/archive/2020/05/18/webpack-sourse-map-eval-cheap-inline-module.html
-Advertisement-
Play Games

sourse-map ,裡面都有個 map 了,肯定是映射的意思。sourse-map 就是一份源碼和轉換後代碼的映射文件。 ...


Webpack 有非常多的概念,很多名詞長得都差不多。我把這些分散在文檔和教程里的內容總結起來,寫了一份 webpack 中的易混淆知識點,目前看是全網獨一份,大家可以加個收藏,方便以後檢索和學習。

全集鏈接 ➡️ webpack 易混淆知識點

sourse-map ,裡面都有個 map 了,肯定是映射的意思。sourse-map 就是一份源碼和轉換後代碼的映射文件。具體的原理內容較多,感興趣的同學可以自行搜索,我這裡就不多言了。

我們先從官網上看看 sourse-map 有多少種類型:

emmmm,13 種,告辭。

如果再仔細看一下,就發現這 13 種大部分都是 evalcheapinlinemodule這 4 個詞排列組合的,我做了個簡單的表格,比官網上直白多了:

參數 參數解釋
eval 打包後的模塊都使用 eval() 執行,行映射可能不准;不產生獨立的 map 文件
cheap map 映射只顯示行不顯示列,忽略源自 loader 的 source map
inline 映射文件以 base64 格式編碼,加在 bundle 文件最後,不產生獨立的 map 文件
module 增加對 loader source map 和第三方模塊的映射

還不明白?可以看看 demo。

我們對 webpack 做一些配置,devtool 是專門配置 source-map 的。

......

{
    devtool: 'source-map',
}

......

index.js 文件為了簡便,我們只寫一行代碼,為了得出報錯信息,我們故意拼錯:

console.lg('hello source-map !') // log 寫成 lg

下麵我們試一試常見的幾個配置:

5.1 source-map

source-map 是最大而全的,會生成獨立 map 文件:

註意下圖游標的位置,,source-map 會顯示報錯的行列信息:

5.2 cheap-sourse-map

cheap,就是廉價的意思,它不會產生列映射,相應的體積會小很多,我們和 sourse-map 的打包結果比一下,只有原來的 1/4 。

5.3 eval-source-map

eval-source-map 會以 eval() 函數打包運行模塊,不產生獨立的 map 文件,會顯示報錯的行列信息:

// index.bundle.js 文件

!function(e) {
    // ......
    // 省略不重要的代碼
    // ......
}([function(module, exports) {
    eval("console.lg('hello source-map !');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vc3JjL2luZGV4Mi5qcz9mNmJjIl0sIm5hbWVzIjpbImNvbnNvbGUiLCJsZyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU8sQ0FBQ0MsRUFBUixDQUFXLG9CQUFYIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zb2xlLmxnKCdoZWxsbyBzb3VyY2UtbWFwICEnKSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///0\n")
}
]);

5.4 inline-source-map

映射文件以 base64 格式編碼,加在 bundle 文件最後,不產生獨立的 map 文件。加入 map 文件後,我們可以明顯的看到包體積變大了;

// index.bundle.js 文件

!function(e) {

}([function(e, t) {
    console.lg("hello source-map !")
}
]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL3NyYy9pbmRleDIuanMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJ......

// base64 太長了,我刪了一部分,領會精神

5.5 常用配置:

上面的幾個例子都是演示,結合官網推薦和實際經驗,常用的配置其實是這幾個:

1.source-map

大而全,啥都有,就因為啥都有可能會讓 webpack 構建時間變長,看情況使用。

2.cheap-module-eval-source-map

這個一般是開發環境(dev)推薦使用,在構建速度報錯提醒上做了比較好的均衡。

3.cheap-module-source-map

一般來說,生產環境是不配 source-map 的,如果想捕捉線上的代碼報錯,我們可以用這個

寫在最後

這篇文章差不多就寫到這裡了,後面我還會寫一些 webapck 打包優化的文章。

從學習 webpack 到這篇輸出差不多花了 2 個星期的時間,個人感覺 webpack 說到底,也就是工具鏈的一環,很多配置內容沒必要像 JavaScript 的內置方法一樣需要記憶,自己寫個大而全的 demo,知道配置項大概能幹個啥,要用的時候查一下就行了。

因此我總結了這篇 webpack 易混淆知識點的文章,大家可以點擊收藏一下,以後準備面試或者複習的時候,看一下就懂個大概了。




最後推薦一下我的個人公眾號:「滷蛋實驗室」,平時會分享一些前端技術和數據分析的內容,大家感興趣的話可以關註一波:



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

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...