Vue3项目中使用ElementPlus作为组件库,由于使用到的组件类型有限,所以将完整引入变为组件内手动引入的方式,打包之后ElementPlus的包体积由1.4MB => 770KB
image.pngimage.png

  1. // main.ts
  2. import { createApp } from 'vue'
  3. import ElementPlus from 'element-plus'
  4. import 'element-plus/dist/index.css'
  5. import App from './App.vue'
  6. const app = createApp(App)
  7. app.use(ElementPlus)
  8. app.mount('#app')

手动引入需要删除**import ElementPlus****app.use(ElementPlus) **

  1. // main.ts
  2. import { createApp } from 'vue'
  3. // import ElementPlus from 'element-plus'
  4. import 'element-plus/dist/index.css'
  5. import App from './App.vue'
  6. const app = createApp(App)
  7. // app.use(ElementPlus)
  8. app.mount('#app')

组件内手动引入:

  1. <template>
  2. <el-button>I am ElButton</el-button>
  3. </template>
  4. <script>
  5. import { ElButton } from 'element-plus'
  6. export default {
  7. components: { ElButton },
  8. }
  9. </script>

TIPS:从完整引入变为手动引入之后,ElementPlus自定的指令需要注册(全局注册或局部注册)之后才能使用。
例如v-loading指令和v-infiniteScroll指令
全局注册:

  1. // main.ts
  2. import { createApp } from 'vue'
  3. // import ElementPlus from 'element-plus'
  4. import 'element-plus/dist/index.css'
  5. import { ElLoading } from 'element-plus';
  6. import App from './App.vue'
  7. const app = createApp(App)
  8. // app.use(ElementPlus)
  9. app.directive('loading', ElLoading.directive);
  10. app.mount('#app')

局部注册:

  1. <script lang="ts" setup>
  2. import { ElInfiniteScroll as vInfiniteScroll } from 'element-plus';
  3. </script>
  1. <script lang="ts">
  2. import { ElInfiniteScroll as InfiniteScroll } from 'element-plus';
  3. export default defineComponent({
  4. directives: {
  5. InfiniteScroll
  6. },
  7. </script>

手动引入之后,组件名可以用的首字母小写的方式,也可以用首字母大写的方式。TypeScript对这两种写法进行了区别:其中小写字母开头称为固有元素,大写字母开头称为基于值的元素。

问题:ElementPlus对于一些原生元素的封装之后,用大写的标签名会存在原生属性不存在的问题

比如 el-input是对原生input的封装,当在jsx里用首字母大写标签名时,onKeyup和onClick这种原生属性就会报错,换成小写标签名就不报错了。
image.pngimage.png

产生以上问题的原因是:
TypeScript对于这两种写法的类型检查规则不同,详见:https://www.tslang.cn/docs/handbook/jsx.html

element plus给这类固有元素做了声明,并继承NaviteElements,支持任意属性和类型。因此使用小写标签名就不会报错了。
image.png