步骤
- 初始化
lerna.json
- npx lerna init --independent
使用独立版本号
会自动在package.json
中增加lerna
依赖 - 修改新增
lerna.json
"packages": ["packages/@demo/*", "packages/components"], "npmClient": "yarn", "useWorkspaces": true, "publishConfig": { "access": "public" }
- 修改根目录
package.json
增加"private": true, "workspaces": [ "packages/@demo/*", "packages/components" ], "scripts": { "lerna":"lerna" },
scripts
使用项目中的lerna
,而不是全局的,消除两个版本不一致的影响 - 修改根目录
.fatherrc.js
增加 只遍历编译packages
下的文档doc: { src: 'packages/', },
- 待执行
yarn install
命令
我们看到项目src
中还有原来create-umi
创建的demo
,我们将他移动到packages
中
-
在
packages
创建文件夹packages/@demo/umi-origin-test
稍后我们会在
@demo
这个文件夹下创建其他包
以@
开头建立packages
的次级文件夹是因为这样更符合依赖包创作开发规范,很多工具都以这种规范开发
umi/father
如果不指定包的路径,对于次级文件夹只能识别@
开头的:说明 -
移动文件
git mv src packages/@demo/umi-origin-test/src
-
创建
package.json
(注意校验文档格式){ "name": "@demo/umi-origin-test", "version": "0.0.0", "private": true, // demo包我们选择不发布 "main": "dist/index.js", "module": "dist/index.esm.js", "peerDependencies": { "react": "16.x" }, "files": [ "dist" ] }
-
处理
ts
问题 由于一些原因,这些子项目读取不了ts
的配置文件,如果是ts
组件就需要手动处理ts
配置文件
复制根目录的tsconfig.json
到这里
新建typing.d.ts
如下import '../../../typings';//路径看实际路径
-
此时可以运行
yarn
安装试一试,运行完成之后,可以发现node_modules
中多了我们创建的包 -
运行
yarn dev
就可以看到界面了警告:我们还没有打包这个组件,所以里面没有
dist
文件夹,其他项目引用会报错。
-
packages/@demo/my-test/package.json
{ "name": "@demo/my-test", "version": "0.0.0", "private": true, "main": "dist/index.js", "module": "dist/index.esm.js", "peerDependencies": { "react":"16.x" } }
-
packages/@demo/my-test/src/index.jsx
import React from 'react'; import Button from '@demo/umi-origin-test'; export default function(props) { return ( <div> {props.label}:<Button>my-test</Button> </div> ); }
这一步会提示不能解析
@demo/umi-origin-test
,因为它还没打包。第四步我们处理这个报错 -
packages/@demo/my-test/src/index.mdx
--- name: my-test route: /@test/my-test --- import MyTest from './' ## 展示 <MyTest label='包装' />
-
处理不能解析
@demo/umi-origin-test
问题 我们运行两次yarn build
来打包。为什么运行两次?看多包打包问题 -
在运行
yarn
安装(记得每次增加package
后都要运行),运行yarn dev
查看 -
上面的警告我们需要添加
@demo/umi-origin-test
到依赖 文档yarn lerna add @demo/umi-origin-test --scope=@demo/my-test
不知道你有没有注意,在lerna.json
中有配置components
,通常在这里开发自己的组件库,也是为了演示docz的配置。注:umi
官方已经放弃docz维护,全力开发father-doc
- 创建一个
components
包,自行查看项目代码 - 安装
docz
主题,默认的docz-them-umi
有bug
,换其他主题yarn add docz-theme-ztopia -D -W
- 配置docz
- 修改主题
- 修改开发端口
- 修改打包目录
- 修改页面标题
- 配置菜单
最后如下:
{
menu:[
{ name: '前言', route: '/' },
{
name: '示例',
menu: [
{name: 'umi-origin-test',},
{name: 'my-test',},
],
},
{
name: '组件库',
menu: [
{name: '前言',route: '/@ml/rc', },
],
},
],
theme: 'docz-theme-ztopia',
typescript: true,
src: 'packages/',
port: 2000,
dest: 'dist/docs',
title: '单体式仓库',
}
- 根
packages/index.mdx
---
name: 前言
route: /
---
单体式开发框架
- 修改包的
mdx
配置,自行查看项目代码
创建包的方式是很多,可以使用lerna create
创建,也可以使用umi-cli
创建,也可以手动创建,但都必须满足以下要求
package.json
满足
{
"name": "@demo/my-test",//必须:保证包有一个名称(lerna)
"version": "0.0.0", // 必须:保证包有一个版本号(lerna)
"private": true,// 如果项目不想发布就设置为true
"main": "dist/index.js",// 必须:为这个(umi/father配置而定)
"module": "dist/index.esm.js",//必须:为这个(同上)
"peerDependencies": {//必须:有这个react前置(同上)
"react": "16.x"
},
"files": [
"dist"// 如果要发布,则推荐只发布dist
]
}
- 以
src/index.js
为入口
必须:以src/index.js
为入口,因为umi/father
默认以包中的src/index
为入口,且由于我们是多包,不便于设置father
的entry
- 文档最好放在
src
目录下
ts版 注意包中一定要有
tsconfing.json
和typing.d.ts
,issues