
Vite构建工具
本文最后更新于 2025-02-15,文章内容可能已经过时。
Vite介绍
Vite
是一个打包构建工具
,它可以将项目
中的浏览器不认识的代码
文件,类似webpack
转换为浏览器可认识的静态资源文件
,打包构建
结合了esbuild
和rollup 构建工具
实现!
相对于
webpack
构建工具,配置
方面变的更简单
,学习
成本降低
,构建
速度变快
!
Vite项目创建
创建一个Vue3项目
使用 npm
方式创建
npm init vite@latest my_project
使用 pnpm
方式创建
pnpm create vite my_project
也可以通过
--template
指定框架来快速创建
pnpm create vite my_project --template vue
目录结构
├── README.md
├── index.html # html 模版文件
├── package.json # 项目配置文件
├── public # 静态文件,该文件夹内的文件不会被打包处理
│ └── vite.svg
├── src # 开发源代码的地方
│ ├── App.vue
│ ├── assets
│ │ └── vue.svg
│ ├── components
│ │ └── HelloWorld.vue
│ ├── main.js # main.js 入口文件
│ └── style.css
└── vite.config.js # vite 配置文件
根据命令行提示,选择要使用的框架,最终等待开发目录生成后,进入该文件夹,安装依赖,启动项目即可!
cd my_project
pnpm install # or npm install
pnpm run dev # or npm run dev
需要注意的是,在
vue
中,默认是不支持JSX语法
的,需要通过安装插件
来支持该语法类型!
pnpm i @vite/plugin-vue-jsx -D
然后在
vite.config.js
中引入插件进行注册!
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue(), vueJsx()],
});
使用
jsx
语法
import { defineComponent } from "vue";
export default defineComponent({
setup() {
return () => {
return <div>hello jsx</div>;
};
}
})
创建一个Vue2项目
在
vite
项目中创建vue2项目
时,还需要使用一个插件vite-plugin-vue2
,它可以在项目中支持vue2
的写法!
使用 pnpm
创建一个项目
pnpm create vite my_vue2_project
根据
命令窗口交互
提示,选择Vanilla
,Vanilla
在不使用任何框架
的情况下创建一个工程项目
,像vite配置文件
等需要手动创建
!
目录结构
├── index.html
├── package.json
├── pnpm-lock.yaml
├── public
│ └── vite.svg
├── src
│ ├── App.vue # 删除 src 内部默认文件后,创建App.vue
│ └── main.js
└── vite.config.js # 配置文件为手动创建
安装依赖
安装
vite-plugin-vue2
插件,和vue2
最新版本!这里需要注意的是,
vue2
的版本一定是最新
的,避免版本不匹配
的问题!
pnpm info vue versions
可以通过以上命令,来查看
vue版本
信息,获取vue2
的最新版本
!
pnpm i vite-plugin-vue2 -D
pnpm i vue@2.7.16 -S
创建vite
配置文件
import { defineConfig } from "vite";
import { createVuePlugin } from "vite-plugin-vue2";
export default defineConfig({
plugins: [ createVuePlugin() ],
})
创建App.vue
文件
<template>
<div>
<center>vite + vue2 {{ msg }}</center>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
<style lang="scss" scoped>
</style>
修改main.js
入口文件
import Vue from "vue";
import App from "./App.vue";
new Vue({
render: (h) => h(App),
}).$mount("#app");
启动项目
pnpm run dev
CSS的使用方式
CSS变量与基本引用
在
src目录
下创建styles
文件夹并分别创建一个index.css
文件和一个variable.css
文件!
variable.css
用来存放一些css变量
!
index.css
用来引入变量,并对元素
设置css
样式!
variable.css
:root{
--text-color: blue;
--bg-color: white;
}
index.css
@import url("./variable.css");
body {
@console.error("This is an error message");
color: var(--text-color);
}
@console.error
是postcss
中的一个插件
,它可以通过js形式
计算出css样式
!
postcss
中有很多插件,比如单位转换px转rem
,低版本浏览器css属性兼容
,还有前缀插件
等!
然后在
main.js
入口文件中引入index.css
样式
main.js
import { createApp } from 'vue'
import './styles/index.css'
import App from './App.vue'
createApp(App).mount('#app')
CSS postcss的支持
postcss
是一个用JavaScript
工具
和插件
转换CSS 代码
的工具!
@console
就是postcss
中的插件之一,具体使用方式如下!
依赖安装
:pnpm install @postcss-plugins/console -D
新建 postcss.config.js
postcss.config.js
是配置文件,在vite
中对postcss
已有内置,新建
该配置文件
后,便会加载该配置文件
!module.exports = { plugins: [require('@postcss-plugins/console')] }
CSS Module
任何以
.module.css
为后缀名
的CSS 文件
都被认为是一个CSS modules
文件。导入
这样的文件会返回一个相应的模块对象
:
example.module.css
.red {
color: red;
}
import classes from './example.module.css'
document.getElementById('foo').className = classes.red
如果
css.modules.localsConvention
设置开启了camelCase
格式变量名转换
(例如localsConvention: 'camelCaseOnly'
),你还可以使用按名导入
。
vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue(), vueJsx()],
css: {
modules: {
localsConvention: 'camelCaseOnly'
}
}
});
import { applyColor } from './example.module.css'
document.getElementById('foo').className = applyColor
配置alias
路径别名
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
export default defineConfig({
plugins: [vue(), vueJsx()],
resolve: {
alias: {
"@": "/src",
"@assets": "/src/assets",
"@components": "/src/components",
"@views": "/src/views",
"@router": "/src/router",
"@store": "/src/store",
"@utils": "/src/utils",
"@styles": "/src/styles"
}
},
});
配置TypeScript
集成
静态文件处理
静态资源
,表示图片
、媒体
等相关文件
内容,通过import
方式来进行导入并使用
!
基本使用
例如
,在src
目录中的assets文件夹
内有一张图片
import vueSvg from './assets/vue.svg'
使用时,可以通过
动态绑定
的方式来引用,import
静态资源时,会返回一个编译后
的的打包路径
!
<img :src="vueSvg" class="logo vue" alt="Vue logo" />
url
路径查询参数
添加一些特殊的
查询参数
可以更改资源被引入的方式
:
url
该参数会返回一个解析后的url地址
// 显式加载资源为一个 URL import assetAsURL from "@/jsx/hello.jsx?url" // jsx url /src/jsx/hello.jsx
raw
以字符串
形式加载资源
会返回
jsx文件中的内容
// 以字符串形式加载资源 import assetAsString from './hello.jsx?raw'
import { defineComponent } from "vue"; export default defineComponent({ setup() { return () => { return <div>hello jsx</div>; }; } })
web worker
// 加载为 Web Worker import Worker from './worker.js?worker' // 在构建时 Web Worker 内联为 base64 字符串 import InlineWorker from './worker.js?worker&inline'
JSON
文件导入import jsonTest from "./assets/test.json" // 会将json以对象的内容进行输出
assets
和 public
区别
assets
是src目录
下的静态资源:src
目录下的文件
会参与文件编译
,文件路径
最终都会通过编译生成文件指纹
!在
vite
中,什么情况下,会在代码中引入静态资源路径
时,会被编译成新的路径
!css 中的静态路径
background-image: url("./assets/logo.jpg")
img 中src的静态路径
<img src="./assets/logo.jpg" />
import()语句方式引入的路径
import logoJpg from "./assets/logo.jpg"
或者可以使用
动态导入
的方式import("./assets/logo.jpg").then(res => { console.log("url", res.default) })
动态导入
,会在打包结果
后的dist文件夹
内生成多个一对图片
还有与之对应的js文件
内容!js文件
内容,包含了图片转换后的文件指纹路径
,最后对路径做了导出
,由res.default
来获取结果!URL对象,同样也会被vite进行路径处理
const url = new URL("./assets/${val}.jpg", import.meta.url); console.log("vite 打包编译后的 url 地址", url)
import.meta.url
是一个ESM
的原生功能,会暴露当前模块的 URL
。将它与原生的URL
构造器 组合使用,在一个 JavaScript 模块中,通过相对路径
我们就能得到一个被完整解析的静态资源 URL
!const imgUrl = new URL('./img.png', import.meta.url).href document.getElementById('hero-img').src = imgUrl
public
是根目录
中的一个文件夹:public
文件夹内的文件不会受到编译的影响
,最终都会以初始的文件状态进行结果打包
!
eslint
和 prettier
1. eslint
是一个代码规范插件
,它可以通过配置
、预设
方式来规定代码书写的规范检查!
2. prettier
是一个代码格式化插件
,它需要在编辑器中安装这个插件
,配合eslint
来使用,可以设置编辑器在保存代码
时,进行格式化代码块,来纠正代码到eslint的所定义的格式规范
!
3. husky
是一个代码提交插件
,它会在提交代码之前
,去做eslint校验
,保证代码的规范性
,若存在不规范代码
,则无法进行提交commit
!
在使用
eslint
和prettier
之前,需要在开发工具
中安装
这两个插件,例如vscode 、 webstorm
!
eslint
相关配置
eslint
相关依赖安装
pnpm install eslint-plugin-vue eslint-config-prettier eslint-plugin-prettier eslint-plugin-import eslint-plugin-promise eslint-plugin-node -D
eslint-config-standtard
是一个预设配置
,也是一个eslint标准规范
配置,通过extends
配置属性,来继承
这个标准的特性
!
eslint-plugin-vue
是vue提供的一个关于vue代码编写规范配置插件
基础规则:
eslint:recommended
代码风格:
airbnb、standard、google
框架支持:
react、vue、typescript
工具集成:
prettier、import
根目录创建eslint
配置文件
在
项目根目录
中新建".eslintrc.js"
配置文件,该配置文件,用来配置代码格式规范检测
!
.eslintrc.js
module.exports = {
extends: ['prettier', 'plugin:vue/vue3-recommended'],
plugins: ['prettier'],
env: {
es6: true,
browser: true
},
global: {
postMessage: true
},
rules: {
'prettier/prettier': 'error',
'no-console': 'off',
'no-debugger': 'off',
'space-before-function-paren': 'off'
}
}
extends
属性为继承
的意思,可以字符串
,或者是一个数组
,来继承
多个规范配置
!
plugin:vue/vue3-recommended
是vue3标准规范配置
,继承
该规范
后,代码规则检测
,将以此规范进行代码检测
!pnpm install eslint-plugin-vue -D
plugin:vue/recommended 是 vue2 eslint 规则!
plugin:vue/vue3-recommended 是vue3 eslint 规则!
rules
用来配置eslint具体校验规则
,如函数
后括号之间是否留有空格(space-before-function-paren), off 代表关闭该项的检测!
global
用来配置全局变量
代码,postMessage
表示在全局中可用
,不需要去做eslint提示
!
当
开启eslint插件
时,会发现项目中的许多文件
,出现了报错提示
,并提示
我们去按照代码规范去纠正这些问题
!而这些
问题
,存在与多出
,修改
的文件内容也比较多
,无法进行一个个修改
,比较麻烦
,因此,我们需要配合prettier格式化插件
工具,来解决
此问题!
prettier
相关配置
首先需要在
开发工具
中,安装此插件
,之后,在vscode
中来对format
部分进行调整修改,确保保存时,进行代码格式化操作!
修改vscode
配置
两部分修改
,一部分是,保存代码时,进行格式化!
另一个是,确保格式化工具选择的是prettier选项!
cmd+shift+p
调出vscode设置
面板,在面板中搜素format
,找到format on save
选项确保勾选
!
另外就是搜索
formatter
确保列出的选项内,选择的是prettier插件
!
新建prettier
配置文件
在
项目根目录
中新建".prettierrc"
配置文件,该配置文件,可以通过json形式
来配置,代码
中格式化的规则
!
.prettierrc
{
"singleQuote": true, // 保留单引号
"semi": false, // 去除结尾分号
"trailingComma": "none" // 去除结尾逗号
}
配合
eslint规则
使用,不然会有冲突
!
配置描述
配置项 | 类型 | 默认值 | 描述 |
---|---|---|---|
printWidth |
整数 |
80 |
设置每行的最大字符数。当代码超过此宽度时,Prettier 会自动换行。 |
tabWidth |
整数 |
2 |
设置缩进的空格数。可以根据团队或个人的编码习惯进行调整。 |
useTabs |
布尔值 |
false |
如果设置为 true ,则使用制表符(Tab)进行缩进;否则,使用空格。 |
semi |
布尔值 |
true |
如果设置为 true ,则在语句末尾添加分号;否则,不添加。 |
singleQuote |
布尔值 |
false |
如果设置为 true ,则使用单引号 (' ' );否则,使用双引号 (" " )。 |
quoteProps |
字符串 |
"as-needed" |
控制对象属性引号的使用方式。"as-needed" :仅在必要时使用引号;"consistent" :保持一致;"preserve" :保留现有引号。 |
jsxSingleQuote |
布尔值 |
false |
如果设置为 true ,则在 JSX 中使用单引号;否则,使用双引号。 |
trailingComma |
字符串 |
"es5" |
控制对象、数组、函数参数等末尾是否添加尾随逗号。"es5" :在 ES5 支持的位置添加;"none" :不添加;"all" :在所有支持的位置添加。 |
bracketSpacing |
布尔值 |
true |
如果设置为 true ,则在对象字面量的大括号内添加空格;否则,不添加。 |
jsxBracketSameLine |
布尔值 |
false |
如果设置为 true ,则将 JSX 的右括号放在同一行;否则,换行。 |
arrowParens |
字符串 |
"always" |
控制箭头函数参数是否使用圆括号。"always" :始终使用;"avoid" :仅在必要时使用。 |
proseWrap |
字符串 |
"preserve" |
控制 Markdown 和其他文本文件中的换行方式。"preserve" :保留现有换行;"always" :始终换行;"never" :不换行。 |
htmlWhitespaceSensitivity |
字符串 |
"css" |
控制 HTML 文件中空白敏感度的处理方式。"css" :根据 CSS 处理;"strict" :严格处理;"ignore" :忽略。 |
endOfLine |
字符串 |
"lf" |
控制行尾的换行符类型。"lf" :Unix/Linux 的换行符;"crlf" :Windows 的换行符;"cr" :旧版 Mac 的换行符;"auto" :根据操作系统自动选择。 |
embeddedLanguageFormatting |
字符串 |
"auto" |
控制嵌入代码的格式化方式。"auto" :自动处理;"off" :关闭嵌入代码的格式化。 |
overrides |
数组 |
无 |
允许针对特定文件类型或路径应用不同的格式化规则。例如,可以为 .json 文件设置不同的 printWidth 。 |
示例配置
{
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"bracketSpacing": true,
"jsxBracketSameLine": false,
"arrowParens": "always",
"proseWrap": "preserve",
"htmlWhitespaceSensitivity": "css",
"endOfLine": "lf",
"embeddedLanguageFormatting": "auto"
}
配置scripts
添加lint
校验
在
package.json
文件中,配置scripts
脚本,可以快速通过命令
,来检测代码规范性!
\
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"lint": "eslint --ext .js,.vue --ignore-path .gitignore ."
}
}
配置打包构建时校验lint
{
"scripts": {
"dev": "vite",
"build": "pnpm lint && vite build",
"preview": "vite preview",
"lint": "eslint --ext .js,.vue --ignore-path .gitignore ."
}
}
只需要在
pnpm run build
的时候之前跑下pnpm lint
做一个校验即可
!
配置git
提交时做lint
校验
在此时,如果
不配置git提交
的话,可能会将校验不通过的代码
,提交到代码仓库中
,此时我们需要使用husky插件
,来处理此问题!
husky
可以防止
使用Git hooks
的一些不好
的commit
或者push
。
Husky
是一个Git Hook
工具,可以触发 Git 提交
的各个阶段
:pre-commit 、commit-msg 、pre-push 、pre-rebase
等等。Husky
支持所有 Git 钩子
,可以根据项目
的需要选择适当的钩子来运行自定义脚本
。
安装husky
依赖
pnpm install husky -D
初始化husky
目录
npx husyk init
初始化会自动做两件事情:
在
package.json
中添加scripts
脚本!{ "scripts": { "prepare": "husky" } }
当
项目其他成员克隆我们的代码
后运行npm install
时,"prepare"
会被触发
,husky init
会运行,这样能确保每个开发者在克隆项目并安装依赖时都有相同的 Git 钩子设置
。创建一个
.husky 的文件夹
在项目根目录
下,其中有一个'pre-commit'
钩子脚本,其中有一个'npm test'
命令被自动添加
了。所以如果我们没有自定义
的需求,实际上默认就会有这么一个'pre-commit'
钩子存在了。
安装husky
相关钩子
npx husyk install
自定义脚本命令
当
npx husky init
初始化时,默认
生成了一个pre-commit
钩子脚本,且内部默认添加了一条命令
,npm test
,若想自定义
,比如,在提交
时,做一次eslint格式校验
,那么需要打开这个pre-commit文件
,进行编辑,并添加 pnpm lint 脚本
保存即可!
这时候,当去做
commit
提交时,就会先执行pnpm lint
去校验代码规范
操作,若eslint
校验失败,则不会提交
代码!
其它husky
命令使用
npx husky add .husky/pre-commit "npm run lint"
add
会.husky
目录下生成pre-commit
钩子脚本,并在脚本内部
添加npm run lint
命令!
vite中的环境变量
环境变量
,就是在不同环境
下定义的变量值
,例如开发环境 测试环境 生产环境
等不同环境相关
!
在
vite
中,可以通过import.meta.env
的方式来获取环境对象
环境对象env
{
"BASE_URL": "/",
"DEV": true,
"MODE": "development",
"PROD": false,
"SSR": false
}
属性 | 类型 | 描述 |
---|---|---|
import.meta.env.MODE |
字符串 |
表示当前应用的运行模式。常见的值包括: |
- development :开发模式 |
||
- production :生产模式 |
||
- test :测试模式(如果适用) |
||
该属性用于根据不同的模式执行不同的逻辑,例如启用或禁用调试工具、日志记录等。 | ||
import.meta.env.BASE_URL |
字符串 |
表示应用的基路径(base URL)。在构建应用时,如果配置了 publicPath 或 base 选项,该属性会反映配置的基路径。例如,如果应用部署在 https://example.com/app/ ,则 BASE_URL 为 /app/ 。 |
import.meta.env.PROD |
布尔值 |
表示应用是否运行在生产模式。当 MODE 为 production 时,该属性为 true ;否则为 false 。用于在代码中根据运行环境执行不同的逻辑,例如启用性能优化、关闭调试信息等。 |
import.meta.env.DEV |
布尔值 |
表示应用是否运行在开发模式。当 MODE 为 development 时,该属性为 true ;否则为 false 。用于在代码中根据运行环境执行不同的逻辑,例如启用日志记录、调试工具等。 |
import.meta.env.SSR |
布尔值 |
表示应用是否在服务器端渲染(SSR)环境中运行。如果应用使用 SSR,该属性为 true ;否则为 false 。用于在代码中根据渲染环境执行不同的逻辑,例如条件加载某些模块或资源。 |
import.meta.env.VITE_ |
对象 |
以 VITE_ 开头的环境变量。这些变量在构建时被注入到代码中,并且可以在应用中使用。例如,import.meta.env.VITE_API_URL 可以用于配置 API 的基础 URL。注意:只有以 VITE_ 开头的环境变量才会被暴露到客户端代码中。 |
import.meta.env.VITE_API_URL |
字符串 |
示例属性,表示通过 VITE_API_URL 环境变量注入的 API 基础 URL。具体的属性名称取决于在 .env 文件中定义的环境变量。 |
import.meta.env
在打包环境(生产 测试)编译
之后,实际上是不存在
的,另外vite
会将此代码转换为一个对象形式
进行输出展示!
console.log("import.meta.env", import.meta.env)
编译后
的代码,import.meta.env
就不存在
了,会被替换成一个对象
!
console.log("import.meta.env", {
"BASE_URL": "/",
"DEV": true,
"MODE": "development",
"PROD": false,
"SSR": false
})
自定义环境变量
自定义环境变量
,就是可以在项目根目录
下创建特定的文件
,来表示不同环境
下的变量
,并且变量名
必须以VITE_开头
才行!
特定的文件
可以有(.env 、 .env.development、 .env.development.local、.env.production 、 .env.test
)
.env
# 所有情况下都会加载.env.local
# 所有情况下都会加载,但会被 git 忽略.env.[mode]
# 只在指定模式下加载.env.[mode].local
# 只在指定模式下加载,但会被 git 忽略
环境中的mode
模式
mode
用来指定vite环境的构建模式
,则默认支持development(开发环境)
和production(生产环境)
,当然也可以自定义mode
,如test
或者是staging
,通过--mode
来实现!
test
和 staging
test
用于开发阶段测试
环境
staging
用于交付阶段uat应用测试
环境
test
测试环境:用于运行
自动化测试
、单元测试
、集成测试
等,确保代码的正确性
和稳定性
。在
项目根目录
中创建.env.test
.env.test
用于配置test 测试
环境中相关的变量API BASE_URL
等!VITE_APP_ENV=test VITE_APP_TITLE=My Vue3 Project Test VITE_APP_API=http://localhost:8090/test/api
package.json
配置scripts
{ "scripts": { "dev": "vite", "build": "pnpm lint && vite build --production", "test": "vite build --mode test", "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", "prepare": "husky" }, }
--mode test
用来指定当前构建环境test Mode
,其变量
中会读取.env.test中的变量
! 构建test
测试包pnpm run test
staging
模式(暂存模式
)用于在
生产环境之前
进行预发布
或试运行
,确保应用在接近真实环境中的表现
。通常用于将
应用部署
到一个与生产环境相似
的环境中进行最终验证
。强调应用的
完整性
和性能
,可能包括负载测试
、用户验收测试(UAT)
等。配置通常与
生产环境
相似,但可能使用不同的 API 端点、数据库
等。在
项目根目录
中创建.env.staging
.env.staging
用于配置staging uat 测试
环境中相关的变量API BASE_URL
等!VITE_APP_ENV=staging VITE_APP_TITLE=My Vue3 Project staging VITE_APP_API=http://localhost:8090/staging/api
package.json
配置scripts
{ "scripts": { "dev": "vite", "build": "pnpm lint && vite build --production", "staging": "vite build --mode staging", "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", "prepare": "husky" }, }
--mode staging
用来指定当前构建环境staging Mode
,其变量
中会读取.env.staging中的变量
! 构建staging
测试包pnpm run staging
dev
和 preview
dev
是本地开发环境
,主要是开发业务功能,测试
等!
preview
是本地
以production Mode
去预览
的一个环境
,主要用来调试,在生产环境出现的问题
!
这两中
mode
都会在本地启动一个服务
,进行本地项目预览
,但是preview
的env环境
是production
,而dev
的env环境
是,development!
vite dev
(开发服务器):
- 用途:主要用于开发阶段,提供快速的热模块替换(HMR)、实时重载和详细的调试信息。
- 特点:
- 启动
开发服务器
,默认运行在http://localhost:3000
(端口可配置)。 - 支持
模块热替换(HMR)
,即在代码修改后自动更新页面,无需手动刷新
。 - 提供
详细的错误信息和源码映射(source maps),便于调试
。 - 适用于日常
开发
和测试
。
- 启动
vite preview
(预览服务器):
- 用途:用于在
本地预览生产构建后
的应用,模拟生产环境
的行为。 - 特点:
- 启动一个
静态文件服务器
,用于提供构建后的静态文件
(通常位于dist
目录)。 - 不包含
开发服务器的特性
,如HMR 和源码映射
。 - 适用于在
本地验证生产构建结果
,或在部署前进行最终检查
。 - 默认运行在
http://localhost:5000
(端口可配置)。
- 启动一个
vite 构建命令的相关参数
dev 常用参数
参数 | 使用 | 描述 |
---|---|---|
--port |
vite --port 8080 |
指定服务端口 ,一般用于指定本地服务端口 ! |
--https |
vite preview --https |
两者都支持通过配置启用 HTTPS ! |
--open |
vite dev --port 300 --open |
启动开发服务器,监听端口 3000 并自动打开浏览器 |
--open /dashboard |
vite preview --open /dashboard |
指定目录文件打开 |
--host |
vite preview --host 0.0.0.0 |
指定主机域名 |
--cors |
vite dev --cors |
启用 CORS 支持 |
--config |
vite dev --config vite.custom.config.js |
自定义配置文件路径 |
build 常用参数
参数 | 使用 | 描述 |
---|---|---|
--outDir |
vite build --outDir build |
指定输出目录 。默认是 dist ! |
--mode |
vite build --mode test |
用来指定 env 环境 mode ,可自定义 test staging 等! |
--assetsDir |
vite build --assetsDir static |
指定静态资源输出目录 。默认是 assets ! |
--sourcemap |
vite build --sourcemap |
生成源码映射 文件 |
--minify |
vite build --minify terser |
指定代码压缩工具 。默认是 esbuild 。可选值包括 terser、esbuild 等 |
--target |
vite build --target es2015 |
指定构建目标环境 。默认是 modules 。可选值包括 es2015、es2016 等! |
--emptyOutDir |
vite build --emptyOutDir |
构建前清空输出目录 |
vite中HMR热更新功能
HMR(热更新)
,当我们修改页面中的内容
时,不去刷新页面,而自动将改动的地方进行变更
!
vite
中开发vue项目
,已经默认有了热更新
操作,像vue
页面以及页面中的样式
,都会及时得到修改的反馈
!
手动完成一个更新操作
通过
import.meta.hot
来完成,dom片段
的局部更新
操作!
import "./style.css";
import javascriptLogo from "./javascript.svg";
import viteLogo from "/vite.svg";
import { setupCounter } from "./counter.js";
export function render() {
document.querySelector("#app").innerHTML = `
<div>
<a href="https://vite.dev" target="_blank">
<img src="${viteLogo}" class="logo" alt="Vite logo" />
</a>
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank">
<img src="${javascriptLogo}" class="logo vanilla" alt="JavaScript logo" />
</a>
<h1>Hello Vite!</h1>
<div class="card">
<button id="counter" type="button"></button>
</div>
<p class="read-the-docs">
Click on the Vite logo to learn moredwad
</p>
</div>
`;
setupCounter(document.querySelector("#counter"));
}
if (import.meta.hot) {
import.meta.hot.accept((newModule) => {
newModule.render();
});
}
import.meta.hot.accept
接受一个回调函数
,其回调参数
,为当前模块
后产生变动后的新模块
,然后调用render
函数,进行重新渲染
!
就是
当前模块中的代码发生变动
时,会触发 websockt
,然后获取accept
中的回调参数
,拿到新的模块
中导出
的render函数
,进行调用重新渲染
!
global import
批量导入
使用
import.meta.glob()
函数可以接受一个文件路径
,来匹配多个文件
,并返回一个键值对对象
,key为文件路径名
,而value
则是,对应的import导入的文件内容
!
基本使用
实现
批量组件注册
,如下components
文件夹内的目录结构
!
├── HelloWorld.vue
├── TestComp.vue
└── index.js
index.js
index.js
为批量注册
的入口文件,通过import.meta.glob()
函数来注册获取components
内的所有.vue文件
!
export function registerComponents(app) {
const compoents = import.meta.glob('./*.vue')
Object.keys(compoents).forEach(async (key) => {
const componentName = key.replace('./', '').replace('.vue', '')
const component = await compoents[key]()
console.log('componentName', componentName)
console.log('component', component.default)
app.component(componentName, component.default)
})
}
以
上导入方式
,是异步方法返回
,比较繁琐,可以通过配置对象
来处理此问题{ eager: true }
!
export function registerComponents(app) {
const compoents = import.meta.glob('./*.vue', { eager: true })
Object.keys(compoents).forEach((key) => {
const componentName = key.replace('./', '').replace('.vue', '')
const component = compoents[key]
console.log('componentName', componentName)
console.log('component', component.default)
app.component(componentName, component.default)
})
}
main.js
import { createApp } from 'vue'
import './styles/index.css'
import App from './App.vue'
import { registerComponents } from './components/index'
const app = createApp(App)
// 注册全局组件
registerComponents(app)
app.mount('#app')
文件路径引入规则
匹配模式 | 描述 | 示例 |
---|---|---|
* |
匹配任意数量的任意字符 (不包含路径分隔符 / )。 |
*.js 匹配当前目录下的所有 .js 文件。 |
** |
递归匹配任意数量的任意字符 ,包括路径分隔符 / 。 |
**/*.js 匹配所有子目录下的所有 .js 文件。 |
? |
匹配单个任意字符 (不包含路径分隔符 / )。 |
?.js 匹配类似 a.js 、b.js 等文件。 |
[seq] |
匹配方括号 内的任意一个字符序列 。 |
[ab].js 匹配 a.js 或 b.js 。 |
[!seq] 或 [^seq] |
匹配不在方括号内 的任意一个字符序列 。 |
[^ab].js 匹配除 a.js 和 b.js 之外的文件。 |
{foo,bar} |
匹配大括号内 的任意 一个字符串 。 |
{foo,bar}.js 匹配 foo.js 或 bar.js 。 |
{n..m} |
匹配数字范围 n 到 m 之间的任意一个数字。 |
{1..3}.js 匹配 1.js 、2.js 、3.js 。 |
**/node_modules/** |
排除 node_modules 目录下的所有文件。 |
**/!(*.spec).js 排除所有 .spec.js 文件。 |
**/!(pattern) |
排除匹配 pattern 的文件。 |
**/!(foo).js 排除所有名为 foo.js 的文件。 |
**/?(pattern) |
匹配可选的 pattern 。 |
**/?(foo).js 匹配 foo.js 或其他文件。 |
**/+(*.js) |
匹配以 .js 结尾的文件。 |
**/+(*.js) 匹配所有 .js 文件。 |
`**/(*.js | *.ts)` | 匹配以 .js 或 .ts 结尾的文件。 |
|
`**/*.@(js | ts)` | 同上,使用 @ 符号进行分组。 |
|
`**/*.+(js | ts)` | 匹配以 .js 或 .ts 结尾的文件。 |
|
**/*.js |
匹配所有以 .js 结尾的文件。 |
**/*.js 匹配所有 .js 文件。 |
**/*.min.js |
匹配所有以 .min.js 结尾的文件。 |
**/*.min.js 匹配所有压缩后的 .js 文件。 |
**/[^a-z]*.js |
匹配不以小写字母开头的 .js 文件。 |
**/[^a-z]*.js 匹配类似 1.js 、A.js 等文件。 |
**/[a-z]*.js |
匹配以小写字母开头的 .js 文件。 |
**/[a-z]*.js 匹配类似 a.js 、b.js 等文件。 |
**/[^_]*.js |
匹配不以 _ 开头的 .js 文件。 |
**/[^_]*.js 匹配类似 a.js 、b.js 等文件。 |
**/_*.js |
匹配以 _ 开头的 .js 文件。 |
**/_*.js 匹配类似 _a.js 、_b.js 等文件。 |
`**/*.@(js | ts | json)` | ||
`**/!(*.js | *.ts)` | 排除所有 .js 和 .ts 文件。 |
|
`**/!(foo | bar).js` | 排除所有名为 foo.js 和 bar.js 的文件。 |
|
`**/?(foo | bar).js` | 匹配可选的 foo.js 或 bar.js 。 |
|
`**/+(foo | bar).js` | 匹配至少一个 foo.js 或 bar.js 。 |
预编译
预编译,vite在启动之前呢
,会把node_modules
中的第三方依赖库
进行一个cache缓存
,当用到时,会从cache缓存
中获取,从而提高加载运行的速度
!
缓存
的文件
在node_modules > .vite
文件夹中,当启动
时,依赖包
会加载
到该目录
当中!
除此之外,我们可以通过
vite.config.js配置文件,来配置缓存优化策略
,可以来指定
哪些第三方库用来缓存
,哪些第三方库不需要缓存
的相关配置!
{
optimizeDeps: {
// include 匹配缓存依赖
include: ['vue', 'vue-router', 'vuex'],
// exclude 排除缓存依赖
exclude: ['vue-demi']
}
}
注意:
vite
会默认扫描所有第三方库
,然后进行缓存
! 而exclude
配置需要排除第三方依赖缓存
时,需要注意,该依赖包
是否有大量的功能作为导出
,例如lodash
,该依赖包,内部提供了,很多utils工具函数,若不进行cache,会导致页面加载时卡顿,闪烁
的问题,因为浏览器会对lodash中所有的utils文件作为请求加载!
{
optimizeDeps: {
// include 匹配缓存依赖
include: ['vue', 'vue-router', 'vuex'],
// exclude 排除缓存依赖
exclude: ['lodash']
}
}
lodash
配置不缓存
时,并且在某一个模块
下,导入
并引用lodash
,则浏览器
会加载请求lodash中上百个模块文件
!
vite 配置文件
基本配置
配置属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
root |
`string | string[]` | process.cwd() |
base |
string |
/ |
公共基础路径,适用于部署在子路径下的应用。 |
mode |
string |
'development' |
环境模式,可以是 'development' 、'production' 或自定义模式。 |
define |
Record<string, string> |
{} |
全局常量定义,用于替换代码中的变量。 |
plugins |
Plugin[] |
[] |
使用的 Vite 插件列表。 |
publicDir |
string |
'public' |
公共静态资源目录,文件会原样复制到输出目录。 |
cacheDir |
string |
'.vite' |
缓存目录,用于存储缓存的依赖和构建产物。 |
resolve |
object |
{} |
模块解析选项,包括 alias (路径别名)等。 |
alias |
Record<string, string> |
{} |
模块路径别名,用于简化模块导入路径。 |
build |
object |
{} |
构建相关配置,包括 outDir (输出目录)、assetsDir (静态资源目录)、rollupOptions (Rollup 配置)等。 |
build.outDir |
string |
'dist' |
构建输出目录。 |
build.assetsDir |
string |
'assets' |
静态资源输出目录。 |
build.rollupOptions |
RollupOptions |
{} |
传递给 Rollup 的自定义配置,用于更细粒度的控制构建过程。 |
server |
object |
{} |
开发服务器配置,包括 port (端口)、host (主机)、open (是否自动打开浏览器)等。 |
server.port |
number |
5173 |
开发服务器端口。 |
server.host |
string |
'localhost' |
开发服务器主机名。 |
server.open |
`boolean | string` | false |
css |
object |
{} |
CSS 相关配置,包括 modules (CSS Modules)、preprocessorOptions (预处理器选项)等。 |
css.modules |
object |
{} |
CSS Modules 配置。 |
css.preprocessorOptions |
object |
{} |
CSS 预处理器(如 Sass、Less)选项。 |
json |
object |
{} |
JSON 解析配置。 |
esbuild |
object |
{} |
Esbuild 相关配置,用于加速构建过程。 |
optimizeDeps |
object |
{} |
依赖优化配置,包括 include (包含的依赖)、exclude (排除的依赖)等。 |
envPrefix |
string |
'VITE_' |
环境变量前缀,用于在代码中访问环境变量。 |
logLevel |
string |
'info' |
日志级别,可以是 'info' 、'warn' 、'error' 、'silent' 。 |
clearScreen |
boolean |
true |
是否在终端中清除屏幕。 |
build.lib |
object |
{} |
库模式配置,用于构建库而非应用。 |
build.ssr |
boolean |
false |
是否启用服务器端渲染(SSR)模式。 |
build.minify |
`boolean | string` | 'esbuild' |
build.target |
string |
'modules' |
构建目标环境,如 'modules' 、'esnext' 、'es2015' 等。 |
通用配置
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue'; // 如果使用 Vue.js
import path from 'path';
import react from '@vitejs/plugin-react'; // 如果使用 React
import viteImagemin from 'vite-plugin-imagemin'; // 图片压缩插件
import unocss from 'unocss/vite'; // CSS 工具类框架
import { visualizer } from 'rollup-plugin-visualizer'; // 构建分析
export default defineConfig({
// 1. 基本配置
root: process.cwd(),
base: '/', // 公共基础路径,根据部署环境调整
mode: 'development', // 或 'production'
// 2. 插件配置
plugins: [
vue(), // Vue.js 插件
// react(), // 如果使用 React,使用此行代替 vue()
viteImagemin({
// 图片压缩配置
gifsicle: {
optimizationLevel: 7,
interlaced: false,
},
optipng: {
optimizationLevel: 7,
},
mozjpeg: {
quality: 20,
},
pngquant: {
quality: [0.8, 0.9],
speed: 4
},
svgo: {
plugins: [
{
name: 'removeViewBox',
active: false
},
{
name: 'removeEmptyAttrs',
active: false
}
]
}
}),
unocss(), // CSS 工具类框架
// 构建分析插件,仅在生产构建时启用
process.env.NODE_ENV === 'production' && visualizer()
].filter(Boolean), // 过滤掉可能的 undefined 值
// 3. 路径别名
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'@assets': path.resolve(__dirname, 'src/assets'),
'@components': path.resolve(__dirname, 'src/components'),
'@views': path.resolve(__dirname, 'src/views'),
'@store': path.resolve(__dirname, 'src/store'),
// 根据项目结构调整
}
},
// 4. 服务器配置
server: {
port: 3000, // 开发服务器端口
host: 'localhost', // 开发服务器主机名
open: true, // 是否自动打开浏览器
cors: true, // 启用 CORS
proxy: {
// 代理配置,根据后端 API 调整
'/api': {
target: 'http://localhost:5000',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
},
// 5. 优化配置
build: {
outDir: 'dist', // 构建输出目录
assetsDir: 'assets', // 静态资源输出目录
rollupOptions: {
output: {
// 代码分割配置
chunkFileNames: 'js/[name]-[hash].js',
entryFileNames: 'js/[name]-[hash].js',
assetFileNames: 'assets/[name]-[hash][extname]'
},
// 其他 Rollup 配置
},
minify: 'esbuild', // 代码压缩器,'terser' 或 'esbuild'
terserOptions: {
// Terser 配置
compress: {
drop_console: true, // 移除 console 语句
drop_debugger: true // 移除 debugger 语句
}
},
sourcemap: 'hidden', // Source map 配置,'none' | 'hidden' | 'inline'
// 库模式配置(如果需要)
lib: {
entry: path.resolve(__dirname, 'lib/index.js'),
name: 'MyLibrary',
formats: ['cjs', 'esm']
},
// SSR 配置(如果需要)
ssr: false
},
// 6. CSS 配置
css: {
modules: {
// CSS Modules 配置
scopeBehaviour: 'local',
generateScopedName: '[local]___[hash:base64:8]'
},
preprocessorOptions: {
// CSS 预处理器配置,如 Sass、Less
scss: {
// 例如,引入全局变量
additionalData: `@import "@/assets/styles/global.scss";`
}
},
// PostCSS 配置(如果需要)
postcss: {
plugins: [
// 例如,自动添加前缀
require('autoprefixer')
]
}
},
// 7. 环境变量
envPrefix: 'VITE_', // 环境变量前缀
// 8. 其他配置
logLevel: 'info', // 日志级别
clearScreen: true, // 是否清除终端屏幕
optimizeDeps: {
include: ['@vue/compiler-sfc'], // 需要预构建的依赖
exclude: ['lodash'] // 需要排除的依赖
}
});
配置说明
基本配置:
root:
指定项目根目录,通常为 process.cwd()。base:
公共基础路径,根据部署环境调整,例如 / 或 /myapp/。mode:
环境模式,通常设置为 'development' 或 'production'。
插件配置:
Vue.js 插件:
如果项目使用 Vue.js,需要引入并配置 @vitejs/plugin-vue。React 插件:
如果项目使用 React,需要引入并配置 @vitejs/plugin-react。图片压缩插件:
使用 vite-plugin-imagemin 进行图片压缩,提升构建性能。CSS 工具类框架:
使用 unocss 或其他类似工具,提升 CSS 开发效率。构建分析插件:
使用 rollup-plugin-visualizer 分析构建产物,优化打包大小。
路径别名:
- 配置
@
指向src
目录,方便模块导入
。 - 根据
项目结构
调整其他路径别名
,如@assets、@components
等。
- 配置
服务器配置:
port:
开发服务器端口,通常设置为 3000 或其他常用端口。host:
开发服务器主机名,通常为 'localhost'。open:
是否自动打开浏览器,通常设置为 true。cors:
启用 CORS,允许跨域请求。proxy:
代理配置,用于解决开发环境下的 API 代理问题。
优化配置:
outDir:
构建输出目录,通常为 dist。assetsDir:
静态资源输出目录,通常为 assets。rollupOptions:
传递给 Rollup 的自定义配置,用于更细粒度的控制构建过程。minify:
代码压缩器,通常使用 'esbuild' 或 'terser'。sourcemap:
Source map 配置,根据需要选择 'hidden' 或 'none'。lib:
库模式配置,如果需要构建库而非应用,需要配置此项。ssr:
服务器端渲染配置,如果需要启用 SSR,需要设置为 true。
CSS 配置:
modules:
CSS Modules 配置,包括作用域行为和生成类名格式。preprocessorOptions:
CSS 预处理器配置,如 Sass、Less 的全局变量导入。postcss:
PostCSS 配置,例如自动添加浏览器前缀。
环境变量:
envPrefix:
环境变量前缀,通常为 'VITE_'。
其他配置:
logLevel:
日志级别,通常设置为 'info'。clearScreen:
是否清除终端屏幕,通常设置为 true。optimizeDeps:
依赖优化配置,包括需要预构建的依赖和需要排除的依赖。