vite.config.ts 配置
作用
vite.config.ts
是 Vite 项目的核心配置文件 ,用于自定义 Vite 的构建行为、开发服务器设置、插件等。它位于项目根目录,使用 TypeScript 编写(也可以是 vite.config.js
)。修改 vite.config.ts
后,不需要重启服务器 ,Vite 会自动热重载。可以通过 defineConfig
获得类型提示和自动补全。
主要功能
功能类别 | 示例配置说明 |
---|---|
开发服务器 | 设置端口、代理、HTTPS、自动打开浏览器等 |
构建输出 | 输出目录、打包格式、压缩方式等 |
插件系统 | 加载插件(如 React、Vue、UnoCSS、自动导入等) |
路径别名 | 设置 @ 指向 src 目录 |
环境变量 | 区分开发/生产环境,读取 .env 文件 |
优化行为 | 分包策略、预构建依赖、CDN 替换等 |
配置项解释
配置项 | 作用说明 |
---|---|
plugins |
加载插件,如 @vitejs/plugin-react 支持 React |
resolve.alias |
设置路径别名,简化导入路径 |
server.port |
设置本地开发服务器端口 |
server.proxy |
配置 API 代理,解决跨域问题 |
build.outDir |
设置打包输出目录,默认是 dist |
build.rollupOptions |
自定义 Rollup 打包行为,如分包 |
空React项目默认vite.config.ts
ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vite.dev/config/
export default defineConfig({
// react插件
plugins: [react()],
})
常用的配置
配置1
ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
},
server: {
port: 3000,
open: true,
proxy: {
'/api': {
target: 'http://localhost:5000',
changeOrigin: true,
},
},
},
build: {
outDir: 'dist',
minify: 'terser',
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
},
},
},
},
})
package.json配置
package.json
是 Node.js / 前端项目的"身份证" ,它用 JSON 格式记录了项目的元数据、依赖、脚本命令等关键信息。
Vite、Create React App(CRA)、Next.js 等所有基于 Node 的工具链都会读取它。
核心字段
字段名 | 作用 | 示例 |
---|---|---|
name | 项目名称,必须全局唯一(若发布到 npm) | "name": "my-react-app" |
version | 当前版本号,遵循 SemVer 规范 | "version": "1.0.0" |
description | 项目简介,会显示在 npm 搜索页 | "description": "A demo React app built with Vite" |
main | 入口文件(CommonJS 模块) | "main": "dist/index.js" |
type | 指定模块系统:"module" 为 ES Module,"commonjs" 为 CommonJS |
"type": "module" |
scripts | 自定义命令,如 npm run dev / npm run build |
见下方示例 |
dependencies | 生产依赖(项目运行时必需) | "react": "^18.2.0" |
devDependencies | 开发依赖(仅在开发/构建阶段使用) | "vite": "^5.0.0" |
peerDependencies | 同伴依赖(插件/库要求宿主项目必须安装) | "react": ">=16.8.0" |
engines | 指定 Node / npm 版本限制 | "node": ">=18" |
private | 设为 true 可防止意外发布到 npm |
"private": true |
常用命令
命令 | 实际运行的脚本 | 作用 |
---|---|---|
npm run dev |
vite |
启动 Vite 开发服务器 |
npm run build |
tsc && vite build |
先类型检查,再打包 |
npm run preview |
vite preview |
本地预览构建产物 |
npm run lint |
eslint ... |
代码风格检查 |
配置细节
版本号:^ 与 ~ 的区别
"^18.2.0"
:可升级18.x.x
的最新补丁或次版本(不跨主版本)。"~18.2.0"
:只能升级18.2.x
的最新补丁。- 无符号如
"18.2.0"
:锁定精确版本。
依赖管理
查看依赖树
bash
npm ls
升级依赖
sql
npm update
# 或交互式升级
npx npm-check -u
配置模版
模版1
json
{
"name": "my-react-app",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/react": "^18.2.43",
"@types/react-dom": "^18.2.17",
"@vitejs/plugin-react": "^4.2.1",
"eslint": "^8.55.0",
"typescript": "^5.2.2",
"vite": "^5.0.8"
}
}
antd pro项目配置(比较规范)
json
{
"name": "ant-design-pro",
"version": "6.0.0",
"private": true,
"description": "An out-of-box UI solution for enterprise applications",
"repository": "git@github.com:ant-design/ant-design-pro.git",
"scripts": {
"analyze": "cross-env ANALYZE=1 max build",
"biome:lint": "npx @biomejs/biome lint",
"build": "max build",
"deploy": "npm run build && npm run gh-pages",
"dev": "npm run start:dev",
"gh-pages": "gh-pages -d dist",
"i18n-remove": "pro i18n-remove --locale=zh-CN --write",
"postinstall": "max setup",
"jest": "jest",
"lint": "npm run biome:lint && npm run tsc",
"lint-staged": "lint-staged",
"openapi": "max openapi",
"prepare": "husky",
"preview": "npm run build && max preview --port 8000",
"record": "cross-env NODE_ENV=development REACT_APP_ENV=test max record --scene=login",
"serve": "umi-serve",
"start": "cross-env UMI_ENV=dev max dev",
"start:dev": "cross-env REACT_APP_ENV=dev MOCK=none UMI_ENV=dev max dev",
"start:devmock": "cross-env REACT_APP_ENV=dev UMI_ENV=dev max dev",
"start:no-mock": "cross-env MOCK=none UMI_ENV=dev max dev",
"start:pre": "cross-env REACT_APP_ENV=pre UMI_ENV=dev max dev",
"start:test": "cross-env REACT_APP_ENV=test MOCK=none UMI_ENV=dev max dev",
"test": "jest",
"test:coverage": "npm run jest -- --coverage",
"test:update": "npm run jest -- -u",
"tsc": "tsc --noEmit"
},
"browserslist": [
"defaults"
],
"dependencies": {
"@ant-design/icons": "^5.6.1",
"@ant-design/pro-components": "^2.7.19",
"@ant-design/v5-patch-for-react-19": "^1.0.3",
"@monaco-editor/react": "^4.7.0",
"antd": "^5.26.4",
"antd-style": "^3.7.0",
"classnames": "^2.5.1",
"dayjs": "^1.11.13",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"vanilla-jsoneditor": "^3.8.0"
},
"devDependencies": {
"@ant-design/pro-cli": "^3.3.0",
"@biomejs/biome": "^2.0.6",
"@commitlint/cli": "^19.5.0",
"@commitlint/config-conventional": "^19.5.0",
"@testing-library/dom": "^10.4.0",
"@testing-library/react": "^16.0.1",
"@types/express": "^5.0.3",
"@types/jest": "^30.0.0",
"@types/lodash": "^4.17.10",
"@types/node": "^24.0.10",
"@types/react": "^19.1.5",
"@types/react-dom": "^19.1.5",
"@types/react-helmet": "^6.1.11",
"@umijs/max": "^4.3.24",
"cross-env": "^7.0.3",
"express": "^4.21.1",
"gh-pages": "^6.1.1",
"husky": "^9.1.7",
"jest": "^30.0.4",
"jest-environment-jsdom": "^29.7.0",
"lint-staged": "^16.1.2",
"mockjs": "^1.1.0",
"ts-node": "^10.9.2",
"typescript": "^5.6.3",
"umi-presets-pro": "^2.0.3",
"umi-serve": "^1.9.11"
},
"engines": {
"node": ">=20.0.0"
},
"packageManager": "pnpm@9.15.4+sha512.b2dc20e2fc72b3e18848459b37359a32064663e5627a51e4c74b2c29dd8e8e0491483c3abb40789cfd578bf362fb6ba8261b05f0387d76792ed6e23ea3b1b6a0"
}
prettierrc代码格式化配置
.prettierrc.json
.prettierrc.json 是 Prettier 的全局格式化规则文件,放在项目根目录即可生效。 它用 JSON 格式声明所有可用的格式化选项,优先级高于 IDE 设置,确保团队代码风格绝对一致。
配置属性
字段 | 类型 | 默认值 | 说明 | 示例 |
---|---|---|---|---|
printWidth | number |
80 |
单行最大字符数,超过即换行 | "printWidth": 100 |
tabWidth | number |
2 |
每个缩进级别的空格数 | "tabWidth": 4 |
useTabs | boolean |
false |
用 Tab 还是 空格 缩进 | "useTabs": false ➜ 空格 |
semi | boolean |
true |
语句末尾是否加分号 | "semi": false ➜ 去掉分号 |
singleQuote | boolean |
false |
字符串使用单引号还是双引号 | "singleQuote": true |
quoteProps | `"as-needed" | "consistent" | "preserve"` | "as-needed" |
trailingComma | `"none" | "es5" | "all"` | "es5" |
bracketSpacing | boolean |
true |
对象字面量 {} 中括号内侧是否保留空格 |
{ foo: 1 } vs {foo: 1} |
bracketSameLine | boolean |
false |
JSX 的 > 是否与最后一行属性同行 |
<div > vs <div> |
arrowParens | `"always" | "avoid"` | "always" |
箭头函数参数是否强制括号 |
endOfLine | `"lf" | "crlf" | "cr" | "auto"` |
embeddedLanguageFormatting | `"auto" | "off"` | "auto" |
是否格式化 markdown / html 中的代码块 |
htmlWhitespaceSensitivity | `"css" | "strict" | "ignore"` | "css" |
jsxSingleQuote | boolean |
false |
JSX 中字符串使用单引号 | "jsxSingleQuote": true |
proseWrap | `"always" | "never" | "preserve"` | "preserve" |
配置示例
json
{
"singleQuote": true,
"semi": false,
"bracketSpacing": true,
"htmlWhitespaceSensitivity": "ignore",
"endOfLine": "auto",
"trailingComma": "all",
"tabWidth": 2
}
json
{
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"quoteProps": "as-needed",
"trailingComma": "es5",
"bracketSpacing": true,
"bracketSameLine": false,
"arrowParens": "always",
"endOfLine": "lf",
"embeddedLanguageFormatting": "auto",
"htmlWhitespaceSensitivity": "css",
"jsxSingleQuote": false,
"proseWrap": "preserve"
}
.prettierrcignore
配置不对哪些文件进行代码格式化,创建 .prettierignore 排除不想格式化的文件/目录,内容同 .gitignore。
bash
/dist/*
/html/*
.local
/node_modules/**
**/*.svg
**/*.sh
/public/*
与VSCode集成
安装 Prettier 插件 并勾选"保存时格式化"。
cli格式化命令
css
执行格式化
npx prettier --write .
格式化检查
npx prettier --check .
eslint 规范配置
.eslintrc.ts
.eslintrc.ts 是 ESLint 的配置文件,采用 TypeScript 语法编写(需额外安装 @typescript-eslint/parser)。 它告诉 ESLint:
- 用哪些规则(rules)
- 解析什么语法(parser)
- 继承哪些预设(extends)
- 忽略哪些文件(ignorePatterns)
- 支持哪些全局变量(globals)
属性解释
字段 | 用途 | 常见值 | ||||
---|---|---|---|---|---|---|
root | true 表示这是根配置,不再向上查找 .eslintrc.* |
true |
||||
env | 预定义全局变量集合 | browser , node , es2022 , jest |
||||
extends | 继承共享配置(可叠加) | eslint:recommended , @typescript-eslint/recommended , prettier |
||||
parser | 指定代码解析器 | @typescript-eslint/parser , @babel/eslint-parser |
||||
parserOptions | 传给解析器的额外参数 | ecmaVersion , sourceType: 'module' , ecmaFeatures.jsx |
||||
plugins | 加载插件包(提供额外 rules) | react , @typescript-eslint , react-hooks , jsx-a11y |
||||
rules | 规则开关与级别 | `0 | 1 | 2或 "off" |
"warn" | "error"` |
settings | 插件共享数据 | react.version: 'detect' |
||||
ignorePatterns | 排除文件/目录 | ['dist', 'vite.config.ts'] |
规则级别
简写 | 全称 | 效果 |
---|---|---|
0 / "off" |
关闭规则 | 不检查 |
1 / "warn" |
警告 | 控制台黄色提示,不会阻断构建 |
2 / "error" |
报错 | 控制台红色,CI 可阻断 |
配置模版
ts
module.exports = {
root: true, // 指定了root为true,eslint只检查当前项目目录
env: {
// 提供预设的全局变量,避免eslint检查报错,例如window
browser: true,
node: true,
es6: true,
},
extends: [
// 继承eslint推荐的检查规则
'eslint:recommended',
],
parserOptions: {
ecmaVersion: 'latest', // 指定ECMAScript 语法为最新
sourceType: 'module', // 指定代码为 ECMAScript 模块
ecmaFeatures: {
tsx: true, // 启用tsx
},
},
}
ts
// .eslintrc.ts
import { Linter } from 'eslint';
const config: Linter.Config = {
root: true, // 停止向上查找父级配置
env: {
browser: true,
es2022: true,
node: true,
},
extends: [
'eslint:recommended', // ESLint 内置推荐规则
'@typescript-eslint/recommended', // TS 推荐规则
'plugin:react/recommended', // React 推荐规则
'plugin:react-hooks/recommended', // React Hooks 规则
'plugin:jsx-a11y/recommended', // 无障碍规则
'prettier', // 关闭与 Prettier 冲突的规则
],
parser: '@typescript-eslint/parser', // 用 TS 解析器
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
ecmaFeatures: { jsx: true }, // 支持 JSX
},
plugins: ['react', '@typescript-eslint', 'react-hooks', 'jsx-a11y'],
rules: {
// 自定义规则:0=off 1=warn 2=error
'react/react-in-jsx-scope': 0, // React 17+ 不再需要 import React
'@typescript-eslint/no-unused-vars': 1,
'prefer-const': 'error',
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'warn',
},
settings: {
react: { version: 'detect' }, // 自动读取 package.json 中的 react 版本
},
ignorePatterns: ['dist', 'node_modules', '*.config.{js,ts}'],
};
export default config;
常用cli命令
命令 | 说明 |
---|---|
npx eslint src --ext .ts,.tsx |
手动检查 |
npx eslint . --fix |
自动修复可修复的问题 |
npx eslint . --max-warnings 0 |
任何 warning 也视为 CI 失败 |
快速安装(React+TS)
bash
npm i -D \
eslint \
@typescript-eslint/parser \
@typescript-eslint/eslint-plugin \
eslint-plugin-react \
eslint-plugin-react-hooks \
eslint-plugin-jsx-a11y \
eslint-config-prettier
hsky 配置
根目录创建 .hsky 文件夹
pre-commit
commit前检查
lint-staged
commit-msg
commit-msg提交信息检查
css
npx --no -- commitlint --edit $1
_文件夹
sh
#!/usr/bin/env sh
if [ -z "$husky_skip_init" ]; then
debug () {
if [ "$HUSKY_DEBUG" = "1" ]; then
echo "husky (debug) - $1"
fi
}
readonly hook_name="$(basename -- "$0")"
debug "starting $hook_name..."
if [ "$HUSKY" = "0" ]; then
debug "HUSKY env variable is set to 0, skipping hook"
exit 0
fi
if [ -f ~/.huskyrc ]; then
debug "sourcing ~/.huskyrc"
. ~/.huskyrc
fi
readonly husky_skip_init=1
export husky_skip_init
sh -e "$0" "$@"
exitCode="$?"
if [ $exitCode != 0 ]; then
echo "husky - $hook_name hook exited with code $exitCode (error)"
fi
if [ $exitCode = 127 ]; then
echo "husky - command not found in PATH=$PATH"
fi
exit $exitCode
fi