# Vite 與環境變數設定
###### tags: `Vite`
## Vite Config 說明
當建立完成Vite專案時,根目錄中會有一個檔案名為vite.config.js,當以命令行方式運行 vite 時,Vite會自動解析項目根目錄下該支檔案,所以關於Vite相關設定,都在vite.config.js中設定。
![](https://i.imgur.com/YDoNqDi.png)
## Vite Config 設定
當專案建立時,會自動產生vite.config.js,內容如下圖
![](https://i.imgur.com/HokCO3L.png)
### Step 1.改寫 defineConfig
首先我們先把defineConfig內的參數,改寫成有參數的function,再來透過loadEnv,讀取環境變數。
VITE_BASE是我設定的環境變數,在Step 2.會說明如何設定。
``` javascript=
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig(({ command, mode, ssrBuild }) => {
// 根據當前工作目錄中的 `mode` 加載 .env 文件
// 設置第三個參數為 '' 來加載所有環境變量,而不管是否有 `VITE_` 前綴。
const env = loadEnv(mode, process.cwd())
console.log( env.VITE_BASE); //輸出VITE_BASE的環境變數
return {
plugins: [vue()],
}
})
```
### Step 2.環境變數設定
Vite專案建立時,會預設建立兩種執行模式,分別是development與production,對應三個指令,分別如下:
:::info
npm run dev --> development
npm run build --> production
npm run preview --> production
:::
### 那如何針對不同模式設定專屬的環境變數呢?
在官方文件中有提到,開發者可以在專案的根目錄內,自行建立.env.development與.env.production兩支檔案,當專案在執行時,就對依不同模式,載入個別的設定檔。
![](https://i.imgur.com/8Xn0ofB.png)
![](https://i.imgur.com/LIXW87d.png)
當開發過程中,覺得只有兩個模式不夠用時,可以在自訂義新模式
在根目錄中,新增一個.env.<font style='color:red'>新模式名稱</font>
![](https://i.imgur.com/fHNuDwa.png)
在package.json,新增呼叫該模式的指令
:::info
"build:<font style='color:red'>新模式名稱</font>": "vite build --mode <font style='color:red'>新模式名稱</font>"
:::
![](https://i.imgur.com/B3o8FVe.png)
#### 環境變數引用範例
``` javascript=
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig(({ command, mode, ssrBuild }) => {
// 根據當前工作目錄中的 `mode` 加載 .env 文件
// 設置第三個參數為 '' 來加載所有環境變量,而不管是否有 `VITE_` 前綴。
const env = loadEnv(mode, process.cwd())
console.log( env.VITE_BASE); //輸出VITE_BASE的環境變數
return {
plugins: [vue()],
base: env.VITE_BASE, //不同模式設定不同路徑
}
})
```
### Step 3.Vite Config 常用設定
#### 路徑別名設置
我們可以import path,來進行路徑別名的設定。
:::warning
path:處理路徑模組提供用於處理文件和目錄路徑的實用程序。
_dirname: vite.config.js 文件所在的目錄。
:::
``` javascript=
import path from 'path';
export default defineConfig(({ command, mode, ssrBuild }) => {
...
return {
...
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'/images': 'src/assets/images',
}
},
}
}
```
當程式碼在import檔案時,即可做以下修改。
``` javascript=
import HelloWorld from '@/components/HelloWorld.vue'
```
以別名方式引入圖片
``` html=
<img src="/images/logo.png" alt="">
```
#### css 配置
全局都可以引用base.scss ,需在config中進行設置,範例如下:
``` javascript=
export default defineConfig(({ command, mode, ssrBuild }) => {
...
return {
...
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/assets/scss/base.scss";`
}
}
},
}
}
```
#### 跨domain proxy 設定
``` javascript=
export default defineConfig(({ command, mode, ssrBuild }) => {
...
return {
...
server: {
proxy: {
// 字串寫法
'/foo': 'http://localhost:4567',
// 選項寫法
'/api': {
target: 'http://jsonplaceholder.typicode.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
},
// 正則寫法
'^/fallback/.*': {
target: 'http://jsonplaceholder.typicode.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/fallback/, '')
},
}
}
}
}
```
#### 跨domain proxy 設定
``` javascript=
// vite.config.js
// enforce:
// pre:在 Vite 核心插件之前呼叫該插件
// 預設:在 Vite 核心插件之後呼叫該插件
// post:在 Vite 建置插件之後呼叫該插件
// apply:
// 屬性指明它們僅在 'build' 或 'serve' 模式時調用
import image from '@rollup/plugin-image'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
{
...image(),
enforce: 'pre',
apply: 'build',
},
],
})
```
#### 共享配置
[請觀看官方文檔](https://cn.vitejs.dev/config/shared-options.html#esbuild)
## 參考資料
* [Config 常見配置](https://ithelp.ithome.com.tw/articles/10270465)
* [環境變數設定](https://editor.leonh.space/2021/vite/)
* [官方文檔配置 Vite](https://cn.vitejs.dev/config/)
* [官方文檔-環境變量和模式](https://cn.vitejs.dev/guide/env-and-mode.html#modes)
* [vite處理各種靜態資源](https://juejin.cn/post/7163543129797328904)
* [配置Vite2环境变量](https://blog.csdn.net/Big_Wee/article/details/119212231)
* [vite 插件推荐](https://hu-snail.github.io/vue3-resource/platform/vite.html)
* [vite.config.js 完整配置](https://blog.csdn.net/tangkthh/article/details/120176518)