环境
- vite: 2.9.9
- unplugin-vue-components: 0.19.6
参考
问题描述
本地开发时,遇到跳转页面要等10s以上才能跳转成功,打包后没有这个问题
问题分析
发现跳转到的页面如果有新的antd组件,就会有这个问题
问题原因
项目中使用了unplugin-vue-components按需引入antd组件,但是在开发环境中有问题,详情可查看issue,实际是按需引入样式导致的问题
解决方法
开发环境全局引入样式,正式环境按需引入样式
有问题的vite.config.ts如下(此处省略了部分配置,只关注需要修改的项)
import Components from "unplugin-vue-components/vite";
import { AntDesignVueResolver } from "unplugin-vue-components/resolvers";
export default ({ command, mode }: ConfigEnv): UserConfig => {
// ...
return {
// ...
plugins: [
// ...
Components({
resolvers: [AntDesignVueResolver()],
}),
],
};
我们引入一个插件vite-plugin-ifdef,用于区分开发环境和生产环境,使用yarn或npm安装
yarn add vite-plugin-ifdef
然后修改vite.config.ts如下
import Components from "unplugin-vue-components/vite";
import { AntDesignVueResolver } from "unplugin-vue-components/resolvers";
import ifdef from "vite-plugin-ifdef";
/** vite-plugin-ifdef插件的配置项 */
type IfdefConfig = { "ifdef-define": any; "ifdef-option": any };
export default ({ command, mode }: ConfigEnv): UserConfig & IfdefConfig => {
// ...
return {
// ...
plugins: [
ifdef(),
// ...
Components({
/**
* 开发环境(serve命令)若配置importStyle会导致使用ant-design的组件加载时间长达10s以上,
* 故仅在打包环境(build命令)按需加载ant-design的样式,开发环境全量引入样式文件
* https://github.com/antfu/unplugin-vue-components/issues/361
*/
resolvers: [AntDesignVueResolver({ importStyle: command === "build" ? "less" : false })],
}),
],
"ifdef-define": {
COMMAND: command,
},
// 注意此处有坑,vite-plugin-ifdef的文档中给的键名 ifdef-config 是错误的
"ifdef-option": {
verbose: false,
},
};
在项目的入口文件main.js中引入样式
// ============================ 根据开发环境和生产环境使用不同的方法引入antd的样式 start ==================================================
// 仅在开发环境(vite serve命令)全量引入antd样式,生产环境(vite build命令)使用unplugin-vue-components按需引入(参见:vite.config.js)
/// #if COMMAND === 'serve'
import "ant-design-vue/dist/antd.less";
/// #else
// unplugin-vue-components 无法按需引入非组件模块的样式,故在此处引入
import "ant-design-vue/lib/message/style/index.less";
import "ant-design-vue/lib/notification/style/index.less";
/// #endif
// ============================ 根据开发环境和生产环境使用不同的方法引入antd的样式 end ==================================================
补充
踩了个坑,使用这个方案后发现自定义的antd弹框样式本地和发布的版本不一样,发现是因为自定义组件在antd.less之前引入了,导致开发环境和生产环境的样式顺序不一致,故最好把上面的样式引入代码放到main.js顶部
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。