Laravel Mix执行prod打包报错:NODE_OPTIONS的--openssl-legacy-provider无效
故障解决方案
这个错误是生产模式触发代码压缩时,Terser插件启动的Node Worker线程不允许NODE_OPTIONS环境变量中携带--openssl-legacy-provider参数导致的,开发模式默认不启动压缩流程因此不会触发报错,可按以下优先级尝试修复:
- 方案1:临时清空NODE_OPTIONS执行打包
直接在打包命令前清空环境变量即可绕过校验,Linux/macOS执行:
Windows cmd执行:NODE_OPTIONS="" yarn run prod
Windows PowerShell执行:set NODE_OPTIONS=&& yarn run prod$env:NODE_OPTIONS=""; yarn run prod - 方案2:将openssl参数从全局环境变量移到脚本启动参数
如果你确实需要--openssl-legacy-provider参数解决加密兼容问题,不要把它放在全局NODE_OPTIONS里,改成直接附加到打包命令的Node启动参数上,修改package.json中的生产构建脚本:
这样参数只会传给构建主进程,不会传递给Worker线程,不会触发校验。{ "scripts": { "prod": "node --openssl-legacy-provider node_modules/laravel-mix/bin/cli.js --production" } } - 方案3:调整Node.js版本
这个参数校验问题仅出现在部分Node.js 17/18的早期小版本中,两种选择都可以解决:- 降级到Node.js 16.x LTS版本,该版本默认使用OpenSSL 1.1.1,不需要额外加
--openssl-legacy-provider参数 - 升级到Node.js 18.12以上的LTS版本,该版本已经修复了Worker线程对这个参数的校验限制
- 降级到Node.js 16.x LTS版本,该版本默认使用OpenSSL 1.1.1,不需要额外加
- 方案4:关闭Terser的多线程压缩
不想调整Node版本和环境变量的话,可以在Webpack配置(或Laravel Mix的webpack.mix.js)中关闭Terser的多线程模式,避免启动Worker线程:
该方案唯一影响是生产构建速度会有所下降。const TerserPlugin = require('terser-webpack-plugin'); mix.webpackConfig({ optimization: { minimizer: [ new TerserPlugin({ parallel: false }) ] } });
内容的提问来源于stack exchange,提问作者Deák Zsolt
相关产品推荐
相关产品推荐

