0-1搭建vue3项目及配置
由于vite脚手架要禁止*.cjs 和 eslint版本升级废弃rc配置文件, 故重新搭建。
核心采用**
antfu**大神预设配置 替代prettier和eslint设置,保留stylelint原因是暂时antfu不支持。
1、前置条件
1.1、node版本
node 最好>20 因为eslint9的需要 本次项目node为20.15.1

1.2、包管理器
包管理器 采用pnpm

1.3、VsCode插件
1 | .vscode/extensions.json |






2、创建项目
1 | # 创建(二选一) |

如果pnpm版本是 v10.1.0 及以上,安装依赖包的时候pnpm i会有这个警告提示。因为pnpm 从 v10.1.0 开始引入安全机制,默认禁止依赖包运行构建脚本(如 postinstall),需要手动批准。若未明确允许 esbuild 的脚本执行,则会出现此警告。
解决:修改配置文件(适合长期配置)
1 | { |
3、强制使用pnpm
engines 字段用于指定支持的 Node.js 版本以及其他依赖包的版本范围。它既不具有提示作用也不具有限制作用,它仅仅是一个标准,告诉使用者该软件包支持哪些版本的环境。
"preinstall": "npx only-allow pnpm"则具有强制作用,必须使用pnpm。
1 | / package.json |

4、.vscode 配置文件
用于保存带代码格式化功能
.vscode/setting.json
1 | { |
这两行的作用就是文件嵌套作用
1 | "explorer.fileNesting.enabled": true, |

5、styleLint 【采用】
less和sass 推荐只选一个
5.1、依赖包
1 | devDependencies: |
5.2、安装
1 | # 选择sass |
| 依赖 | 说明 | 备注 |
|---|---|---|
| stylelint | stylelint核心库 | stylelint |
| stylelint-config-standard | Stylelint 的标准配置,适用于普通的 CSS 文件 | 帮助开发者编写一致、规范的 CSS 代码。 |
| stylelint-config-standard-scss | 专门为 SCSS(Sass)文件设计的标准配置 | 在此stylelint-config-standard基础上扩展了对 SCSS 语法的支持 |
| stylelint-config-standard-less | 专门为 less文件设计的标准配置 | 在此stylelint-config-standard基础上扩展了对 less语法的支持 |
| stylelint-config-recess-order | 提供优化样式顺序配置 | css样式书写顺序规范 |
| postcss | 处理 CSS 的工具 | 自动添加浏览器前缀、CSS 进行压缩、去除未使用的 CSS、合并相同的选择器等优化操作等等 |
| postcss-scss | postcss的scss解析器 | postcss-scss文档,支持css行类注释 |
| postcss-html | 解析html(类似html)的postcss语法 | postcss-html文档 |
如果项目使用的是scss就使用stylelint-config-standard-scss,如果scss和less都没使用则安装stylelint-config-standard
5.3、配置文件
stylelint.config.mjs
1 | /** @type {import('stylelint').Config} */ |
5.4、新增脚本
package.json
1 | { |
5.4、添加忽略文件
.stylelintignore
1 | /dist/* |
6、antfu 组合prettier&eslint 【采用】
配置网站 https://github.com/antfu/eslint-config/tree/feat/support-eslint-9?tab=readme-ov-file
先选一个unocss 免得后续再去安装unocss的@unocss/eslint-plugin
6.1、命令行界面 (CLI) 安装
1 | / 空格选择 回车下一步 |

最后一步选NO,配置setting.json中的内容,因为之前一次性配置了,因为这里选no。
1 | devDependencies: |
默认会添加这些依赖到包管理文件package.json(未安装),因此需要重新安装下依赖
1 | pnpm i |
6.2、配置文件
修改生成配置文件
eslint.config.js为eslint.config.mjs用于eslint规则校验
1 | import antfu from '@antfu/eslint-config' |
6.3、新增脚本
1 | { |
7、.gitignore文件
1 | # Logs |
8、代码提交检查
Husky + Lint-staged + Commitlint 来配置 Git 提交代码规范。
核心内容是配置 Husky 的
pre-commit和commit-msg两个钩子:**
pre-commit:**Husky + Lint-staged 整合实现 Git 提交前代码规范检测/格式化 (前提:ESlint + Prettier + Stylelint 代码统一规范);
commit-msg: Husky + Commitlint 整合实现生成规范化且高度自定义的 Git commit message。
8.1、husky Git 钩子工具
Husky 是 Git 钩子工具,可以设置在 git 各个阶段(pre-commit、commit-msg 等)触发。
官网https://typicode.github.io/husky 推荐安装指令
命令行界面 (CLI) 安装
1 | npx husky-init |


默认会添加这个依赖到包管理文件package.json(未安装),因此需要重新安装下依赖
1 | / pnpm i |

8.2、Lint-staged 检测提交代码
lint-staged 是一个在 git add 到暂存区的文件运行 linters (ESLint/Prettier/StyleLint) 的工具进行检测,避免在 git commit 提交时在整个项目执行。
1)安装
1 | pnpm i lint-staged -D |
2)配置文件
a、新建 lint-staged.config.mjs 配置文件
cache缓存能使钩子检测速度更快
1 | /** @type {import('lint-staged').Config} */ |
b、package.json 中添加指令
1 | "scripts": { |
c、文件.husky/pre-commit修改提交前钩子命令
提交的时候执行pre-commit文件中命令,然后触发package.json 中的lint:lint-staged,从而执行lint-staged.config.mjs配置文件去做检测。
1 | #!/usr/bin/env sh |

8.3、Commitlint 检测提交命名
Commitlint 检查您的提交消息是否符合 Conventional comm it format 规范。– Commitlint 官网
1)安装
1 | pnpm i @commitlint/cli @commitlint/config-conventional -D |
2)语法规范
1 | // 语法规范 |
3)语法拆解说明
- 头部(Header)
<type>: 提交的类型,常见的类型包括:feat: 新增功能fix: 修复缺陷docs: 文档变更style: 代码格式(不影响功能)refactor: 代码重构perf: 性能优化test: 添加测试或改动已有测试build: 构建过程或外部依赖的变更ci: 修改 CI 配置chore: 其他杂项更改revert: 回滚提交
<scope>: 可选,表示提交影响的范围(如模块名、文件名等),例如ui或api。可以用括号括起来。<subject>: 提交的简要描述,建议不超过 50 个字符,使用祈使句(例如:add login feature)。
- 正文(Body)
- 可选,用于详细描述提交的内容和背景。可以包含多行,建议每行不超过 72 个字符。
- 说明为什么要做这些更改,以及如何解决了问题或实现了功能。
- 尾部(Footer)
- 可选,通常用于引用相关的任务、问题编号或其他重要的元信息。
- 例如:
Closes #123或Fixes #456,表示这个提交关闭或修复了特定的问题。
4)注意

5)配置文件
根目录创建 commitlint.config.mjs 配置文件
1 | /** @type {import("@commitlint/types").UserConfig} */ |
执行下面命令生成 commint-msg 钩子用于 git 提交信息校验
1 | npx husky add .husky/commit-msg "npx --no -- commitlint --edit $1" |

9、其他
不使用antfu 直接使用prettier&eslint &styleLint
9.1、prettier
1)安装
1 | pnpm i prettier -D |
2)配置文件
根目录创建 prettier.config.mjs 配置文件
1 | /** @type {import('prettier').Config} */ |
9.2、eslint
使用9x版本 扁平化设计 导致很多插件版本滞后
1)安装
脚手架快速安装 然后pnpm i安装相关依赖包(如果创建项目的时候安装了,则不需要安装)
1 | pnpm create @eslint/config@latest |
额外安装
1 | pnpm i eslint-define-config eslint-plugin-import -D |
2)配置文件
修改eslint.config.js为eslint.config.mjs保持风格统一
1 | import globals from "globals"; |
10、简化组件命名
正常组件命名
1 | <template> |
使用vite-plugin-vue-setup-extend
1 | pnpm add vite-plugin-vue-setup-extend -D |
1 | // vite.config.ts |
组件中使用
1 | <script setup lang="ts" name="Person"></script> |
11、打包环境区分
vite.config.ts
1 | export default defineConfig((res) => { |
返回四个参数:
mode:当前的运行模式(例如development或production),没配置env文件默认就只有这两个值。command:当前运行的命令(例如serve或build),本地运行返回serve,使用打包之后返回的buildisSsrBuild:是否在进行服务器端渲染的构建。isPreview:是否在预览模式下运行。
实践可知:
在运行本地项目时:
有无.env文件时,vite.config.ts文件中res返回都是mode="development",command="serve";
在运行打包项目时:
默认无.env文件时,vite.config.ts文件中res返回mode="production",command="build";
有.env文件时,根据打包的配置来的 ,如果你打包运行的是.env.sit文件,res返回的则是mode="sit",command="build";
1 | // package.json |
vite.config.ts 中访问.env文件:
1 | import process from 'node:process' |
1 | // .env |
12、添加基准路径
1 | // router/index.ts |
1 | // vite.config.ts |
13、添加打包的dist文件预览配置
1 | // package.json |
14、本地代理服务配置
官网https://cn.vitejs.dev/config/server-options.html#server-proxy
vite.config.ts配置
1 | export default defineConfig({ |
参数解析
cors和changeOrigin
在 vite.config.ts 中,cors: true 和 changeOrigin: true 用于解决不同场景下的跨域问题,具体区别如下:
1、cors: true
- 作用:配置开发服务器(Vite Dev Server)的 CORS 响应头,允许浏览器跨域访问本地开发服务器的资源。
- 实现方式:
当设置为true时,Vite 会默认添加Access-Control-Allow-Origin: *响应头,允许所有来源的请求。若需更精细控制(如指定允许的域名),可通过CorsOptions对象配置。 - 适用场景:
用于本地开发环境,解决前端资源(如静态文件)被其他域名访问时的 CORS 限制。例如,主应用加载微前端子应用的资源时可能需要此配置。
2、changeOrigin: true
- 作用:在代理请求时修改请求头的
Origin字段为目标服务器的地址,绕过目标服务器的 CORS 校验。 - 实现方式:
代理将前端请求的Origin(如[http://localhost:3000 ](http://localhost:3000 ))改为目标服务器的域名(如[https://apiservice.com ](https://apiservice.com )),使目标服务器认为请求来自同源,从而避免 CORS 拦截。 - 适用场景:
用于代理接口请求,尤其是当前端与后端分离开发时。例如,将/api路径的请求代理到[http://localhost:8080 ],并通过changeOrigin: true让后端正常响应。
两者的区别
| 配置项 | 作用对象 | 核心目的 | 典型使用场景 |
|---|---|---|---|
cors: true | Vite 开发服务器 | 允许浏览器跨域访问本地资源 | 微前端资源加载、本地静态服务 |
changeOrigin: true | 代理请求 | 绕过目标服务器的 CORS 校验 | 接口代理到不同域的后端服务 |
注意事项
- 优先级:
changeOrigin: true仅影响代理请求的Origin头,而cors: true影响的是 Vite 开发服务器自身的响应头。两者可同时使用。 - 生产环境:
cors: true和代理配置仅在开发环境生效,生产环境需通过后端或 Nginx 配置 CORS。 - 冲突处理:
若后端强制校验Origin,需确保changeOrigin: true修改后的值与后端允许的域名一致
15、axios二次封装
utils/request.ts
1 | import type { AxiosResponse } from 'axios' |
api/user/index.ts
1 | import request from '@/utils/request' |
***.vue
1 | <template> |
16、打包分析
插件网站https://www.npmjs.com/package/rollup-plugin-visualizer
1 | pnpm add rollup-plugin-visualizer -D |
vite.config.ts
1 | import { defineConfig } from 'vite' |
17、gzip压缩
1 | pnpm i vite-plugin-compression -D |
vite.config.ts
1 | // 压缩gzip |
nginx服务器上还要对应配置
在server节点下新增以下配置
1 | server { |
如果是打包成docker镜像,Dockerfile可配置如下:
1 | FROM nginx:1.25.2-alpine-slim |
这些配置项的作用如下:
gzip on;启用 Gzip 功能。gzip_static on;允许 Nginx 直接返回已压缩的静态文件。gzip_types指定需要压缩的文件类型。gzip_vary on;添加Vary: Accept-Encoding头部,确保浏览器正确处理压缩文件。gzip_comp_level设置压缩级别,数值越大压缩率越高,但性能消耗也越大(1-9)gzip_buffers设置缓冲区大小。gzip_http_version设置 HTTP 版本。gzip_disable禁用对特定浏览器的 Gzip 压缩。gzip_proxied用于控制 Gzip 压缩的行为,特别是在处理来自代理服务器的请求时。any: 对所有请求(包括来自代理的请求)执行 Gzip 压缩
18、图片压缩
插件网站vite-plugin-image-optimizer (弃用)
1 | pnpm add vite-plugin-image-optimizer -D |
vite.config.ts
1 | import { defineConfig } from 'vite' |
插件网站vite-plugin-image-tools(推荐)
vite插件,支持图片压缩和自动转webp,目前只支持’png’, ‘jpg’, ‘webp’, ‘avif’, ‘tiff’, ‘gif’
1 | pnpm add -D vite-plugin-image-tools |
vite.config.ts
1 | import { defineConfig } from 'vite' |
参数
| 参数 | 类型 | 默认值 | Description |
|---|---|---|---|
| quality | number | 80 | 图片质量 (1-100) |
| includes | string/RegExp | ‘’ | ‘xxx.png'.includs(inclouds) includes.test('xxx.png')jpe?g |
| excludes | string/RegExp | ‘’ | 排除项,如:!’xxx.png'.includs(inclouds) !includes.test('xxx.png') |
| filter | function | () => true | 过滤方法,可自定义过滤图片逻辑,支持async 参数:图片路径 如: filter: (path) => { return path.includes(‘.png’) } |
| compatibility | boolean | false | 是否兼容低版本浏览器,生产环境生效, true:只有css中的图片会转webp(暂时只支持打包时候处理css) false:全部转webp |
| bodyWebpClassName | string | webp | body标签的webp class,用于生成兼容webp的class |
| enableWebp | boolean | false | 生产环境是否转webp |
| enableDev | boolean | false | 开发环境是否开启压缩 |
| enableDevWebp | boolean | false | 开发环境是否开启转webp |
| cacheDir | string | ‘node_modules/.cache/vite-plugin-image’ | 缓存路径, 默认,只在开发环境生效 |
| sharpConfig | Object | { jpeg?: JpegOptions, jpg?: JpegOptions, png?: PngOptions, webp?: WebpOptions, avif?: AvifOptions, tiff?: TiffOptions, gif?: GifOptions} | sharp配置 |
| svgoConfig | Object | {plugins:[‘preset-default’,{name:’removerXMLNS’},{name:’removeViewBox’}],js2svg:{indent:2, pretty: true}} | https://svgo.dev/docs/preset-default/ |
✅ 结论:vite-plugin-image-tools 默认不会删除原图,这是有意设计(兼容性考虑)。
如果你确定不需要原图,可以写 Node 脚本删除原图(不建议删除)
1 | // vite.config.ts |
19、解决ts无法识别路由中导入的vue组件
env.d.ts
1 | declare module '*.vue' { |
20、将路由和pinia分离到独立模块
将路由和pinia分离到独立模块,提高可维护性和可扩展性
/src/plugins/index.ts
1 | import type { App } from 'vue' |
src/router/index.ts
1 | import type { App } from 'vue' |
src/store/index.ts
1 | import type { App } from 'vue' |
src/main.ts
1 | import plugins from '@/plugins' |
21、添加mock工具
1 | pnpm add vite-plugin-mock-dev-server -D |
vite.config.ts
1 | import { defineConfig } from 'vite' |
在项目根目录添加mock文件夹
mock/index.ts
1 | import path from 'node:path' |
tsconfig.app.
1 | { |
mock/modules/home.mock.ts
这里命名中间一定要用mock,格式xxx.mock.ts
1 | import { defineMock } from '../index' |
22、添加ESLint配置检查器 启动项
package.json
1 | "scripts": { |
23、添加404页
src/router/index.ts
1 | import type { App } from 'vue' |
24、引用scss文件
添加scss文件
src/styles/common.scss
src/styles/mixin.scss
src/styles/variables.scss
vite.config.ts
1 | import { defineConfig } from 'vite' |
25、打包拆分 小图片转base64
1 | pnpm add terser -D |
vite.config.ts
1 | export default defineConfig(({ mode, command }) => { |
26、添加Vconsole打印
1 | pnpm add vite-plugin-vconsole vconsole -D |
vite.config.ts
1 | import { defineConfig } from 'vite' |
27、简化SVG使用
插件网站https://www.npmjs.com/package/vite-svg-loader
1 | pnpm add vite-svg-loader -D |
vite.config.ts
1 | import { defineConfig } from 'vite' |
1 | // env.d.ts 模块声明 |
.vue文件使用
1 | <template> |
28、px转换
cnjm-postcss-px-to-viewport
px转vw/vh
插件网站https://www.npmjs.com/package/cnjm-postcss-px-to-viewport
1 | pnpm add cnjm-postcss-px-to-viewport -D |
vite.config.ts
1 | import { defineConfig } from 'vite' |
在 TypeScript 中,declare module 用于声明一个模块的类型定义,通常在以下情况下使用:
- 没有类型定义文件的第三方库:如果你正在使用一个第三方库(如
cnjm-postcss-px-to-viewport),但该库没有提供官方的类型定义文件(例如.d.ts文件),你可以使用declare module来告诉 TypeScript 这个模块存在,从而避免编译时报错。 - 临时解决方案:这是一个临时的声明,通常用于快速解决类型检查问题。它不会为模块提供具体的类型信息,只是告诉 TypeScript 这个模块是有效的。
types/cnjm-postcss-px-to-viewport.d.ts
1 | declare module 'cnjm-postcss-px-to-viewport' |
tsconfig.node.json
1 | { |
declare module ‘cnjm-postcss-px-to-viewport
这行代码的意思是:
- 声明一个名为
'cnjm-postcss-px-to-viewport'的模块。 - TypeScript 不会对该模块的导入进行类型检查。
- 你可以在项目中导入并使用这个模块,但它的类型是
any,即没有具体的类型信息。
vite-plugin-px2rem
px转rem
插件网站https://www.npmjs.com/package/vite-plugin-px2rem#vite-plugin-px2rem
1 | pnpm add vite-plugin-px2rem -D |
vite.config.ts
1 | import { defineConfig } from 'vite' |
29、预构建的依赖项
强制预构建的依赖项,在开发服务器启动时,Vite 会预先处理这些库,以确保它们快速加载和解析
1 | import { defineConfig } from 'vite' |
30、计算白屏时间
白屏时间(First Paint Time)是一个非常重要的指标。它指的是从用户输入网址并按下回车键,到浏览器开始渲染页面内容的时间段。在这段时间内,用户看到的只是一个空白页面,因此白屏时间的长短直接影响了用户的体验。
30.1、什么是白屏时间?
白屏时间是指从用户发起页面请求到浏览器首次开始渲染页面内容的时间。具体来说,白屏时间包括以下几个阶段:
- DNS解析:浏览器将域名解析为IP地址。
- 建立TCP连接:浏览器与服务器建立TCP连接(三次握手)。
- 发起HTTP请求:浏览器向服务器发送HTTP请求。
- 服务器响应:服务器处理请求并返回响应数据。
- 浏览器解析HTML:浏览器解析HTML文档并构建DOM树。
- 浏览器渲染页面:浏览器根据DOM树和CSSOM树生成渲染树,并开始渲染页面。
- 页面展示第一个标签:浏览器首次将页面内容渲染到屏幕上。
白屏时间的长短直接影响了用户对网站的第一印象。如果白屏时间过长,用户可能会感到不耐烦,甚至直接关闭页面。因此,优化白屏时间是前端性能优化的重要目标之一。
30.2、白屏时间的影响因素
白屏时间的长短受到多种因素的影响,主要包括以下几个方面:
- 网络性能:网络延迟、带宽、DNS解析时间等都会影响白屏时间。如果网络状况不佳,DNS解析和TCP连接建立的时间会变长,从而导致白屏时间增加。
- 服务器性能:服务器的响应速度、处理能力等也会影响白屏时间。如果服务器响应缓慢,浏览器需要等待更长的时间才能接收到HTML文档。
- 前端页面结构:HTML文档的大小、复杂度、外部资源的加载顺序等都会影响白屏时间。如果HTML文档过大或包含大量外部资源,浏览器需要更长的时间来解析和渲染页面。
- 浏览器性能:浏览器的渲染引擎性能、缓存机制等也会影响白屏时间。不同浏览器的渲染性能可能存在差异,导致白屏时间不同。
1 |
|
