美文网首页
vue组件库如何按需引入之babel-plugin-import

vue组件库如何按需引入之babel-plugin-import

作者: 偶余杭 | 来源:发表于2019-12-27 11:16 被阅读0次

    组件库的按需引用可以精简项目资源大小,提升项目性能。目前使用广泛的组件库,如element、iview、antd等都可以按需引入了。那如何实现组件库的按需引入呢?

    需求解析

    比如一个vue项目的组件库:ComponentsDemo,全局引入组件库的代码为:

    import vsuite from "vsuite";
    Vue.use(vsuite);
    

    需要按需引入的时候,代码为:

    import  ComponentA   from "ComponentsDemo/src/components/component-a ";
    vue.component("ComponentA ", ComponentA );
    

    这样写,其实已经满足了我们的需求。但是这样写不是很优雅,那么,怎么简化import ComponentA from "ComponentsDemo/src/components/component-a ";呢?这就设计到对import语句的解析转化了。
    由此想到了Babel,我们知道Babel 是一个 JavaScript 编译器,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。而Babel插件可以在输入源码 => 输出编译后的代码的过程中做一些操作,比如实现以下代码:

    import { ComponentA, ComponentB } from 'ComponentsDemo';
    
    ↓ ↓ ↓ ↓ ↓ ↓
    
    import  ComponentA   from "ComponentsDemo/src/components/component-a ";
    import  ComponentB   from "ComponentsDemo/src/components/component-b ";
    

    能实现这一步骤的babel插件之中,babel-plugin-import使用的比较多。

    babel-plugin-import

    babel-plugin-import是阿里开源的一款babel插件,其主要用于组件的按需引入。
    babel-plugin-import npm链接
    关于babel-plugin-import的制作思路可以看这篇文章:手把手教你开发一个babel-plugin

    vue组件库按需引入设置

    自定义的vue组件库ComponentsDemo,想要让它可以被按需引入,需要注意目录等的构成方式。
    根据babel-plugin-import.babelrc中的设置,如果.babelrc设置如下:

    {
      "plugins": [
        [
          "import",
          {
            "libraryName": "ComponentsDemo",
            "libraryDirectory": "src/components"
          }
        ]
      ]
    }
    

    babel-plugin-import在读取以下代码时:

    import { ComponentA } from "ComponentsDemo";
    vue.component("ComponentA ", ComponentA );
    

    查找引入组件库中的组件的代码解析如下:

    import  ComponentA   from "ComponentsDemo/src/components/component-a ";
    

    根据查找的规则,ComponentA 是ComponentsDemo组件库下src/components/目录下的文件名或者目录名,第一个字母大写会被转成小写(如ComponentA 为Icon,找的文件名就是icon),驼峰命名会被转成-来连接(如ComponentA 为MenuItem,会查找名为menu-item的文件)。
    故此,我们的组件库的结构可以为:

    ...
    - src
        - components
            - component-a
                - index.vue
            - component-b
                - index.vue
            - component-c
                - index.vue
    -- -- index.js
    ...
    

    组件的导出文件index.js的结构:

    import ComponentA from './components/component-a';
    import ComponentB from './components/component-b';
    import ComponentC from './components/component-c';
    
    export default {
        ComponentA ,
        ComponentB ,
        ComponentC 
    }
    

    需要注意components目录下的文件名需要和组件名对应,需要能对应解析到。

    按需引入组件库

    在需要引入组件库的项目Test中,首先安装babel-plugin-import:

    npm i babel-plugin-import -D
    

    根目录下新建文件.babelrc

    {
      "plugins": [
        [
          "import",
          {
            "libraryName": "ComponentsDemo",
            "libraryDirectory": "src/components"
          }
        ]
      ]
    }
    

    入口文件中按需引入组件:

    import { ComponentA , ComponentB } from "ComponentsDemo";
    vue.component("ComponentA", ComponentA);
    vue.component("ComponentB", ComponentB);
    

    注意如果你的组件库的样式没有跟组件放在一起时,需要额外引入组件样式:

    import "~A/src/styles/index.scss";
    

    此时npm run build --report时,可以打开report.html查看到组件库的引入已经是按需引入了。

    相关文章

      网友评论

          本文标题:vue组件库如何按需引入之babel-plugin-import

          本文链接:https://www.haomeiwen.com/subject/oalkoctx.html