网易首页 > 网易号 > 正文 申请入驻

pnpm workspaces踩坑记:Next.js 16的CI构建陷阱

0
分享至

1994年,父亲带回一台Amiga 500。我不懂什么基准测试,只知道磁盘转太久就是有问题。没有正式指标,只有有限的耐心和眼前具体的麻烦。三十年后,我发布了一份pnpm vs npm vs yarn的基准测试报告,数字漂亮:安装时间、磁盘占用、冷缓存与热缓存对比。工整,可发表,却对即将发生的事完全失明。

因为那份测试只测量了安装环节。它没测当pnpm workspaces遇上Next.js 16 App Router,在缓存不完整的CI环境里、在跨workspace共享包的场景下会发生什么。本地bash脚本计时看不到这些。这些东西只在Railway流水线晚上11点抛出晦涩报错、构建跑了18分钟还没结束时才会现身。


我的核心判断:pnpm workspaces在2026年仍是monorepo最优选,但存在一些边缘案例——它们不会出现在任何安装时间基准测试里,却可能让你在CI中耗费数小时调试,如果你不清楚Next.js 16 App Router需要哪些具体配置。这不是pnpm的bug,而是其严格隔离模型的文档化后果,正是这一模型让它在其他方面表现卓越。问题在于官方文档假设你已读完所有前置上下文,而在CI环境中这个假设不成立。


基准测试遗漏的问题:缓存失效与工作区提升(hoisting)

原始测试结构很简单:一个monorepo,两个应用,一个共享包。脚本测量了从零开始和带缓存的pnpm install。数字好看。但我没测pnpm在CI中以下组合条件下的行为:

— 共享包@repo/ui,内含React组件
— 应用apps/web,使用Next.js 16 App Router,从@repo/ui导入
— GitHub Actions缓存~/.pnpm-store跨运行保留
— Railway作为部署目标,自带构建步骤

这种场景下的错误不出在pnpm install,而出在Next.js构建阶段,报错信息足够模糊,足以让你找错方向:

Error: Cannot find module '@repo/ui/components/Button'
Require stack:
- /app/apps/web/.next/server/chunks/[turbopack]_root_of_the_server__[...].js

这个错误在此上下文中不是导入路径写错。它是pnpm在工作区中处理依赖提升的直接后果——配合嵌套的node_modules结构,以及Next.js 16 Turbopack与webpack截然不同的模块解析方式。


pnpm的提升机制如何运作(以及为何在此失效)

pnpm官方文档(pnpm.io/workspaces)解释了其模型:与npm和yarn不同,pnpm默认不做激进提升。工作区中每个包在自己的node_modules里拥有独立依赖,共享包通过符号链接连接。这种严格隔离是pnpm磁盘效率和安全优势的基础。

但当Next.js 16 Turbopack在CI容器中解析模块时,它期望某些依赖以特定方式可访问。pnpm的嵌套结构加上部分缓存,导致Turbopack在构建时找不到@repo/ui——尽管安装阶段一切正常。

修复不需要换工具。需要理解pnpm的node-linker配置选项,以及何时在CI中强制使用shamefully-hoist模式,或更精细地配置Turbopack的resolve别名。这些在官方文档里都有,只是散落在不同页面,且假设你同时读过pnpm、Turbopack和Next.js三边文档。

教训:基准测试测量的是你定义的问题。但生产环境的问题往往在你定义的范围之外。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
75岁大爷与保姆生下儿子,做亲子鉴定后,大爷却被子女们气得心梗

75岁大爷与保姆生下儿子,做亲子鉴定后,大爷却被子女们气得心梗

黄家湖的忧伤
2025-03-06 09:30:21
上海多个地铁站存在相同问题!市民无奈:太累太辛苦,每次都是对体力的极大考验

上海多个地铁站存在相同问题!市民无奈:太累太辛苦,每次都是对体力的极大考验

新民晚报
2026-05-13 12:11:10
吃透【光通信】产业链,3 大关键赛道(附核心公司)

吃透【光通信】产业链,3 大关键赛道(附核心公司)

飞跑的鹿
2026-05-13 20:11:54
张兰一家格局大变!新妻带幼子赴台贺生日,过往恩怨一笑而过

张兰一家格局大变!新妻带幼子赴台贺生日,过往恩怨一笑而过

陈意小可爱
2026-05-12 10:30:39
25岁失业女子高调征婚,要男方180有肌肉删光异性月薪过万并上交

25岁失业女子高调征婚,要男方180有肌肉删光异性月薪过万并上交

捣蛋窝
2026-05-13 12:35:35
当伊朗亮出海底光缆底牌时,全世界才发现,中国藏了一手更绝的!

当伊朗亮出海底光缆底牌时,全世界才发现,中国藏了一手更绝的!

独坐山巅前
2026-05-12 23:14:57
不配当周琦替补!北京队晋级,28岁中锋被弃用,顶薪明年到期

不配当周琦替补!北京队晋级,28岁中锋被弃用,顶薪明年到期

体坛大事记
2026-05-13 11:19:27
闫妮调侃张嘉益:我能演《主角》中花彩香吗?张嘉益回复显情商

闫妮调侃张嘉益:我能演《主角》中花彩香吗?张嘉益回复显情商

萧狡科普解说
2026-05-13 16:46:33
他是元帅起点,上将的军衔,他当师长时,陈赓是营长,粟裕是班长

他是元帅起点,上将的军衔,他当师长时,陈赓是营长,粟裕是班长

顾秋韵
2026-05-13 08:17:50
专机落地!特朗普又舞起熟悉手势 乘专车前往酒店

专机落地!特朗普又舞起熟悉手势 乘专车前往酒店

看看新闻Knews
2026-05-13 23:14:07
仅20分钟,英国男子“淘金”挖到当地有史以来最大金块,重64.8克

仅20分钟,英国男子“淘金”挖到当地有史以来最大金块,重64.8克

怪罗
2026-05-13 23:27:10
学医后才明白,预防骨质疏松最好的习惯,不是晒太阳,而是3件事

学医后才明白,预防骨质疏松最好的习惯,不是晒太阳,而是3件事

垚垚分享健康
2026-05-04 19:15:04
马斯克:特斯拉在柏林超级工厂生产了750000辆汽车

马斯克:特斯拉在柏林超级工厂生产了750000辆汽车

财闻
2026-05-12 16:29:47
漫步者N500音箱“30周年限量典藏款”上架,999元

漫步者N500音箱“30周年限量典藏款”上架,999元

IT之家
2026-05-12 20:40:10
谷歌发布安卓 AI 系统,这就是苹果想象中的自己

谷歌发布安卓 AI 系统,这就是苹果想象中的自己

爱范儿
2026-05-13 12:13:33
美式霸权在波斯湾显露纸老虎本质

美式霸权在波斯湾显露纸老虎本质

风铃草语
2026-05-13 06:36:05
足协主席宋凯与国际足联秘书长在京会面

足协主席宋凯与国际足联秘书长在京会面

北青网-北京青年报
2026-05-13 17:44:09
绿洲珠宝行血案,浙江6任厅长追凶22年,抓到嫌犯后大家都愣住了

绿洲珠宝行血案,浙江6任厅长追凶22年,抓到嫌犯后大家都愣住了

崖边行
2025-06-27 21:11:22
陈赓去朝支援,听彭德怀说以为是姓高的人来,问:你不大欢迎我?

陈赓去朝支援,听彭德怀说以为是姓高的人来,问:你不大欢迎我?

简史档案馆
2026-05-12 11:05:03
新婚夜妻子坦白怀了别人孩子,我离婚,十个月后她竟抱娃跪求接盘

新婚夜妻子坦白怀了别人孩子,我离婚,十个月后她竟抱娃跪求接盘

晓艾故事汇
2026-05-03 10:29:18
2026-05-14 04:48:49
赛博兰博
赛博兰博
专注捣鼓AI效率工具,试图在这个时代留下数字分身的探索者。
2606文章数 28关注度
往期回顾 全部

科技要闻

阿里年营收首破万亿,AI终于不再是画大饼

头条要闻

女子闪婚获千万房产99%份额闪离后起诉分割 法院判了

头条要闻

女子闪婚获千万房产99%份额闪离后起诉分割 法院判了

体育要闻

14年半,74万,何冰娇没选那条更安稳的路

娱乐要闻

白鹿掉20万粉,网友为李晨鸣不平

财经要闻

美国总统特朗普抵达北京

汽车要闻

C级纯电轿跑 吉利银河"TT"申报图来了

态度原创

时尚
艺术
手机
本地
房产

专栏 | 进入心流后,不被洪流裹挟

艺术要闻

规划中的成都第三高楼,从396米降到250米以下?

手机要闻

iOS 27新功能全面爆料!相机App界面支持定制,Siri将彻底重塑

本地新闻

用苏绣的方式,打开江西婺源

房产要闻

卷疯了!最低杀到7字头!手握30万,海口楼市横着走!

无障碍浏览 进入关怀版