我已经通过“npm install”安装了Node.js模块,然后尝试在命令提示符下执行gulp sass watch。之后,我得到了以下回应。

[18:18:32] Requiring external module babel-register
fs.js:27
const { Math, Object, Reflect } = primordials;
                                  ^

ReferenceError: primordials is not defined

我在大口大口看之前已经试过了:

npm -g install gulp-cli

当前回答

我们在根据gulp@3.9.1到Node.js 12+。

这些修复使您能够使用Node.js 12+gulp@3.9.1通过将优雅的fs覆盖到版本^4.2.10。

如果您正在使用pnpm

pnpm支持覆盖某些依赖项版本。为此,您应该在package.json文件中添加pnpm部分:

{
  "pnpm": {
    "overrides": {
      "graceful-fs": "^4.2.10"
    }
  }
}

如果您使用纱线v1

Yarn v1支持将包解析为定义的版本。您需要在package.json中添加一个resolutions部分:

{
  "resolutions": {
    "graceful-fs": "^4.2.10"
  }
}

感谢@jazd以这种方式解决问题。

如果您正在使用npm

运行此命令以了解您正在使用的Node.js版本:

node -v

它将返回一个版本号<major><小调><补丁>如18.11.0。

如果您的版本是v16.14.0或更高版本,则可以通过在package.json文件中添加覆盖部分来覆盖曼妙fs的版本:

{
  "overrides": {
    "graceful-fs": "^4.2.10"
  }
}

否则,您需要使用npm-force分辨率作为预安装脚本,以便能够通过如下方式更改package.json文件来覆盖优雅fs的版本:

{
  "scripts": {
    "preinstall": "npx npm-force-resolutions"
  },
  "resolutions": {
    "graceful-fs": "^4.2.10"
  }
}

npm-force解析将在安装完成之前更改package-lock.json文件,以将优雅的fsto设置为所需版本。

如果您在项目中使用自定义.npmrc文件,并且该文件包含代理或自定义注册表,则可能需要将npx-npm-force分辨率更改为npx-userconfig.npmrc npm-force分辨率,因为某些版本的npx默认情况下不使用当前文件夹.npmrc。

问题的根源

这个问题源于以下事实:gulp@3.9.1取决于monkeypatchesNode.js fs模块的优雅fs@^3.0.0。

在11.15版本之前,这一直适用于Node.js(这是一个开发分支的版本,不应该在生产中使用)。

优雅的fs@^4.0.0不再对Node.js fs模块进行monkeypatch,这使其与Node.js>11.15兼容(已测试并与版本12、14和16一起使用)。

请注意,这不是一个长期的解决方案,但当您没有时间更新到狼吞虎咽@^4.0.0时,它会有所帮助。

其他回答

我在Windows 10上遇到了这个错误。结果是一个损坏的漫游配置文件。

npm ERR! node v12.4.0
npm ERR! npm  v3.3.12

npm ERR! primordials is not defined
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:

删除C:\Users\{user}\AppData\Roaming\npm文件夹解决了我的问题。

对于使用纱线的用户:

yarn global add n
n 11.15.0
yarn install # Have to install again

对于任何遇到这种情况的人,请确认你没有做过我做的傻事,一百万年前,我无意中在你的用户目录中运行了npm init,并忘记清除这些文件。

我在尝试使用@vue-cli创建一个新项目时发现了这个问题,结果是用户目录根目录中的一个rogue package.json/package-lock.json文件和node_modules文件夹。

解决方案:从用户目录中删除package.json、package-lock.json和node_modules,问题解决了!现在,把手掌从前额上移开!

TL:博士

Gulp 3.*不适用于Node.js 12.*或更高版本。您必须降级Node.js或升级Gulp。

如果时间不足,请将Node.js降级到v11.*或更低版本;如果您需要更新的功能,并且有时间可能修复大量的依赖关系,请将Gulp升级到4.*或更高版本!

正如其他人已经提到的,Node.js 12或更高版本不支持Gulp 3.*,因此您必须将Node版本降级到11.*或更低,或者将Gulp升级到4.0。

最好的选择最终取决于你有多少时间,因为升级Gulp带来了更干净的Gulp文件的好处,并且内置了对任务串行或并行运行的控制,但也依赖于你将Gulp文件重写为新语法,并且可能(读:可能会-见本评论结尾)导致与某些依赖项的冲突。


降级Node.js

这是最简单快捷的选择。特别是如果您使用n或nvm,因为它们允许您快速安装并在Node.js版本之间切换。

在N上安装Node.js版本

n 10.16.0

在NVM上安装Node.js版本

nvm install 10.16.0

完成此操作后,您可能需要重建npm依赖项,或者删除node_modules文件夹和package-lock.json文件并重新安装依赖项。虽然如果您只是恢复到一个预先存在的Node.js版本,您可能会没事。


升级Gulp

如上所述,这是一项更耗时的任务,但从长远来看可能会带来好处。例如,Node.js 12现在引入了对ES模块的本地支持(在实验标志后面),并在Node.js 13中提供了完全支持。

您可能需要升级Node.js才能使用它,从而迫使您升级Gulp。或者你可能只是想要使用Gulp 4的好处,因为它可以更好、更有效地控制写作任务。

关于这一点,已经有很多文章了,所以我不会再详细说明细节,但要重申,这不是一项快速的工作。根据项目的大小,可能需要一些显著的重写,并且可能会有依赖关系中断。如果时间紧迫,您应该选择简单地降级Node.js,至少暂时如此。


但我已经有了Gulp 4,但它仍然不起作用!

如果像我一样,您已经在使用Gulp 4+(我使用的是Gulp 4.0.2,最初在Node.js 10上),并且最近升级了(我升级到Node.js 13.8.0),那么您仍然会遇到问题,这可能是因为依赖项依赖于旧版本的Gulp,而这正被管道所捕获。

在我的例子中,gulp combine mq是使用gulp 3.9.*的依赖项。在我的gulp文件中禁用此任务允许gulp再次运行。

如果发生这种情况,你有几个选择。你可以,

如果不是绝对必要的话,不使用插件寻找替代方案,修复插件

不用说,如果您有几个插件依赖于旧版本的Gulp,特别是如果这些插件对您的应用程序至关重要,那么升级Gulp可能会花费大量额外的时间(因此上面的警告)。

如果发生这种情况,最好只降级Node.js,至少在发布补丁之前。

使用NVM管理您正在使用的Node.js版本,运行以下命令对我有效:

cd /to/your/project/
nvm install lts/dubnium
nvm use lts/dubnium
yarn upgrade # or `npm install`