Vue做者尤雨溪在今年4月提出了一個由Vue3搭載的前端開發工具Vite。Vite主要提供了前端開發服務器的功能以及生產環境打包的功能,而其主要突破則是在前端開發服務器這一方面,提供了一種基於ES Module的快速的本地開發服務器。html
在本文編輯時,Vite版本仍處於1.0.0-rc.9,還沒有正式發佈,而且Vite目前主要支持Vue3項目,尚不識別Vue2語法。下面是引用尤雨溪在微博上對Vite的介紹。前端
Vite,一個基於瀏覽器原生 ES imports 的開發服務器。利用瀏覽器去解析 imports,在服務器端按需編譯返回,徹底跳過了打包這個概念,服務器隨起隨用。同時不只有 Vue 文件支持,還搞定了熱更新,並且熱更新的速度不會隨着模塊增多而變慢。針對生產環境則能夠把同一份代碼用 rollup 打。雖然如今還比較粗糙,但這個方向我以爲是有潛力的,作得好能夠完全解決改一行代碼等半天熱更新的問題。vue
使用下面的命令便可快速搭建一個使用Vite做爲開發服務器的項目,使用十分方便,相似於Vue-cli。node
npm init vite-app <project-name>
cd <project-name>
npm install
npm run dev
複製代碼
第一行命令的目的就是從npm倉庫拉取 create-vite-app
這個包,而後全局安裝,最後使用它建立基於Vite的模板項目。webpack
官方文檔介紹,Vite主要有下面三個特性web
create-vite-app
和 Vue-cli
建立的項目,來看一下Vite快在哪裏,下圖分別是使用Vite和 Vue-cli(webpack)
啓動本地開發服務器的過程。能夠看出Vite相對於Vue-cli(webpack)在本地服務器啓動時省略了打包步驟,於是作到了冷啓動秒開的效果,而且這個速度提高會隨着項目模塊增多而越發明顯。下面咱們就看一下Vite是如何實現其快速的特性。npm
Vite 是基於瀏覽器原生 ES imports 的開發服務器。於是咱們首先須要瞭解瀏覽器是如何支持ES Module的瀏覽器
首先,咱們來看一下在瀏覽器如何使用ES Module。打開瀏覽器調試面板, 清空network,使用下面代碼在頁面動態插入一段 <script>
代碼緩存
const script = document.createElement('script')
script.setAttribute('type', 'module');
script.innerHTML = 'import {test} from "./test.js"'
document.body.append(script)
複製代碼
在運行上述代碼後,瀏覽器向當前服務器目錄發送了 http://km.oa.com/test.js
的請求。咱們都知道本地項目中咱們使用ES import會從文件系統讀取相應路徑的模塊,瀏覽器則是將模塊路徑轉換爲Url。服務器
瀏覽器解析ES module的過程如上圖所示。
type="module"
的 <script>標籤
import
語法,生成請求url,向服務器請求該地址的模塊能夠說瀏覽器對於ES Module的支持實現了真正的按需加載,省略了前端打包的過程,對於減小首屏加載時間是有極大幫助的。可是咱們要在生產環境中使用它必須知道瀏覽器的支持度到底如何。
下面是一張caniuse中說明的瀏覽器對於 ES Module的靜態import語法的支持狀況。能夠看出除了IE外的主流瀏覽器基本上都支持了 ES Module的import語法。
那麼,對於不支持ES Module的瀏覽器,難道咱們就讓項目跑不起來嗎?
固然不是,在 script 標籤中使用 nomodule 屬性,能夠確保向後兼容。
像上圖同樣提供ES Module方式和非ES Module方式的代碼,對於支持ES Module的瀏覽器,其會忽視 nomodule
類型的script,而對於沒法識別 Es Module的瀏覽器則會直接使用 nomodule
的script代碼。所以咱們只需提供一份打包好的代碼,放在 nomodule
標籤內就能夠實現向後兼容
值得注意的是,瀏覽器只能解析以’/’, ‘./’, 或 '…/'開頭的模塊路徑,對於像引用nodemodules中的模塊,好比像下面引用Vue的方式,瀏覽器沒法識別,會報錯。所以對於nodemodules的引用,須要另外處理,而Vite也給出瞭解決方案。
import Vue from 'vue'
複製代碼
咱們啓動Vite本地開發服務器,用瀏覽器打開入口頁面,觀察瀏覽器的NetWork面板.以下圖所示,
main.js
,main.js
中包含ES Module, 解析 import
語法,發現有三個 import
import
,發出所依賴的模塊的Http請求對比源碼和網絡請求,咱們會發現網絡請求數明顯要多於源碼中 import
的個數。多出的網絡請求主要是兩類
.vue
文件相關 對於一個Vue組件SFC(Single File Components),其主要包含三類代碼,模板、script、樣式。因爲瀏覽器是沒法識別vue文件的,一個vue文件會被拆分爲三個請求 .vue
, .vue?type=template
, .vue?type=style
,這些都須要藉助Vite的本地服務器實現,具體實現方法下文會詳細闡述。clent.js
,還有websocket請求,這些都是爲熱更新服務的,而在代碼中插入創建websocket鏈接須要的 clent.js
邏輯也是由Vite開發服務器實現的。對於瀏覽器不識別的node_module引用如何處理?對於 .vue
文件如何處理都是由Vite開發服務器實現的。首先咱們看一下Vite開發服務器架構圖
Vite開發服務器是基於Koa框架的,利用Koa中間件實現模塊解析以及熱更新的主要功能。這一節咱們主要看一下Vite是如何處理模塊的。
nodemodules 模塊處理過程 對nodemodules的處理主要由中間件
serverPluginModuleRewrite
完成,其主要過程以下
vue文件處理過程 對vue組件的處理由
serverPluginVue
來實現,其處理流程以下
js
template
內容的渲染函數,返回類型爲 js
style
標籤內樣式的動態插入函數如上圖所示,Vite熱更新也是基於Websocket。在Vite服務器啓動時,Vite利用中間件 serverPluginHtml
在html中插入 client.js
. 這個js文件主要用於在創建瀏覽器和Vite服務器之間的Websocket通訊。熱更新的步驟以下
clientjs監聽的更新消息類型
Vite 提供了一個更快的開發環境服務器, 其實現原理基於ES模塊,經過開發環境去打包將構建時間從 O(n) 減小到 O(1), 其搭載Vue3發佈,藉助Vue生態,在將來有更普遍的使用場景。
原做者:李璐
未經贊成,禁止轉載!