执行npm run build报EBUSY资源被锁错误,仅偶尔成功如何解决?
解决步骤
第一步:修改构建脚本,前置清空dist目录
安装rimraf工具用于强制清理构建产物目录:npm install -D rimraf
修改package.json中的build命令,先清空dist再执行构建:"build": "rimraf dist && 原有的build命令内容"
避免旧的未写完的dist文件占用锁导致复制冲突。第二步:调整文件复制插件的并发和重试配置
如果你使用的是copy-webpack-plugin,在webpack配置中添加重试、降低并发参数:new CopyPlugin({ patterns: [/* 保留你原有复制规则不变 */], options: { concurrency: 1, // 单线程复制避免并行写入冲突 retry: { attempts: 5, // 失败自动重试5次 delay: 200 // 每次重试间隔200ms等待锁释放 } } })可以直接解决随机锁导致的单次复制失败问题。
第三步:给Windows安全软件添加目录排除
除了McAfee外,需要将以下目录添加到Windows Defender实时扫描的排除列表:- 你的React项目根目录
- NPM全局缓存目录(默认路径为
C:\Users\你的用户名\AppData\Roaming\npm-cache) - Node.js安装目录
Windows Defender的实时扫描会在新文件生成的瞬间加锁扫描,是这类随机EBUSY错误的最常见诱因。
第四步:更换Node.js LTS版本
卸载当前安装的Node.js,安装官方长期支持版本(建议18.x或20.x LTS),避免旧版本Node.js在Windows平台的文件IO已知bug导致的写入异常。第五步:调整TypeScript声明文件输出逻辑
如果项目开启了d.ts生成,修改tsconfig.json将声明文件输出到临时目录而非直接输出到dist,全部生成完成后再统一复制到dist目录:{ "compilerOptions": { "declaration": true, "declarationDir": "./temp-types", // 其他配置保持不变 } }再修改build命令,最后添加复制临时声明文件到dist的逻辑,避免一边生成声明一边复制的时序冲突。
你提到的dist目录下index.d.ts内容全为NUL的问题,是文件写入过程中被强制打断导致的文件系统占位错误,按上述步骤调整后即可完全解决。
内容的提问来源于stack exchange,提问作者Kid
相关产品推荐
相关产品推荐

