我们来学习配置下vite.config.ts。
Vite 是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:
Vite 意在提供开箱即用的配置,同时它的 插件 API 和 JavaScript API 带来了高度的可扩展性,并有完整的类型支持。vite在打包时已经做了优化(代码分割、异步加载优化等),因此,无需我们过多配置即可使用。
Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。
下方任何一个即可:
npm create vite@latest
yarn create vite
pnpm create vite
修改package.json中的scripts对象 :
{
"scripts": {
"dev": "vite", // 启动开发服务器,别名:`vite dev`,`vite serve`
"build": "vite build", // 为生产环境构建产物
"preview": "vite preview" // 本地预览生产构建产物
}
}
然后 npm run dev 或 直接 npx vite即可。
vite.config.ts简单的配置如下:
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
css: {
preprocessorOptions: {
scss: {
additionalData: '@import "@/assets/css/main.scss";'
}
}
}
})
上面时构建vue3+ts时自动生成的配置文件,我们在这基础上完善即可。
配置文件使用 esmodule导出一个对象,如果需要进行复杂的配置,需要使用defineConfig工具函数包裹对象。
import { defineConfig } from 'vite'
export default defineConfig({
// ...
})
项目根目录(index.html 文件所在的位置)。可以是一个绝对路径,或者一个相对于该配置文件本身的相对路径。默认process.cwd()。
开发或生产环境服务的公共基础路径。合法的值包括以下几种:
指定 base 配置项后,所有资源的路径都将据此配置重写。这个选项也可以通过命令行参数指定,例如 vite build --base=/my/public/path/。 如果你的项目带有上下文,需要指定一下base。
在配置中指明将会把 serve 和 build 时的模式 都 覆盖掉。也可以通过命令行 --mode 选项来重写。
默认: ‘development’ 用于开发,‘production’ 用于构建。
例如 : ‘vue-tsc --noEmit && vite build --mode test’,(需要在根目录创建一个.env.test文件)
定义全局常量替换方式。其中每项在开发环境下会被定义在全局,而在构建时被静态替换。因为它是不经过任何语法分析,直接替换文本实现的,所以我们建议只对 CONSTANTS 使用 define。
例如,process.env.FOO 和 __APP_VERSION__ 就非常适合。但 process 或 global 不应使用此选项。变量相关应使用 shim 或 polyfill 代替。
从 2.0.0-beta.70 开始,string 值会以原始表达式形式使用,所以如果定义了一个字符串常量,它需要被显式地打引号。(例如使用 JSON.stringify)
为了与 esbuild 的行为保持一致,表达式必须为一个 JSON 对象(null、boolean、number、string、数组或对象),亦或是一个单独的标识符。
替换只会在匹配到周围不是其他字母、数字、_ 或 $ 时执行。
plugins是一个配置要使用插件的数组,vite插件是一个函数,所以使用时直接调用就行,不要用new 调用 。数组中也可以使用对象来添加一些属性,实现特定效果:
// vite.config.js
import image from '@rollup/plugin-image'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
{
...image(),
enforce: 'pre'
}
]
})
// vite.config.js
import typescript2 from 'rollup-plugin-typescript2'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
{
...typescript2(),
apply: 'build'
}
]
})
作为静态资源服务的文件夹。该目录中的文件在开发期间在 / 处提供,并在构建期间复制到 outDir 的根目录,并且始终按原样提供或复制而无需进行转换。该值可以是文件系统的绝对路径,也可以是相对于项目的根目录的相对路径。
将 publicDir 设定为 false 可以关闭此项功能。
请注意:
模块解析时规则对象,可以在解析的时候替换指定内容,含有alias(别名)、extensions(扩展名)等属性。
例:
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
export default defineConfig({
resolve: {
// 别名
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
},
// 扩展
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
},
})
处理css相关的配置,有modules、postcss、preprocessorOptions等。
import { defineConfig } from 'vite'
const postCssPxToRem = require('postcss-pxtorem')
// https://vitejs.dev/config/
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: '@import "@/assets/css/main.scss";'
}
},
postcss: {
plugins: [
// px转rem插件
postCssPxToRem({
// rootValue: 144, // (设计稿/10)1rem的大小
propList: ['*']
})
]
}
}
})
用于加载 .env 文件的目录。可以是一个绝对路径,也可以是相对于项目根的路径。默认root(项目根目录).Vite 使用 dotenv 从你的 环境目录 中的下列文件加载额外的环境变量:
加载的环境变量也会通过 import.meta.env 以字符串形式暴露给客户端源码。为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码。
根目录新建一个文件夹env,然后创建.env.development(开发环境)文件和.env.production(生产环境)文件。
改变envDir目录。这里我为了可以在配置文件内拿到自定义的环境变量,采用了函数形式配置vite.config.ts。
/*
* @Date: 2022-10-27 11:31:17
* @LastEditors: zhangsk
* @LastEditTime: 2022-12-02 13:41:41
* @FilePath: \basic-demo\vite.config.ts
* @Label: Do not edit
*/
import { fileURLToPath, URL } from 'node:url'
import { defineConfig, loadEnv } from 'vite'
/** @type {import('vite').UserConfig} */
// https://vitejs.dev/config/
export default ({ command, mode }: any) => {
// env文件变量
const env = loadEnv(mode, fileURLToPath(new URL('./env', import.meta.url)))
// 是否是构建模式
const isBuild = command === 'build'
console.log(isBuild, mode);
return defineConfig({
plugins: [vue()],
// env目录
envDir: fileURLToPath(new URL('./env', import.meta.url)),
// 文件根目录
base: env.VITE_BASE_SXW ? env.VITE_BASE_SXW + '/' : '/',
})
}
package.json 文件中的dev和build启动命令。默认的mode分别是development和production,如果你想自定义env文件,在命令行后添加 --mode 自定义env文件名即可。例如:创建了一个.env.test文件,打包命令:
"test":"vue-tsc --noEmit && vite build --mode test"
开发服务器选项设置对象,包含属性常用的有host、port、open、proxy。
// 开发服务器
server: {
// 服务端口
port: Number(env.VITE_PORT),
// host (不带端口)
host: env.VITE_HOST,
// 是否自动打开
open: false,
//为开发服务器配置自定义代理规则。
proxy: {
'/api': {
target: 'http://localhost:4000', // 意思是代理 http://localhost:4000
changeOrigin: true,
rewrite: (h) => h.replace(/^\/api/, '')
}
}
}
项目构建选项设置对象。常用的属性有target、outDir、assetsDir、assetsInlineLimit。
// 构建选项
build: {
// 输出目录,默认dist(相对于根目录)
outDir: 'dist',
// 指定生成静态资源的存放路径 ,,默认 assets
assetsDir: 'assets',
//小于此阈值的导入或引用资源将内联为 base64 编码,以避免额外的 http 请求。设置为 0 可以完全禁用此项。 默认4096 (4kb)
assetsInlineLimit: 4096,
//设置最终构建的浏览器兼容目标。默认值是一个 Vite 特有的值——'modules',这是指 支持原生 ES 模块、原生 ESM 动态导入 和 import.meta 的浏览器。
// 另一个特殊值是 “esnext” —— 即假设有原生动态导入支持,并且将会转译得尽可能小,一般会搭配esbuild使用
target: 'modules'
},
// ESBuildOptions 继承自 esbuild 转换选项。
esbuild: {
// 最常见的用例是自定义 JSX
jsxFactory: 'h',
jsxFragment: 'Fragment'
}
})
import { fileURLToPath, URL } from 'node:url'
import { build, defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
const postCssPxToRem = require('postcss-pxtorem')
// https://vitejs.dev/config/
export default ({ command, mode }: any) => {
// env文件变量
const env = loadEnv(mode, fileURLToPath(new URL('./env', import.meta.url)))
// 是否是构建模式
const isBuild = command === 'build'
console.log(isBuild, mode);
return defineConfig({
plugins: [vue()],
resolve: {
// 别名
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
},
// 扩展
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
},
css: {
preprocessorOptions: {
scss: {
additionalData: '@import "@/assets/css/main.scss";'
}
},
postcss: {
plugins: [
// px转rem插件
postCssPxToRem({
// rootValue: 144, // (设计稿/10)1rem的大小
propList: ['*']
})
]
}
},
// env目录
envDir: fileURLToPath(new URL('./env', import.meta.url)),
// 文件根目录
base: env.VITE_BASE_SXW ? env.VITE_BASE_SXW + '/' : '/',
// 开发服务器
server: {
// 服务端口
port: Number(env.VITE_PORT),
// host (不带端口)
host: env.VITE_HOST,
// 是否自动打开
open: false,
//为开发服务器配置自定义代理规则。
proxy: {
'/api': {
target: 'http://localhost:4000', // 意思是代理 http://localhost:4000
changeOrigin: true,
rewrite: (h) => h.replace(/^\/api/, '')
}
}
},
// 构建选项
build: {
// 输出目录,默认dist(相对于根目录)
outDir: 'dist',
// 指定生成静态资源的存放路径 ,,默认 assets
assetsDir: 'assets',
//小于此阈值的导入或引用资源将内联为 base64 编码,以避免额外的 http 请求。设置为 0 可以完全禁用此项。 默认4096 (4kb)
assetsInlineLimit: 4096,
//设置最终构建的浏览器兼容目标。默认值是一个 Vite 特有的值——'modules',这是指 支持原生 ES 模块、原生 ESM 动态导入 和 import.meta 的浏览器。
// 另一个特殊值是 “esnext” —— 即假设有原生动态导入支持,并且将会转译得尽可能小,一般会搭配esbuild使用
target: 'modules'
},
// ESBuildOptions 继承自 esbuild 转换选项。
esbuild: {
// 最常见的用例是自定义 JSX
jsxFactory: 'h',
jsxFragment: 'Fragment'
}
})
}
package.json scripts部分
"scripts": {
"dev": "vite --mode development ",
"build": "run-p type-check build-only",
"preview": "vite preview",
"build-only": "vite build",
"type-check": "vue-tsc --noEmit",
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore"
},
vite 的简单配置就结束了,vite内部已经做好了转换编译等工作,所以我们只需简单配置即可使用。这篇文章只介绍了常见的配置选项,如果你要了解更加详细的vite配置,请转到vite中文官网。