阅读 1552

前端工程化篇---- monorepo、lerna

1. monorepo、lerna是什么?

Monorepo 是管理项目代码的一个方式,指在一个项目仓库 (repo) 中管理多个模块/包 (package),不同于常见的每个模块建一个 repo。

Lerna是一种Monorepo的解决方案

Lerna是一个用来优化托管在 git\npm 上的多 package 代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题。

2.优缺点

优点

  • 1.节约了大量存储空间。
    • 比如多个项目都依赖Vue,Vue-route等包,在多个仓库的项目下,node_modules会出现大量的冗余。
  • 2.调试方便
    • 在多个仓库的项目下,调试依赖的包是通过npm link,使用Lerna不需要了
  • 3.资源包升级问题
    • 一个项目依赖了多个 npm 包,当某一个子 npm 包代码修改升级时,都要对主干项目包进行升级修改。(这个问题感觉是最烦的,可能一个版本号就要去更新一下代码并发布)

缺点 :

  • 由于源码在一起,仓库变更非常常见,存储空间也变得很大,甚至几G,CI 测试运行时间也会变长

3.使用方法

  • 1.安装 lerna 工具
npm install lerna -g
复制代码
  • 2.初始化一个lerna 项目
mkdir lerna-demo

cd lerna-demo

lerna init
复制代码

生成如下文件:

 - packages(目录)
 - lerna.json(配置文件)
 - package.json(工程描述文件)
复制代码
  • 3.常用命令
    lerna init  //初始化 lerna 项目
    lerna create <name>  //创建一个新的由 lerna 管理的包
    lerna bootstrap // 安装所有依赖项并连接所有的交叉依赖
    lerna add axios // 增加模块包到最外层的公共 node_modules中
    lerna add a --scope=b // 增加模块包到 packages 中指定项目 下面是将 a 模块增加到 b 项目中
    lerna exec --scope a -- yarn start //在 packages 中对应包下的执行任意命令 下面的命令,是对 packages 下的 a 项目执行 yarn start 命令 ,比较常用,可以把它配置到最外层的 package.json 中
    
    如果命令中不增加 --scope a 直接使用下面的命令,这会在 packages 下所有包执行命令rm -rf ./node_modules
    lerna exec -- rm -rf ./node_modules
    
    lerna list // 显示所有的安装的包。等同于 lerna ls
    lerna clean // 从所有包中删除 node_modules 目录。不会删除项目最外层的根 node_modules
    lerna publish // 在当前项目中发布包。lerna publish 永远不会发布标记为 private 的包(package.json中的”private“: true)
    复制代码

4.应用(适用场景)

  • 从零搭建一个 平台基础组件库项目
  • 框架类项目(比如:vue3源码)
  • 公司组件库项目
  • 工具类项目(比如 :babel、facebook/jest、alibaba/rax)
文章分类
前端
文章标签