Vue.js 2项目npm run build报E2BIG错误,serve运行正常
Vue 2 项目生产构建报
spawn E2BIG 问题 原问题描述
我正在开发Vue.js 2应用程序,使用的操作系统为Ubuntu 20.04.1 LTS。
我的 package.json 文件内容如下:
{ "name": "my-app", "version": "0.0.1", "private": true, "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint" }, "dependencies": { "vue": "^2.6.12", "vue-router": "^3.4.9", "vuex": "^3.6.2", "vuex-persistedstate": "^4.0.0-beta.3", ...and others }, "devDependencies": { ...some dependencies } }
执行 npm run build 命令时,抛出如下异常:
> vue-cli-service build ⠹ Building for production...internal/child_process.js:403 throw errnoException(err, 'spawn'); ^ Error: spawn E2BIG at ChildProcess.spawn (internal/child_process.js:403:11) at Object.spawn (child_process.js:553:9) at new PoolWorker (/workspace/___/___/___/node_modules/thread-loader/dist/WorkerPool.js:46:43) at WorkerPool.createWorker (/workspace/___/___/___/node_modules/thread-loader/dist/WorkerPool.js:341:23) at WorkerPool.distributeJob (/workspace/___/___/___/node_modules/thread-loader/dist/WorkerPool.js:335:28) at runQueue (/workspace/___/___/___/node_modules/neo-async/async.js:8099:9) at processTicksAndRejections (internal/process/task_queues.js:75:11) { errno: -7, code: 'E2BIG', syscall: 'spawn' } npm ERR! code 1 npm ERR! path /workspace/___/___/___ npm ERR! command failed npm ERR! command sh -c vue-cli-service build npm ERR! A complete log of this run can be found in: npm ERR! /home/___/.npm/_logs/2021-03-08T18_57_06_018Z-debug.log
执行 npm run serve 命令时所有功能运行正常,求定位问题原因,如需补充其他相关配置文件可随时告知。
问题根因
- 报错代码
E2BIG是Linux系统内核返回的标准错误,代表创建子进程时,传入的启动参数、环境变量总长度超过了内核允许的单进程传参上限(即ARG_MAX阈值) - 从堆栈调用链可定位,错误触发点是
thread-loader创建编译工作子进程时抛出:Vue CLI 在生产构建场景下默认开启多线程编译优化,创建工作子进程时会透传当前主进程的全部环境变量与启动参数 - 开发服务模式无异常的原因:
npm run serve场景下的thread-loader worker初始化数量、透传参数总量远小于生产构建阶段,不会触及系统传参上限 - Ubuntu 20.04 默认的
ARG_MAX阈值为2MB,如果当前终端会话的环境变量总长度接近或超过这个值,就会在创建构建子进程时触发校验失败
解决方式
- 临时调高系统传参上限
执行命令调整当前会话的内核参数:
调整完成后重新执行构建命令即可。如需永久生效,可将sudo sysctl -w kernel.arg_max=16777216kernel.arg_max=16777216追加写入/etc/sysctl.conf配置文件。 - 关闭Vue CLI的多进程编译逻辑
在项目根目录的vue.config.js中新增配置:
该配置会关闭thread-loader的多线程编译能力,构建流程全程在主进程执行,从根本上避开子进程传参长度校验的问题,代价是生产构建速度会有一定幅度下降。module.exports = { parallel: false } - 清理冗余环境变量
检查当前终端会话内导出的全局环境变量,清理掉非构建流程必需的大段冗余配置(如被错误导出的大段JSON配置、超长日志路径变量等),降低传给子进程的总参数长度,再重新执行构建。
内容的提问来源于stack exchange,提问作者Aleks Vujic
相关产品推荐
相关产品推荐

