根目录启用 npm workspaces

my-monorepo/package.json(根目录)里添加:

{
  "private": true,
  "workspaces": [
    "apps/*"
  ]
}

然后在根目录运行:

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/webpackage.json 新增依赖 npm install axios --workspace=apps/web
mobile 安装,只在 apps/mobilepackage.json 新增依赖 npm install react-native-maps --workspace=apps/mobile
所有包 安装(根层依赖),给根目录 package.json 新增依赖 npm install lodash --workspaces

注意:--workspace= 一次只能指定一个包;--workspaces(复数)会把依赖安装到所有工作区。

原理

在子目录里执行脚本时,Node 和 npm 会自动往上层目录去找 node_modules,原理主要有两点:

  1. 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(即根目录)查找。

  2. npm workspaces 的安装行为

    当你在根目录执行 npm install(启用了 workspaces)时: