Vite 的好與壞

大家好,我是若川,誠邀你進群交流學習。今天分享一篇關于Vite的文章。學習源碼系列、面試、年度總結、JS基礎系列。
全文 3000 字,歡迎點贊關注轉發

一、Vite 是什么

2020年4月,尤大大發了這么一個推:

隨后,2021年2月,Vite 2.0 它來了,上來就是一套組合拳:

  • 基于 esbuild 實現的極速開發體驗

  • 多框架支持

  • 兼容 Rollup 的插件機制與 API

  • SSR 支持

  • 舊瀏覽器支持

一開始我是拒絕的,從 grunt、gulp ,到 Webpack、Rollup、Snowpack 以及若干知名不知名構建框架,都2021了,還來?然后試用了一下,嗯,是真的香!

二、Vite 的優勢

2.1 真 TM 快

Vite 非常非常快,對比 Vue-cli(基于 Webpack):


Dev 啟動時長Dev 頁面加載速度Build 時長
Vue-cli2568ms320ms5.14s
Vite232ms379ms2.39s
示例代碼:Vue3 項目,10個組件

測試兩者的 dev 命令運行耗時相差十倍,且理論上,項目越大性能差距越大,為什么呢?最大的原因是 Vite 在開發模式下并沒有做太多打包操作!

Webpack 啟動后會做一堆事情,經歷一條很長的編譯打包鏈條,從入口開始需要逐步經歷語法解析、依賴收集、代碼轉譯、打包合并、代碼優化,最終將高版本的、離散的源碼編譯打包成低版本、高兼容性的產物代碼,這可滿滿都是 CPU、IO 操作啊,在 Node 運行時下性能必然是有問題。

而 Vite 運行 Dev 命令后只做了兩件事情,一是啟動了一個用于承載資源服務的 service;二是使用 esbuild 預構建 npm 依賴包。之后就一直躺著,直到瀏覽器以 http 方式發來 ESM 規范的模塊請求時,Vite 才開始“「按需編譯」”被請求的模塊。

這里 Vite 預設的前提是:

  • 現代瀏覽器大多數已經原生支持 ESM 規范,構建工具 —— 特別是開發環境下已經沒有太大必要為了低版本兼容把大量的時間花在編譯打包上了!

這么一對比,Webpack 是啥都做了,瀏覽器只要運行編譯好的低版本(es5)代碼就行;而 Vite 只處理問題的一部分,剩下的事情交由瀏覽器自行處理,那速度必然賊 TM 快。

除了啟動階段跳過編譯操作之外,Vite 還有很多值得一提的性能優化,整體梳理一下:

  • 預編譯:npm 包這類基本不會變化的模塊,使用 Esbuild 在 「預構建」 階段先打包整理好,減少 http 請求數

  • 按需編譯:用戶代碼這一類頻繁變動的模塊,直到被使用時才會執行編譯操作

  • 客戶端強緩存:請求過的模塊會被以 http 頭 max-age=31536000,immutable 設置為強緩存,如果模塊發生變化則用附加的版本 query 使其失效

  • 產物優化:相比于 Webpack ,Vite 直接錨定高版本瀏覽器,不需要在 build 產物中插入過多運行時與模板代碼

  • 內置更好的分包實現:不需要用戶干預,默認啟用一系列智能分包規則,盡可能減少模塊的重復打包

  • 更好的靜態資源處理:Vite 盡量避免直接處理靜態資源,而是選擇遵循 ESM 方式提供服務,例如引入圖片 import img from 'xxx.png' 語句,執行后 img 變量只是一個路徑字符串。

可以看出,Vite 的快是全方位的,從 Dev 到 Build,從 npm 包到項目源碼,再到靜態資源處理都在 ESM 規則框架下盡可能地實現各種優化措施,理論性能急劇提升。

2.2 簡單

Vite 的用法很簡單, 執行初始化命令:

yarn?create?@vitejs/app?my-vue-app?--template?vue

就得到了一個預設好的開發環境,可以開始愉快地寫 demo 了,Vite 開箱就給你一堆功能,包括 css 預處理器、html 預處理器、hash 命名、異步加載、分包、壓縮、HMR 等:

這些功能,作者都按行業最佳實踐預設好了,通常不需要用戶介入做變更。

Vite 的表現很容易讓人聯想到 vue-cli,不過兩者區別還是挺大的:vue-cli 底層依賴 Webpack,實際的構建工作通常由各種 Webpack loader、plugin 實現,比如 less => css 由 less-loader 實現;圖片加載由 img-loader 實現等。這套設計很靈活,你可以在 Webpack 體系下做任何你能想到的變更,只需要學習一點點 Webpack 的知識,包括百來個配置項、成千上萬的插件、若干虛無縹緲的構建概念等。

而 Vite 顯得特別簡潔,它只是暴露了極少數的配置項與 plugin 接口,設計上就沒打算讓你做太多自定義操作。。。這是因為 Vite 從一開始就沒打算做成另一個 Webpack,而是做成一套“能夠顯著提升前端開發體驗的前端構建工具”,重在 「開發體驗」 啊同學們,Vite 可謂是用心良苦,想盡辦法降低學習入門成本,它就不希望你為了使用工具又學一大堆復雜、縹緲的概念,希望這些事情都在框架層面屏蔽了 —— 雖然代價是喪失靈活性。

簡單說吧,Vite 定位就是傻瓜式但強大的構建工具,你專心寫好業務代碼,早點下班,不用再為了工具費神費力了。

2.3 生態

除了極致的運行性能與簡易的使用方法外,Vite 對已有生態的兼容性也不容忽略,主要體現在兩個點:

  • 與 Vue 解耦,兼容支持 React、Svelte、Preact、Vanilla 等,這意味著 Vite 可以被應用在大多數現代技術棧中

  • 與 Rollup 極其接近的插件接口,這意味著可以復用 Rollup 生態中大部分已經被反復錘煉的工具

說真的,這兩條擺上桌面,加上前面討論的性能優勢和超低學習成本,一時半會真想不到拒絕的理由了。。。

三、Vite 的劣勢

Vite 還很新,雖然它從理論與體感上提供了非常極致的開發體驗,還是有一些值得關注的問題。

3.1 兼容性

默認情況下,無論是 dev 還是 build 都會直接打出 ESM 版本的代碼包,這就要求客戶瀏覽器需要有一個比較新的版本,這放在現在的國情下還是有點難度的。

不過 Vite 同時提供了一些彌補的方法,使用 build.polyfillDynamicImport 配置項配合 @vitejs/plugin-legacy 打包出一個看起來兼容性比較好的版本,我相信這一點會隨時間慢慢被抹平。

3.2 缺少 Show Case

Vite 太新了,直到最近才釋放出正式 2.0版本,社區還沒太反應過來,自然也就沒什么大型、復雜的商業落地案例,誰都說不準這里面可能有多少坑。

不過好消息是社區對 Vite 的搜索熱度在最近幾個月急劇增長:

數據來自谷歌指數(https://trends.google.com/trends/explore?date=2021-01-01%202021-07-01&q=vite,webpack)

相信很快就會出現一大批布道者,畢竟這玩意兒是真的很有競爭力。

3.3 代價

不要忘記,工程化本身的復雜度不會憑空消失,只 Vite 背后的團隊在幫我們負重前行,這對 Vite 開發團隊而言,維護這么多構建規則是一個不小的負擔。而站在用戶的角度,越容易上手的工具往往意味著越難被定制。

另外,如果只是在 Vite 預設好的邊框里面玩確實很容易,但隨著項目復雜度的提高,用戶遲早還是會接觸到底層的 esbuild 或 Rollup,高工們該補的知識還是遲早還是得補回來,逃不掉的。

三、總結

Vite 給我最大的啟示:Webpack 并不是標準答案,前端構建工具可以有一些新的玩法:

  • 「打包」 不是目的,「運行」 才是,2021年了,能夠交給瀏覽器做的事情就交給瀏覽器吧

  • 一個靈活的框架,對作者而言可能意味著逐步失控的開發量;對用戶而言可能意味高學習成本,以及不斷重復的類似空格好還是 tab 好的爭論。那么,一套內置好各種業界 「最佳實踐」,沒有太多定制空間的工具,某些情況下反而能提升大家的效率

我個人對 Vite 的態度:短期保持觀望,長期非常看好。

我相信現在開始上手學習 Vite 是一個不錯的選擇,這東西封裝的太好了,學習成本極低(吹逼效果極好),可以寫點 Demo 或者就直接在一些用戶范圍可控的小型新項目落地。但是,建議不要激進地直接重構一些已有的大型項目,別自己給自己埋坑了,早點下班不香嗎。


最近組建了一個江西人的前端交流群,如果你是江西人可以加我微信?ruochuan12?私信 江西 拉你進群。


推薦閱讀

我在阿里招前端,該怎么幫你(可進面試群)
畢業年限不長的前端焦慮和突破方法

前端搶飯碗系列之Vue項目如何做單元測試
老姚淺談:怎么學JavaScript?

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》多篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,活躍在知乎@若川,掘金@若川。致力于分享前端開發經驗,愿景:幫助5年內前端人走向前列。

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

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

相關文章

Windows phone 7新開發工具發布

春節假期已經接近尾聲. 馬上第一個工作日就要來臨. 春節真的不再是一個簡簡單單的節日. 有時讓人感到欣喜 這意味這一年的忙碌都會因為這個節日的到來而畫上一個終止符.面臨一個不長也不短的假期.眼下的一年翻過去 新的一年即將到來. 似乎一切都可以重新開始. 有時又令人感到無…

opentaps mysql_opentaps 1.4 聯接 mysql 筆記

opentaps 1.4 連接 mysql 筆記一、安裝 MySQ 略...二、創建MySQL Database opentaps ERP CRM1.mysql -u root -h 127.0.0.1 -p 2.mysql>create database opentaps default CHARACTER SET utf8 COLLATE utf8_general_ci;3.mysql>create user opentaps;4.mysql>grant …

這10道springboot常見面試題你需要了解下

1、什么是Spring Boot?多年來,隨著新功能的增加,spring變得越來越復雜。只需訪問https://spring.io/projects頁面,我們就會看到可以在我們的應用程序中使用的所有Spring項目的不同功能。如果必須啟動一個新的Spring項目&#xff0…

Silverlight中使用MIRIA進行觸屏編程

Silverlight for Windows phone7中可以使用XNA提供的功能進行觸屏編程,不過暫時還沒有網頁Silverlight的XNA移植。經過搜索發現MIRIA這個開源項目http://miria.codeplex.com/ 可以在Silverlight中實現Touch、Gesture的功能。 用法如下: 1、項目中引用MIG…

React 核心開發者 Dan Abramov 訪談實錄

大家好,我是若川。面試、學習源碼系列、年度總結、JS基礎系列譯者注:本譯文是在「在線對話 React.js 核心開發者」一個半小時直播的基礎上進行的原文翻譯,包括了直播中的所有問答內容,盡可能保留了 Dan 回答的中心語義&#xff0c…

python ev3圖形化編程軟件下載_mPython(圖形化編程軟件)

mPython是盛思技術團隊在BBC官方原版PythonEditor基礎上、拓展開發的應用軟件。可以進行可視化代碼編程,有hex、python、blockly三種代碼讀寫等功能。功能介紹1、不依賴網絡,可離線安裝使用2、支持hex、python、blockly三種代碼的讀寫3、blockly模式下支…

02-15 GUCCI 我喜歡的

我覺得,GUCCI是低調的奢華,價格不是很高,容易接近,符合我的風格,是現階段我的選擇 樣式我喜歡 希望我的生活質量步步高升,將來不再為追求物質生活而奮斗。 轉載于:https://www.cnblogs.com/yd1227/archive/…

php 批量修改mysql 數據表,字段 字符集編碼

$sql"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA 數據庫名稱";$r$pdo->query($sql,2);foreach($r as $v){//if($v[TABLE_NAME]!monxin_index_user){continue;} 代碼來源 夢行云軟件$sql"alter table ".$v[TABLE_NAME]." conver…

python如何安裝panda數據庫_在Pycharm中安裝Pandas庫方法(簡單易懂)

開發環境的搭建是一件入門比較頭疼的事情,在上期的文稿基礎上,增加一項Anaconda的安裝介紹。Anaconda是Python的一個發行版本,安裝好了Anaconda就相當于安裝好了Python,并且里面還集成了很多Python科學計算的第三方庫。比如我們需…

譯文 | Vue 在哪些方面做的比 React 更好?

大家好,我是若川。在過去的五年中,我一直是一名 React 工程師。我愛React。我喜歡開發 React 應用程序。我認為它是目前最好的UI框架之一。但是,在這個領域有一些競爭對手。其中最大的是 Vue.js 。我以前玩過一些 Vue.js,但我認為…

表單提交中Get和Post方式的區別及EncType表明提交數據的格式詳解

表單提交中Get和Post方式的區別1. get是從服務器上獲取數據,post是向服務器傳送數據。2. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP post機制,將表單…

web mp4第一幀_Web成幀器就在這里!

web mp4第一幀The Framer Team is pulling up it’s pants. I sniffed something cooking when they announced a public beta for Framer for web… FRAMER FOR WEB? Yes, I don’t know how they did it, but their powerful set of tools, plugins and animation controls …

Lucene學習總結之三:Lucene的索引文件格式(2)

2019獨角獸企業重金招聘Python工程師標準>>> 四、具體格式 上面曾經交代過,Lucene保存了從Index到Segment到Document到Field一直到Term的正向信息,也包括了從Term到Document映射的反向信息,還有其他一些Lucene特有的信息。下面對這…

JavaScript 數組 API 全解析

在編程世界中,數組是指元素的集合。數組將數據作為元素進行存儲,并在需要時將其取出。在支持數組的編程語言中廣泛地采用了這個數據結構。這個手冊會介紹 JavaScript 數組的所有知識。你將會學到復雜數據處理、解構、常用數組方法等內容。我為什么寫這篇…

Spoken English(001)

if he wants to make any changes,minor alternations can be made thenis there any way of ensuring well have enough time for our talks?so our evenings will be quite full then?We’ll leave some evenings free,that is, if it is all right with you.We’d have to…

美學設計評價_死亡的孩子無法使用的設計美學

美學設計評價In the popular anime series, Soul Eater, Death the Kid is a Shinigami (Japanese death god) who vanquishes evil with his dual pistols, Liz and Patty. Although he’s strikingly powerful, his battles are often hindered by his obsessive-compulsive …

iis php網站500錯誤原因_因為曾經錯誤安裝過PHP5.2而導致IIS7無法正常工作,顯示500錯誤提示,大家幫忙看看!...

我的系統是VISTA,使用自帶的IIS7,對ASP網頁一直瀏覽正常。最近因自己心血來潮錯誤安裝了一次PHP5.2。主要操作是:1、下載的是自動安裝的PHP5.2程序,自動選ISAPI按鈕安裝;2、對IIS7中添加了名為“PHP”的ISAPI篩選器,選…

【送書】2021年哪些好書值得讀(小姐姐配音)

大家好,我是若川。記得點上面的小姐姐再次錄制的配音。為感謝大家一直以來的支持和肯定。不知道是今年第幾次送書了。昨天送書的音頻廣受好評,沒參與的可以參與。今天聯合華章圖書再送文中任選一本 * 3 包郵送,詳細規則看文末。Web開發01《斯…

Flash獲取html參數的方法

一. swf?傳參 html代碼:代碼<html><head><meta http-equiv”Content-Type” content”text/html charsetutf-8″ /><title>as</title></head><body><object classid”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″ codebase”h…

方法重載_方法

方法重載Recently, I wrote an article about moving XD designs to Figma. It was a really interesting experiment and one that seemed to interest quite a lot of people.最近&#xff0c;我寫了一篇有關將XD設計移至Figma的文章。 這是一個非常有趣的實驗&#xff0c;似…