<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【Vuejs】1247- Vue3 如何實現(xiàn) Feature Flags?

          共 6602字,需瀏覽 14分鐘

           ·

          2022-03-03 17:29

          在開發(fā)組件庫或者插件,經(jīng)常會需要區(qū)分多種環(huán)境構(gòu)建,從而實現(xiàn):

          • 提供各種「體積」版本:全量版、精簡版、基礎(chǔ)版等;
          • 提供各種「環(huán)境」版本:web 版、nodejs 版等等;
          • 提供各種「規(guī)范」版本:esm 規(guī)范版本、cjs 規(guī)范版本、UMD 規(guī)范版本等等。

          那么如何能夠方便實現(xiàn)上面功能呢?這種場景就適合使用 Feature Flags,在構(gòu)建過程中,通過開關(guān)的啟用和關(guān)閉,對構(gòu)建代碼的過程進(jìn)行動態(tài)設(shè)置,從而更好的實現(xiàn) Tree Shaking。

          Tree Shaking 是一種通過消除最終文件中未使用的代碼來優(yōu)化體積的方法。

          本文會從 Vue 源碼(版本號:3.0.11)中使用的 Feature Flags 進(jìn)行構(gòu)建的過程開始介紹,然后通過簡單示例進(jìn)行學(xué)習(xí),最后介紹 rollup、webpack 和 Vite 中的實現(xiàn)。

          一、什么是 Feature Flags

          Feature Flag(又名 Feature Toggle、Flip等)是一種允許控制線上功能開啟或者關(guān)閉的方式,通常會采取配置文件的方式來控制。

          http://fex.baidu.com/blog/2014/07/feature-flag/

          可以理解為在代碼中添加一個開關(guān),當(dāng)開關(guān)開啟,則邏輯會執(zhí)行下去,否則不會執(zhí)行,通常代碼表現(xiàn)形式為 if語句,舉個簡單示例:

          const flags = true;
          const test = () => flags && console.log('Hello Feature Flags');

          當(dāng) flagstrue則執(zhí)行輸出,否則不會?,F(xiàn)在我們想控制日志會不會輸出,只需改變 flags的值即可,test方法邏輯不用修改。

          ?? 可以將 Feature Flag 翻譯成「特性標(biāo)志」。

          后面所有示例代碼地址:https://github.com/pingan8787/Leo-JavaScript/blob/master/Cute-Vue/Source/FeatureFlags/

          二、Vue 源碼實現(xiàn) Feature Flags

          2.1 使用示例

          從上一節(jié)對特性標(biāo)志的介紹后,大家應(yīng)該對其有點理解,接下來從 Vue3 源碼中看一個使用示例:

          // packages/compiler-core/src/errors.ts
          export function defaultOnWarn(msg: CompilerError{
            __DEV__ && console.warn(`[Vue warn] ${msg.message}`)
          }

          這里的 __DEV__就是一個 Feature Flag,當(dāng) __DEV__值為 true時,會輸出后面的日志,否則不會輸出。在 Vue3 源碼中還存在很多其他特性標(biāo)志,比如:

          • __COMMIT__
          • __TEST__
          • __GLOBAL__
          • ...

          還有很多,有興趣的小伙伴可以在 Vue3 源碼中找找。

          2.2 如何定義特性標(biāo)志

          上面只是帶大家看了下源碼中如何使用,那么接下來看看__DEV__這些特性標(biāo)志是如何定義的。Vue3 中使用了 [@rollup/replace](https://github.com/rollup/plugins/tree/master/packages/replace)依賴,實現(xiàn)構(gòu)建時,替換文件中目標(biāo)字符串內(nèi)容,比如構(gòu)建開發(fā)環(huán)境的包的過程中,將 __DEV__替換為 true。還是以上面示例代碼為例介紹:

          // 本地開發(fā)環(huán)境 __DEV__ 為 true,經(jīng)過 @rollup/replace 依賴打包后如下:
          export function defaultOnWarn(msg: CompilerError{
            true && console.warn(`[Vue warn] ${msg.message}`)
          }

          // 生成環(huán)境中 __DEV__ 為 false,經(jīng)過 @rollup/replace 依賴打包后如下:
          export function defaultOnWarn(msg: CompilerError{
          }

          構(gòu)建后 defaultOnWarn方法內(nèi)的 console.warn語句就被 Tree Shaking 移除掉了。

          三、上手 Feature Flags

          這一節(jié)通過將分別使用 rollup、webpack 和 Vite 實現(xiàn)三個 Feature Flags 的 Demo。其核心原理就是在構(gòu)建階段的時候,已經(jīng)明確的 Feature Flags 值的內(nèi)容會被替換成具體的值,然后進(jìn)行 Tree Shaking。三個示例的全部代碼可以到下面?zhèn)}庫查看:

          首先我們先創(chuàng)建一個 index.js文件,輸入下面測試內(nèi)容:

          // index.js 

          const name = 'pingan8787';
          const age = 18;

          const featureFlags = () => {
              console.warn(name)
              __DEV__ && console.log(name)
          }

          featureFlags();

          我們需要實現(xiàn)的目標(biāo)是:當(dāng) __DEV__變量的值為 true 時,打包后的 index.js 將不包含 __DEV__ && console.log(name)這一行代碼。那么開始看看如何實現(xiàn):

          3.1 rollup 實現(xiàn)

          在 rollup 中,需要使用[@rollup/replace](https://github.com/rollup/plugins/tree/master/packages/replace)包實現(xiàn)構(gòu)建時替換文本,我們先安裝它:

          npm install @rollup/plugin-replace --save-dev

          然后在 rollup.config.js中使用:

          import replace from '@rollup/plugin-replace';

          export default {
              input'index.js',
              output: {
                  file'./dist/index.js',
                  format'cjs'
              },
              plugins: [
                  replace({
                   __DEV__true
                  })
              ]
          };

          接下來通過 rollup打包命令,可以看到輸出內(nèi)容如下:

          const name = 'pingan8787';
          const age = 18;

          const featureFlags = () => {
              console.warn(name)
              __DEV__ && console.log(name)
          }

          featureFlags();

          可以看到 __DEV__true時代碼并沒有 Tree Shaking,再試試改成 false,輸出如下:

          'use strict';

          const name = 'pingan8787';

          const featureFlags = () => {
              console.warn(name);
          };

          featureFlags();

          這邊 __DEV__ && console.log(name)就被移除了,實現(xiàn) Tree Shaking。照著相同原理,再看看 webpack 和 Vite 的實現(xiàn):

          3.2 webpack 實現(xiàn)

          webpack 中自帶了 DefinePlugin可以實現(xiàn)該功能,具體可以看 DefinePlugin 文檔 ,下面看看 webpack.config.js配置:

          // webpack.config.js

          const path = require('path')
          const webpack = require('webpack')

          module.exports = {
              entry'./index.js',
              output: {
                  path: path.resolve(__dirname, 'dist'),
                  filename'index.js',
              },
              mode'production',
              plugins: [
                  new webpack.DefinePlugin({
                      __DEV__JSON.stringify(true),
                  })
              ],
          };

          因為這是使用 mode: 'production'模式,所以打包出來的代碼會壓縮:

          (()=>{const n="pingan8787";console.warn(n),console.log(n)})();

          可以看出 __DEV__已經(jīng)不存在,但 console.log(n)還存在,這時候把 __DEV__改成 false再看看打包結(jié)果:

          console.warn("pingan8787");

          只剩下這句,其他都被 Tree Shaking 掉了。

          3.3 Vite 實現(xiàn)

          Vite 默認(rèn)也是支持自定義全局變量,實現(xiàn)該功能,可以看文檔[define option](https://github.com/vitejs/vite/blob/a4133c073e640b17276b2de6e91a6857bdf382e1/src/node/config.ts#L72-L76) 。通過 pnpm create vite創(chuàng)建一個簡單 Vite 項目,并刪除多余內(nèi)容,并在 main.js中加入我們的測試代碼:

          import { createApp } from 'vue'
          import App from './App.vue'

          const name = 'pingan8787';
          const age = 18;

          const featureFlags = () => {
              console.warn(name)
              __DEV__ && console.log(name)
          }

          featureFlags();

          createApp(App).mount('#app')

          并且在 vite.config.js中設(shè)置 __DEV__

          // vite.config.js

          export default defineConfig({
            plugins: [vue()],
            define: {
              __DEV__true
            }
          })

          然后執(zhí)行 pnpm build構(gòu)建項目,可以看到壓縮后的代碼還存在 __DEV__ && console.log(name)。

          接下來修改 __DEV__的值為 false,再重新打包,可以看到代碼已經(jīng)被 Tree Shaking 了:

          到這里我們就使用 rollup、webpack 和 Vite 分別實現(xiàn)了一遍 Feature Flags 了。

          四、總結(jié)

          本文通過簡單例子和 Vue3 源碼,與大家介紹了 Feature Flags 的概念和簡單的實現(xiàn),最后分別使用 rollup、webpack 和 Vite 分別實現(xiàn)了一遍 Feature Flags 。

          在實際業(yè)務(wù)開發(fā)中,我們可以通過設(shè)計各種 Feature Flags,讓代碼能夠更好的進(jìn)行 Tree Shaking。

          1. JavaScript 重溫系列(22篇全)
          2. ECMAScript 重溫系列(10篇全)
          3. JavaScript設(shè)計模式 重溫系列(9篇全)
          4. 正則 / 框架 / 算法等 重溫系列(16篇全)
          5. Webpack4 入門(上)|| Webpack4 入門(下)
          6. MobX 入門(上) ||  MobX 入門(下)
          7. 120+篇原創(chuàng)系列匯總

          回復(fù)“加群”與大佬們一起交流學(xué)習(xí)~

          點擊“閱讀原文”查看 130+ 篇原創(chuàng)文章

          瀏覽 89
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲AV成人无码www在线观看 | 五月天亚洲激情 | 黑鬼巨大两根一起挤进 | 91麻豆成人精品国产免费网站 | 熟女搜索结果 - 91Porn |