Vite
Vite 是一个快速、现代化的前端构建工具,旨在提供开发者友好的开发体验和优化的性能。
一、安装
npm install vite
# 创建 Vite 项目,并安装项目所需的依赖项
npm create vite@latest
二、配置
当以命令行方式运行 vite 时,Vite 会自动解析 项目根目录 下名为 vite.config.js
的文件。
1、依赖预构建
当你首次启动 vite 时,Vite 在本地加载你的站点之前预构建了项目依赖。默认情况下,它是自动且透明地完成的。
import { defineConfig } from 'vite'
export default defineConfig({
optimizeDeps: {
include: ['linked-dep']
}
})
2、智能提示
方式一
/** @type {import('vite').UserConfig} */
export default {
// ...
}
方式二
import { defineConfig } from 'vite'
export default defineConfig({
// ...
})
3、环境变量与模式
.env
.env
文件是一个常见的配置文件,用于存储应用程序的环境变量。它的名称是以 ".env" 开头的,通常位于应用程序的根目录下。采用简单的键值对的格式,每行表示一个环境变量。Vite 使用 .env
从 环境目录 中的下列文件加载额外的环境变量:
.env
:所有情况下都会加载.env.local
:所有情况下都会加载,但会被 git 忽略.env.[mode]
:只在指定模式下加载.env.[mode].local
:只在指定模式下加载,但会被 git 忽略
#.env:所有环境变量配置文件,且以 VITE_ 为前缀的变量会被暴露为 import.meta.env.VITE_API_KEY 提供给客户端源码
DB_HOST=localhost
DB_PORT=5432
VITE_API_KEY=abc123
#.env.development:开发环境变量配置文件默认名称,且以 DEV_ 为前缀的变量会被暴露为 import.meta.env.DEV_API_KEY 提供给客户端源码
DB_HOST=localhost
DB_PORT=5432
DEV_API_KEY=abc456
#.env.production:生产环境变量配置文件默认名称,且以 PROD_ 为前缀的变量会被暴露为 import.meta.env.PROD_API_KEY 提供给客户端源码
DB_HOST=localhost
DB_PORT=5432
PROD_API_KEY=abc789
TIP
加载的环境变量也会通过 import.meta.env
以字符串形式暴露给客户端源码。
为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_
为前缀的变量才会暴露给经过 vite
处理的代码。如果想自定义 env
变量的前缀,需要配置 envPrefix
选项。
axios.post(url, {
params: {
API_KEY: import.meta.env.VITE_API_KEY // 或 DEV_API_KEY、PROD_API_KEY
}
})
vite.base.config.js
import { defineConfig } from 'vite'
export default defineConfig({
envPrefix: 'VITE_';
})
vite.prod.config.js
import { defineConfig } from 'vite'
export default defineConfig({
envPrefix: 'PROD_';
})
vite.dev.config.js 文件
import { defineConfig } from 'vite'
export default defineConfig({
envPrefix: 'DEV_';
})
vite.config.js
import { defineConfig, loadEnv } from 'vite'
import viteBaseConfig from './vite.base.config';
import viteProdConfig from './vite.prod.config';
import viteDevConfig from './vite.dev.config';
const envResolver = {
"build": () => {
console.log('生产环境');
return ({...viteBaseConfig, ...viteProdConfig})
},
"dev": () => {
console.log('开发环境');
reutrn ({...viteBaseConfig, ...viteDevconfig})
}
}
export default defineConfig(({ command, mode }) => { //command:npm run dev/build ,mode:--mode development/production
console.log('command', command);
const env = loadEnv(mode, process.cwd(), ''); //process.cwd():返回当前node进程的工作目录
console.log('ENV:', env);
reutrn envResolver[command]();
})
HTML 环境变量替换
Vite 还支持在 HTML 文件中替换环境变量。import.meta.env 中的任何属性都可以通过特殊的 %ENV_NAME% 语法在 HTML 文件中使用:
<h1>Vite is running in %MODE%</h1>
<p>Using data from %VITE_API_URL%</p>
TIP
如果环境变量在 import.meta.env
中不存在,比如不存在的 %NON_EXISTENT%
,则会将被忽略而不被替换,这与 JS 中的 import.meta.env.NON_EXISTENT
不同,JS 中会被替换为 undefined
。
模式
默认情况下,开发服务器 (dev 命令) 运行在 development (开发) 模式,而 build 命令则运行在 production (生产) 模式。
这意味着当执行 npm run build
时,它会自动加载 .env.production
中可能存在的环境变量;当执行 npm run dev
时,它会自动加载 .env.development
中可能存在的环境变量。
在某些情况下,若想在 npm run build
时运行不同的模式来渲染不同的环境变量,你可以通过传递 --mode
选项标志来覆盖命令使用的默认模式,且还需要新建一个 .env.mode-name
文件。
# 运行开发环境服务器
npm run dev # 默认对应 .env.development 文件
npm run dev --mode development # 对应 .env.development 文件
npm run dev --mode dev # 对应 .env.dev 文件
# 运行生产环境服务器
npm run build # 默认对应 .env.production 文件
npm run build --mode production # 对应 .env.production 文件
npm run build --mode prod #对应 .env.prod 文件
4、CSS
CSS Modules
任何以 .module.css 为后缀名的 CSS 文件都被认为是一个 CSS modules 文件。导入这样的文件会返回一个相应的模块对象。
import { defineConfig } from 'vite'
export default defineConfig({
css:{
module:{
scopeBehaviour?: 'global' | 'local'
globalModulePaths?: RegExp[]
generateScopedName?: string | ((name, filename, css) => string)
hashPrefix?: string
localsConvention?: 'camelCase' | 'camelCaseOnly' | 'dashes' | 'dashesOnly' //默认:null
}
}
})
CSS 预处理器
由于 Vite 的目标仅为现代浏览器,因此建议使用原生 CSS 变量和实现 CSSWG 草案的 PostCSS 插件(例如 postcss-nesting)来编写简单的、符合未来标准的 CSS。Vite 也同时提供了对 .scss, .sass, .less, .styl 和 .stylus 文件的内置支持。没有必要为它们安装特定的 Vite 插件,但必须安装相应的预处理器依赖。
# .scss and .sass
npm add -D sass
# .less
npm add -D less
# .styl and .stylus
npm add -D stylus
import { defineConfig } from 'vite'
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: `$injectedColor: orange;`
},
less: {
math: 'parens-division'
},
styl: {
define: {
$specialColor: new stylus.nodes.RGBA(51, 197, 255, 1)
}
}
},
devSourcemap: true //在开发过程中是否启用 sourcemap,开启后会显示源文件索引
}
})
PostCSS
import { defineConfig } from 'vite'
import tailwindcss from 'tailwindcss'
export default defineConfig({
css: {
postcss: {
plugins: [tailwindcss]
}
}
})
5、静态资源
import { defineConfig } from 'vite';
import path form 'path';
export default defineConfig({
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
}
}
})
6、打包生产
import { defineConfig } from 'vite'
export default defineConfig({
build: {
rollupOptions: {
output: {
assetFileNames: '[hash].[name].[ext]'
}
},
assetsInlineLimit: 409600, //4000kb
outDir: 'dist',
assetsDir: 'static'
}
})
7、插件
vite-html-plugin
安装插件
npm i vite-html-plugin
使用插件
import { defineConfig } from 'vite';
import htmlPlugin form 'vite-html-plugin';
export default defineConfig({
plugins: [
htmlPlugin({ //用法参见github
inject: {
data: {
title: '主页'
}
}
})
]
})
vite-plugin-mock
安装插件
npm i vite-plugin-mock
使用插件
import { defineConfig } from 'vite';
import mockPlugin form 'vite-plugin-mock';
export default defineConfig({
plugins: [
mockPlugin()
]
})
8、TypeScript 的智能提示
vite-plugin-checker 提供 TypeScript、ESLint、vue-tsc 等检查。
安装插件
npm i vite-plugin-checker -D
使用插件
import { defineConfig } from 'vite';
import checker form 'vite-plugin-checker';
export default defineConfig({
plugins: [
checker:{
typescript:true
}
]
})
TIP
- vite-plugin-checker 插件需要安装 TypeScrit,且创建 tsconfig.json 配置文件
{
"compilerOption": {
"skipLibCheck": true,
"isolatedModules": true
}
}
- 在构建生产版本时,你可以在 Vite 的构建命令之外运行
tsc --noEmit
进行类型检查,若报错则不进行构建
env.d.ts 或 vite-env.d.ts 默认情况下,Vite 在 vite/client.d.ts
中为 import.meta.env
提供了类型定义。随着在 .env
文件中自定义了越来越多的环境变量,你可能想要在代码中获取这些以 VITE_
为前缀的用户自定义环境变量的 TypeScript 智能提示。
要想做到这一点,你可以在 src 目录下创建一个 env.d.ts
文件,接着按下面这样增加 ImportMetaEnv
的定义:
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_API_KEY: string
}
如果代码依赖于浏览器环境的类型,比如 DOM 和 ES2017,你可以在 tsconfig.json 中修改 lib 字段来获取类型支持。
{
"compilerOption": {
"module": "ESNext", //为了支持import.meta.env
"lib": ["ES2017", "DOM"]
}
}
9、跨域
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://jsonplaceholder.typicode.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
}
})