在 my-monorepo/package.json
(根目录)里添加:
{
"private": true,
"workspaces": [
"apps/*"
]
}
private: true
:防止你把整个仓库不小心发布到 npmworkspaces
:告诉 npm 去管理哪些子包然后在根目录运行:
cd my-monorepo
npm install
这会递归地为 apps/web
(你的 Next.js)和将来 apps/mobile
(Expo)安装依赖,并且把各包共用的依赖放到根 node_modules
里,减少重复。
# 在根目录启动 Next.js
npm run dev --workspace=apps/web
# 在根目录启动 Expo
npm start --workspace=apps/mobile
场景 | 命令示例 |
---|---|
给 web 安装,只在 apps/web 的package.json 新增依赖 |
npm install axios --workspace=apps/web |
给 mobile 安装,只在 apps/mobile 的package.json 新增依赖 |
npm install react-native-maps --workspace=apps/mobile |
给 所有包 安装(根层依赖),给根目录 package.json 新增依赖 |
npm install lodash --workspaces |
注意:--workspace= 一次只能指定一个包;--workspaces(复数)会把依赖安装到所有工作区。
在子目录里执行脚本时,Node 和 npm 会自动往上层目录去找 node_modules
,原理主要有两点:
Node 的模块查找机制
当你在某个目录里 require('some-package')
,Node 会按下面的顺序搜索:
./node_modules/some-package
../node_modules/some-package
../../node_modules/some-package
… 一直往上查到文件系统根目录
因此,即使你在 apps/web
里跑命令,Node 也会在 apps/web/node_modules
找不到时,自动去 my-monorepo/node_modules
(即根目录)查找。
npm workspaces 的安装行为
当你在根目录执行 npm install
(启用了 workspaces)时:
npm 会把所有子包的依赖集中安装到根的 node_modules
如果子包依赖必须有自己目录下的 node_modules
,npm 会在子包下创建一个“指向”根依赖的符号链接(symlink)
这样,无论是运行时(Node 查找模块)还是执行 npm 脚本,都会自动“看到”根目录里的依赖。