《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 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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...