需求:需要基于Antd开发业务组件,但是项目中可能也会应用于antd的基础组件,所以我们需要将自己的组件设置新的前缀名,以及不影响项目中的antd配置以及样式发布到npm仓库,最后再部署自己的组件文档。
1.根据dumi官网初始化项目,并且在antd官网下载依赖并引入样式到我们项目中
2.首先dumi初始化的项目打包其实是分为文档打包和组件打包,文档打包配置主要在.umirc.ts
而npm打包配置主要在.fatherrc.ts
注入Antd Less变量
- 因为我们需要组件使用的antd样式和项目antd样式区分,所以我们修改了antd类名前缀
antd不得不承认很强大,提供了我们修改less变量,其中就有修改类名前缀,当时查看antd源码时,还纳闷为什么要把生成前缀单独拎出来封装成一个函数。具体使用方法参考antd官网全局配置文档。
因为dumi只提供了一个入口文件,但是这个入口文件是暴露我们组件的,所以我选择在每个组件最外层都会包裹ConfigProvider 标签
,例如:
![](https://img.haomeiwen.com/i16645308/70185b30ad19e80a.png)
- 接下来我们需要在打包时注入Less变量
1.文档打包时我们需要注入Less变量,所以在umirc.ts
注入
image.png
2.组件打包时我们需要注入Less变量,所以在fatherrc.ts
注入
关键问题就在这,我们一般打包组件都会使用esm的方式进行打包,而esm使用的bundleless构建代码,而bundleless他不会同bundle一样将我们所有凡是依赖到的东西追根溯源全部打包在一起,他只会将这些引入方式放在构件好的代码里。交给浏览器去处理,这有一个很好地对比图,budleless就是快。这有介绍可以看看CJS,AMD,UMD,ESM都是什么
![](https://img.haomeiwen.com/i16645308/899b5181022b7222.png)
所以这时候我们就面临一个问题,我们想把我们注入了less变量的,也就是修改的antd类名前缀的样式进行打包。这样我们就可以在项目中引入我们组件库的样式,而不是从项目中再去注入antd的less变量,如果在项目中注入@ant-prefix的话,那么我们项目如果要使用antd的话,就会造成影响。项目中的antd样式就无法与我们组件库独立配置的antd样式进行隔离。
所以我最终解决方案是:ESM和UMD(UMD需要注入我们的less变量)都进行打包处理,项目中引入UMD打包后的样式文件,如此才可以进行项目中antd与组件库中antd样式隔离。fatherrc.ts
如下图配置:
![](https://img.haomeiwen.com/i16645308/6d77672c0b24a872.png)
打包后文件如下图
![](https://img.haomeiwen.com/i16645308/78f150849763c318.png)
这里有个需要优化的建议,如果是我们本身组件库应用到了第三方的依赖,需要在package.json把这些依赖放在peerDependencies
,因为如果放在peerDependencies
中,我们使用npm下载组件库的时候,npm会对比peerDependencies
中的依赖,宿主项目的package.json如果有同样的包,那么npm就不会重复下载依赖,组件库就会直接依赖于宿主项目下载的依赖包
3.发布到github page
dumi已经集成好了,直接运行npm run docs:deploy
即可build文档和在当前repo上创建gh-pages分支并且push上去。
-
首先我们需要在github上创建个repo,然后选择public。例如我的github账户名叫:lxulxu555,所以我的仓库名叫lxulxu555.github.io
image.png
- 然后点击settings-pages,选择分支,以及根目录
![](https://img.haomeiwen.com/i16645308/c4e3c5bf7e974430.png)
-
然后点击actions就可以看到build的结果
image.png
-
然后再次回到Settings-pages界面,访问该页面(action build成功后,需要等一会才能看到最新效果)
image.png
网友评论