上一章講的是js壓縮混淆,和這一章沒有半毛錢關係,這章講的是DefinePlugin
,一個好像沒有用,但其實很好用的一個插件,我很喜歡,嘿嘿嘿!webpack
說白了,這是一個簡單的字符串替換插件,將咱們全部通過webpack
打包的js
文件的對應的字符串都替換爲咱們在這個插件中指定的字符串。git
初始化項目github
+ 0x005-define-plugin + src - index.js - webpack.config.js
安裝依賴包web
$ npm init -y $ npm install --save-dev webpack
編寫webpack.config.js
npm
var path = require('path') module.exports = { entry : ['./src/index.js'], output: { path : path.resolve(__dirname, 'dist'), filename: 'index.js' } }
添加插件,並指定幾個常量json
var path = require('path') var webpack = require('webpack') module.exports = { entry : ['./src/index.js'], output : { path : path.resolve(__dirname, 'dist'), filename: 'index.js' }, plugins: [ new webpack.DefinePlugin({ PRODUCTION : JSON.stringify(true), VERSION : JSON.stringify("2.0.1"), BROWSER_SUPPORTS_HTML5: true, TWO : "1+1", "typeof window" : JSON.stringify("object"), 不想寫代碼 : JSON.stringify("i like boss"), 彈窗一下 : "alert('我彈窗了')" }) ] }
調用這幾個變量segmentfault
// src/index.js console.log("Running App version " + VERSION); if (!BROWSER_SUPPORTS_HTML5) console.log('BROWSER_SUPPORTS_HTML5') if (PRODUCTION) { console.log('Production log') } console.log(TWO) console.log(typeof window) console.log(不想寫代碼) 彈窗一下
打包並查看打包後的結果api
// dist/index.js ... console.log("Running App version " + "2.0.1"); if (false) console.log('BROWSER_SUPPORTS_HTML5') if (true) { console.log('Production log') } console.log(1+1) console.log("object") console.log("i like boss") alert('我彈窗了') ...
就是這種用處了,直接將匹配的字符串替換,固然後面兩句是玩笑,萬萬不可這麼作,直接用這個插件替換邏輯會形成維護上的問題的,推薦只使用這個插件作全局的變量替換,好比在不一樣環境之間切換等。app
該插件是簡單的字符串替換,因此若是是定義常量最好使用""
包裹要替換的內容,或者使用JSON.stringify()
轉化,不然會變成代碼直接插入,好比版本號:'"1.2.1"'
,這樣替換的時候就會變成"1.2.1"
,而不會變成1.2.1
,致使錯誤的數據格式。測試
git
配合jenkins
之類的ci
作自動化發佈的時候注入版本號
- 每一次`git push`就自動遞增`package.json`中的版本號 - `git tag`讀取`package.json`中的版本號發佈新版本 - `jenkins`接收到`webhook`以後,調用`webpack`構建發佈版本,`webpack`將會注入`package.json`中的版本號,讓`app`中顯示當前的版本 - 打包完成以後作資源上傳,頁面部署之類的 - 這樣就讓`git`版本號、`app`版本號、`package.json`版本號統一。
切換環境
- 當擁有兩套環境時,好比測試環境和正式環境,咱們能夠定義`PRODUCTION`變量來作斷定,斷定當前的環境,並對此做出不一樣的操做,好比替換`api`地址等