Lerna实践总结

2,894 阅读3分钟

Lerna

Lerna简介

A tool for managing JavaScript projects with multiple packages.
用于管理具有多个JavaScript程序包的工具
有什么用?
1. 自动解决packages之间的依赖关系
2. 通过git 检测文件改动,自动发布
3. 根据git 提交记录,自动生成CHANGELOG

本文也将从这3个方面对Lerna进行实践操作

1.新建一个Lerna工程

  1. 全局安装Lerna:npm install lerna -g
  2. 初始化:
mkdir myLerna
cd myLerna
lerna init --independent

得到以下目录结构

 --- myLerna
 --- |--- packages(目录)
 --- |--- lerna.json(配置文件)
 --- |--- package.json(工程描述文件)
  1. 创建一个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

所以:

  1. 关联远程仓库
  2. 重命名package-1wuwei-1(注意package.jsonpackage-lock.json同步修改),git提交修改代码。
  3. npm login登录
  4. lerna publish,检查远程仓库(github)和npm是否有所发布的包。

怎么打包

实际情况是发布到npm上的包,其实是你的源码,而更多情况是,你想发布打包后的代码,那你需要引入webpack(或其他)进行打包配置。

注意下面几点(不细讲):

  1. 需要在子项目中引入相关打包配置,如webpack.config.dev.js
  2. 怎么指定发布到npm上的包的指定文件夹?在package.json中定义好files,它包含需要发布到npm的文件。
  3. 接下来就是编写自己的打包命令了(分为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 将会是一个微前端的新方向,值得期待。

预学lerna 的demo地址