背景
为了打包构建之前的 element-theme,用到了gulp,但是遇到的坑,记录一下。
报错如下
fs.js:40
} = primordials;
^
ReferenceError: primordials is not defined
at fs.js:40:5
ReferenceError: primordials is not defined 意思是primordials这个没被定义,是因为项目中gulp版本和node版本不兼容,先看下本地的版本:
gulp --version
CLI version: 2.3.0
Local version: 3.9.1'
node -version
v14.21.0
node >=12 && gulp <= 3的话,他们的版本不兼容,我本地是14的版本。
解决方法 找到原因后,有两种解决方法,降级node或升级gulp
解决方法之:降级node 不建议用这种方法,毕竟时代在进步,还是不要倒退的好, 所以这种方法直接 pass 那就用另一个解决方法,使用npm shrinkwrap锁定依赖版本:
解决方法之:升级gulp(1)
- 1、项目根目录新建npm-shrinkwrap.json
- 2、npm-shrinkwrap.json内容修改如下:
{
"dependencies": {
"graceful-fs": {
"version": "4.2.2"
}
}
}
然后重新执行npm install,这时候再去执行gulp相关操作就不会报错了。
注意:这个文件在执行过一次npm install以后,就失效了,下次再执行就没有效果了, 所以,最好不要把它加入版本控制里后再加入 .gitignore,这样本地执行,其它合作伙伴拉取 后无感知安装
解决方法之:升级gulp(2)
在package.json文件里加入以下代码:
{
"scripts": {
"preinstall": "npx npm-force-resolutions"
},
"resolutions": {
"graceful-fs": "4.2.2"
}
}
注意:此方案有毒
原因: package.json中"preinstall": "npx npm-force-resolutions"强制npm安装特定的传递依赖项版本,该命令需要package-lock.json
解决方法:先注释掉 //”preinstall”: “npx npm-force-resolutions”, 然后npm install生成 package-lock.json 文件,最后再取消注释重新安装。