阅读 142

lerna 简单介绍和实战

介绍

A tool for managing JavaScript projects with multiple packages. Lerna is a tool that optimizes the workflow around managing multi-package repositories with git and npm

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

多仓库模式的痛点

• 资源浪费:一个主干,多 repo 的方式,可能 node_module 会出现大量的冗余,比如它们可能都会安装 React、React-dom 等包,浪费了大量存储空间 • 调试繁琐:很多公共的包通过 npm 安装,想要调试依赖的包时,需要通过 npm link 的方式进行调试 • 资源包升级问题:一个项目依赖了多个 npm 包,当某一个子 npm 包代码修改升级时,都要对主干项目包进行升级修改。(这个问题感觉是最烦的,可能一个版本号就要去更新一下代码并发布)

软链实现

未使用 lerna 之前,想要调试一个本地的 npm 模块包,需要使用 npm link 来进行调试,但是在 lerna 中可以直接进行模块的引入和调试,这种动态创建软链是这样实现的

fs.symlink(target, path[, type], callback)
const res = fs.symlink('./target.js','./link.js',()=>{});
// window有坑,要用绝对路径,还需要传type
const res = fs.symlink(path.join(__dirname, "/target.js"), path.join(__dirname, "/link.js"), 'junction',()=>{});
复制代码

lerna软链源码

实战

  1. npm install lerna -g
  2. lerna init

image.png

  1. 配置yarn workspace
  • yarn workspace允许我们使用 monorepo 的形式来管理项目
  • 在安装 node_modules 的时候它不会安装到每个子项目的 node_modules 里面,而是直接安装到根目录下面,这样每个子项目都可以读取到根目录的 node_modules
  • 整个项目只有根目录下面会有一份 yarn.lock 文件。子项目也会被 link 到 node_modules 里面,这样就允许我们就可以直接用 import 导入对应的项目
// lerna.json
"npmClient": "yarn",  // 指定 npmClent 为 yarn
 "useWorkspaces": true // 将 useWorkspaces 设置为 true
复制代码
// package.json
{
 "name": "root",
 "private": true,
 "workspaces": [
   "packages/*"
 ],
 "devDependencies": {
   "lerna": "^4.0.0"
 }
}
复制代码
  1. lerna create 创建子项目

image.png

  1. 给子项目a-module添加react依赖
lerna add react --scope=a-module
or
yarn workspace a-module add react
复制代码
  1. 顶层package.json添加公用依赖。
lerna add <name>
or
yarn add <name> --ignore-workspace-root-check
复制代码

image.png

  1. 启动子项目

使用了 lerna 进行项目管理之后,可以在顶层的 package.json 文件中进行配置

// package.json
"scripts": {
    "a": "lerna exec --scope a-module -- yarn start",
 }
复制代码
  1. lerna publish

执行命令后在会出现如下内容,针对 packages 中的每个模块单独选择版本进行发布。 如果想要发布的模块统一,使用相同的版本号,需要修改lerna.json ,将 "version": "independent", 改为固定版本号,修改后尝试重新使用 lerna publish进行发布 9. 安装和link 最佳实践:配置 yarn workspaces,直接执行yarn install

为什么用yarn?

lerna 提供了可以将子项目的依赖包提升到最顶层的方式 ,我们可以执行 lerna clean先删除每个子项目的 node_modules , 然后执行命令 lerna bootstrop --hoist lerna bootstrop --hoist 会将 packages 目录下的公共模块包抽离到最顶层,但是这种方式会有一个问题,不同版本号只会保留使用最多的版本,这种配置不太好,当项目中有些功能需要依赖老版本时,就会出现问题。

所以建议:配置 yarn workspaces,直接执行yarn install

其他命令

作用命令
查看工作空间信息yarn workspaces info
删除所有的 node_moduleslerna clean
重新获取所有的 node_modulesyarn install --force
查看缓存目录yarn cache dir
清除本地缓存yarn cache clean

yarn和lerna有些功能是重叠的,建议可以yarn用来构建依赖,lerna用来发布

yarn workspace lerna

参考:

基于 Lerna 管理 packages 的 Monorepo 项目最佳实践

lerna管理前端模块最佳实践

现代前端工程化-基于 Monorepo 的 lerna 详解(从原理到实战)

文章分类
前端
文章标签