開(kāi)始使用vite
搭建第一個(gè)vite項(xiàng)目
npm create vite@latest
然后按照提示操作即可!
你還可以通過(guò)附加的命令行選項(xiàng)直接指定項(xiàng)目名稱和你想要使用的模板。例如,要構(gòu)建一個(gè) Vite + Vue 項(xiàng)目,運(yùn)行:
npm create vite@latest my-vue-vite-app -- --template vue
vite配置文件
在 Vite 中,配置文件是項(xiàng)目根目錄下的 vite.config.js 文件,最基本的格式為:
export default {
// 配置選項(xiàng)
}
如果你的 Vite 配置文件不在項(xiàng)目根目錄下,你也可以通過(guò) --config 來(lái)進(jìn)行指定:
vite --config my-config.js
Vite 提供了一個(gè)工具函數(shù) defineConfig,通過(guò)它可以方便的獲取類型提示,這對(duì)于使用 TS 編寫配置尤其有用。
所以一般 Vite 配置文件的基本格式為:
export default defineConfig({
// 配置選項(xiàng)
})
在 Vite 中,配置大致分為這么幾類:
- 普通配置:設(shè)置項(xiàng)目的基本選項(xiàng),別名、根目錄、插件....
- 開(kāi)發(fā)服務(wù)器配置:開(kāi)發(fā)服務(wù)器的功能,開(kāi)發(fā)服務(wù)器的端口、代理、CORS....
- 構(gòu)建配置:構(gòu)建生產(chǎn)版本時(shí)候的配置,輸出目錄、壓縮、CSS代碼拆分....
- 預(yù)覽配置:配置預(yù)覽服務(wù)器的行為,端口、主機(jī)名...
- 依賴優(yōu)化配置:針對(duì)依賴預(yù)打包做一些配置,比如可以新增包或者排除包
- SSR配置:服務(wù)器端渲染相關(guān)配置
- Worker配置:Web Worker相關(guān)配置
普通配置
1. root
- 類型:string
- 默認(rèn)值:process.cwd( ) ,默認(rèn)就是項(xiàng)目根目錄
- 描述:index.html 所在位置,可以是絕對(duì)路徑,也可以是相對(duì)于當(dāng)前工作目錄的路徑。
例如:
my-project/
├── public/
│ └── index.html
├── src/
│ ├── main.js
│ └── App.vue
└── vite.config.js
這個(gè)時(shí)候就可以使用 root 來(lái)進(jìn)行配置:
// vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
root: 'public', // 將項(xiàng)目根目錄設(shè)置為 'public' 文件夾
});
2. define
類型:Record<string, any>
-
描述:定義全局常量替換。在開(kāi)發(fā)過(guò)程中,這些條目將被定義為全局變量,被定義為全局變量后,意味著不需要通過(guò) import 來(lái)導(dǎo)入,直接使用;在構(gòu)建過(guò)程中會(huì)被靜態(tài)替換。
export default defineConfig({ define: { __APP_VERSION__: JSON.stringify('v1.0.0'), __API_URL__: 'window.__backend_api_url', }, })
注意:Vite 使用 esbuild 的 define 進(jìn)行替換,因此值表達(dá)式必須是包含 JSON 可序列化的 值(null、boolean、number、string、array、object)的字符串或單個(gè)標(biāo)識(shí)符。對(duì)于非字符串值,Vite 會(huì)自動(dòng)將其轉(zhuǎn)換為 JSON 字符串。
3. resolve
resolve 對(duì)應(yīng)的值是一個(gè)對(duì)象,對(duì)象里面對(duì)應(yīng)了好幾項(xiàng)配置。
alias
用于配置路徑別名,這樣可以簡(jiǎn)化模塊路徑引用。
// vite.config.js
import { defineConfig } from 'vite';
import path from 'path';
export default defineConfig({
resolve: {
alias: {
// 將 '@' 指向 'src' 目錄
'@': path.resolve(__dirname, 'src'),
// 將 '@components' 指向 'src/components' 目錄
'@components': path.resolve(__dirname, 'src/components'),
// 將 '@utils' 指向 'src/utils' 目錄
'@utils': path.resolve(__dirname, 'src/utils'),
},
},
});
之后在代碼中就可以通過(guò)別名來(lái)指定目錄:
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import HelloWorld from '@components/HelloWorld.vue'; // 使用 '@components' alias
import { helperFunction } from '@utils/helpers'; // 使用 '@utils' alias
createApp(App).mount('#app');
extensions
在導(dǎo)入時(shí)省略文件擴(kuò)展名時(shí),嘗試的文件擴(kuò)展名列表。
注意,不推薦對(duì)自定義導(dǎo)入類型(如 .vue)省略擴(kuò)展名,因?yàn)檫@可能會(huì)干擾 IDE 和類型支持。
默認(rèn)值為 ['.mjs', '.js', '.mts', '.ts', '.jsx', '.tsx', '.json']
可以自定義擴(kuò)展名的順序,比如優(yōu)先匹配 ts 類型:
// vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'], // 自定義擴(kuò)展名順序
},
});
4. CSS
CSS 配置項(xiàng)對(duì)應(yīng)的值同樣是一個(gè)對(duì)象,一個(gè)基本的格式如下:
// vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
css: {
// 其他配置項(xiàng)
}
});
下面是一個(gè)常見(jiàn)的配置項(xiàng):
postcss:該配置項(xiàng)用于配置 PostCSS 的行為,可以是內(nèi)聯(lián)的 PostCSS 配置,也可以是自定義目錄。
內(nèi)聯(lián) PostCSS 配置:
// vite.config.js
import { defineConfig } from 'vite';
import autoprefixer from 'autoprefixer';
import cssnano from 'cssnano';
export default defineConfig({
css: {
postcss: {
// 在這里配置 postcss 相關(guān)信息,例如用哪個(gè)插件....
plugins: [
autoprefixer(),
cssnano()
]
}
}
});
自定義目錄:
my-project/
├── config/
│ └── postcss.config.js
├── src/
│ └── main.js
└── vite.config.js
這個(gè)時(shí)候直接指定 postcss 的目錄就可以了:
// vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
css: {
postcss: 'config' // 指定自定義目錄
}
});
preprocessorOptions:該配置項(xiàng)用于為 CSS 預(yù)處理器指定配置,文件擴(kuò)展名用于作為鍵來(lái)設(shè)置選項(xiàng)。每個(gè)預(yù)處理器支持的選項(xiàng)可以在它們各自的文檔中找到:
export default defineConfig({
css: {
// 配置 css 預(yù)處理器
preprocessorOptions: {
less: {
math: 'parens-division',
},
styl: {
// 目前僅支持 define
define: {
$specialColor: new stylus.nodes.RGBA(51, 197, 255, 1),
},
},
},
},
})
preprocessorOptions[extension].additionalData:當(dāng)你想要為 CSS 預(yù)處理器(如 SCSS、SASS、Less 等)添加全局樣式、變量、或混合器時(shí),該選項(xiàng)非常有用。
import { defineConfig } from 'vite';
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
// 這里添加了一些全局變量,之后在任何的 Scss 文件中都可以使用這些全局變量
additionalData: `$injectedColor: orange; $defaultMargin: 10px;`
}
}
}
});
import { defineConfig } from 'vite';
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
// 相當(dāng)于給所有的 Scss 文件的頭部都添加了這個(gè)引用,自動(dòng)導(dǎo)入 mixins.scss 混合器文件
additionalData: `@import "@/styles/mixins.scss";`
}
}
}
});
preprocessorMaxWorkers:如果啟用了這個(gè)選項(xiàng),那么 CSS 預(yù)處理器會(huì)盡可能在 worker 線程中運(yùn)行??梢栽O(shè)置 number 值,也可以設(shè)置布爾值,例如設(shè)置成 true 的話表示 CPU 數(shù)量減 1.
devSourcemap:在開(kāi)發(fā)過(guò)程中是否啟用 source maps,默認(rèn)值為 false.
export default defineConfig({
css: {
// 開(kāi)啟 source maps
devSourcemap: true
}
});
transformer:指定 CSS 處理的引擎,可以設(shè)置的值就兩個(gè),'postcss' 或者 'lightningcss'
lightingcss 就是 postcss 的 rust 版本。
服務(wù)器配置
服務(wù)器配置是指開(kāi)發(fā)服務(wù)器,對(duì)應(yīng)的配置項(xiàng)是 server
一個(gè)基本的格式如下:
export default defineConfig({
server: {
// 眾多配置項(xiàng)
},
})
下面是一個(gè)常見(jiàn)的配置項(xiàng):
host
指定服務(wù)器應(yīng)該監(jiān)聽(tīng)哪個(gè) IP 地址,默認(rèn)是 localhost.
類型: string | boolean
默認(rèn): 'localhost'
思考?? 正常情況下就是 localhost 就好了呀,什么情況下還存在要修改 host 的情況呢?
答案:除了 localhost 以外,我們經(jīng)常還需要設(shè)置為 0.0.0.0 或者 true,表示監(jiān)聽(tīng)所有的網(wǎng)絡(luò)接口請(qǐng)求。有些時(shí)候需要多設(shè)備來(lái)測(cè)試應(yīng)用。
port
監(jiān)聽(tīng)的端口號(hào),默認(rèn)是 5173.
strictPort
如果設(shè)置為 true,Vite 將嚴(yán)格使用指定的端口。如果端口被占用,服務(wù)器啟動(dòng)將失敗。
proxy
這個(gè)配置項(xiàng)非常常用,用于配置代理服務(wù)器。
export default defineConfig({
server: {
proxy: {
'/foo': 'http://localhost:4567', // 將 '/foo' 前綴的請(qǐng)求代理到 'http://localhost:4567'
},
},
});
對(duì)應(yīng)的值也可以是對(duì)象的形式,對(duì)象形式能夠包含更多的配置選項(xiàng):
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://jsonplaceholder.typicode.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''), // 重寫路徑,將 '/api' 前綴去掉
},
},
},
});
open
啟動(dòng)開(kāi)發(fā)服務(wù)器時(shí)是否自動(dòng)在瀏覽器中打開(kāi)應(yīng)用,默認(rèn)值是 false.
https
是否啟用 HTTPS。如果是一個(gè)對(duì)象,可以指定 SSL 證書和私鑰的路徑。
export default defineConfig({
server: {
https: {
key: fs.readFileSync('/path/to/server.key'),
cert: fs.readFileSync('/path/to/server.crt')
}
},
});
watch
自定義文件監(jiān)視器的選項(xiàng)。這對(duì)于開(kāi)發(fā)過(guò)程中的熱模塊替換(HMR)非常關(guān)鍵。背后其實(shí)使用的是 chokidar,一個(gè) Node.js 的文件系統(tǒng)監(jiān)聽(tīng)?zhēng)?,它提供了多種可配置的監(jiān)聽(tīng)選項(xiàng)。
import { defineConfig } from 'vite';
export default defineConfig({
server: {
watch: {
// 任何位于 ignored-directory 目錄下的文件
// 或者任何目錄下面的 some-specific-file.txt 文件
// 內(nèi)容發(fā)生更改都不會(huì)觸發(fā) HMR
ignored: ['**/ignored-directory/**', '**/some-specific-file.txt']
}
}
});
watch 還支持更加細(xì)粒度的控制:
import { defineConfig } from 'vite';
export default defineConfig({
server: {
watch: {
ignored: '**/temp/**', // 忽略 temp 目錄
persistent: true, // 持續(xù)監(jiān)聽(tīng)變化
usePolling: true, // 使用輪詢
interval: 100, // 輪詢間隔 100 毫秒
binaryInterval: 300 // 對(duì)于二進(jìn)制文件的輪詢間隔
}
}
});
如果想要關(guān)閉文件監(jiān)聽(tīng),直接設(shè)置為 null 即可:
import { defineConfig } from 'vite';
export default defineConfig({
server: {
watch: null
}
});