# Vite vs webpack(以vue-cli為主) ###### tags: `Vite`, `webpack` - `webpack` 會`先打包`,然後啟動開發伺服器,請求伺服器時直接給予打包結果。 - 而 `Vite` 是`直接啟動`開發伺服器,請求哪個模組再對該模組進行`實時編譯`。 - 在 HMR(熱更新)方面,`Vite`當改動了一個模組後,**僅需讓瀏覽器重新請求該模組即可**,==不像`webpack`那樣需要把該模組的相關依賴模組全部編譯一次==,**效率更高**。 ## [webpack](https://webpack.js.org/concepts/) ![](https://i.imgur.com/NTXJZ3i.png) - 優點 - 生態龐大,遇到問題90% 網路上都有辦法解決。 - 支持`vue-class-component` - 缺點 - 構建耗時、**專案越大編譯速度越慢**。 - 做出來的網站[google網站評分較低](https://pagespeed.web.dev/) ## [Vite](https://cn.vitejs.dev/) ![](https://i.imgur.com/q5ZSdLt.png) - 優點 - 啟動快,做出來的網站[google網站評分較高](https://pagespeed.web.dev/) - **按需動態編譯**的方式,極大的縮減了編譯時間,==專案越複雜、模組越多,`Vite` 的優勢越明顯。== - 內置支持 `TypeScript` / `less` / `sass` / `stylus` / `postcss`(需要單獨安裝所對應的編譯器) - 缺點 - 沒有`webpack`成熟,無法做到太細部的調整。 - 生態沒有`webpack`龐大,遇到問題90%需要自己解決(但現在有越來越好)。 - vite不支持`vue-class-component` ## 環境變數方面 ### Vite > .env文檔的自定義環境變數以`VITE_`為前綴詞命名 1. ==`Vite`預設沒有`process.env`==,必須另外設定。 ```javascript= //in vite.config.js import { defineConfig, loadEnv } from 'vite'; import vue from '@vitejs/plugin-vue'; export default ({ mode }) => { process.env = {...process.env, ...loadEnv(mode, process.cwd())}; // import.meta.env.VITE_NAME available here with: process.env.VITE_NAME // import.meta.env.VITE_PORT available here with: process.env.VITE_PORT return defineConfig({ plugins: [vue()], server: { port: process.env.VITE_PORT, }, }); } ``` 2. 它有專門的屬性`import.meta` 除了我們自行定義的環境變數,Vite 還有內建四個它設定的環境變數讓我們運用: - `import.meta.env.MODE`:應用運行的模式。 - `import.meta.env.BASE_URL`:部署應用時的基本 URL。它由 base 配置項決定。 - `import.meta.env.PROD`:應用是否運行在生產環境。 - `import.meta.env.DEV`:應用是否運行在開發環境(永遠與 `import.meta.env.PROD` 相反)。 3. 圖片在js引入方法 >`import.meta.url` 是一個 ESM 的原生功能,會暴露當前模塊的 URL。將它與原生的 URL 構造器 組合使用,在一個 JavaScript 模塊中,通過相對路徑我們就能得到一個被完整解析的靜態資源 URL > >---節錄於[vite官網](https://vitejs.cn/guide/assets.html#new-url-url-import-meta-url) ```javascript= images: new URL(`/src/assets/images/yourImgName`, import.meta.url).href ``` ### webpack > .env文檔的自定義環境變數以`VUE_APP`為前綴詞命名 > 1.拿取環境變數的方法為`process.env.VUE_APP_YOUR_NAME` 2. 圖片在js引入方法 ```javascript= images: require('/src/assets/images/yourImgName') ``` ## TypeScript引入type方面 ### Vite 引入`interface`、`type`型別時,需要前面加個`type`做引入,`enum`則要分開引入 ```javascript= import type { interface, type } from '@/common/types' import { enum } from '@/common/types' ``` 否則會噴這個錯誤 Does not provide an export named vue ![](https://i.imgur.com/4SeZVBI.png) ### webpack 不管是`interface`、`type`或`enum`都可以一起引入。 ```javascript= import { interface, type, enum } from '@/common/types' ``` ## webpack vs rollup #### [rollup](https://rollupjs.org/guide/en/) > 官方解析:Rollup 是一個 JavaScript 模塊打包器,可以將小塊代碼編譯成大塊複雜的代碼,例如 library 或應用程序。 #### [webpack](https://webpack.js.org/concepts/) > 官方解析:webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。當 webpack 處理應用程序時,它會遞歸地構建一個依賴關係圖(dependency graph),其中包含應用程序需要的每個模塊,然後將所有這些模塊打包成一個或多個 bundle。 ### 結論 **`rollup`偏向應用於js庫,`webpack`偏向應用於前端工程,UI庫**; 如果你的應用場景中只是js代碼,希望做ES轉換,模塊解析,可以使用`Rollup`。 如果你的場景中涉及到`css`、`html`,涉及到復雜的代碼拆分合併,建議使用`webpack`。 ### 總體來說 ==`Vite`在一些細部調整上(像是打包時指定資料夾不要加hash)還是無法完全取代`webpack`==,生態還不夠完整。 根據[Vite 实践:Vue 旧项目迁移](https://juejin.cn/post/7038883564422692901)內文敘述,`chunkFileNames`,`assetFileNames` 拿不到具體路徑,目前沒有解決方法。 官網類可以直上`Vite`(如果不須太細部的調整)。 後台建議保留`webpack` dev & build 的能力, **`Vite` 僅作為開發的輔助**,等相關工具再完善一些, 再考慮完全遷移過來。 ### 參考文章 - [[專案實戰] Webpack to Vite, 為開發提速!](https://www.gushiciku.cn/pl/gHc5/zh-tw) - [Vite当前可用于生产吗,对比webpack有什么不足吗?](https://www.zhihu.com/question/447025978) - [rollup和webpack使用场景分析](https://baolei.blog.csdn.net/article/details/99841458?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-99841458-blog-109353622.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-99841458-blog-109353622.pc_relevant_paycolumn_v3&utm_relevant_index=2) - [前端新工具:Vite](https://w3ctim.com/post/77cd4175.html#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B) - [2021年了,vite能投入生产了吗?vite.config.js配置踩坑](https://juejin.cn/post/6989475484551610381) - [Vite 实践:Vue 旧项目迁移](https://juejin.cn/post/7038883564422692901) - [Rollup 使用教程](https://github.com/JohnApache/rollup-usage-doc) - [Vite - change ouput directory of assets](https://stackoverflow.com/questions/71180561/vite-change-ouput-directory-of-assets) - [Vite 與環境變數](https://editor.leonh.space/2021/vite/) - [Vite官網](https://vitejs.cn/) - [Vue-Cli官網](https://cli.vuejs.org/zh/) - [How can I use Vite env variables in vite.config.js?](https://stackoverflow.com/questions/66389043/how-can-i-use-vite-env-variables-in-vite-config-js)