dumi 打包组件库文档静态站点以及部署官网已经有详细的讲解,这里不多讲了,下面主要讲一下 father 打包组件库并发布到 npm 中所遇到的问题
dumi,中文发音嘟米,是一款为组件开发场景而生的文档工具,与 father 一起为开发者提供一站式的组件开发体验,father 负责构建,而 dumi 负责组件开发及组件文档生成。
- 文档中关于 father 构建只提了上面一句话,一切问题都得去 father 的仓库去找答案
- father 各种打包产物示例配置
father 有两种打包模式分别是
babel
/Rollup
,这里有篇文章做了详细介绍遇到的问题
源码中出现循环依赖
Rollup
模式会出现打包失败的情况,如下所示,但babel
模式不会报错,解决办法手动更改代码中的循环依赖➜ react-tasty-ui git:(feat/base-comps) ✗ npm run build > @xxx/react-tasty-ui@0.0.10 build > father-build Clean dist directory Build esm with rollup Circular dependency: src/index.ts -> src/components/Toast/index.tsx -> src/index.ts Build esm success entry: src/index.ts
Rollup
模式打包 tsconfig.json 的 "module": 不可以设置为commonjs
,必须设置成esModule
格式➜ react-tasty-ui git:(feat/base-comps) ✗ npm run build > @xxx/react-tasty-ui@0.0.10 build > father-build Clean dist directory Build esm with rollup ✖ error Error: Incompatible tsconfig option. Module resolves to 'CommonJS'. This is incompatible with rollup, please use 'module: "ES2015"' or 'module: "ESNext"'. at checkTsConfig (/Users/yaolei/code/rushable/react-tasty-ui/node_modules/rollup-plugin-typescript2/src/check-tsconfig.ts:9:9) at parseTsConfig (/Users/yaolei/code/rushable/react-tasty-ui/node_modules/rollup-plugin-typescript2/src/parse-tsconfig.ts:50:2) at Object.options (/Users/yaolei/code/rushable/react-tasty-ui/node_modules/rollup-plugin-typescript2/src/index.ts:88:64) at /Users/yaolei/code/rushable/react-tasty-ui/node_modules/rollup/dist/shared/rollup.js:19931:36 at processTicksAndRejections (node:internal/process/task_queues:96:5) at /Users/yaolei/code/rushable/react-tasty-ui/node_modules/rollup/dist/shared/rollup.js:19931:90 at getInputOptions (/Users/yaolei/code/rushable/react-tasty-ui/node_modules/rollup/dist/shared/rollup.js:19924:61) at rollupInternal (/Users/yaolei/code/rushable/react-tasty-ui/node_modules/rollup/dist/shared/rollup.js:19883:72)
babel 模式会默认打包 css/less 等文件,但 scss 文件不会处理,
但这里我遇到了一个问题,就是我的这个组件库是供内部的一个 Nextjs 项目用的,我原本设想的组件库引入模式是下面这样子的,需要输出不同的包,
// 组件引入 import { Alert } from '@xxx/react-ui'; // Icon引入 import { AddressIcon } from '@xxx/react-ui/icon'
由于 scss 文件不会被处理导致 Next.js 使用组件库出现了下图问题
于是改成 Rollup 模式打包,但这样有会阐释新的问题,上面说到 Rollup 模式打包时 module 不能选 commonjs,只能用 esNext/ES2015,这样打出的产物引入到 Next.js 项目中会产生下图问题,意思是 Next.js 不能加载模块为 ESModule 的第三方依赖,这里有个 Stack Overflow上的问题, Next.js 端的解决办法安装一个插件在转换一层
上面的问题我不想在 Next.js 端来解决,我想在组件库打包时来解决,这样使用方就可以无脑使用了
最终打包配置文件
最终使用方式
// 入口处引入 css import '@xxx/react-ui/css' // 组件引入 import { Alert } from '@xxx/react-ui'; // Icon引入 import { AddressIcon } from '@xxx/react-ui/icon'
.fatherrc.ts 配置文件
export default [ { // babel 模式会打包所有文件包括下图的 index.ts build.ts esm: 'babel', }, { // 一个空的文件只引入scss 用于打包css,因为 esm: babel 模式下无法打包scss, entry: ['src/tasty'], umd: {}, extractCSS: true, } ];
- 最后再说一点就是要实现 npm 指定目录加载还需要在 package.json 设置
exports
参数, 我的设置如下图所示
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。