起因
刚把element-plus从2.7.8升级到最新的了2.9.4,发现首次刷新页面时候,加载更慢了。似乎是网络请求比之前更多一些了,下载的文件量更大导致的这个问题。
然后就怀疑是不是把整个element-plus包全部引入了,但是我是用的nuxt的插件@element-plus/nuxt,这个插件按理来说是会自动按需加载呀,心中的疑惑大大的。
排查
查看网络请求中,发现有1034项,共计27.2MB,发现加载了skeleton.mjs文件,由于我知道项目没有使用骨架屏,所以由此可以看出应该是加载了全部组件。
从skeleton.mjs文件的启动器,可以看出是从/_nuxt/node_modules/element-plus/es/index.mjs?v=a2632a4a文件中加载的。
网络中再筛选查看index.mjs,查看它的启动器,发现是从/_nuxt/pages/index.vue 的第68行加载的,对应的代码内容为
import { ElDropdown, ElDropdownItem, ElDropdownMenu ,ElIcon } from 'element-plus';
这里看起来没有什么问题,手动加载了几个组件,并使用。(解释一下这里为什么我需要手动导入,是因为在script中使用了tsx的语法创建组件,如果不手动导入会报错还是啥,忘了)
实际上这里写法有大问题
查看官方的按需导入写法
查看了element-plus官网的开发指南,发现他们是这样写的
<script setup lang="ts">
// 要保证当前组件已注册到 @element-plus/components
import { ComponentYouAreDeveloping } from '@element-plus/components'
</script>
关键就在于它们写的是@element-plus/components,相当于跟上了路径的。我的区别是没加路径。
这个时候我用鼠标点击我的代码中的 'element-plus',发现导航到了node_modules\element-plus\es\index.d.ts文件,这个文件内容是这样的:
import installer from './defaults';
export * from 'element-plus/es/components';
export * from 'element-plus/es/constants';
export * from 'element-plus/es/directives';
export * from 'element-plus/es/hooks';
export * from './make-installer';
export declare const install: (app: import("vue").App, options?: import("element-plus/es/components").ConfigProviderContext) => void;
export declare const version: string;
export default installer;
export { default as dayjs } from 'dayjs';
看到这,我悟了啊!!
这个export *看着就很不对劲啊
解决问题
于我将导入语法改成这样
import { ElDropdown, ElDropdownItem, ElDropdownMenu } from 'element-plus/es/components/dropdown';
import { ElIcon } from 'element-plus/es/components/icon';
再次刷新网页,网络中不再加载skeleton.mjs文件了,问题解决。
事了拂衣去,身藏功与名。
优雅,属实优雅