IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> dumi组件库打包总结 -> 正文阅读

[JavaScript知识库]dumi组件库打包总结

最近在做页面抽成组件然后发布,期间也是遇到了很多问题和坑,现在顺便分享一下。

dumi官网

dumi为组件开发场景而生的文档工具,这里注重分享打包的过程,

father

dumi使用father打包,father文档

1 使用rollup打包的时候报错。

father提供了几种打包的方式,umd, cjs, esm。
也支持使用rollup或者babel来打包成cjs/esm。
一开始选择的是rollup来打包。
出现的问题:

  • rollup只支持esmodule,不支持commonjs,如果你的组件库引用了类似于lodash的库,lodash是commonjs的,就会报错。这时候可以配置extraExternals。
  • 比如我的组件库使用了lodash.debounce和lodash的throttle方法,
export default {
  cjs: { type: 'rollup' },
  esm: {
    type: 'rollup',
   
  },
 cssModules: true,
	extraExternals: [
    'lodash.debounce',
    'lodash.throttle',
  ],
}
  • extraExternals表示为rollup模式配置额外的external。这样debounce的代码不会被打包进index.js,而是换成了
var debounce = require('lodash.debounce');
var throttle = require('lodash.throttle');

直接require。

2 peerDependencies和dependencies

一文搞懂peerDependencies
假设denpendencies是这样的

  dependencies: {
  "ahooks": "^2.10.12",
    "antd": "^4.19.3",
    "crypto-js": "^4.1.1",
    "react": "^16.12.0",
    }

这时候外部引用的时候,不管版本是否一致,都会打包两份react,两份antd。
而使用了peerDependencies之后

peerDependencies: {
 "ahooks": "^2.10.12",
    "antd": ">=4.19.3",
    "crypto-js": "^4.1.1",
    "react": ">=16.12.0",
},
dependencies: {
 "ahooks": "^2.10.12",
    "antd": ">=4.19.3",
    "crypto-js": "^4.1.1",
    "react": ">=16.12.0",
    }

比如当外部的react版本是17的,就满足条件,那么组件库不会多打包一份react代码,而是直接使用外部引用项目的react。

  • 这里i还有一个注意的点,配置了peerDependencies之后,不能配置webpack的resolve.modules去指定第三方库的位置

3 组件库配置antd样式前缀问题

因为是从页面抽离成组件,所以一开始是有配置antd样式前缀的,但是打包成组件库之后便无法使用样式前缀了。

  • 原因:组件库依赖的antd,并不会在打包的时候直接将代码打包到输出产物。
  • 简单理解就是,antd的代码,是在外部引用组件库的时候,比较antd版本的区别,
  • 如果符合,那么组件库使用的antd就是项目的antd。而项目的antd我们无法控制他使用跟组件库一样的样式前缀。
  • 如果不符合,那么组件库会多打包出一份antd的代码,而这个antd同样是没有webpack来帮我们修改样式文件的前缀的。
  • 上面两种情况就会导致组件库手动修改的antd前缀修改,如自己定义的.ant-xxx的.ant会被修改前缀,但是引用的css/less文件的前缀还是.ant

使用babel打包代码

  • 使用rollup打包后的代码,全部都输出到一个文件,这也是rollup的特色。
  • 但是组件库的方式不适合使用rollup打包,不利于按需引入。
  • 引入一个组件,会导致全部都被引入,打包体积大大增加。比如一个组件依赖了一些大一点的库,但是我引入了其他的一个组件,也会导致没引入的组件和他依赖的库都被打包了。
  • 使用rollup打包后的体积:
    在这里插入图片描述

test就是引入组件的页面,vendors~test…是组件库依赖的第三方文件,其中就包括没有引用的组件的依赖也被打包了。

改造,使用babel打包代码。参考antd的代码结构。
 cjs: { type: 'babel', lazy: true },
  esm: {
    type: 'babel',
    //importLibToEs: true,
  },

cjs打包后的代码在lib,esm打包后的代码在es。
package.json配置

"main": "lib/index.js",
 "module": "es/index.js",

main字段,会在外部项目引入组件库的时候,当打包的时候就会找到lib/index.js文件,就是cjs的方式。
module字段,会在外部项目引入组件库的时候,当本地启动的时候,就会找到es/index.js文件。

使用了babel之后,打包后的代码结构如
在这里插入图片描述
不会将所有代码打包到一个文件去了。
为了配合babel-plugin-imports插件实现按需引入,我们的文件命名和目录结构选择跟antd类似的即可。

babel打包遇到路径别名问题。

babel形式的打包,如果遇到了’@/xx’,他不会解析@,这时候就需要另一个插件来帮忙了。

babel-plugin-module-resolver

 extraBabelPlugins: [
    [
      'import',
      {
        libraryName: 'antd',
        //libraryDirectory: 'es',
        style: true,
      },
    ],
   [
       require.resolve('babel-plugin-module-resolver'),
      {
        root: ['./'],
        alias: {
         '@': './es',
         },
      },
     ],
  ],

他会将@转换成es的相对路径,但是对于cjs来说,文件夹是lib,所以这样配也有问题,暂时没有找到好的解决办法,所以将只能将别名一一改掉,如果只需要打包一种形式的,就可以使用该插件,如只打包esm。

改进后效果:

跟上面的例子一样,正常引入一个组件。然后在.babelrc.js文件中配置bable-plugin-imports,npm上有他的很多配置。
在这里插入图片描述
他可以帮助我们转化代码实现按需引入,比如上面的import button,到打包后就转成require(‘antd/lib/button’)。
这时候我们配置

module.exports = {
  "presets": ["@babel/preset-env", "@babel/preset-react"],
  "plugins": [
    [
      "import",
      {
        "libraryName": "antd",
        "style": true
      }
    ],
    // 配置我们的组件库按需引入
    [
      "import",
      {
        "libraryName": "xxxx",
        "libraryDirectory": "lib",
        //"camel2DashComponentName": false,
        // "customName": (name, file) => {
        //   name = name[0].toLowerCase() + name.slice(1)
        //   return `xxxx/${name}`;
        // }
      },
      "xxxx"
    ]
  ]
}

然后,正常打包,
再对比使用rollup打包的组件库
在这里插入图片描述
左边是rollup,右边是babel打包加按需加载的效果。

可以看到,test是引用了组件的页面,

  • 在rollup下,所有的包括组件库依赖的第三方依赖也会被打包进来。
  • 在babel打包+babel-plugin-import插件的帮助下,只打包进了引用的组件。

如果没有使用babel-plugin-import
在这里插入图片描述
打包后的代码也是全量引入。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 11:44:26  更:2022-04-28 11:45:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:27:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码