Vue3源碼學習5-不使用 `const enum` 的原因

文章目錄

  • 前言
    • ? 什么是 `const enum`
    • ? 為什么 Vue 3 不使用 `const enum`
      • 1. 📦 **影響構建工具兼容性**
      • 2. 🔁 **難以做模塊間 tree-shaking**
      • 3. 🧪 **調試困難**
      • 4. 📦 **Vue 是庫,不掌控用戶配置**
    • ? 官方推薦做法:普通 `enum`
    • 🔚 總結


前言

Vue 3 官方不使用 const enum 的原因,主要出于兼容性、構建工具支持和維護性方面的考慮。以下是詳細解釋:


? 什么是 const enum

const enum 是 TypeScript 的特性,它會在編譯階段被 完全內聯展開,不會生成額外的 JavaScript 枚舉對象。

// const enum
const enum Shape {Circle,Square
}const s = Shape.Circle  // 編譯后 -> const s = 0;

? 為什么 Vue 3 不使用 const enum

1. 📦 影響構建工具兼容性

  • const enum 必須由 TypeScript 編譯器(tsc)進行處理。

  • 如果項目使用 Babel、ESBuild、Vite、Rollup 等工具鏈,它們默認并不支持 const enum,導致構建失敗或行為不一致。

  • 例如:

    • Babel 轉譯階段不會處理 const enum,需要額外插件才能支持。
    • 但這些插件會破壞 Vue 的通用構建流程。

Vue 3 選擇構建兼容性強的庫,需要兼容各種構建工具。


2. 🔁 難以做模塊間 tree-shaking

  • const enum 被內聯后,喪失了靜態引用關系(例如 Shape.Circle 被替換成字面量 0)。
  • 這會影響 tree-shaking(例如只用一個枚舉值,Tree-shaking 無法剔除其他的值)。

3. 🧪 調試困難

  • 內聯后的代碼在調試階段看不到 EnumName.Value 的標識,堆棧、日志輸出變成了普通數字。
  • 不利于開發者閱讀錯誤信息、排查問題。

4. 📦 Vue 是庫,不掌控用戶配置

  • const enum 需要啟用 isolatedModules: false(否則 Babel/Vite 報錯)。
  • 但 Vue 是一個庫,不能假設使用者配置了符合要求的 TypeScript 編譯器或插件鏈

? 官方推薦做法:普通 enum

Vue 3 通常采用 普通 enum字面量聯合類型

// 普通 enum
export enum PatchFlags {TEXT = 1,CLASS = 1 << 1
}

或者

export const enum PatchFlags {// 開發者構建階段改為 const,生產構建禁止使用 const
}

🔚 總結

原因const enum 不適用原因說明
構建兼容性差不兼容 Babel/Vite/ESBuild 等
Tree-shaking 不友好被內聯后喪失靜態引用關系
調試困難被轉為字面量后影響可讀性
對使用者構建環境要求高違反 Vue 設計的通用性原則

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79417.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79417.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79417.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++學習:六個月從基礎到就業——C++11/14:lambda表達式

C學習&#xff1a;六個月從基礎到就業——C11/14&#xff1a;lambda表達式 本文是我C學習之旅系列的第四十篇技術文章&#xff0c;也是第三階段"現代C特性"的第二篇&#xff0c;主要介紹C11/14中引入的lambda表達式。查看完整系列目錄了解更多內容。 引言 Lambda表達…

AIDC智算中心建設:計算力核心技術解析

目錄 一、智算中心發展概覽 二、計算力核心技術解析 一、智算中心發展概覽 智算中心是人工智能發展的關鍵基礎設施&#xff0c;基于人工智能計算架構&#xff0c;提供人工智能應用所需算力服務、數據服務和算法服務的算力基礎設施&#xff0c;融合高性能計算設備、高速網絡以…

IoTDB時序數據庫V2.0.2大版本更新的一些梳理

一些小知識&#xff1a; 關于事務&#xff1a;時序數據庫是沒有事務的&#xff0c;它和關系數據庫的應用場景不同&#xff0c;通常情況下不需要多點同時操作同一條數據&#xff0c;而且要保證極高的吐出量&#xff0c;事務太消耗資源&#xff0c;并且時序數據庫提供了覆寫的功能…

CSS定位詳解

在前端開發中&#xff0c;CSS 定位&#xff08;positioning&#xff09;是一個核心概念&#xff0c;它決定了元素在頁面上的位置和布局方式。無論是構建復雜的交互界面&#xff0c;還是實現簡單的頁面排版&#xff0c;CSS 定位都是不可或缺的工具。本文將全面介紹 CSS 中的五種…

React 語法擴展

useReducer鉤子函數 不同action類型返回不同處理行為 useState()函數返回解構為兩個值 state當前狀態 dispatch修改狀態函數 dispatch()函數參數為一個actuon對象 如 &#xff1a; 樣例&#xff1a; import { useReducer } from react; import ./App.css;// 定義一個Reduce…

MCP協議與Dify集成教程

一、MCP協議概述 MCP&#xff08;Model Control Protocol&#xff09;是一種新興的開放協議&#xff0c;為大型語言模型&#xff08;LLM&#xff09;與外部應用之間構建了雙向通信通道。它就像是AI的"USB-C"接口&#xff0c;幫助模型發現、理解并安全調用各種外部工…

學習springboot-條件化配置@Conditional(條件注解)

前言 在Spring Boot中&#xff0c;Conditional 注解及其相關注解是用于條件化配置的重要工具。它們允許開發者根據特定條件決定是否加載某個Bean或配置類。 注意&#xff1a;Conditional 相關注解&#xff0c;通常和Bean搭配使用 學習springboot-Bean管理&#xff08;Bean 注…

2025年- H18-Lc126-54.螺旋矩陣(矩陣)---java版

1.題目描述 2.思路* 思路1&#xff1a; 補充2&#xff1a; directions[1][0] // 表示“下”這個方向的行增量&#xff08;1&#xff09; directions[1][1] // 表示“下”這個方向的列增量&#xff08;0&#xff09; int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-…

微信小程序連續多個特殊字符自動換行解決方法

效果圖 .wxml <view class"container"><text>沒轉換{{text}}</text><view style"height: 60rpx;" /><text>轉換后{{convert}}</text> </view>.js Page({data: {text:&#xff01;&#xff01;&#xff01;&am…

編程速遞-RAD Studio 12.3 Athens四月補丁:關注軟件性能的開發者,安裝此補丁十分必要

2025年4月22日&#xff0c;Embarcadero發布了針對RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月補丁。此更新旨在提升這些產品的質量&#xff0c;特別關注于Delphi編譯器、C 64位現代工具鏈、RAD Studio 64位IDE及其調試器、VCL庫和其他RAD Studio特性。強烈建議所有使…

Linux 進程基礎(二):操作系統

目錄 一、什么是操作系統&#xff1a;用戶和電腦之間的「翻譯官」&#x1f310; OS 的層狀結構&#x1f9e9; 案例解析&#xff1a;雙擊鼠標的「跨層之旅」 二、操作系統的必要性探究&#xff1a;缺乏操作系統的環境面臨的挑戰剖析&#x1f511; OS 的「管理者」屬性&#xff1…

第 11 屆藍橋杯 C++ 青少組中 / 高級組省賽 2020 年真題,選擇題詳細解釋

一、選擇題 第 2 題 在二維數組按行優先存儲的情況下&#xff0c;元素 a[i][j] 前的元素個數計算如下&#xff1a; 1. **前面的完整行**&#xff1a;共有 i 行&#xff0c;每行 n 個元素&#xff0c;總計 i * n 個元素。 2. **當前行的前面元素**&#xff1a;在行內&#x…

1??7??three.js_OrbitControls相機控制器

17、相機軌道控制器 3D虛擬工廠在線體驗相機軌道控制器OrbitControls 它是 Three.js 中最常用的交互控制器之一,專門用于通過鼠標/觸摸控制相機圍繞一個目標點(target)旋轉、縮放和平移。import {OrbitControls } from three/addons/controls/OrbitControls.js; const cont…

以下是在 Ubuntu 上的幾款PDF 閱讀器,涵蓋輕量級、功能豐富和特色工具:

默認工具&#xff1a;Evince&#xff08;GNOME 文檔查看器&#xff09; 特點&#xff1a;Ubuntu 預裝&#xff0c;輕量快速&#xff0c;支持基本標注和書簽。 安裝&#xff1a;已預裝&#xff0c;或手動安裝&#xff1a; sudo apt install evince功能全面&#xff1a;Okular&…

基于用戶場景的汽車行駛工況構建:數據驅動下的能耗優化革命

行業現狀&#xff1a;標準工況與用戶場景的割裂 全球汽車行業普遍采用WLTC工況進行能耗測試&#xff0c;但其與真實道路場景差異顯著。據研究&#xff0c;WLTC工況下車輛能耗數據比實際道路低10%-30%&#xff0c;導致用戶對續航虛標投訴激增&#xff08;數據來源&#xff1a;東…

chili3d調試10 網頁元素css node deepwiki 生成圓柱體 生成零件圖片

.input是input的外框&#xff0c;.input input是input的內框 沙雕 全部input都換成textarea了 自己的方法用接口定義&#xff0c;把自己的方法pub出去&#xff0c;定義在內部拉出去只是取個值 這其實是mainwindow端pub回來的 窗口pub端把數據pub回 mainwindow端讓mainwindow端…

Redis 啟用 TLS 加密傳輸配置

Redis 啟用 TLS 加密傳輸配置 一、Redis TLS 加密概述 Redis 從 6.0 版本開始原生支持 TLS 加密傳輸&#xff0c;可以保護客戶端與服務器之間的通信安全&#xff0c;防止數據被竊聽或篡改。 二、準備工作 確認 Redis 版本?&#xff1a; redis-server --version確保版本 ≥…

【Linux】深入理解程序地址空間

&#x1f31f;&#x1f31f;作者主頁&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所屬專欄&#xff1a;Linux 目錄 前言 一、什么是程序地址空間 二、深入理解程序地址空間 1. 引例 2. 理解地址轉化 3. 再談程序地址空間 4. 補充知識 總結 前言 在現代操作系…

【深度學習-Day 5】Python 快速入門:深度學習的“瑞士軍刀”實戰指南

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

解決在 Linux 中 WPS 字體缺失問題

解決在 Linux 中 WPS 字體缺失問題 安裝方式 安裝方式 首先下載你所需要的字體文件 在字體文件所在的目錄下右鍵點擊在命令行中打開 或 Open in Terminal sudo mkdir /usr/share/fonts/myfontssudo cp ./* /usr/share/fonts/myfonts執行命令&#xff0c;更新字體緩存 sudo fc…