前端開發(fā)利器Vite完整版詳解
推薦兩個插件插件Volar 、 Vue 3 Snippets
序論:
開發(fā)環(huán)境:ESM+HMR:來實(shí)現(xiàn)模塊的熱更新;類似于webpack-server
生產(chǎn)環(huán)境:Rollup: 打包工具rollup的產(chǎn)生就是針對開發(fā)js庫的,生成代碼只是把我們的代碼轉(zhuǎn)碼成目標(biāo)js并無其他
Vite 的快,主要體現(xiàn)在兩個方面: 快速的冷啟動和快速的熱更新。而 Vite
之所以能有如此優(yōu)秀的表現(xiàn),完全歸功于 Vite
借助了瀏覽器對 ESM
規(guī)范的支持,采取了與 Webpack
完全不同的 unbundle
機(jī)制。
1.快速冷啟動:Vite只啟動一臺靜態(tài)頁面的服務(wù)器,不會打包全部項(xiàng)目文件代碼,服務(wù)器根據(jù)客戶端的請求加載不同的模塊處理,實(shí)現(xiàn)按需加載,而我們所熟知的webpack則是,一開始就將整個項(xiàng)目都打包一遍,再開啟dev-server,如果項(xiàng)目規(guī)模龐大,打包時間必然很長。
2.打包編譯速度:當(dāng)需要打包到?產(chǎn)環(huán)境時,vite使?傳統(tǒng)的rollup進(jìn)?打包,所以,vite的優(yōu)勢是體現(xiàn)在開發(fā)階段,另外,由于vite使?的是ES Module,所以代碼中不可以使?CommonJs;
3.熱模塊更新:在HRM熱更新??,當(dāng)某個模塊內(nèi)容改變時,讓瀏覽器去重新請求該模塊即可,?不是像webpack重新將該模塊的所有依賴重新編譯;
vite優(yōu)缺點(diǎn):vite優(yōu)點(diǎn) -unbundle 機(jī)制的核心:
- 模塊之間的依賴關(guān)系的解析由瀏覽器實(shí)現(xiàn);
- 文件的轉(zhuǎn)換由
dev server
的middlewares
實(shí)現(xiàn)并做緩存; - 不對源文件做合并捆綁操作;
vite缺點(diǎn):由于 unbundle
機(jī)制,首屏期間、懶加載方面需要額外做以下工作:和 Webpack
對比,Vite
把需要在 dev server
啟動過程中完成的工作,轉(zhuǎn)移到了 dev server
響應(yīng)瀏覽器請求的過程中,不可避免的導(dǎo)致首屏性能下降。不過首屏性能差只發(fā)生在 dev server
啟動以后第一次加載頁面時發(fā)生。之后再 reload
頁面時,首屏性能會好很多。原因是 dev server
會將之前已經(jīng)完成轉(zhuǎn)換的內(nèi)容緩存起來。
- 不對源文件做合并捆綁操作,導(dǎo)致大量的
http
請求; dev server
運(yùn)行期間對源文件做resolve
、load
、transform
、parse
操作;- 預(yù)構(gòu)建、二次預(yù)構(gòu)建操作也會阻塞首屏請求,直到預(yù)構(gòu)建完成為止。
vite架子分析
1、 打包構(gòu)建:
npm run build
默認(rèn)情況下,構(gòu)建會輸出到 dist
文件夾中。你可以部署這個 dist
文件夾到任何你喜歡的平臺。
本地測試應(yīng)用
vite preview
命令會在本地啟動一個靜態(tài) Web 服務(wù)器,將 dist
在 http://localhost:4173
。這樣在本地環(huán)境下查看該構(gòu)建產(chǎn)物是否正常可用就方便多了。你可以通過 --port
參數(shù)來配置服務(wù)的運(yùn)行端口。
現(xiàn)在 preview
命令會將服務(wù)器運(yùn)行在 http://localhost:8080
。
自動打開瀏覽器:
"dev": "vite --open", "build": "vue-tsc --noEmit && vite build", "preview": "vite preview --open"
值得注意的是 vite preview
用作預(yù)覽本地構(gòu)建,而不應(yīng)直接作為生產(chǎn)服務(wù)器。
2、環(huán)境變量
Vite 在一個特殊的 import.meta.env 對象上暴露環(huán)境變量。這里有一些在所有情況下都可以使用的內(nèi)建變量:
import.meta.env.MODE: {string} 應(yīng)用運(yùn)行的模式。 import.meta.env.BASE_URL: {string} 部署應(yīng)用時的基本 URL。他由base 配置項(xiàng)決定。 import.meta.env.PROD: {boolean} 應(yīng)用是否運(yùn)行在生產(chǎn)環(huán)境。 import.meta.env.DEV: {boolean} 應(yīng)用是否運(yùn)行在開發(fā)環(huán)境 (永遠(yuǎn)與 import.meta.env.PROD相反)。 import.meta.env.SSR: {boolean} 應(yīng)用是否運(yùn)行在 server 上。
自定義環(huán)境變量:
(1)創(chuàng)建文件:已存在的環(huán)境變量不會被以下文件中的覆蓋
.env # 所有情況下都會加載 .env.local # 所有情況下都會加載,但會被 git 忽略 .env.[mode] # 只在指定模式下加載,如.env.production的優(yōu)先級比.env高 .env.[mode].local # 只在指定模式下加載,但會被 git 忽略
加載的環(huán)境變量也會通過 import.meta.env
以字符串形式暴露給客戶端源碼。
為了防止意外地將一些環(huán)境變量泄漏到客戶端,只有以 VITE_
為前綴的變量才會暴露給經(jīng)過 vite 處理的代碼。例如下面這些環(huán)境變量:
只有 VITE_SOME_KEY
會被暴露為 import.meta.env.VITE_SOME_KEY
提供給客戶端源碼,而 DB_PASSWORD
則不會。
(2)添加類型聲明
<reference types="vite/client" /> interface ImportMetaEnv { readonly VITE_APP_TITLE: string // 更多環(huán)境變量... } interface ImportMeta { readonly env: ImportMetaEnv }
3、模式
默認(rèn)情況下,開發(fā)服務(wù)器 (dev
命令) 運(yùn)行在 development
(開發(fā)) 模式,而 build
命令則運(yùn)行在 production
(生產(chǎn)) 模式。這意味著當(dāng)執(zhí)行 vite build
時,它會自動加載 .env.production
中可能存在的環(huán)境變量:
在你的應(yīng)用中,你可以使用 import.meta.env.VITE_APP_TITLE
渲染標(biāo)題。
除了默認(rèn)的developmen和production還可以自定義模式,如可能希望有一個 “staging” (預(yù)發(fā)布|預(yù)上線) 模式,它應(yīng)該具有類似于生產(chǎn)的行為,但環(huán)境變量與生產(chǎn)環(huán)境略有不同
vite build --mode staging .env.staging文件存放相關(guān)模式下的環(huán)境變量
4、兼容老瀏覽器
默認(rèn)情況下 Vite 只處理語法轉(zhuǎn)譯,且默認(rèn)不包含任何 polyfill。 通過引入polyfill: polyfill 是一個js
庫,主要撫平不同瀏覽器之間對js實(shí)現(xiàn)的差異。 可以前往 Polyfill.io 查看,這是一個基于用戶瀏覽器 User-Agent 字符串自動生成 polyfill 包的服務(wù) 通過插件支持:通過插件@vitejs/plugin-legacy來支持,它將自動生成傳統(tǒng)版本的 chunk 及與其相對應(yīng) ES 語言特性方面的 polyfill,兼容版的chunk只會在不支持原生 ESM 的瀏覽器中進(jìn)行按需加載
5、typescript相關(guān)
(1)esbuild下不支持功能編輯時報錯
配置類型導(dǎo)入導(dǎo)出、enum、沒有import、export導(dǎo)入導(dǎo)出的非模塊文件報錯
tsconfig.json { "compilerOptions": { "isolatedModules":true 上述特性會在編輯時報錯,否則會在運(yùn)行時報錯 } }
(2)導(dǎo)入vite內(nèi)置的一些類型定義
資源導(dǎo)入 (例如:導(dǎo)入一個 .svg 文件)
.import.meta.env 上 Vite 注入的環(huán)境變量的類型定義 .import.meta.hot 上的 HMR API 類型定義
方式一:在.d.ts 中
<reference types="vite/client" />
方式二:在tsconfig.json中
{ "compilerOptions": { "types": ["vite/client"] } }
多頁面配置
├── package.json ├── vite.config.js ├── index.html ├── main.js └── nested ├── index.html └── nested.js build: { rollupOptions: { input: { main: resolve(__dirname, 'index.html'), nested: resolve(__dirname, 'nested/index.html') } } }
6、基本配置
區(qū)分不同環(huán)境配置
- command:根據(jù)運(yùn)行的命令區(qū)分配置,serve為開發(fā)環(huán)境,否則為build生產(chǎn)環(huán)境
- mode:根據(jù)環(huán)境區(qū)分配置
export default defineConfig(async ({ command, mode }) => { const config=await fn(); 支持使用Promise if (command === 'serve') { return { } } else if(command='build'){ return { } } })
核心配置全集
export default defineConfig({ base: "./", //開發(fā)或生產(chǎn)環(huán)境服務(wù)的公共基礎(chǔ)路徑, 絕對 URL 路徑名,例如 /foo/ // 完整的 URL,例如 https://foo.com/ // 空字符串或 ./(用于開發(fā)環(huán)境) // 通過命令指定:vite build --base=/my/public/path/ // 代碼中獲取base:import.meta.env.BASE_URL全局變量在代碼中使用, //原樣出現(xiàn)(例如import.meta.env['BASE_URL']是無效的) root: process.cwd(), // 項(xiàng)目根目錄(index.html 文件所在的位置絕對位置或相對位置),默認(rèn)process.cwd() define: { __DEV__: 'dev', }, //定義全局常量替換方式。其中每項(xiàng)在開發(fā)環(huán)境下會被定義在全局,而在構(gòu)建時被靜態(tài)替換 mode: 'development', // 模式將會把serve和build時的模式都覆蓋掉。 //也可以通過命令行 --mode 選項(xiàng)來重寫'development'(serve)、'production'(build) plugins: [vue()], // 需要用到的插件數(shù)組 publicDir: 'public', // 靜態(tài)資源服務(wù)的文件夾。該目錄中的文件在開發(fā)期間在 / 處提供 //并在構(gòu)建期間復(fù)制到 outDir 的根目錄,并且始終按原樣提供或復(fù)制而無需進(jìn)行轉(zhuǎn)換。 //該值可以是文件系統(tǒng)的絕對路徑,也可以是相對于項(xiàng)目的根目錄的相對路徑。默認(rèn)'public' cacheDir: 'node_modules/.vite', // 存儲緩存文件的目錄。此目錄下會存儲預(yù)打包的依賴項(xiàng)或 vite // 生成的某些緩存文件,使用緩存可以提高性能。如需重新生成緩存文件,你可以使用 --force 命令行選項(xiàng) // 或手動刪除目錄。此選項(xiàng)的值可以是文件的絕對路徑,也可以是以項(xiàng)目根目錄為基準(zhǔn)的相對路徑。 // 當(dāng)沒有檢測到 package.json 時,則默認(rèn)為 .vite。 默認(rèn)"node_modules/.vite" // 解析相關(guān) resolve: { alias: [ // 文件系統(tǒng)路徑別名 { "@": path.resolve(__dirname, "src"), }, //或 { find: /\/@\//, //字符串|正則 replacement: pathResolve('src') + '/' } ], dedupe: [], // 強(qiáng)制 Vite 始終將列出的依賴項(xiàng)解析為同一副本,比如當(dāng)安裝了兩個不同版本的依賴, // 如vue2和vue3,通過這個聲明最終引入的版本 [] conditions: [], // 解決程序包中 情景導(dǎo)出 時的其他允許條件 [{ // "exports": { // ".": { // "import": "./index.esm.js", // "require": "./index.cjs.js" // } // } // }] mainFields: [], // 解析包入口點(diǎn)嘗試的字段列表 ,根據(jù)package.json中的字段, // 在不同環(huán)境中導(dǎo)入庫的入口文件位置 // import引入的文件對應(yīng)module中的路徑 // require引入的文件對應(yīng)main中的路徑 // 默認(rèn):['module', 'jsnext:main', 'jsnext','main'] extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json'], // 默認(rèn):['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json']導(dǎo)入時想要忽略的擴(kuò)展名列表 導(dǎo)入時想要省略的擴(kuò)展名列表。不建議忽略自定義導(dǎo)入類型的擴(kuò)展名(例如:.vue),因?yàn)樗鼤绊?IDE 和類型支持 preserveSymlinks: false, // 啟用此選項(xiàng)會使 Vite 通過原始文件路徑(即不跟隨符號鏈接的路徑)而不是真正的文件路徑(即跟隨符號鏈接后的路徑)確定文件身份 // 默認(rèn):false }, // css相關(guān) css: { modules: { //配置 CSS modules 的行為。選項(xiàng)將被傳遞給 postcss-modules。 scopeBehaviour: 'global' | 'local', // ... }, postcss: '', // 內(nèi)聯(lián)的 PostCSS 配置 如果提供了該內(nèi)聯(lián)配置,Vite 將不會搜索其他 PostCSS 配置源 preprocessorOptions: { // css的預(yù)處理器選項(xiàng) scss: { additionalData: `$injectedColor: orange;` } } }, // JSON相關(guān) json: { namedExports: true, // 是否支持從.json文件中進(jìn)行按名導(dǎo)入 stringify: false, // 開啟此項(xiàng),導(dǎo)入的 JSON 會被轉(zhuǎn)換為 export default JSON.parse("...") 會禁用按名導(dǎo)入 }, //esbuild相關(guān) esbuild: { // 最常見的用例是自定義 JSX jsxFactory: 'h', jsxFragment: 'Fragment' // ESbuild會被應(yīng)用在 ts、jsx、tsx 文件,以下選項(xiàng)對要處理的文件類型進(jìn)行配置 // include:string | RegExp | (string | RegExp)[] // exclude:string | RegExp | (string | RegExp)[] // jsxInject:自動為每一個被 ESbuild 轉(zhuǎn)換的文件注入內(nèi)容 // `import React from 'react'` }, assetsInclude: ['**/*.gltf'], // 指定額外的 picomatch 模式 作為靜態(tài)資源處理 logLevel: 'info', // 調(diào)整控制臺輸出的級別 'info' | 'warn' | 'error' | 'silent' clearScreen: true, // 設(shè)為 false 可以避免 Vite 清屏而錯過在終端中打印某些關(guān)鍵信息 envDir: '/', // 用于加載 .env 文件的目錄 envPrefix: [], // 以 envPrefix 開頭的環(huán)境變量會通過 import.meta.env 暴露在你的客戶端源碼中 //server相關(guān) server: { host: '127.0.0.1', // 指定服務(wù)器應(yīng)該監(jiān)聽哪個 IP 地址 port: 5000, // 指定開發(fā)服務(wù)器端口 strictPort: true, // 若端口已被占用則會直接退出 https: false, // 啟用 TLS + HTTP/2 // 當(dāng)為true:啟用 TLS + HTTP/2。注意:當(dāng) server.proxy 選項(xiàng) 也被使用時,將會僅使用 TLS。 // 這個值也可以是一個傳遞給 https.createServer() 的 選項(xiàng)對象 open: true, // 啟動時自動在瀏覽器中打開應(yīng)用程序 proxy: { // 配置自定義代理規(guī)則 '/api': { target: 'http://jsonplaceholder.typicode.com', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, ''), ws: true, //WebSocket } }, cors: true, // 配置 CORS force: true, // 強(qiáng)制使依賴預(yù)構(gòu)建 hmr: { // 禁用或配置 HMR 連接 熱更新相關(guān) // false禁用 protocol: string, //協(xié)議 host: string, port: number, path: string, timeout: number, overlay: boolean, //為 false 可以禁用開發(fā)服務(wù)器錯誤的屏蔽 clientPort: number, //只在客戶端的情況下覆蓋端口,這允許你為 websocket 提供不同的端口,而并非在客戶端代碼中查找。如果需要在 dev-server 情況下使用 SSL 代理,這非常有用。 server: Server, //當(dāng)使用 server.middlewareMode 或 server.https 時,你需將 server.hmr.server 指定為你 HTTP(S) 的服務(wù)器,這將通過你的服務(wù)器來處理 HMR 的安全連接請求。這在使用自簽證書或想通過網(wǎng)絡(luò)在某端口暴露 Vite 的情況下,非常有用。 }, watch: { // 傳遞給 chokidar 的文件系統(tǒng)監(jiān)聽器選項(xiàng) 監(jiān)聽文件改變 // 通過命令:vite build --watch ignored: ['!**/node_modules/your-package-name/**'] // 默認(rèn)會忽略對 .git/ 和 node_modules/ 目錄的監(jiān)聽,如果需要對 node_modules/ 內(nèi)的包進(jìn)行監(jiān)聽,可以為 server.watch.ignored 賦值一個取反的 glob 模式 // 其他選項(xiàng):使用的是rollup的選項(xiàng)配置:https://rollupjs.org/guide/en/#watch-options }, middlewareMode: '', // 以中間件模式創(chuàng)建 Vite 服務(wù)器 'ssr' | 'html' 在SSR中使用 fs: { strict: true, // 限制為工作區(qū) root 路徑以外的文件的訪問 allow: [], // 限制哪些文件可以通過 /@fs/ 路徑提供服務(wù) deny: ['.env', '.env.*', '*.{pem,crt}'], // 用于限制 Vite 開發(fā)服務(wù)器提供敏感文件的黑名單 }, origin: 'http://127.0.0.1:8080/', // 用于定義開發(fā)調(diào)試階段生成資產(chǎn)的 origin }, //build構(gòu)建相關(guān) build: { target: ['modules'], // 設(shè)置最終構(gòu)建的瀏覽器兼容目標(biāo) 默認(rèn):'modules'指支持原生 ES 模塊的瀏覽器。 // "esnext" :即假設(shè)有原生動態(tài)導(dǎo)入支持,并且將會轉(zhuǎn)譯得盡可能?。? // 如果 build.minify 選項(xiàng)為 'terser', 'esnext' 將會強(qiáng)制降級為 'es2019'。 // 其他情況下將完全不會執(zhí)行轉(zhuǎn)譯。 // 'es2015':自定義目標(biāo)也可以是一個 ES 版本 polyfillModulePreload: true, // 是否自動注入 module preload 的 polyfill true:此 polyfill 會被自動注入到每個 index.html 入口的 proxy 模塊中 outDir: 'dist', // 指定輸出路徑 assetsDir: 'assets', // 指定生成靜態(tài)文件目錄 assetsInlineLimit: '4096', // 小于此閾值的導(dǎo)入或引用資源將內(nèi)聯(lián)為 base64 編碼 cssCodeSplit: true, // 啟用 CSS 代碼拆分 cssTarget: '', // 允許用戶為 CSS 的壓縮設(shè)置一個不同的瀏覽器 target 與 build.target 一致 sourcemap: false, // 構(gòu)建后是否生成 source map 文件 rollupOptions: {}, // 自定義底層的 Rollup 打包配置 lib: {}, // 構(gòu)建為庫 manifest: false, // 當(dāng)設(shè)置為 true,構(gòu)建后將會生成 manifest.json 文件 ssrManifest: false, // 構(gòu)建不生成 SSR 的 manifest 文件 ssr: undefined, // 生成面向 SSR 的構(gòu)建 minify: 'esbuild', // 指定使用哪種混淆器 terserOptions: {}, // 傳遞給 Terser 的更多 minify 選項(xiàng) write: true, // 啟用將構(gòu)建后的文件寫入磁盤 emptyOutDir: true, // 構(gòu)建時清空該目錄 brotliSize: true, // 啟用 brotli 壓縮大小報告 chunkSizeWarningLimit: 500, // chunk 大小警告的限制 watch: null, // 設(shè)置為 {} 則會啟用 rollup 的監(jiān)聽器 }, // 構(gòu)建預(yù)覽preview相關(guān) preview: { port: 5000, // 指定開發(fā)服務(wù)器端口 strictPort: true, // 若端口已被占用則會直接退出 https: false, // 啟用 TLS + HTTP/2 open: true, // 啟動時自動在瀏覽器中打開應(yīng)用程序 proxy: { // 配置自定義代理規(guī)則 '/api': { target: 'http://jsonplaceholder.typicode.com', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') } }, cors: true, // 配置 CORS }, optimizeDeps: { entries: [], // 指定自定義條目——該值需要遵循 fast-glob 模式 exclude: [], // 在預(yù)構(gòu)建中強(qiáng)制排除的依賴項(xiàng) include: [], // 可強(qiáng)制預(yù)構(gòu)建鏈接的包 keepNames: false, // true 可以在函數(shù)和類上保留 name 屬性 }, // SSR相關(guān) ssr: { external: [], // 列出的是要為 SSR 強(qiáng)制外部化的依賴, noExternal: '', // 列出的是防止被 SSR 外部化依賴項(xiàng) target: 'node', // SSR 服務(wù)器的構(gòu)建目標(biāo) }, // Worker相關(guān) worker: { format: iife, //worker bundle 的輸出類型。 默認(rèn): 'iife' 'es', plugins: [], //適用于 worker bundle 的 Vite 插件。 [] rollupOptions: [], //用于構(gòu)建 worker bundle 的 Rollup 配置項(xiàng) } })
總結(jié)
到此這篇關(guān)于前端開發(fā)利器Vite完整版詳解的文章就介紹到這了,更多相關(guān)Vite完整版詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Vue3 (一)創(chuàng)建Vue CLI 項(xiàng)目
這篇文章主要介紹利用Vue3 創(chuàng)建Vue CLI 項(xiàng)目,下面文章內(nèi)容附有官方文檔鏈接,安裝過程,需要的可以參考一下2021-10-10使用vuex較為優(yōu)雅的實(shí)現(xiàn)一個購物車功能的示例代碼
這篇文章主要介紹了使用vuex較為優(yōu)雅的實(shí)現(xiàn)一個購物車功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12el-table?樹形數(shù)據(jù)?tree-props?多層級使用避坑
本文主要介紹了el-table?樹形數(shù)據(jù)?tree-props?多層級使用避坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08Vue 實(shí)現(xiàn)定時刷新與自動更新(示例詳解)
在現(xiàn)代 Web 開發(fā)中,定時刷新頁面或定時更新數(shù)據(jù)是一種常見的需求,尤其是在需要與服務(wù)器進(jìn)行定時通信或者展示實(shí)時數(shù)據(jù)的場景下,Vue.js 提供了簡單而有效的方法來實(shí)現(xiàn)定時刷新和自動更新,本文將介紹幾種常見的定時刷新方式、適用場景、優(yōu)缺點(diǎn)以及性能考慮2024-11-11vue 界面刷新數(shù)據(jù)被清除 localStorage的使用詳解
今天小編就為大家分享一篇vue 界面刷新數(shù)據(jù)被清除 localStorage的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09