閱讀《Vue.js設計與實現》 -- 02

接上一篇文章:閱讀《Vue.js設計與實現》 – 01

文章目錄

  • 第二章
    • 提升用戶的開發體驗
      • tips
    • 控制框架代碼的體積
      • Tree-Shaking
      • 副作用
    • 框架應該輸出怎樣的構建產物?
      • 注意
      • 這兩個文件有什么區別?
    • 特性開關
      • 如何實現?
    • 處理錯誤
    • TS支持

第二章

本書第二章,主要是告訴我們一個好的框架需要考慮的事情很多,包括:構建的產物是什么?產物構建模式?提升用戶的開發體驗?熱更新?減少打包體積?可配置?……

這部分主要就是說:vue怎么樣做到這些事情,以及vue怎么好的。屬于自賣自夸,手動狗頭!

提升用戶的開發體驗

衡量一個框架是否足夠優秀的指標之一,就是看它的開發體驗如何。

說白了就是出現問題提示我們程序員夠不夠清楚,別出個問題全是源碼提示,一點進去直接跳進源碼(說實話,菜鳥開發vue經常性這樣,所以感覺有點自賣自夸),《Vue.js設計與實現》 中舉例的是 createApp 掛載元素不存在時的一個 wran,那確實提示得很清楚

在這里插入圖片描述

這要是都提示不清楚,那也沒必要說 vue 好用了,畢竟掛載上去是最重要的一點!

如果 Vue.js 內部不做任何處理,那么我們很可能得到的是 JavaScript 層面的錯誤信息,例如 Uncaught TypeError: Cannot read property 'xxx' of null,根據此信息,我們很難知道問題出在哪里。

tips

我們在寫代碼打印 ref 對象時,如果不加 .value 就打印,打印出來的結構還是比較難看的,打印結果需要我們手動點擊進去,且有很多我們不關注的無用信息。

在這里插入圖片描述

但是其實瀏覽器允許我們編寫自定義的 formatter,從而自定義輸出形式。在 Vue.js3 的源碼中,你可以搜索到名為 initCustomFormatter 的函數,該函數就是用來在開發環境下初始化自定義 formatter 的。

我們只需要設置一下goole控制臺,即可優化打印結果,步驟如下:

1、打開控制臺,點擊如圖按鈕

在這里插入圖片描述

2、找到控制臺,開啟 Enablecustom formatters即可

在這里插入圖片描述

設置之后的打印結果會變成

在這里插入圖片描述

控制框架代碼的體積

這部分主要講的就是:框架在實現相同功能時,肯定是代碼越少越好,這樣體積更小,請求后加載速度就更快!但是這個和上一個違背了,因為要處理好報錯,肯定就要加一堆不相關的邏輯。vue想辦法解決了這個問題,就是區分環境,用rollup里面的插件來設置一個Boolean值(源碼為__DEV__常量 ),讓開發環境有提示,生產環境因為rollupTree-Shaking,就不會打包進入生產環境,減小體積!

在這里插入圖片描述

Tree-Shaking

什么是 Tree-Shaking ?在前端領域,這個概念因 rollup.js 而普及,指的就是消除那些永遠不會被執行的代碼,現在無論是 rollup.js 還是 webpack,都支持 Tree-Shaking

想要實現 Tree-Shaking,必須滿足一個條件,即模塊必須是ESM(ES Module),因為 Tree-Shaking 依賴 ESM 的靜態結構。

這里《Vue.js設計與實現》舉了一個rollup打包的例子,一個input.js文件

import { foo } from './utils.js'

一個utils.js文件

export function foo(obj) {obj && obj.foo
}export function bar(obj) {obj && obj.bar
}

使用 rollup 打包后,打包文件只會留下 foo 函數,bar 函數會被Tree-Shaking掉!

但是又發現其實 foo 也沒有使用,只是引用了而已,按理說應該也要將其刪除!

副作用

當調用函數的時候會對外部產生影響。這時你可能會說,上面的代碼明顯是讀取對象的值,怎么會產生副作用呢?其實是有可能的,試想一下,如果 obj 對象是一個通過 Proxy 創建的代理對象,那么當我們讀取對象屬性時,就會觸發代理對象的 get ,在 get 中是可能產生副作用的,例如:我們在 get 夾子中修改了某個全局變量。而到底會不會產生副作用,只有代碼真正運行的時候才能知道,JavaScript 本身是動態語言,因此想要靜態地分析哪些代碼是永遠不會被使用的很有難度。

因為靜態地分析 JavaScript 代碼很困難,所以像 rollup.js 這類工具都會提供一個機制,讓我們能明確地告訴 rollup.js:“放心吧,這段代碼不會產生副作用,你可以移除它。”

如何告訴rollup呢?使用/*#__PURE__*/

代碼變成:

import {foo} from './utils'
/*#__PURE__*/ foo()

在這里插入圖片描述

框架應該輸出怎樣的構建產物?

這里講解了rollup如何打包產物為你需要的格式,如果用戶想直接通過script直接引入那么就要設置

在這里插入圖片描述

菜鳥這里直接搞成表格

需要的打包產物rollup設置(output/format)
script直接引入iife
script使用module形式引入esm
node中使用require引入cjs

注意

這里第二種其實會產生兩種文件,一種vue.esm-browser.js,該文件是直接給 <script type="module"> 使用的,還有一種vue.esm-bundler.js,這個文件是開發時,給構建工具(vite 或者 webpack)使用的!

我們知道,無論是 rollup.js 還是 webpack,在尋找資源時,如果 package.json 中存在 module 字段,那么會優先使用 module 字段指向的資源來代替 main 字段指向的資源。

這兩個文件有什么區別?

區別在于上文中的 __DEV__ 常量。當構建用于<script>標簽的 ESM 資源時,如果是用于開發環境,那么__DEV__ 會設置為 true;如果是用于生產環境,那么 __DEV__ 常量會設置為 false,從而被 Tree-Shaking 移除。

但是當我們構建提供給打包工具的 ESM 格式的資源時,不能直接把 __DEV__ 設置為 true或 false,而要使用 (process.env.NODE_ENV !=='production') 替換 __DEV__ 常量。

在這里插入圖片描述

特性開關

就是預留一些配置,用戶通過true或者false(或者其他代碼)來確定自己要不要那些功能,如果用戶想要就在打包時留下那些功能代碼,不想要就直接刪除!

在這里插入圖片描述

如何實現?

其實很簡單,原理和上文提到的__DEV__ 常量一樣,本質上是利用 rollup.js 的預定義常量插件來實現。

更具體的就想要讀者去看書了,這里不好總結,感覺就是一整段,但是都拿過來就要被寄律師函了,手動狗頭!

死道友不死貧道,手動狗頭,大家可以看這個:https://juejin.cn/post/7091263773301800991?from=search-suggest#heading-17

處理錯誤

框架需要為用戶提供統一的錯誤處理接口,這樣用戶可以通過注冊自定義的錯誤處理函數來處理全部的框架異常。

說實話,菜鳥沒有用過,所以不太清楚這個統一的錯誤處理接口是啥,然后菜鳥問了一下GPT,感覺這里統一的錯誤接口應該就是和js里面的頂層監聽錯誤一個意思!類似:

在這里插入圖片描述

GPT回答:

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

菜鳥感覺基本用處不是很大,讀者想了解可以直接vue3官網搜:onErrorCaptured() --> vue3的一個生命周期!

TS支持

一個常見的認知誤區,即"使用 TS 編寫框架和框架對 TS 類型支持友好是兩件完全不同的事"。有時候為了讓框架提供更加友好的類型支持,甚至要花費比實現框架功能本身更多的時間和精力。

菜鳥只是略懂ts,但是感覺ts讓我們的心智負擔更重而不是減少了!我們程序需要的是:檢驗變量類型,以確保邏輯正確,而不是在項目中一引入就一大堆報錯,然后去找用什么類型才能讓這個組件的類型是對的,以及一些不知道名字的庫的類型是對的,感覺ts檢測的重心應該在邏輯而不是檢驗為什么組件類型不對。

就像這本書說的:

有時候為了讓框架提供更加友好的類型支持,甚至要花費比實現框架功能本身更多的時間和精力。

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

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

相關文章

Mac:Ant 下載+安裝+環境配置(詳細講解)

&#x1f4cc; 下載 Ant 下載地址&#xff1a;https://ant.apache.org/bindownload.cgi &#x1f4cc; 無需安裝 Apache官網下載 Ant 壓縮包&#xff0c;無需安裝&#xff0c;下載解壓后放到自己指定目錄下即可。 按我自己的習慣&#xff0c;我會在用戶 jane 目錄下新建了個…

qt圖表背景問題

從代碼來看&#xff0c;這段代碼涉及到設置背景透明度和背景可見性的操作&#xff0c;主要是在一個基于Qt框架的圖形界面程序中對某個圖表控件&#xff08;fontChart&#xff09;和視圖控件&#xff08;fontChartView&#xff09;進行操作。以下是每行代碼的作用以及它們之間的…

藍橋杯國賽子串2023動態規劃,暴力

#include <bits/stdc.h> using namespace std; // string ss; #define int long long string s; //該方法通過動態規劃&#xff0c;找到2023字串&#xff0c;而2023等于202加3&#xff0c;202等于202&#xff0c;20等于20&#xff1b; int f2() {int dp[4]{0};//dp[0]代表…

uni-app——網絡API

uni-app 網絡API 在 uni-app 開發中&#xff0c;網絡請求是獲取數據與和服務器交互的重要手段。以下介紹 uni-app 中常見的網絡 API&#xff0c;包括發起請求、上傳和下載以及 WebSocket、UDP 通信等方面。 發起請求 在 uni-app 里&#xff0c;使用uni.request(OBJECT)來發起…

計算機網絡筆記再戰——理解幾個經典的協議HTTP章3

理解幾個經典協議——HTTP章3 返回結果的HTTP狀態碼 ? 我們知道&#xff0c;ICMP可以傳遞IP通信時候的狀態如何。HTTP雖然沒有輔助的解析&#xff0c;但是它可以使用狀態碼來表達我們的HTTP請求的結果&#xff0c;標記服務器端的處理是否正常、通知出現的錯誤等工作。這就是…

國產編輯器EverEdit - Hex Dump插件:看到文本的另一面!

1 Hex Dump插件 1.1 應用場景 有時可能需要顯示字母的ASCII編碼&#xff0c;或其他文字的字節編碼&#xff0c;可以使用Hex Dump插件來完成 1.2 使用方法 安裝Hex Dump插件&#xff0c;安裝插件方法參考&#xff1a;擴展管理 在編輯器中選中文本&#xff0c;選擇擴展 -> …

《駕馭MXNet:深度剖析分布式深度學習訓練的高效之道》

在深度學習的迅猛發展進程中&#xff0c;模型的規模和復雜性持續攀升&#xff0c;對計算資源的需求也愈發苛刻。單機訓練在面對大規模數據集和復雜模型結構時&#xff0c;常常顯得力不從心。分布式深度學習訓練成為解決這一困境的關鍵途徑&#xff0c;而MXNet作為一款強大的開源…

Vue3項目開發:狀態管理實踐指南

# Vue3項目開發&#xff1a;狀態管理實踐指南 一、引言 背景介紹 在Vue項目中&#xff0c;狀態管理是一個非常重要的話題。合理的狀態管理能夠幫助我們更好地組織和管理數據&#xff0c;提升項目的可維護性和可擴展性。本文將深入探討Vue3項目中狀態管理的最佳實踐&#xff0c;…

網絡安全漏洞與修復 網絡安全軟件漏洞

文章目錄 一、軟件漏洞的概念 1、信息安全漏洞簡述2、軟件漏洞3、軟件漏洞概念4、軟件漏洞的成因分析 二、軟件漏洞標準化管理 1、軟件漏洞分類2、軟件漏洞分級3、安全漏洞管理規范 一、軟件漏洞的概念 1、信息安全漏洞簡述 信息安全漏洞是信息安風險的主要根源之一&…

SpringBoot項目controller層接收對應格式請求的相關RequestMapping配置

目錄 &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; 注&#xff1a;此情況注意和&#xff08;4&#xff09;中情況進行區分 &#xff08;4&#xff09; 在幾個springboot項目開發后&#xff0c;我總結了以下的一些常見的接收對應請求的…

2025年圖生視頻模型技術全景解析

一、開源圖生視頻模型 阿里通義萬象Wan2.1系列 I2V-14B-480P&#xff1a; 14B參數基礎模型支持480P分辨率圖生視頻顯存需求16GB以上 I2V-14B-720P&#xff1a; 高清增強版模型采用分幀渲染技術&#xff0c;輸出分辨率達1280720 技術特性&#xff1a; 支持中文提示詞自動解析內置…

一場由 ES 分片 routing 引發的問題

一場由 ES 分片 routing 引發的問題 ES 結構 {"poroperties": {"joinType": {"type": "join","eager_global_ordinals": true,"relations": {"spu": "sku"}},"id":{"type&q…

Linux信號的處理

目錄 一、信號處理概述&#xff1a;為什么需要“信號”&#xff1f; 二、用戶空間與內核空間&#xff1a;進程的“雙重人格” 三、內核態與用戶態&#xff1a;權限的“安全鎖” 四、信號捕捉的內核級實現&#xff1a;層層“安檢” 五、sigaction函數&#xff1a;精細控制信…

IntelliJ IDEA 2023.3.1安裝指南從下載到配置的完整教程(附資源下載)

安裝 IntelliJ IDEA 2023.3.1 非常簡單&#xff0c;以下是詳細的安裝步驟&#xff0c;適用于 Windows、macOS 和 Linux 系統。 1. 下載 IntelliJ IDEA IntelliJ IDEA下載鏈接&#xff1a;https://pan.quark.cn/s/3ad975664934 選擇適合你的操作系統的版本&#xff1a; Ultimat…

【HarmonyOS Next】鴻蒙中App、HAP、HAR、HSP概念詳解

【HarmonyOS Next】鴻蒙中App、HAP、HAR、HSP概念詳解 &#xff08;圖1-1&#xff09; 一、鴻蒙中App、HAP、HAR、HSP是什么&#xff1f; &#xff08;1&#xff09;App Pack&#xff08;Application Package&#xff09; 是應用發布的形態&#xff0c;上架應用市場是以App Pa…

配置阿里云yum源

配置阿里云yum源 修改默認的yum倉庫&#xff0c;把原有的移動到創建的目錄里&#xff08;踢出國外的yum源&#xff09; # 切換到/ect/yum.repos.d/目錄下 cd /etc/yum.repos.d/ # 新建repo目錄 mkdir repo # 把原有的移動到創建的目錄里 mv ./*.repo ./repo/配置yum源 # 找到…

在C#的MVC框架framework項目的使用ajax,及源碼下載

在C# MVC框架中使用AJAX實現異步請求,有助于提高應用程序的性能和用戶體驗。 在MVC框架framework項目中&#xff0c;ajax使用方法如下 1.在Controller類中&#xff0c;創建一個新的方法&#xff08;例如&#xff1a;GetRes&#xff09;&#xff0c;該方法處理AJAX請求并返回J…

Linux部署DHCP服務腳本

#!/bin/bash #部署DHCP服務 #userli 20250319#檢查是否為root用戶 if[ "$USER" ! "root" ] thenecho "錯誤&#xff1a;非root用戶&#xff0c;權限不足&#xff01;"exit 0 fi#配置網絡環境 read -ep "請給本機配置一個IP地址(不…

vulhub Matrix-Breakout

1.下載靶機&#xff0c;打開靶機和kali虛擬機 2.查詢kali和靶機ip 3.瀏覽器訪問 訪問81端口有登陸界面 4.掃描敏感目錄 kali dirb 掃描 一一訪問 robot.txt提示我們繼續找找&#xff0c;可能是因為我們的字典太小了&#xff0c;我們換個掃描器換個字典試下,利用kali自帶的最大…

科普類——雙目立體視覺與 RGBD 相機的簡單對比

雙目立體視覺與 RGBD 相機生成的深度圖在原理、性能和應用場景上有顯著差異。以下是兩者的詳細對比和分析&#xff1a; 1. 原理差異 (1) 雙目立體視覺 (Stereo Vision) 原理&#xff1a; 通過兩個攝像頭模擬人眼視差&#xff0c;計算匹配像素點的水平位移&#xff08;視差&…