Lerna简介
A tool for managing JavaScript projects with multiple packages.
用于管理具有多个JavaScript程序包的工具
有什么用?
1. 自动解决packages之间的依赖关系
2. 通过git 检测文件改动,自动发布
3. 根据git 提交记录,自动生成CHANGELOG
本文也将从这3个方面对Lerna进行实践操作
1.新建一个Lerna工程
- 全局安装Lerna:
npm install lerna -g
- 初始化:
mkdir myLerna
cd myLerna
lerna init --independent
得到以下目录结构
--- myLerna
--- |--- packages(目录)
--- |--- lerna.json(配置文件)
--- |--- package.json(工程描述文件)
- 创建一个package
// 进入packages目录
cd packages
// 创建一个packge目录
mkdir packge-1
// 进入packge-1 package目录
cd packge-1
// 初始化一个package
npm init -y
4.全局安装eslint和prettier
// 进入根目录
cd myLerna
// 所有的包都装上eslint
lerna add eslint
// 接下来根据实际情况选择
eslint --init
// 安装eslint 新增的依赖
npm install
上述步骤操作完成之后,会发现项目根目录多了eslintrc.json
文件(我选择的配置方式为json方式)。
接下来就是根据需要配置eslint了。
安装prettier:
npm i -D prettier
npm i -D eslint-plugin-prettier
安装prettier系统不会自动生成 prettierrc.js
配置文件,需要手动添加。
有一点需要注意,eslint 与 prettier兼容问题,需要在.eslinttrc.json
的配置中修改扩展,由于本人使用了ts,所以最终可能这样:
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
'plugin:prettier/recommended',
'prettier/@typescript-eslint',
],
2.发布相关
如何发布
在操作之前,你需要关联上你的远程仓库,并创建.gitignore
文件。
在执行lerna publish
,会同步发布到远程仓库(github)和npm 上,但是npm 不允许包重名,所以你的package-1
项目名应该进行修改避免重名,并进行npm登录npm login
所以:
- 关联远程仓库
- 重命名
package-1
为wuwei-1
(注意package.json
和package-lock.json
同步修改),git提交修改代码。 npm login
登录lerna publish
,检查远程仓库(github)和npm是否有所发布的包。
怎么打包
实际情况是发布到npm上的包,其实是你的源码,而更多情况是,你想发布打包后的代码,那你需要引入webpack(或其他)进行打包配置。
注意下面几点(不细讲):
- 需要在子项目中引入相关打包配置,如
webpack.config.dev.js
。 - 怎么指定发布到npm上的包的指定文件夹?在
package.json
中定义好files
,它包含需要发布到npm的文件。 - 接下来就是编写自己的打包命令了(分为dev和pro环境)。
3.添加husky
husky 可以在提交前进行eslint校验和commit信息的规范校验。
npm i -D husky lint-staged @commitlint/cli @commitlint/config-conventional
创建 .huskyrc.js
module.exports = {
hooks: {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
},
};
创建.lintstagedrc.json
{
"src/**/*.js": "eslint"
}
创建commitlint.config.js
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
// type 类型定义
'type-enum': [
2,
'always',
[
'feat', // 新功能 feature
'fix', // 修复 bug
'refactor', // 重构(既不增加新功能,也不是修复bug)
'doc', // 文档注释
'test', // 增加测试
'chore', // 构建过程或辅助工具的变动
'style', // 代码格式(不影响代码运行的变动)
'revert', // 回退
],
],
// subject 大小写不做校验
// 自动部署的BUILD ROBOT的commit信息大写,以作区别
'subject-case': [0],
},
}
4. 单元测试
作为一个JDK项目,单元测试必不可少,但也和普通项目的测试一样。所以看官网文档更直接:Jest。需要注意的是,你的单元测试是在子项目中,别搞错了。
5. 总结
由于项目中要开发SDK,为了未来统一管理,决定使用larna进行模块化管理 ,实践中发现larna 非常易用,本身没有什么坑,更多的坑还是在使用其他附加的功能上。 不久webpack5 + lerna 将会是一个微前端的新方向,值得期待。