前端Monorepos项目使用npm-workspaces
【前言】
之前一直使用 lerna 来管理前端 monorepos 项目,
今天升级 lerna 后发现不支持 bootstrap 命令了,
替换为了 npm 的 workspaces 相关命令。
【lerna bootstrap】
lerna 的相关使用可以看这篇文章,
而 lerna 的 bootstrap 命令,
用来给 packages 下的包安装依赖,以及管理相互间的依赖。
这里用一个 monorepos 前端项目来举例,
地址: https://github.com/uikoo9/offline-to-online
这个项目下有 4 个包,

相互间的关系如下:

可以看到 qiao-is-online 依赖 offline-to-online和 qiao-ping 两个包,
使用 lerna bootstrap 命令安装依赖后,可以看到 qiao-is-online 下的依赖是本地链接的,

可以看到,
lerna 之前的 bootstrap 命令,主要用来
1.安装各个包的依赖
2.如果依赖是本地包,不会下载依赖,而是改为本地链接
但是 lerna 升级到 7.0.0 版本后移除了这个命令,
提示如下

lerna 官方的说明在这里: https://lerna.js.org/docs/legacy-package-management
大概意思是 npm 这类包管理工具已经具备 bootstrap 命令的能力了,
所以移除了该命令,推荐使用 npm 的 workspaces 相关能力。
【npm workspaces】
npm的 workspaces 相关能力文档地址: https://docs.npmjs.com/cli/v9/using-npm/workspaces
这里对比 lerna bootstrap 来看下
lerna.json vs package.json
lerna.json 中的 packages 属性声明了相关包位置,
例如下面的配置,告诉 lerna 相关包都在 packages 这个文件夹下。
{
"packages": ["packages/*"],
"version": "3.1.6",
"command": {
"version": {
"allowBranch": "master"
},
"publish": {
"allowBranch": "master",
"message": "chore(release): publish"
}
}
}
package.json 中的 workspaces 属性类似,
例如下面的配置,告诉 npm 相关包都在 packages 这个文件夹下,
{
"name": "dishi-monorepo",
"private": true,
"workspaces": [
"packages/*"
]
}
如果要使用 npm workspaces 属性,
对应的要在lerna.json 中做修改,如下
也就是将之前 lerna.json 中的 packages 属性去掉,
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "3.1.8",
"command": {
"version": {
"allowBranch": "master"
},
"publish": {
"allowBranch": "master",
"message": "chore(release): publish"
}
}
}
node_modules 位置
lerna bootstrap 默认安装后,
相关包的依赖都在本包下,例如下图,
qiao-is-online 的依赖在本文件夹下的 node_modules 下

而给 npm 添加 workspaces 属性后,
执行 npm i 后,会将相关包的依赖都安装到根路径的 node_modules 下,

虽然都安装到了根路径下,但是可以看到本地相互依赖的包都是 link 的方式
效果类似 lerna bootstrap —hoist
但是如果一个依赖包,在根节点下有依赖,
在 packages 下包也有依赖,
且两个依赖的版本不一样, 例如下面这种情况,

可以看到 uuid 在 packages/qiao-encode 中依赖版本是 9.0.0,
而在根路径下的 lerna 依赖的是 8.3.2,
这时,使用了 npm workspaces 时,
npm i 后会将 packages/qiao-encode 的依赖安装到当前包下
【总结】
lerna 中的lerna bootstrap 相关命令,
可以用 npm 的 workspaces 属性以及 npm i 命令替代
相关推荐
小巧的JS测试框架:AVA
【前言】 常见的JS测试框架有Jest,Mocha等, 今天介绍一个小巧的JS测试框架:ava, https://github.com/avajs/ava
规范的代码提交:Conventional Commits
【前言】 本文介绍如何提交规范的commit msg, 规范的commit msg可以看这个网站: https://www.conventionalcommits.org/en/v1.0.0/ 【commitizen】 可以手动提交符合规范的commit msg,如下 手动提交符合规范的msg比较麻
一篇文章开发todolist
【前言】 本文实战开发一个todolist, 基于以下技术栈: react:开发ui, https://reactjs.org/ webpack,构建前端项目, https://webpack.js.org/ localStorage,存储数据, https://developer.mozilla.
一篇文章学会IndexedDB
【简介】 IndexedDB,web端可以直接使用的数据库,详见: https://developer.mozilla.org/zhCN/docs/Web/API/IndexedDB\API 【IndexedDB vs LocalStorage】 之前介绍了LocalStorage:一篇文章学会lo
初始化前端Monorepos项目
【前言】 本文记录初始化一个前端Monorepos项目的过程 【LICENSE】 如果是开源项目, 需要添加LICENSE, 一般推荐使用MIT LICENSE, 模板如下, 其中copyright那一行, 可以替换为自己的信息。 【git】 git的一些基础设置 设置git账号信息 配置gitig
一篇文章判断用户是否在线
【前言】 如何判断用户在线,而不是用户网络是否连通, 在线:连网,可以访问internet 连通:连网,不能访问internet 【是否在线】 如上,判断是否在线,需要检测是否可以访问internet nodejs 在nodejs下,可以通过ping一些常见的域名来确定, 这里封装了一个工具, ht
一篇文章学会LocalStorage
【简介】 LocalStorage,即本地存储,详见: https://developer.mozilla.org/zhCN/docs/Web/API/Window/localStorage 【cookie vs LocalStorage】 服务端是否可以获取? cookie:服务端可以获取,每次请
mantine-ui快速上手
【前言】 2023年,前端开发的ui框架应该用哪个呢, 一些基本的诉求: 1.支持pc和移动端 2.支持黑夜&白天主题切换 3.组件丰富 4.支持react 4是技术栈选择,非通用 按以上要求在github上快速搜索下react相关ui库, 从start数,issues数,最后commit时间等维度
Nx-VS-Lerna
【前言】 nx和lerna都是优秀的monorepos工具, 本文来对比一下两者的不同, https://nx.dev/ https://lerna.js.org/ 对比之前可以先看下面两篇文章, 了解nx和lerna的基本使用, 一文学会用Lerna管理多个npm包 强大的构建系统:NX 【任务执
强大的构建系统:NX
【前言】 nx是一个强大的构建系统, 这么说可能比较模糊, 本文实践一个项目,带大家了解nx, 感兴趣的也可以自己探索: https://nx.dev/ nx一些典型的应用场景: 1.基于package的monorepo管理 2.完整的前端项目管理 3.react,angular等项目管理 4.no
一篇文章了解JS并行任务
【前言】 在开发过程中大部分场景是顺序执行代码, 也有场景要求并行执行多个任务, 本文研究下如何高效的并行执行任务。 【并行场景】 常见并行执行任务的场景 1.并行执行多个请求 2.并行下载文件 【并行任务】 上述场景中任务的共同点是 1.多个任务没有依赖关系 2.多个任务完成耗时不确定 3.要求最
一篇文章学会Webpack5.x
【前言】 Web前端构建离不开webpack, 众所周知webpack的配置很多很复杂, 甚至可以设置“webpack配置工程师”, 本文抓住webpack核心概念, 和业务开发中常用配置进行讲解, 争取一篇文章学会webpack使用和配置。 【常用文档】 webpack官网 webpack手册:可