
之前的机器是 2 核 4g 的配置,打包 nextjs 项目经常不成功,后面升级了 4 核 8G 打包成功了,但是速度很慢,现在好了直接不能打包!
无奈使用免费的 github Actions ,发现吊打阿里云服务器啊,还没一个免费的服务好用!这钱花的不值~
是我不会用阿里云 esc 吗,还是阿里云的 ecs 有猫腻。。。

1 newaccount 348 天前 默认没有 swap 吧,你加个试试看 |
2 rekulas 348 天前 这个最好排查下,不一定是阿里的问题,有可能你这套打包就是超了 8g 呢。。。我们之前有一个 nuxt 的也是打包内存直接 oom ,现在的前端几十个页面打包时间几分钟内存数 G ,后端数百项 api 打包 20s 内存几百 M ,实在不想吐槽 至于 github ,它的机器确实比较厚道,你的用的实例可能不止 8g |
3 ttkit OP |
5 newaccount 348 天前 @ttkit #3 windows 的虚拟内存知道吧,在 linux 上就是 swap |
6 ttkit OP @newaccount 好的,我研究下 |
7 skallz 348 天前 打包直接用云效啊,你都用阿里云了为啥不直接用配套的云效流水线。。。 |
8 hefish 348 天前 就看在 esc ,ecs 混用的情况,感觉 op 技能还能再提高一些。 |
9 baobao1270 348 天前 |
12 ttkit OP @baobao1270 这个就是专业 |
13 gadfly3173 348 天前 via Android 我本地一个 build 完 12MB 的 angular9 的项目,打包的时候吃掉了 2.4GB 内存,再加上你系统其他占用什么的,要是没 swap 的话,超 8G 应该很轻松 |
14 salmon5 348 天前 前端? |
15 ThisZKC 348 天前 国内各大公有云都有资源 基本官网价格的六折左右都能买到 |
16 laminux29 348 天前 关于 swap: Windows 有个功能叫虚拟内存,在磁盘上设定一个文件,当成内存用。当物理内存满了后,就会开始用磁盘上的这个文件。代价是,早期用机械硬盘,速度极慢。但现在 nvme 了,速度很快。 Linux 的 swap ,本质上也是虚拟内存,但是逻辑与 Windows 完全不一样,坑了很多人。swap 是 Linux 主动进行管理,把一小部分不常用的内容放在这里。当物理内存满了后,不一定会使用 swap ,而是会直接 kill 进程。所以经常发现,Linux 物理内存都用完了,swap 却几乎没怎么用。 |
17 sagaxu 348 天前 打包前先设置环境变量 export NODE_OPTIOnS=--max_old_space_size=4096 |
21 sagaxu 348 天前 node 下输入 v8.getHeapStatistics() 看看输出是什么,监控里显示内存只用了 50%,不大可能是 ECS 的问题 |
22 ttkit OP @sagaxu v8.getHeapStatistics() { total_heap_size: 6516736, total_heap_size_executable: 262144, total_physical_size: 6291456, total_available_size: 2192958816, used_heap_size: 4726808, heap_size_limit: 2197815296, malloced_memory: 262312, peak_malloced_memory: 172416, does_zap_garbage: 0, number_of_native_contexts: 2, number_of_detached_contexts: 0, total_global_handles_size: 8192, used_global_handles_size: 2848, external_memory: 2293864 } 输出的这些。 |
23 sagaxu 348 天前 heap_size_limit: 2197815296, heap 最大只有 2G ,这个限制没打开 参考 v8 的代码 heap/heap.cc size_t Heap::HeapSizeFromPhysicalMemory(uint64_t physical_memory) { // Compute the old generation size and cap it. uint64_t old_generation = physical_memory / kPhysicalMemoryToOldGenerationRatio * kHeapLimitMultiplier; old_generation = std::min(old_generation, static_cast<uint64_t>(MaxOldGenerationSize(physical_memory))); old_generation = std::max({old_generation, static_cast<uint64_t>(V8HeapTrait::kMinSize)}); old_generation = RoundUp(old_generation, PageMetadata::kPageSize); size_t young_generation = YoungGenerationSizeFromOldGenerationSize( static_cast<size_t>(old_generation)); return static_cast<size_t>(old_generation) + young_generation; } 默认只能使用 1/4 的物理内存 |
24 ttkit OP @sagaxu 好兄弟可以了,我之前写了一个 sh 脚本: log "正在构建项目..." rm -rf .next/ NODE_OPTIOnS="--max-old-space-size=4096" npm run build || handle_error "构建失败" 没加 export 导致的。 这个做备选方案吧,还是 github actions 的自动化部署方案优秀,可以省不少钱。 |
25 Nitromethane 348 天前 这和阿里云有屁关系,换到 aws 照样同样的错误 |
26 goodryb 348 天前 打包这种重复性工作可以考虑用抢占实例,价格便宜,配置可以开高一些 |
27 msg7086 348 天前 免费打包服务好用那是因为有大佬帮你付了费了,要是换你自己掏钱支付这些 runner 的费用你就知道肉疼了。Github 的收费打包机 2c7g (免费打包机的一半规格)收费价格是每分钟$0.008 ,相当于一天$11.52 ,一个月 300 多美刀。你再和 ECS 的价格比比? |
28 aru 348 天前 Github Actions 提供的虚拟机配置比较高:Linux 4 核 16 GB 内存 14 GB ssd 性能全面打爆你用的这个 ecs 吧,特别 cpu 配额和 ssd 的 iops |
30 darkengine 347 天前 今天刚试了 build 一个 express 项目爆了 heap ,不过我用的是 AWS 的 t2.micro 1C1GB 的丐版配置 |
32 wnpllrzodiac 347 天前 via Android 前端代码都干了啥,塞了一个操作系统? |
33 Dragonphy 347 天前 Next.js 项目是这样的,我都不知道塞了什么,上次跑一个 GitHub 上拉下来的服务,我还特地更新了本地 CI 服务器配置。 |
34 ttkit OP @darkengine 哈哈,node 项目就这样,npm 包依赖太多 |
35 ttkit OP @wnpllrzodiac 打包的时候要分析几千个模块,nextjs 又要区分哪些页面需要服务端渲染哪些需要 spa 打包,所以页面多了会变慢。我现在用的是 nextjs 是 14 版本,Next.js 15 会好些,默认的打包工具从 Webpack 升级为 Turbopack 。 |
36 ttkit OP @Dragonphy 准备有时间升级 15 版本了,看官方说 15 版本默认使用 Turbopack 了,Turbopack 的速度比 Webpack 快 700 倍,比 Vite 快 10 倍。这使得项目的构建速度大幅提升,开发者可以更高效地进行开发。 |
37 darkengine 347 天前 @wnpllrzodiac 有一张很出名的梗图,node_modules 的。。。 |
38 BG7ZAG 347 天前 借助云效进行打包~ |
39 cyningxu 347 天前 via Android 上 swap ,云服务器默认都不开 swap 的,只要内存满了就会挂 |
41 Sunzehui 347 天前 限制一下 nuxt 的并行打包数量应该可以解决 |
42 corcre 347 天前 @darkengine 勒索病毒加密了一小时还在加密 node_modules 文件夹那张吗 |
43 darkengine 347 天前 @corcre “全宇宙最重的东西”那张 |
44 importmeta 347 天前 我自己项目在本地打包, 只推镜像. |
45 lynn1su 347 天前 |
46 jiangzm 347 天前 好奇问下 为什么会用 nextjs/nuxtjs 这类框架,是确实有 SSR 需求还是其他原因呢 |
47 sleepm 347 天前 加 swap 管用,一直以为工具有 bug... sudo fallocate -l 3G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile sudo swapon --show free -h echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab |
49 ttkit OP @importmeta 啊这。。 |
51 a1248499257 347 天前 next.js 可以配置下 config ,限制下构建内存,不过会比较慢,另外这框架确实很容易内存溢出.. 例如在使用它自身的图片优化服务的时候 |
52 tracebundy 347 天前 你想阿里云 8G 达到 16G 的效果? |
53 perfectlife 347 天前 前端在构建这一块现在搞得比后端真的是麻烦多了,又大又重 |
54 seansong 347 天前 前端太卷了,我平时构建 react 的时候,就感觉相当吃资源,也不理解这里面到底干了啥,以前用 nextjs ,后来换到 vite ,打包速度有提升,打包时候的占用也稍微好一些了 |
55 terranboy 347 天前 阿里云打包确实慢 |
56 shadowyue 347 天前 前端构建的工具链用 nodejs 的迟早会被淘汰掉,性能太低了。 估计以后都是被 rust 语言重写的工具链替代。 |
57 yuezhiyuan 347 天前 nodejs 赶紧淘汰吧 换个东西来支持 js |
58 daimaosix 347 天前 via Android 啥机型? |
59 Lanzhijiang 346 天前 via Android 开 swap 基本上就能解决了。不过我认为阿里云默认不开 swap 就是故意的,想要一些人傻傻去升级 |
60 Betterr 346 天前 我用过的大部分 vps 的磁盘性能都堪忧,有的时候 swap 可以拉崩磁盘导致系统无响应...我后来都是只开 zram ,完全不敢在垃圾盘的 vps 上开 swap 了。 |
61 Betterr 346 天前 @Lanzhijiang 才发现没有 at 上,重新 at 一下。 |
62 heimoshuiyu 345 天前 应该吐嘈 Javascript 框架 |
63 coolfan 345 天前 |
64 Lanzhijiang 337 天前 via Android @Betterr 天哪,这么遭吗 |