說說Vue 3.0中Treeshaking特性?舉例說明一下?

来源:https://www.cnblogs.com/smileZAZ/p/18059466
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、是什麼 Tree shaking 是一種通過清除多餘代碼方式來優化項目打包體積的技術,專業術語叫 Dead code elimination 簡單來講,就是在保持代碼運行結果不變的前提下,去除無用的代碼 如果把代碼打包比作製作蛋糕,傳 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

 

一、是什麼

Tree shaking 是一種通過清除多餘代碼方式來優化項目打包體積的技術,專業術語叫 Dead code elimination

簡單來講,就是在保持代碼運行結果不變的前提下,去除無用的代碼

如果把代碼打包比作製作蛋糕,傳統的方式是把雞蛋(帶殼)全部丟進去攪拌,然後放入烤箱,最後把(沒有用的)蛋殼全部挑選並剔除出去

treeshaking則是一開始就把有用的蛋白蛋黃(import)放入攪拌,最後直接作出蛋糕

也就是說 ,tree shaking 其實是找出使用的代碼

Vue2中,無論我們使用什麼功能,它們最終都會出現在生產代碼中。主要原因是Vue實例在項目中是單例的,捆綁程式無法檢測到該對象的哪些屬性在代碼中被使用到

import Vue from 'vue'
 
Vue.nextTick(() => {})

Vue3源碼引入tree shaking特性,將全局 API 進行分塊。如果您不使用其某些功能,它們將不會包含在您的基礎包中

import { nextTick, observable } from 'vue'
 
nextTick(() => {})

二、如何做

Tree shaking是基於ES6模板語法(importexports),主要是藉助ES6模塊的靜態編譯思想,在編譯時就能確定模塊的依賴關係,以及輸入和輸出的變數

Tree shaking無非就是做了兩件事:

  • 編譯階段利用ES6 Module判斷哪些模塊已經載入
  • 判斷那些模塊和變數未被使用或者引用,進而刪除對應代碼

下麵就來舉個例子:

通過腳手架vue-cli安裝Vue2Vue3項目

vue create vue-demo

Vue2 項目

組件中使用data屬性

<script>
    export default {
        data: () => ({
            count: 1,
        }),
    };
</script>

對項目進行打包,體積如下圖

為組件設置其他屬性(comptedwatch

export default {
    data: () => ({
        question:"", 
        count: 1,
    }),
    computed: {
        double: function () {
            return this.count * 2;
        },
    },
    watch: {
        question: function (newQuestion, oldQuestion) {
            this.answer = 'xxxx'
        }
};

再一次打包,發現打包出來的體積並沒有變化

Vue3 項目

組件中簡單使用

import { reactive, defineComponent } from "vue";
export default defineComponent({
  setup() {
    const state = reactive({
      count: 1,
    });
    return {
      state,
    };
  },
});

將項目進行打包

 在組件中引入computedwatch

import { reactive, defineComponent, computed, watch } from "vue";
export default defineComponent({
  setup() {
    const state = reactive({
      count: 1,
    });
    const double = computed(() => {
      return state.count * 2;
    });

    watch(
      () => state.count,
      (count, preCount) => {
        console.log(count);
        console.log(preCount);
      }
    );
    return {
      state,
      double,
    };
  },
});

再次對項目進行打包,可以看到在引入computerwatch之後,項目整體體積變大了

三、作用

通過Tree shakingVue3給我們帶來的好處是:

  • 減少程式體積(更小)
  • 減少程式執行時間(更快)
  • 便於將來對程式架構進行優化(更友好)

參考文獻

  • https://segmentfault.com/a/1190000038962700

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

-Advertisement-
Play Games
更多相關文章
  • 本文探討了前端發展的新趨勢,以及 Vue.js 生態中 ViewDesign 這一優秀 UI 組件庫的崛起。首先闡述了現代 Web 應用對前端開發提出的新需求,以及 Vue.js 作為漸進式框架在滿足這些需求方面的優勢。接著重點介紹了 ViewDesign 作為基於 Vue.js 的 UI 組件庫的... ...
  • 開源項目地址:https://gitee.com/easyxaf/jsplumb-navigator 前言 jsPlumb可用於連接DOM元素,它不依賴框架,所以與主流框架都可以無縫的集成。但比較遺憾的是社區版中沒有平移、縮放等功能,如果用它來開發工作流等項目,用戶體驗會大打折扣。我的項目是用Bla ...
  • 大家好,我是 Java陳序員。 由於為了生活奔波,常年在外,導致很多關係稍疏遠的親戚之間來往並不多。 因此節假日回家時,往往會搞不清楚哪位親戚應該喊什麼稱呼,很容易“社死”。 今天給大家介紹一個親戚關係計算器,讓你快速的計算出正確的親戚稱謂! 關註微信公眾號:【Java陳序員】,獲取開源項目分享、A ...
  • 寫在前面 情人節已經接近尾聲了,雖然跟我沒什麼關係,但是我還是很渴望,能遇到一個良人相伴一生。 現在時間: 內心異常平靜,相對吵鬧我更喜歡安靜的晚上,沒人打擾,enjoy自己獨處的時間! 保存內容顯示 1、任務拆解 讀取已保存內容 將讀取內容在富文本里顯示 2、讀取已保存內容 這個很好理解,就是增加 ...
  • Vue進階 一、vue實例 1.一個基本的vue的實例 <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <h1> {{title}} </h1> <button id="btn" @click=" ...
  • 前言 Composables 稱之為可組合項,熟悉 react 的同學喜歡稱之為 hooks ,由於可組合項的存在,Vue3 中的組件之間共用狀態比以往任何時候都更容易。這種新範例引入了一種更有組織性和可擴展性的方式來管理整個應用程式的狀態和邏輯。 什麼是Composables 本質上,可組合項是一 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、組件設計 組件就是把圖形、非圖形的各種邏輯均抽象為一個統一的概念(組件)來實現開發的模式 現在有一個場景,點擊新增與編輯都彈框出來進行填寫,功能上大同小異,可能只是標題內容或者是顯示的主體內容稍微不同 這時候就沒必要寫兩個組件,只需要 ...
  • 當我們在引入應該組件的時候 提示找不到這個組件但是項目明明就有這個物理文件 報錯原因:typescript 只能理解 .ts 文件,無法理解 .vue文件 出現這樣的 第一種 方法就是在env.d.ts 裡面添加下麵代碼 1 declare module '*.vue' { 2 import typ ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...