# Uni App Vite 项目基础配置
封装 vite.config.ts
的基本配置,开箱即用。
# 如何使用
安装
pnpm add @plugin-light/project-config-uni-vite -D
在 vite.config.ts
中添加如下设置:
import { getUniVue3ViteConfig } from '@plugin-light/project-config-uni-vite';
import { defineConfig } from 'vite';
export default defineConfig(({ mode }) => {
return getUniVue3ViteConfig({ mode });
});
# 参数
import type { Plugin, ServerOptions, CommonServerOptions, BuildOptions } from 'vite';
import type { Server } from 'node:https';
import tailwindcss from 'tailwindcss';
import type { UniTailwindPluginUserOptions } from '@uni-helper/vite-plugin-uni-tailwind';
import type { IRemoveVueDirectionOptions } from '@plugin-light/vite-plugin-remove-vue-directive';
import type { ICrossGameStyleOptions } from '@plugin-light/vite-plugin-cross-game-style';
import type { Options as TransformWebTagOptions } from '@plugin-light/postcss-plugin-transform-web-tag';
import type { Options as LegacyOptions } from '@vitejs/plugin-legacy';
import type { Options as ESBuildOptions } from 'rollup-plugin-esbuild';
export interface IUniViteConfigOptions {
mode: string;
uni: any;
// 端口,传递给 server.port
port?: CommonServerOptions['port'];
// https 配置,传递给 server.https
https?: Server;
// host 配置,传递给 server.host
host?: CommonServerOptions['host'];
// 前置插件
prePlugins?: Array<Plugin>;
// 后置插件
postPlugins?: Array<Plugin>;
// 对应 optimizeDeps.include
optimizeDepsIncludes?: Array<string>;
removeVueDirectionOptions?: IRemoveVueDirectionOptions;
hmr?: ServerOptions['hmr'];
// 语法警报列表,比如 v-model,destroyed
warnList?: ICrossGameStyleOptions['warnList'];
// transform-web-tag postcss插件
transformWebTagOptions?: boolean | TransformWebTagOptions;
// uniTailwind 插件
uniTailwindOptions?: boolean | UniTailwindPluginUserOptions;
// tailwindcss postcss插件
tailwindcssOptions?: boolean | Parameters<typeof tailwindcss>[0];
// 构建选项
buildOptions?: BuildOptions;
// 是否使用chunk-split
useChunkSplit?: boolean;
// 是否使用 @vitejs/plugin-legacy
// 传递对象格式将作为插件参数
useLegacy?: boolean | LegacyOptions;
// 传递给 uni 插件的参数
uniOptions?: any;
// 是否使用 rollup-plugin-esbuild
// 传递对象格式将作为插件参数
useESBuildPlugin?: boolean | ESBuildOptions;
}
# 注意事项
node.js 版本 >= 16
支持在环境变量文件中配置
VUE_APP_DIR
,环境变量文件可以是.env
,.env.local
等,举例如下:
UNI_INPUT_DIR = './src/project/guandan-match'
VUE_APP_DIR = project/guandan-match
# 对外脚本
本插件导出了几个脚本,外部可以使用。
- 修复
uni-app
中monorepo
仓库下打包路径问题
原理是修改了 node_modules/@dcloudio/uni-cli-shared/dist/utils.js
源码中的 normalizeNodeModules
方法,增加了下面这句:
str = str.replace(/^[./]*/, '');
使用方式:
require('@plugin-light/project-config-uni-vite/public-script/uni/fix-uni-dir');
- 修复
uni-app
小程序下样式文件变化无法重新编译的问题
小程序开发时,独立的 sass
文件改动后并不会重新编译,用一个全新的示例工程也不可以。看了下源码,uni-app
是用 import('vite').then({build}=>{})
这种方式来启动的。
解决办法是利用 gulp.watch
,监听 ./src/**/*.scss
文件,然后修改下 main.ts
,然后这样就能重新编译了。同时加上了 debounce
。
使用方式:
require('@plugin-light/project-config-uni-vite/public-script/watch/watch-sass')();
# SCSS 警告说明
配置中屏蔽了 import (opens new window)、legacy-js-api (opens new window)、mixed-decls (opens new window) 的相关警告信息。
原因如下:
uni-app
会把uni.scss
放到业务每个scss
前面,所以@import
改成@use
后,会报错@use rules must be written before any other rules
legacy-js-api
问题,也是uni-app
中使用了node-sass
的renderSync
mixed-decls
问题,涉及到样式优先级问题,业务自己判断即可
# useChunkSplit 说明
设置 useChunkSplit
为 true
后,将会开启:
- 将
aegis-v2
、axios
作为外链 - 将一些库单独拆包
t-comm、press-ui、press-plus、 pmd-npm
=>pmd-pkg
@dcloudio/uni-h5
=>uni-h5
仅在 H5 下有效。
# 低版本浏览器兼容
使用方式为,设置 useLegacy
为 true
。
原理,使用了 @vitejs/plugin-legacy (opens new window) 这个三方库,以及修复了它不支持 CDN
的问题。
是否会影响 H5 在高版本浏览器的性能?基本不会,具体可自行搜索 @vitejs/plugin-legacy (opens new window) 的原理。
如何判断当前项目是运行的的 module
产物,还是 legacy
产物?控制台打印 window.__vite_is_modern_browser
,为 true
则表示运行的是 module
产物,否则为 legacy
产物。