赞
踩
前言:最近项目要从vue2.x迁移到vue3,于是借此机会打算重构整个项目。在搭建项目的时候发现vue3更新了构建方式,放弃了webpack,使用了新的构建机制vite。再经过一番了解后发现vite借助了esbuild与rollup。
vite开发大致分两个阶段
现代浏览器基本支持了esmodule,考虑到要在生产环境获得最佳的加载性能,vite在生产环境使用rollup来进行打包构建,由于vite的插件机制是借鉴rollup来实现的,使得rollup大部分插件可以直接在vite中使用,可以说是双向奔赴了
当以命令行方式运行 vite 时,vite 会自动解析项目根目录下名为 vite.config.js 的文件。以下是基础的配置文件:
通过 IDE 和 jsdoc 的配合来实现智能提示
// vite.config.js
/** @type {import('vite').UserConfig} */
export default {
// 一些自定义基础配置
}
使用工具函数 defineConfig
import { defineConfig } from 'vite';
export default defineConfig({
// 一些自定义基础配置
})
使用defineConfig工具函数并以箭头函数作为callback函数接收command, mode, ssrBuild来获取一些基本参数,用于区分环境亦或者是一个 SSR 构建(ssrBuild)
// vite.config.js
export default defineConfig(({ command, mode, ssrBuild }) => {
if (command === 'serve') {
return {
// dev 独有配置
}
} else {
// command === 'build'
return {
// build 独有配置
}
}
})
路径配置可以自定义配置或者借助插件
自定义配置
// vite.config.js
import { defineConfig } from 'vite';
import path from 'path';
export default defineConfig({
resolve: {
alias: {
'@': path.resolve(__dirname, './src') // 路径别名
}
}
})
假如你的项目使用 typescript 进行开发,则需要在 tsconfig.json 文件中配置paths,否则IDE引入路径飘红
// tsconfig.json
{
"paths": {
"@src/*": ["./src/*"],
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue"] // 编译对以下文件进行ts检测
"exclude": ["dist", "node_modules"] // 编译排除以下文件ts检测
}
使用 vite-aliases 插件
默认别名示例:src -> @src; hooks -> @hooks,即使用@符号作为前缀
import { defineConfig } from 'vite';
import { ViteAliases } from 'vite-aliases';
export default defineConfig({
plugins: [
ViteAliases()
]
})
使用/引入路径示例:
import xxx from ‘@src/xxxx’;
import xxx from ‘@hooks/xxxx’;
vite虽然内置了css预处理器,如需要按需引入则需要手动引入css工具
css: {
preprocessorOptions: {
scss: {
additionalData: `@import '/xxx/xx.scss;` // 引入全局变量文件
}
},
},
export default defineConfig({ server: { host: true, // 对所有地址进行监听 proxy: { // 字符串 '/foo': 'http://localhost:8080', // 选项写法 '/api': { target: 'http://xxxx.xxxx.com', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') }, // 正则表达式写法 '^/fallback/.*': { target: 'http://xxxx.xxxx.com', changeOrigin: true, rewrite: (path) => path.replace(/^\/fallback/, '') }, } }, }, })
vite默认引用外部index.html,在里面通过type="module"实现ES Module注入模版,如果需要调整则需要在 vite.config.js 添加root属性,也可以配置 build 属性(支持多入口)。
import { defineConfig } from 'vite';
export default defineConfig({
root: 'src/packages/index/', // 模版路径
})
rollup打包并不允许相对路径的存在,多入口需要配置不同的npm scripts命令来进入不同的入口(即使这么做是没意义的),试着探索一下可行性,于是有了以下操作:
import { defineConfig } from 'vite';
export default defineConfig({
build: {
rollupOptions: {
input: {
mono1: path.resolve(__dirname, 'src/packages/template1/index.html'),
mono2: path.resolve(__dirname, 'src/packages/template2/index.html'),
},
},
},
})
// package.json
"scripts": {
"mono1": "vite serve src/packages/template1/ --config ./vite.config.ts",
"mono2": "vite serve src/packages/template2/ --config ./vite.config.ts",
}
import { defineConfig } from 'vite'; import viteImagemin from 'vite-plugin-imagemin'; export default defineConfig({ plugins: [ viteImagemin({ gifsicle: { optimizationLevel: 7, interlaced: false }, optipng: { optimizationLevel: 7 }, mozjpeg: { quality: 20 }, pngquant: { quality: [0.8, 0.9], speed: 4 }, svgo: { plugins: [ { name: 'removeViewBox' }, { name: 'removeEmptyAttrs', active: false } ] } }) ], })
这是我第一次写关于vite的文章,由于个人水平有限,也是刚接触到vite,而且每个人的观点和方法可能都存在差异。因此文章中难免会有不严谨甚至不正确的地方,并且每个人的开发环境略有差别,可能会导致代码表现差异,如有发现,欢迎大家指出来并多多交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。