聲明
本人也在不斷的學(xué)習(xí)和積累中,文章中有不足和誤導(dǎo)的地方還請(qǐng)見諒,可以給我留言指正。希望和大家共同進(jìn)步,共建和諧學(xué)習(xí)環(huán)境。
介紹
1、Vite 是什么
vite是前端的構(gòu)建工具,和webpack類似。
2、優(yōu)點(diǎn)
- 極速的服務(wù)啟動(dòng),使用原生 ESM 文件,無需打包。
- 輕量快速的熱重載,無論應(yīng)用程序大小如何,都始終極快的模塊熱重載(HMR)
- 豐富的功能,對(duì) TypeScript、JSX、CSS 等支持開箱即用。
- 優(yōu)化的構(gòu)建,可選 “多頁(yè)應(yīng)用” 或 “庫(kù)” 模式的預(yù)配置 Rollup 構(gòu)建
- 通用的插件,在開發(fā)和構(gòu)建之間共享 Rollup-superset 插件接口。
- 完全類型化的API,靈活的 API 和完整 TypeScript 類型。
3、缺點(diǎn)
- 生態(tài)不及webpack,加載器、插件不夠豐富
- 打包到生產(chǎn)環(huán)境時(shí),vite使用傳統(tǒng)的 rollup(也可以自己手動(dòng)安裝webpack來)進(jìn)行打包
- 項(xiàng)目的開發(fā)瀏覽器要支持 ES Module,而且不能識(shí)別 CommonJS 語法
為什么服務(wù)快
1、Vite 通過在一開始將應(yīng)用中的模塊區(qū)分為 依賴 和 源碼 兩類,改進(jìn)了開發(fā)服務(wù)器啟動(dòng)時(shí)間。
-
依賴 大多為在開發(fā)時(shí)不會(huì)變動(dòng)的純 JavaScript。一些較大的依賴(例如有上百個(gè)模塊的組件庫(kù))處理的代價(jià)也很高。依賴也通常會(huì)存在多種模塊化格式(例如 ESM 或者 CommonJS)。
Vite 將會(huì)使用 esbuild 預(yù)構(gòu)建依賴。esbuild 使用 Go 編寫,并且比以 JavaScript 編寫的打包器預(yù)構(gòu)建依賴快 10-100 倍。
-
源碼 通常包含一些并非直接是 JavaScript 的文件,需要轉(zhuǎn)換(例如 JSX,CSS 或者 Vue/Svelte 組件),時(shí)常會(huì)被編輯。同時(shí),并不是所有的源碼都需要同時(shí)被加載(例如基于路由拆分的代碼模塊)。
Vite 以 原生 ESM 方式提供源碼。這實(shí)際上是讓瀏覽器接管了打包程序的部分工作:Vite 只需要在瀏覽器請(qǐng)求源碼時(shí)進(jìn)行轉(zhuǎn)換并按需提供源碼。根據(jù)情景動(dòng)態(tài)導(dǎo)入代碼,即只在當(dāng)前屏幕上實(shí)際使用時(shí)才會(huì)被處理。
vite 的打包過程

2、在 Vite 中,HMR 是在原生 ESM 上執(zhí)行的。當(dāng)編輯一個(gè)文件時(shí),Vite 只需要精確地使已編輯的模塊與其最近的 HMR 邊界之間的鏈?zhǔn)Щ?/strong>[1](大多數(shù)時(shí)候只是模塊本身),使得無論應(yīng)用大小如何,HMR 始終能保持快速更新。
3、Vite 同時(shí)利用 HTTP 頭來加速整個(gè)頁(yè)面的重新加載(再次讓瀏覽器為我們做更多事情):源碼模塊的請(qǐng)求會(huì)根據(jù) 304 Not Modified 進(jìn)行協(xié)商緩存,而依賴模塊請(qǐng)求則會(huì)通過 Cache-Control: max-age=31536000,immutable 進(jìn)行強(qiáng)緩存,因此一旦被緩存它們將不需要再次請(qǐng)求。
安裝和使用
1、 安裝方式
官方提供的方式
/**npm 方式*/
$ npm create vite@lastest
/** Yarn 方式*/
$ yarn create vite
/** PNPM*/
$ pnpm create vite
還可以使用官方的一些模板
# npm 6.x
npm create vite@latest my-vue-app --template vue
# npm 7+, extra double-dash is needed:
npm create vite@latest my-vue-app -- --template vue
# yarn
yarn create vite my-vue-app --template vue
# pnpm
pnpm create vite my-vue-app --template vue
其實(shí)無論使用上面的哪種方式,其實(shí)都是使用的官方封裝好的vite腳手架。如果想要單獨(dú)的使用vite
/* npm 方式*/
npm i vite -D
/* Yarn 方式*/
yarn add vite -D
/* PNPM 方式 要求node>= 17.0.0 */
pnpm add vite -D
2、 配置文件
如果想要配置vite 需要在項(xiàng)目根目錄下創(chuàng)建一個(gè)vite.config.js 的文件,vite.config.js 是編譯時(shí)需要執(zhí)行的,所有執(zhí)行在node端
// vite.config.js
export default {
// 配置選項(xiàng)
}
支持ts的配置
/** 方式一 */
/** @type {import('vite').UserConfig} */
export default {
// ...
}
/** 方式二 */
/** 使用defineConfig 還可以讓vscode 可以有語法提示 */
import { defineConfig } from 'vite'
export default defineConfig({
// ...
})
注:Vite默認(rèn)支持ESM語法,所有可以不用在package.json 中開啟 type: "module"。
3、環(huán)境配置
配置可以返回一個(gè)方法,可以是異步方法,在函數(shù)中可以獲取到command來區(qū)分。
export default defineConfig(({ command, mode, ssrBuild }) => {
if (command === 'serve') {
return {
// dev 獨(dú)有配置
}
} else {
// command === 'build'
return {
// build 獨(dú)有配置
}
}
})
mode的使用(vite內(nèi)置了dotenv插件):
在項(xiàng)目根目錄中創(chuàng)建.env.development 和 .env.production(vite可以使用
evnDir:來指定環(huán)境變量文件的位置,默認(rèn)是找跟目錄下面的.env 文件)執(zhí)行serve 命令時(shí),mode 默認(rèn)為development ,執(zhí)行build 時(shí),mode默認(rèn)為production
.env.[mode]文件中
/** .env.development */
VITE_URL = http://www.baidu.com
VITE_USER = little-lion
- 可以使用
loadEnv加載env 文件
loadEnv(mode, 文件所在目錄, 文件名前綴)
export default defineConfig(({ command, mode, ssrBuild }) => {
const env = loadEnv(mode, process.pwd(), '') // process.pwd() node 啟動(dòng)服務(wù)根目錄
})
- 可以使用命令行指定mode
npm dev --mode development
- 在js 中使用
import.meta.env獲取到VITE_前綴的環(huán)境變量,可以使用envPrefix改變這個(gè)前綴
/** 使用import.meta.env */
/* vite.config.js 中修改前綴 */
export default {
envPrefix: "LIKE_"
}
4、module css的使用
// 需要使用import 導(dǎo)入
// css 文件名字需要添加上module
import componentCss from './component.module.css'
console.log(componentCss) // 打印看下都有什么
const div = document.createElement("div");
// ['class'] 這個(gè)是component.module.css中定義的樣式選擇器名字
div.className = componentCss['class']
在vite.config.js中配置
export default {
css: {
modules: { // 對(duì)默認(rèn)行為的覆蓋,傳給postcss modules
localsConvention: 'cameCase', // 配置css 選擇器轉(zhuǎn)化后的名字類型---- 駝峰式
scopeBehaviour: 'global' | 'local', // 配置當(dāng)前的是模塊化還是全局化
generateScopedName: '[name]_[local]_[hash:5]', // 生成類名的規(guī)則 https://github.com/webpack/loader-utils#interpolatename
}
}
}
5、插件
$ npm add -D @vitejs/plugin-legacy
// vite.config.js
import legacy from '@vitejs/plugin-legacy'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
legacy({
targets: ['defaults', 'not IE 11'],
}),
],
})
使用enforce強(qiáng)制插件排序:
- pre:在 Vite 核心插件之前調(diào)用該插件
- 默認(rèn):在 Vite 核心插件之后調(diào)用該插件
- post:在 Vite 構(gòu)建插件之后調(diào)用該插件
export default defineConfig({
plugins: [
{
...image(),
enforce: 'pre',
},
],
})
使用apply屬性指明它們僅在 'build' 或 'serve' 模式時(shí)調(diào)用
export default defineConfig({
plugins: [
{
...typescript2(),
apply: 'build',
},
],
})
更多的使用方法:Vite官網(wǎng)
更多的插件:Vite插件
總結(jié)
1、相對(duì)vite來說,webpack在本地起服務(wù)時(shí),會(huì)讀取所有的模塊,所有到底本地啟動(dòng)和編譯的時(shí)候比較緩慢,但是webpack的兼容性比較好,支持Commonjs規(guī)范。vite只能構(gòu)建瀏覽器端的應(yīng)用,而webpack還能構(gòu)建node端的應(yīng)用,所以沒有必要非要使用Vite,而是針對(duì)項(xiàng)目而定。
2、Vite在預(yù)構(gòu)建時(shí)基于esbuild進(jìn)行的,但是esbuild的兼容性不好,還不太穩(wěn)定,所以暫時(shí)最好不要使用esbuild,未來可學(xué)習(xí)(對(duì)我自己說的)。