本文最后更新于 2025-02-15,文章内容可能已经过时。

https://cn.vitejs.dev/guide/

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

根据命令窗口交互提示,选择VanillaVanilla不使用任何框架的情况下创建一个工程项目,像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.errorpostcss中的一个插件,它可以通过js形式计算出css样式!

postcss 中有很多插件,比如单位转换px转rem,低版本浏览器css属性兼容,还有前缀插件等!

https://www.postcss.com.cn/

然后在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中的插件之一,具体使用方式如下!

  1. 依赖安装:

    pnpm install @postcss-plugins/console -D
    
  2. 新建 postcss.config.js

    postcss.config.js 是配置文件,在vite中对postcss已有内置,新建配置文件后,便会加载该配置文件!

    module.exports = { 
      plugins: [require('@postcss-plugins/console')]
    }
    

CSS Module

https://cn.vitejs.dev/guide/features.html#css

任何以 .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路径查询参数

添加一些特殊的查询参数可以更改资源被引入的方式

  1. url 该参数会返回一个解析后的url地址

    // 显式加载资源为一个 URL
    import assetAsURL from "@/jsx/hello.jsx?url"
    // jsx url /src/jsx/hello.jsx
    
  2. raw字符串形式加载资源

    会返回jsx文件中的内容

    // 以字符串形式加载资源
    import assetAsString from './hello.jsx?raw'
    
    import { defineComponent } from "vue";
    
    export default defineComponent({
      setup() {
        return () => {
          return <div>hello jsx</div>;
        };
      }
    })
    
  3. web worker

    // 加载为 Web Worker
    import Worker from './worker.js?worker'
    
    // 在构建时 Web Worker 内联为 base64 字符串
    import InlineWorker from './worker.js?worker&inline'
    
  4. JSON文件导入

    import jsonTest from "./assets/test.json"
    // 会将json以对象的内容进行输出
    

assetspublic 区别

  1. assetssrc目录下的静态资源:

    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
      
  2. public根目录中的一个文件夹:

    public 文件夹内的文件不会受到编译的影响,最终都会以初始的文件状态进行结果打包!

eslintprettier

1. eslint 是一个代码规范插件,它可以通过配置预设方式来规定代码书写的规范检查!

2. prettier 是一个代码格式化插件,它需要在编辑器中安装这个插件,配合eslint来使用,可以设置编辑器在保存代码时,进行格式化代码块,来纠正代码到eslint的所定义的格式规范!

3. husky 是一个代码提交插件,它会在提交代码之前,去做eslint校验,保证代码的规范性,若存在不规范代码,则无法进行提交commit!

在使用eslintprettier 之前,需要在开发工具安装这两个插件,例如vscode 、 webstorm!

eslint 相关配置

https://eslint.nodejs.cn/docs/latest/use/getting-started

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-recommendedvue3标准规范配置继承规范后,代码规则检测,将以此规范进行代码检测!

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 相关配置

https://www.prettier.cn/docs/index.html

首先需要在开发工具中,安装此插件,之后,在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

初始化会自动做两件事情:

  1. package.json中添加scripts脚本!

    {
      "scripts": {
        "prepare": "husky"
      }
    }
    

    项目其他成员克隆我们的代码后运行 npm install 时,"prepare"被触发husky init 会运行,这样能确保每个开发者在克隆项目并安装依赖时都有相同的 Git 钩子设置

  2. 创建一个 .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)。在构建应用时,如果配置了 publicPathbase 选项,该属性会反映配置的基路径。例如,如果应用部署在 https://example.com/app/,则 BASE_URL/app/
import.meta.env.PROD 布尔值 表示应用是否运行在生产模式。当 MODEproduction 时,该属性为 true;否则为 false。用于在代码中根据运行环境执行不同的逻辑,例如启用性能优化、关闭调试信息等。
import.meta.env.DEV 布尔值 表示应用是否运行在开发模式。当 MODEdevelopment 时,该属性为 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来实现!

teststaging

test 用于开发阶段测试环境

staging 用于交付阶段uat应用测试 环境

  1. 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
    
  2. 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
    
devpreview

dev本地开发环境,主要是开发业务功能,测试等!

preview本地production Mode预览的一个环境,主要用来调试,在生产环境出现的问题!

这两中 mode 都会在本地启动一个服务,进行本地项目预览,但是preview env环境production,而dev env环境是,development!

  1. vite dev(开发服务器):
  • 用途:主要用于开发阶段,提供快速的热模块替换(HMR)、实时重载和详细的调试信息。
  • 特点:
    1. 启动开发服务器,默认运行在 http://localhost:3000(端口可配置)。
    2. 支持模块热替换(HMR),即在代码修改后自动更新页面,无需手动刷新
    3. 提供详细的错误信息和源码映射(source maps),便于调试
    4. 适用于日常开发测试
  1. vite preview(预览服务器):
  • 用途:用于在本地预览生产构建后的应用,模拟生产环境的行为。
  • 特点:
    1. 启动一个静态文件服务器,用于提供构建后的静态文件(通常位于 dist 目录)。
    2. 不包含开发服务器的特性,如 HMR 和源码映射
    3. 适用于在本地验证生产构建结果,或在部署前进行最终检查
    4. 默认运行在 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.jsb.js 等文件。
[seq] 匹配方括号内的任意一个字符序列 [ab].js 匹配 a.jsb.js
[!seq][^seq] 匹配不在方括号内任意一个字符序列 [^ab].js 匹配除 a.jsb.js 之外的文件。
{foo,bar} 匹配大括号内任意一个字符串 {foo,bar}.js 匹配 foo.jsbar.js
{n..m} 匹配数字范围 nm 之间的任意一个数字。 {1..3}.js 匹配 1.js2.js3.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.jsA.js 等文件。
**/[a-z]*.js 匹配以小写字母开头的 .js 文件。 **/[a-z]*.js 匹配类似 a.jsb.js 等文件。
**/[^_]*.js 匹配不以 _ 开头的 .js 文件。 **/[^_]*.js 匹配类似 a.jsb.js 等文件。
**/_*.js 匹配以 _ 开头的 .js 文件。 **/_*.js 匹配类似 _a.js_b.js 等文件。
`**/*.@(js | ts | json)`
`**/!(*.js | *.ts)` 排除所有 .js.ts 文件。
`**/!(foo | bar).js` 排除所有名为 foo.jsbar.js 的文件。
`**/?(foo | bar).js` 匹配可选的 foo.jsbar.js
`**/+(foo | bar).js` 匹配至少一个 foo.jsbar.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'] // 需要排除的依赖
  }
});

配置说明

  1. 基本配置:
    • root: 指定项目根目录,通常为 process.cwd()。
    • base: 公共基础路径,根据部署环境调整,例如 / 或 /myapp/。
    • mode: 环境模式,通常设置为 'development' 或 'production'。
  2. 插件配置:
    • Vue.js 插件:如果项目使用 Vue.js,需要引入并配置 @vitejs/plugin-vue。
    • React 插件:如果项目使用 React,需要引入并配置 @vitejs/plugin-react。
    • 图片压缩插件:使用 vite-plugin-imagemin 进行图片压缩,提升构建性能。
    • CSS 工具类框架:使用 unocss 或其他类似工具,提升 CSS 开发效率。
    • 构建分析插件:使用 rollup-plugin-visualizer 分析构建产物,优化打包大小。
  3. 路径别名:
    • 配置 @ 指向 src 目录,方便模块导入
    • 根据项目结构调整其他路径别名,如 @assets、@components 等。
  4. 服务器配置:
    • port: 开发服务器端口,通常设置为 3000 或其他常用端口。
    • host: 开发服务器主机名,通常为 'localhost'。
    • open: 是否自动打开浏览器,通常设置为 true。
    • cors: 启用 CORS,允许跨域请求。
    • proxy: 代理配置,用于解决开发环境下的 API 代理问题。
  5. 优化配置:
    • outDir: 构建输出目录,通常为 dist。
    • assetsDir: 静态资源输出目录,通常为 assets。
    • rollupOptions: 传递给 Rollup 的自定义配置,用于更细粒度的控制构建过程。
    • minify: 代码压缩器,通常使用 'esbuild' 或 'terser'。
    • sourcemap: Source map 配置,根据需要选择 'hidden' 或 'none'。
    • lib:库模式配置,如果需要构建库而非应用,需要配置此项。
    • ssr:服务器端渲染配置,如果需要启用 SSR,需要设置为 true。
  6. CSS 配置:
    • modules: CSS Modules 配置,包括作用域行为和生成类名格式。
    • preprocessorOptions: CSS 预处理器配置,如 Sass、Less 的全局变量导入。
    • postcss: PostCSS 配置,例如自动添加浏览器前缀。
  7. 环境变量:
    • envPrefix: 环境变量前缀,通常为 'VITE_'。
  8. 其他配置:
    • logLevel: 日志级别,通常设置为 'info'。
    • clearScreen: 是否清除终端屏幕,通常设置为 true。
    • optimizeDeps: 依赖优化配置,包括需要预构建的依赖和需要排除的依赖。