Rollup构建挂起触发内存溢出及模块找不到问题求助
Rollup构建挂起、内存溢出及模块找不到问题的排查与解决
问题描述
执行rollup -c时,第一个配置项可正常完成构建,但命令随即挂起,等待一段时间后触发JavaScript堆内存溢出错误。手动排查Rollup启动shell脚本时,执行exec node "$basedir/../rollup/dist/bin/rollup" "$@"会提示Error: Cannot find module '/rollup/dist/bin/rollup'。已尝试升级依赖、使用pnpx运行,未发现代码循环依赖。
配置与环境信息
Rollup配置文件
// @ts-check import multiInput from "rollup-plugin-multi-input"; import typeScript from "rollup-plugin-typescript2"; export default [ { input: "packages/**/*.tsx", output: { format: "esm", dir: ".registry/js" }, plugins: [ multiInput(), typeScript({ tsconfig: "tsconfig.react.json" }) ] }, { input: "packages/etech-ui-utils/src/index.ts", output: { format: "esm", dir: "packages/etech-ui-utils/dist" }, plugins: [ multiInput(), typeScript({ tsconfig: "tsconfig.lib.json" }) ] } ];
核心依赖版本
{ "rollup": "^4.20.0", "rollup-plugin-multi-input": "^1.4.2", "rollup-plugin-typescript2": "^0.36.0" }
系统环境
- macOS 14.6
- Node.js 22.5.1
- pnpm 9.6.0
解决方案
1. 修复模块找不到的路径问题
出现Cannot find module '/rollup/dist/bin/rollup'是因为shell脚本中的$basedir变量未正确解析Rollup的安装路径(pnpm的依赖存储结构与npm不同,默认在node_modules/.pnpm下)。解决方式:
- 直接使用pnpm的包执行命令替代手动调用脚本:
pnpm exec rollup -c - 若需自定义脚本,检查
$basedir的取值逻辑,确保指向Rollup包的实际安装目录(比如node_modules/.pnpm/rollup@4.20.0/node_modules/rollup)
2. 解决内存溢出与构建挂起问题
- 缩小输入范围:第一个配置项的
packages/**/*.tsx通配符可能匹配了大量无关文件(如测试用例、Demo代码),导致插件处理时内存过载。修改为明确的路径,比如packages/*/src/**/*.tsx - 增加Node内存限制:执行构建时添加内存参数:
NODE_OPTIONS="--max-old-space-size=4096" pnpm exec rollup -c(数值可根据实际情况调整,如8192即8G) - 优化插件配置:
- 给rollup-plugin-typescript2开启缓存,减少重复编译:
typeScript({ tsconfig: "tsconfig.react.json", cacheRoot: ".rollup-cache" // 添加缓存目录 }) - 第二个配置项输入为单个文件,无需
multiInput插件,直接移除该插件以减少不必要的开销
- 给rollup-plugin-typescript2开启缓存,减少重复编译:
3. 修复插件兼容性问题
rollup-plugin-multi-input@1.4.2是2022年的旧版本,与Rollup 4.x存在兼容性风险。可尝试:
- 降级Rollup到3.x版本(如
pnpm add rollup@3.29.4),与旧插件版本适配 - 替换为官方维护的多入口插件
@rollup/plugin-multi-entry,安装后替换原插件:import multiEntry from "@rollup/plugin-multi-entry"; // 插件使用改为multiEntry()
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

