Vite 的學(xué)習(xí)筆記

聲明

本人也在不斷的學(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 的打包過程

image.png

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ì)我自己說的)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容