Lerna性能优化从入门到精通,关键在于不要盲目使用默认配置。我去年用Lerna管理一个中型React项目时,发现每次运行 lerna run build 都要花十几分钟,根本没法迭代。后来调整了并行策略和缓存机制,效率直接翻倍。说白了,Lerna不是魔法棒,它和npm/yarn一样,也要靠你手动调参。
我印象里,Lerna默认是串行执行所有包的build任务,这在项目多的时候非常慢。后来我改成并行执行,用 lerna run build --parallel 命令,结果发现任务之间有依赖关系。比如某个包需要另一个包先编译,就得多加几个 --exclude 参数,或者用 --concurrency 控制并发数。别傻乎乎地以为并行就能解决所有问题,先理清依赖关系,再决定怎么调。
如果你用Lerna的 lerna publish ,别忘了配置 npmrc 文件。我之前在发布时遇到权限问题,发现是因为没有在 .npmrc 里写 //registry.npmjs.org/:_authToken=xxx 。这个配置必须放在项目根目录,不然会报错。你可以用 lerna publish from-package 来避免重复输入版本号,这样流程更顺畅。
Lerna的缓存机制有时候会让人崩溃。我之前遇到一个项目,每次 lerna run 都在重新下载依赖,其实是因为缓存被清空了。后来发现是 lerna clean 执行时把 node_modules 删除了,但缓存文件夹还在。别直接删 node_modules ,用 lerna clean --force 会清除缓存,这样下次就不会重复下载。这招在多人协作时尤其有用。
如果你用了Lerna的 lerna exec ,别只想着跑脚本。我发现一个问题,就是在某些情况下, lerna exec 会把 node_modules 拷贝到每个子包,导致磁盘占用飙升。后来改成 lerna run ,把脚本写在 package.json 里,这样就不会重复拷贝了。尽量用 lerna run 而不是 lerna exec ,除非你有特殊需求。
Lerna的版本控制也容易出问题。我之前写了一个 lerna version 脚本,结果因为没有指定 --no-git-tag-version ,所有子包的版本号都被修改了。后来发现,Lerna会自动创建git tag,但如果你不想麻烦git,可以直接加这个参数。或者用 lerna version --exact 来确保版本号精确匹配,避免依赖混乱。
别以为用Lerna就是高枕无忧。我之前在一个项目里,因为子包太多,每次 lerna bootstrap 都要花好久。后来优化了 package.json 里的 peerDependencies 和 dependencies ,最后发现 lerna bootstrap 会自动处理依赖冲突。别瞎改依赖,除非你知道它会影响什么。
Lerna的配置文件 .lernarc.json 是你最该关注的地方。我之前写的配置太复杂,结果每次运行都报错。后来简化了配置,只保留 packages 和 npmClient ,其他都不写。这样不仅稳定,还能减少维护成本。简单配置才是好配置。
如果你用Lerna做monorepo管理,别忽略 lerna.json 里的 workspace 配置。我之前在 lerna.json 里写错了路径,结果某些包根本没被处理。后来发现,应该用绝对路径或者相对路径,不要写冗余。比如 packages/ 或者 apps/ ,这样更清晰。
Lerna的性能优化其实和npm/yarn一样,关键在于减少重复操作。我之前遇到一个坑,就是每次 lerna run 都会重新安装依赖,后来发现是因为 lerna.json 里没写 npmClient 。改成 npm 之后,依赖就只安装一次了。这招在开发环境特别有用,能节省大量时间。
如果你在使用Lerna的时候遇到CI变慢,别急着改代码。我之前在GitHub Actions里发现,Lerna的 lerna run 会在每个子包里重复执行。后来改成 lerna run build --stream --parallel ,不仅速度提升,还能看到每个子包的执行状态。这招能帮你快速定位问题。
Lerna的版本号管理也是个容易出错的地方。我之前用 lerna version 时,意外设置了 --force ,结果所有包的版本号都更新了,这可不是我想要的。后来发现,一定要明确指定 --no-git-tag-version ,或者用 --exact 来控制版本。别让你的版本号变乱了。
我在配置Lerna时,最常犯的错误是忘记关掉 lerna.json 里的 useWorkspaces 。有一次,我用 lerna run 运行脚本,结果发现依赖没被正确链接,导致模块找不到。后来才知道,要是开了 useWorkspaces ,就必须手动执行 npm install 。这招在某些情况下确实有用。
别总想着用Lerna的高级特性,有时候简单就是最好的。我之前为了统一构建命令,搞了个 lerna run 的别名,结果项目太多,命令变长了,反而影响效率。后来直接写 npx lerna run build ,反而更清晰。别为了一点方便搞得太复杂。
我最近发现,Lerna的缓存策略其实可以自定义。默认情况下,它会把缓存存到 node_modules/.cache ,但如果你用 lerna cache 可以手动清理。有一次我清理了缓存,结果发现某个依赖被缓存坏了,导致构建失败。后来我加了 --no-cache 参数,直接从源码安装。这招在依赖有问题的时候特别有用。
如果你在使用Lerna的时候遇到问题,先看 lerna.json 的配置。我之前的一个项目,因为 lerna.json 里 npmClient 写成了 yarn ,结果 lerna run 跑起来全是 npm 命令,导致命令执行出错。后来改成 npm 就好了。配置文件要保持统一,别瞎改。
Lerna的性能优化其实就是“少做无用功”。我印象里最经典的优化是 lerna run build 时加 --stream ,这样能实时看到每个子包的执行状态。有一次我用 --stream 发现某个子包一直卡住,后来才发现是依赖没安装全。这招能帮你更快发现问题。
有时候,Lerna的工具链会和你的本地环境不兼容。我之前在开发的时候,用的是yarn,但 lerna.json 里写的是 npm ,结果 lerna run 会报错。后来改成 yarn 就正常了。别让工具链互相打架,保持一致最重要。
Lerna的版本控制最好配合 lerna version 的 --pre 参数。我之前在发版时,想加个 beta 标签,结果没加这个参数,直接发成 1.0.0 ,后面才想起来要改。后来每次都加上 --pre ,这样就能自动创建 beta 版本了。这招能帮你避免版本号错误。
如果你遇到Lerna的权限问题,别急着换账号。我之前在CI里运行 lerna publish ,发现权限不够,结果是因为没在 .npmrc 里添加 //registry.npmjs.org/:_authToken=xxx 。后来加了这行,问题就解决了。权限问题总是和账号配置有关。
有时候,Lerna的并行执行会让某些任务冲突。我之前用 lerna run build --parallel ,结果两个子包同时写入同一个文件,导致覆盖了。后来改成 --concurrency 设置成 1 ,这样就不会冲突了。别盲目并行,要看任务类型。
Lerna的子包管理有时候会让人头大。我之前在 lerna.json 里写错了 packages 的路径,结果某些包没被包含进去。后来发现,应该用 packages/ 或者 packages/react/ 这样的通配符,而不是硬编码路径。这招能帮你避免漏掉子包。
Lerna的发布流程有时候会卡在 npm publish 阶段。我之前发版时发现,某个子包的 package.json 里写的 name 和主包不一样,结果 lerna publish 阻止了。后来统一了 name ,才成功发布。子包的 name 要和主包一致。
如果你在使用Lerna的时候发现CI变慢,别急着改代码。我之前看到 lerna bootstrap 花了好久,后来发现是依赖太复杂了。我用 lerna.json 里的 npmClient 改成了 npm ,这样安装速度明显快了。工具链选择也很关键。
Lerna的版本号管理最好配合 Semantic Versioning。我之前用 lerna version 时,没加 --exact ,结果版本号变成了 1.0.0 ,而实际上我想发的是 1.0.1 。后来发现 --exact 会强制使用当前版本,避免意外升级。这招能帮你减少版本号混乱。
有时候,Lerna的缓存文件会被误删。我之前清理了 .cache ,结果 lerna run 都得重新下载依赖,效率瞬间下降。后来我在 lerna.json 里加了 cache: true ,这样缓存就不会被清空了。别随意删缓存文件。
如果你在使用Lerna管理多个子包,别忽略 lerna.json 里的 ignore 配置。我之前有个子包一直不被处理,后来发现是因为 ignore 里写了 -test ,结果测试包被忽略了。后来改成 -dev ,就解决了问题。配置要精准。
Lerna的性能优化其实和你的依赖结构密切相关。我之前发现,某个子包引用了其他子包,但 lerna.json 里没写 npmClient ,导致依赖没被正确处理。后来加了 npmClient: "npm" ,问题就解决了。配置要根据你的环境调整。
如果你在使用Lerna的时候遇到问题,别急着改代码。我之前在执行 lerna run 时,发现某个子包没执行,后来发现是因为 lerna.json 里没写 npmClient ,结果用的是默认的 yarn ,但脚本是 npm 。这招能帮你避免工具链冲突。
别以为Lerna能解决所有问题,有时候还是得回来看看依赖。我之前用 lerna run build ,结果某些子包的依赖没装,导致构建失败。后来发现,应该用 lerna bootstrap 来安装依赖,这样更稳定。别省略依赖安装步骤。
Lerna的缓存机制有时候会让人崩溃。我之前遇到一个项目,每次 lerna run 都要重新下载依赖,其实是因为缓存被清空了。后来发现,应该用 lerna cache 来管理缓存,而不是直接删文件。这招能帮你节省时间。
如果你在使用Lerna的时候发现某个子包执行异常,别直接改代码。我之前在 lerna.json 里加了 npmClient: "yarn" ,结果某些子包的 yarn 依赖没装全,导致构建失败。后来发现,应该用 lerna run 的 --stream 参数,这样就能看到每个子包的执行状态。这招能帮你快速定位问题。
Lerna的配置文件 .lernarc.json 有时候会被忽略。我之前在配置里写了很多参数,结果发现 lerna run 会忽略它们。后来才明白,应该用 lerna.json 来配置,而不是 .lernarc.json 。别搞混这两个配置文件。





