《Webpack入門系列》DefinePlugin插件用法理解

来源:https://www.cnblogs.com/shuitao/archive/2019/11/29/11958980.html
-Advertisement-
Play Games

作者:水濤 座右銘:天行健,君子以自強不息 自白:我寫博文上來蹭蹭就是乾,我突然覺得我需要幽默一點了,好了,下麵我們說正經的 一、官方定義: DefinePlugin 允許創建一個在 編譯 時可以配置的全局常量。這可能會對開發模式和生產模式的構建允許不同的行為非常有用。如果在開發構建中,而不在發佈構 ...


作者:水濤
座右銘:天行健,君子以自強不息
自白:我寫博文上來蹭蹭就是乾,我突然覺得我需要幽默一點了,好了,下麵我們說正經的

一、官方定義:

DefinePlugin

DefinePlugin 允許創建一個在編譯時可以配置的全局常量。這可能會對開發模式和生產模式的構建允許不同的行為非常有用。如果在開發構建中,而不在發佈構建中執行日誌記錄,則可以使用全局常量來決定是否記錄日誌。這就是 DefinePlugin 的用處,設置它,就可以忘記開發環境和生產環境構建的規則。

new webpack.DefinePlugin({
  // Definitions...
});

用法 

每個傳進 DefinePlugin 的鍵值都是一個標誌符或者多個用 . 連接起來的標誌符。

  • 如果這個值是一個字元串,它會被當作一個代碼片段來使用。
  • 如果這個值不是字元串,它會被轉化為字元串(包括函數)。
  • 如果這個值是一個對象,它所有的 key 會被同樣的方式定義。
  • 如果在一個 key 前面加了 typeof,它會被定義為 typeof 調用。

這些值會被內聯進那些允許傳一個代碼壓縮參數的代碼中,從而減少冗餘的條件判斷。

new webpack.DefinePlugin({
  PRODUCTION: JSON.stringify(true),
  VERSION: JSON.stringify('5fa3b9'),
  BROWSER_SUPPORTS_HTML5: true,
  TWO: '1+1',
  'typeof window': JSON.stringify('object'),
  'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
});
console.log('Running App version ' + VERSION);
if(!BROWSER_SUPPORTS_HTML5) require('html5shiv');

When defining values for process prefer 'process.env.NODE_ENV': JSON.stringify('production')over process: { env: { NODE_ENV: JSON.stringify('production') } }. Using the latter will overwrite the process object which can break compatibility with some modules that expect other values on the process object to be defined.

註意,因為這個插件直接執行文本替換,給定的值必須包含字元串本身內的實際引號。通常,有兩種方式來達到這個效果,使用 '"production"', 或者使用 JSON.stringify('production')

二、個人分析

1、官網中說的“可以使用這個插件定義一些編譯時的全局常量”

編譯時這幾個字很重要,webpack會根據配置文件將將入口文件解析、打包、轉譯為瀏覽器可識別的js文件最後輸出到出口,而他轉譯的過程其實就是webpack編譯過程,也就是官網說的編譯時。

2、官網中說的“插件會直接替換文本”

 > 在編譯過程中(轉譯為瀏覽器可識別的js文件時),會將源文件中所有用到DefinePlugin中定義的常量的地方直接替換為對應的值文本,註意,是文本無論語義上是對象還是字元串還是函數,都直接作為文本替換過去。

示例1:

假設在配置文件中定義編譯時全局常量 process.env.firstName

new webpack.DefinePlugin({
  'process.env.firstName': JSON.stringify("ShuiTao")
});

源文件index.js內容如下

console.log(process.env.firstName)

最終轉譯後的js文件

console.log('ShuiTao')

可以看到,在編譯生成新js文件時,將process.env.firstName常量直接替換成了他對應的值文

示例2:

假設在配置文件中定義編譯時全局常量 process.env.info

new webpack.DefinePlugin({ 'process.env.info': JSON.stringify({
    name:'ShuiTao',
    age:23
}) });

源文件index.js內容如下

console.log(process.env.info)

最終轉譯後的js文件

console.log({
      name:'ShuiTao',
      age:23
})

可以看到,在編譯生成新js文件時,將process.env.info常量直接替換成了他對應的值文本

示例3:

假設在配置文件中定義編譯時全局常量 process.env.info

new webpack.DefinePlugin({ 'process.env.info': JSON.stringify({
    name:'ShuiTao',
    age:23
}) });

源文件index.js內容如下

console.log(process.env);
console.log(process.env.info);

最終轉譯後的js文件

console.log(process.env);
console.log({
      name:'ShuiTao',
      age:23
});

可以看到,在編譯生成新js文件時,將process.env.info常量直接替換成了他對應的值文本,而process.env沒有被替換,因為沒有在DefinePlugin定義process.env

運行最終轉譯後的js文件時,process.env指向的是Node中的process,在process.env中找不到info屬性,足以證明在DefinePlugin定義的process.env.infoNodeprocess沒有任何關係,他只是一個在插件中定義的編譯時的常量,編譯後就已經被替換了,因此 理解清楚概念,他只是個編譯時的常量,轉譯後就會被替換,只是恰好常量的名字是process.env.info


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

-Advertisement-
Play Games
更多相關文章
  • sqlserver日誌處理不當而造成的隱患 事故背景:一大早還在路上,群里陸續有人反饋系統一直報錯 “Unknown error 258”,後來查詢日誌發現錯誤日誌 第一反應是不是資料庫連接不夠用了?導致超時?但是通過sql查詢當時連接也只有40個左右,於是繼續排查問題,發現dbserver機器這段 ...
  • 重建全庫索引: exec sp_msforeachtable 'DBCC DBREINDEX(''?'')' 更新全庫統計信息: --更新全部統計信息 exec sp_updatestats 實例反饋: 在實際項目中,出現過導入數據的存儲過程執行需要大概46分鐘,而通過更新全庫統計信息之後,只需要6 ...
  • 德 App 進行 Bundle 化後,由於業務的複雜性,Bundle 的數量非常多。而這帶來了一個新的問題——Bundle 之間的依賴關係錯綜複雜,需要進行管控,使 Bundle 之間的依賴保持在架構設計之下。 ...
  • Node的全局對象和全局變數、非同步、無阻塞IO?Node的技術架構和函數調用原理是什麼? ...
  • 什麼是CommonJS規範?它與NodeJS是什麼關係呢?CommonJS 的底層實現原理是什麼? ...
  • 1、清空所有行和所有列 $('#dgJGQuery').datagrid({ columns: [], url: '', data: [] }); 2、採用 datagrid-groupview 分組展示後,取消分組展示。 datagrid使用分組展示 是基於view屬性,把view屬性設置為gro ...
  • 響應式開發 1. 響應式開發原理 使用媒體查詢針對不同寬度的設備進行佈局和樣式的設置,從而適配不同設備的目的 | 設備劃分 | 尺寸區間 | | | | | 超小屏幕(手機) | =768px~=992px~=1200px | 2. 響應式佈局容器 響應式需要一個父級作為佈局容器,來配合子級元素來實 ...
  • Accept Encoding和Content Encoding Accept Encoding和Content Encoding是HTTP中用來對採用何種壓縮格式傳輸正文進行協定的一對header。工作原理如下: 瀏覽器發送請求,通過Accept Encoding帶上自己支持的內容編碼格式列表 服 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...