ChatGPT解决这个技术问题 Extra ChatGPT

如何修复 Node.js 中的“ReferenceError: primordials is not defined”

我已经通过“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

我在 gulp sass-watch 之前尝试过这个:

npm -g install gulp-cli
如果有人在通过 Visual Studio 任务运行程序自动执行 gulp 任务期间遇到此问题(尤其是在更新 VS 之后),请参见此处 - stackoverflow.com/a/72709758/1549918

P
Peter Mortensen

我遇到了同样的错误。我怀疑您使用的是 Node.js 12 和 Gulp.js 3。这种组合不起作用:Gulp.js 3 is broken on Node.js 12 #2324

月之前的解决方法也不起作用:After update to Node.js 11.0.0 running Gulp.js exits with 'ReferenceError: internalBinding is not defined' #2246

解决方案:升级到 Gulp.js 4 或降级到 Node.js 的早期版本。


我正在使用节点 v12.1.0 和 gulp gulp@4.0.2 但它不起作用
我建议使用 Valentin 发布的 npm-shrinkwrap.json 解决方案:stackoverflow.com/a/58394828/2726785,即使这是公认的解决方案。
我使用节点 v14 和 gulp v4。我仍然得到这个问题:(
将 Gulp 升级到 4 并且必须在我的 gulpfile.js 中修复几个任务问题,但这成功了。
您还可以使用 nvm 来使用多个节点版本
V
Valentin

在将依赖于 gulp@3.9.1 的旧项目更新到 Node.js 12+ 时,我们遇到了同样的问题。

这些修复使您能够通过将 graceful-fs 覆盖到版本 ^4.2.9 来使用带有 gulp@3.9.1 的 Node.js 12+。

如果您使用的是纱线 v1

纱线 v1 supports resolving a package to a defined version。您需要将 resolutions 部分添加到 package.json

{
  // Your current package.json contents
  "resolutions": {
    "graceful-fs": "^4.2.9"
  }
}

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

如果您使用的是 npm >= 8.3.0

npm@^8.3.0 使您能够覆盖项目依赖包的版本。为此,您应该在 package.json 中添加 an overrides section

{
  // Your current package.json
  "overrides": {
    "graceful-fs": "^4.2.9"
  }
}

如果您使用的是 npm < 8.3.0

使用 npm-force-resolutions 作为预安装脚本,您可以获得与使用 yarn v1 类似的结果。您需要以这种方式修改您的 package.json:

{
  // Your current package.json
  "scripts": {
    // Your current package.json scripts
    "preinstall": "npx npm-force-resolutions"
  },
  "resolutions": {
    "graceful-fs": "^4.2.9"
  }
}

npm-force-resolutions 将更改 package-lock.json 文件以在 install 完成之前将 graceful-fs 设置为所需的版本。

如果您在项目中使用自定义 .npmrc 文件并且它包含代理或自定义注册表,您可能需要将 npx npm-force-resolutions 更改为 npx --userconfig .npmrc npm-force-resolutions,因为到目前为止,npx 不使用当前文件夹.npmrc 文件。

问题的根源

此问题源于 graceful-fs@^3.0.0 上的 gulp@3.9.1 depends 对 Node.js fs 模块进行了猴子补丁。

在 11.15 版之前,这一直与 Node.js 一起使用(这是来自开发分支的 version,不应在生产中使用)。

graceful-fs@^4.0.0 不再对 Node.js fs 模块进行monkeypatch,这使其与 Node.js > 11.15(经过测试并使用版本 12 和 14)。

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


@Valentin 这对我有用,但它是如何工作的?根据我的阅读,除了可发布之外,npm-shrinkwrap.json 的行为应该与 package-lock.json 相同。为什么他们在这里的行为不一样?为什么需要 npm-shrinkwrap.json 来解决这个问题?
它所做的是将优雅的 fs 版本覆盖到更新的版本(v4+),该版本不再修补 nodejs fs 模块(请参阅优雅的 fs 自述文件)。值得庆幸的是,这足以让一切正常工作。
如果没有有效的 package-lock.jsonnpx npm-force-resolutions 将不再起作用。要解决此问题,请使用 "preinstall": "npm install --package-lock-only --ignore-scripts && npx npm-force-resolutions" (source)。
@rustyx 我没有遇到过这个问题,因为 package-lock.json 在添加预安装脚本之前很久就在源代码管理中提交了。截至今天,我建议使用 npm 8.3.0+ 附带的 Node.js 16.14.0 及更高版本,以便能够使用覆盖解决方案。
我不能感谢你!完美运行,使用 npm > 8.3.0 将“覆盖”键添加到 package.json!
P
Peter Mortensen

一分钟搞定:

只需关注 these steps。我在 Windows 10 上,它非常适合我!

在 package.json 所在的同一目录中,创建一个 npm-shrinkwrap.json 文件,其内容如下: { "dependencies": { "graceful-fs": { "version": "4.2.2" } } } Run npm安装,不用担心,它会用一堆内容更新 npm-shrinkwrap.json。运行 gulp 启动项目。


警告 这只是一个临时解决方案,如果您再次运行 npm i,它会再次损坏。
因为shrinkwrap.json文件是在npm install之后修改的,如果要再次运行,需要将其删除。解决方案是在您的 package.json scripts 节点中添加一行:"preinstall": "cp npm-shrinkwrap.gulp.json npm-shrinkwrap.json",其中 npm-shrinkwrap.gulp.json 是需要的,将在 npm 安装之前复制到 npm-shrinkwrap.json。 (在 Windows 上将 cp 更改为 copy
P
Peter Mortensen

使用以下命令并安装 Node.js v11.15.0:

npm install -g n

sudo n 11.15.0

将解决

ReferenceError: primordials 未在节点中定义

参考@Terje Norderhaug @Tom Corelis 的答案。


如果它仍然不起作用,试试这个(在上面的命令之后): npm rebuild node-sass
我的(Windows 64)机器上的 npm install -gn 产生错误:npm ERR! notsup n@6.1.3 不支持的平台:想要 {"os":"!win32","arch":"any"}(当前:{"os":"win32","arch":"x64"})
我以前有节点 12,降级对我有帮助。
P
Peter Mortensen

使用以下命令安装 Node.js v11.15.0 和 Gulp.js v3.9.1:

npm install -g n

sudo n 11.15.0

npm install gulp@^3.9.1
npm install
npm rebuild node-sass

它将解决这个问题:

ReferenceError: primordials 未在节点中定义


请不要使用短暂的 NodeJS 分支(所有奇数版本号,如 9 和 11),请使用 NodeJS 10。
sudo n 11.15.0 中的 n 应该是在第一步 npm install -g n 中安装的。那是什么?它仍然有效吗?
如果您在运行 npm install gulp@^3.9.1 时遇到权限问题,请按照本指南中的步骤操作 docs.npmjs.com/…
P
Peter Mortensen

对我来说,Diego Fortes' answer 只需稍作改动即可。

如果出现此错误,这是我的工作流程:

npm install npm install gulp create file npm-shrinkwrap.json with { "dependencies": { "graceful-fs": { "version": "4.2.2" } } } npm install (again) (不是 npm install gulp 了!非常重要 - 否则错误会回来)gulp(现在工作)


这只是一个临时解决方案,如果您再次运行 npm i,它会再次损坏。
P
Peter Mortensen

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

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

请不要使用短暂的 NodeJS 分支(所有奇数版本号,如 9 和 11),使用 NodeJS 10。同时使用 10 代替代码名称。
对于 Windows,请使用 nvm-windows
P
Peter Mortensen

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 会带来更清洁的 gulpfile 和对在 series or parallel 中运行任务的内置控制的好处,但也依赖于您将 gulpfile 重写为新语法,并且 可能(阅读:可能会 - 见此评论的结尾)会导致与某些依赖项发生冲突。

降级 Node.js

这是最简单和最快的选择。特别是如果您使用 nnvm,因为它们允许您非常快速地安装和在 Node.js 版本之间切换。

在 N 上安装 Node.js 版本

n 10.16.0

在 NVM 上安装 Node.js 版本

nvm install 10.16.0

完成此操作后,您可能需要重新构建您的 npm dependencies,或者删除您的 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.* 的依赖项。在我的 gulpfile 中禁用此任务允许 Gulp 再次运行。

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

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

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

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


对我来说,这也是我的情况。我使用的是 Gulp 4,但一个旧的 gulp 插件在内部依赖于旧的优雅 fs 版本。使用 npm ls graceful-fs 可以找到罪魁祸首 - 使用低于 4 版本的优雅 fs 的包将导致此问题。从 gulpfile 中删除它,使用替代方案或升级它来解决问题。
s
saumilsdk

简单优雅的解决方案

只需按照以下步骤操作。它与 npm install 运行多次或安装任何其他模块甚至将项目发布到工件完美配合。

在您拥有 package.json 的同一目录中,创建一个 npm-shrinkwrap.json 文件,其中包含以下内容:

{
  "dependencies": {
    "graceful-fs": {
        "version": "4.2.2"
     }
  }
}

运行 npm install,别担心,它会用一堆内容更新 npm-shrinkwrap.json。让我们通过更新 package.json 脚本选项来摆脱这个更新。

"scripts": {
    "preshrinkwrap": "git checkout -- npm-shrinkwrap.json",
    "postshrinkwrap": "git checkout -- npm-shrinkwrap.json"
}

现在您可以运行 npm install 并且您的 npm-shrinkwrap.json 将完好无损并且将永远工作。


让我免于手动保存 npm-shrinkwrap.json,谢谢!
很高兴看到我关于堆栈溢出的第一篇文章帮助你成为第一人 @dblazeski :)
@saumilsdk 当我之后安装另一个模块时,例如npm i bla,它只安装了graceful-fs + 新的,但是所有其他模块都丢失了,对你来说是一样的吗?
@NthDegree 不,我没有看到这种情况发生。您应该会在 package.config 文件中看到一些更改。
P
Peter Mortensen

Gulp 3.9.1 不适用于 Node v12.xx,如果升级到 Gulp 4.0.2,则必须使用新语法(系列和并行)完全更改 gulpfile.js。所以你最好的选择是通过简单地在终端中使用以下代码来降级到 Node.js v 11.xx(11.15.0 版本对我来说很好用):

nvm install 11.15.0
nvm use 11.15.0 # Just in case it didn't automatically select the 11.15.0 as the main node.
nvm uninstall 13.1.0
npm rebuild node-sass

P
Peter Mortensen

我有同样的错误。当我更新所有软件包并在 package.json 中提到 与我的本地工作系统中相同的 Node.js 引擎版本和 npm 版本时,我终于解决了这个问题。

 "engines": {
    "node": "10.15.3",
    "npm": "6.9.0"
 }

Heroku 上部署时出现此错误。

有关更多信息,请查看 Heroku support


这是解决方法,而不是修复。有时我们无法将节点版本从 12 降级到 10。
嘿,您只需要确保 Heroku 和本地计算机上的节点引擎版本相同。 :)
P
Peter Mortensen

检查 Node.js 版本:

 node --version

检查 gulp 版本:

gulp -v

如果 Node.js >=12 并且 gulp <= 3,请执行以下操作之一:

升级 gulp

sudo npm install -g gulp

降级节点

sudo npm install -g n
sudo n 11.15.0

How to Upgrade (or Downgrade) Node.js Using npm


P
Peter Mortensen

如果问题不是来自 gulp,请检查 unzip npm 模块。自上次更新以来已经过去了大约六年。它不适用于 Node.js > v11。

尝试这个:

npm install -g n

sudo n 11.15.0

unzip2 相同。但是,unzip2 有一个有效的替代品 - node-unzip-2
我的项目有同样的问题。移至 unzipper fork 而不是 github.com/EvanOxfeld/node-unzip/issues/…
P
Peter Mortensen

这个错误是因为新版本的Node.js(12)和旧版本的Gulp(小于4)。

不建议降级 Node.js 和其他依赖项。我通过更新 package.json 文件解决了这个问题,获取所有依赖项的最新版本。为此,我使用 npm-check-updates。它是一个使用所有依赖项的最新版本更新 package.json 的模块。

参考https://www.npmjs.com/package/npm-check-updates

npm i -g npm-check-updates
ncu -u
npm install

在大多数情况下,我们必须更新 gulpfile.js,如下所示:

参考Gulp 4: The new task execution system - gulp.parallel and gulp.series, Migration

前:

gulp.task(
    'sass', function () {
        return gulp.src([sourcePath + '/sass/**/*.scss', "!" + sourcePath + "/sass/**/_*.scss"])

            ....
    }
);

Other configuration...

gulp.task(
    'watch', function () {
        gulp.watch(sourcePath + '/sass/**/*.scss', ['sass']);
    }
);

后:

gulp.task('sass', gulp.series(function(done) {
    return gulp.src([sourcePath + '/sass/**/*.scss', "!" + sourcePath + "/sass/**/_*.scss"])

            ...

    done();
}));

Other config...

gulp.task(
    'watch', function () {
        gulp.watch(sourcePath + '/sass/**/*.scss', gulp.series('sass'));
    }
);

如果您没有复杂的 gulp 文件,这是一个很好的解决方案。就我而言,我只需要为每个 gulpfile.js 修改两行代码。感谢您提供简短的迁移指南!
A
Abbie 'Scarophion' deZ

我仅在 Visual Studio 的 Task Runner Explorer 中出现此问题,而不是在从命令行或 PowerShell 运行时出现。

我意识到 VS 忽略了我用 NVM 设置的 Node 版本。

https://i.stack.imgur.com/1ZR19.png


这是我的问题,验证/解决这个问题的简单性让我希望我可以两次投票,我真的希望我能先看到这个。
P
Peter Mortensen

降级到 Node.js stable 为我解决了这个问题,因为它发生在我升级到 Node.js 12 之后:

sudo n 10.16.0

如果您尝试此操作并收到错误:'sudo: n: command not found',请务必先安装 n:'npm install -g n'
在 Windows 10(64 位)上试过这个并得到:- C:\react-script-editor>npm install -gn npm ERR!代码 EBADPLATFORM npm 错误! notsup n@6.1.0 不支持的平台:想要 {"os":"!win32","arch":"any"}(当前:{"os":"win32","arch":"x64"}) npm 错误! notsup 有效操作系统:!win32 npm ERR! notsup 有效拱门:任何 npm 错误! notsup 实际操作系统:win32 npm ERR! notsup 实际拱门:x64
降级不是一种选择。我们需要修复而不是创可贴的解决方案。
P
Peter Mortensen

我遇到了同样的问题。我尝试了什么,什么对我有用:

检查 Node.js 和 Gulp.js 的版本(Node.js v12 和低于 v4 的 Gulp.js 的组合不起作用)我通过以下方式降级了 NPM 版本: sudo NPM install -gn sudo n 10.16.0

它工作得很好。然后只需按照控制台的说明进行操作即可。


M
Morgan Segura

升级到 4.0.1 并确保迁移 https://fettblog.eu/gulp-4-parallel-and-series/#migration


做到了,没有骰子。
不幸的是,这并不容易。 Gulp 4.xx 与 Gulp 3.xx 严重不兼容 Gulpfile 基本上需要从头开始重写。
P
Peter Mortensen

我在 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 文件夹解决了我的问题。


这弄乱了我的整个 npm 依赖项,抱歉。
P
Peter Mortensen

如果在使用最新的 gulp ^4.0 时保留 Node.js v12,请按照以下步骤操作:

使用以下命令更新命令行界面(只是为了预防起见):

npm i gulp-cli -g

添加/更新 package.json 文件的依赖项部分下的 gulp

"dependencies": {
  "gulp": "^4.0.0"
}

删除您的 package-lock.json 文件。

删除您的 node_modules 文件夹。

最后,运行 npm i 以升级并重新创建一个全新的 node_modules 文件夹和 package-lock.json 文件,并为 Gulp ^4.0 提供正确的参数:

npm i

注意 Gulp.js 4.0 引入了 series()parallel() 方法来组合任务,而不是 Gulp 3 中使用的数组方法,因此您可能会也可能不会在旧 {3 } 脚本。

要了解有关应用这些新功能的更多信息,this site 确实做到了:How to Migrate to Gulp.js 4.0


gulp-cli 有什么用?我按照您的步骤进行操作,最初一切正常;但后来我卸载了 gulp-cli(因为我没有看到它在哪里被使用),一切仍然有效。不过,感谢您的回答,因为我已经使用节点 v12.9.1 和 Gulp 4.0.2 再次启动并运行!
我很高兴它有所帮助。 gulp-cli 是命令行实用程序。它确保正确安装 gulp 正如您在此处的 gulp 安装步骤中所见:gulpjs.com/docs/en/getting-started/quick-start
P
Peter Mortensen

我通过从添加或删除程序 → Node.js 卸载 Node.js 在 Windows 10 上解决了这个问题。

然后我从 https://nodejs.org/download/release/v11.15.0/ 安装了 11.15.0 版

如果您运行的是 64 位 Windows,请选择 node-v11.15.0-x64.msi。


P
Peter Mortensen

如果您尝试安装 semantic-ui 并且出现以下错误,请尝试从 Node.js.org 下载具有最新功能的最新版本的 Node.js js(13.5.0)

此外,与其尝试 NPM 安装语义,不如将链接(可以从 cdnjs link 中找到)添加到 index.html 文件的标题中。


代码示例将是一个很好的补充。
“以下错误”指的是什么?
P
Peter Mortensen

Gulp 对 Node.js 版本 11 及更高版本提出了问题。卸载当前的 Node.js 版本并重新安装 v10.15.1 版本。这是该版本的链接。这对我有帮助,也可以解决您的问题。

https://nodejs.org/download/release/v10.15.1/


P
Peter Mortensen

安装 gulp 并将您的 Node.js 版本添加到 package.json 文件中,如下所示:

{
  "dependencies": {
    "node":  "^10.16.3"
  }
}

N
Nurhak Kaya

我已经尝试了很多建议来解决我的 Windows 10 机器上的现有项目的这个问题,并最终按照这些步骤来解决它;

从“添加或删除程序”卸载 Node.js。启动一个新的命令提示符并键入 gulp -v 然后 node -v 以检查它是否已完全卸载。

下载并安装 Node.js v10.16.0 - 不是最新的,因为据我所知,最新的节点和 gulp 组合导致了问题。在安装过程中,我没有更改我通常做的安装路径(C:\Program Files\nodejs)。

打开一个新的命令提示符,转到您的项目目录,其中您有 gulpfile.js 并启动 gulp,如图所示。

请注意,有时当我在 git 分支之间切换时,我可能需要关闭我的 Visual Studio 并再次以管理员身份运行它才能看到此解决方案再次运行。

据我所知,这个问题是在我为一个新项目安装了最新推荐的 Node.js 版本(12.18.4)之后开始发生的,而我只有在一些 FE 更改没有反映在现有 Web 项目上时才意识到这一点。

更新:今天我在新 PC 上设置现有项目之一时遇到了同样的问题,我做了同样的步骤 + 转到我有 gulpfile 的目录,然后运行 npm install

https://i.stack.imgur.com/ZiqgX.jpg


A
Ahmed Sayed

看来您已将 nodejs 的版本升级为 +12 并且仍在使用 gulp 3.9.1

您可以使用以下解决方案之一

将您的 gup 版本升级为 +4

或者干脆你使用 NVM Node version Manager 在同一台机器上运行多个 nodejs 版本。


S
Svetoslav Stefanov

我遇到了同样的错误,但它是由不同的问题引起的。

OS: windows 10
nodejs version: 15.12.0
npm version: 7.6.3

问题的原因是优雅的 fs 包。每当我尝试运行 npm 时,即使运行 npm-v 也会触发“ReferenceError: primordials is not defined”。

我尝试运行 npm install graceful-fs@latest,但它仍然没有工作,即使包是最新版本。

那么是什么帮助了我呢?

运行 npm ls graceful-fs

这样,您将找到 graceful-fs 所依赖的所有包以及它具有的版本。就我而言,它主要是 3.0 版,即使我已经安装了 4.2.6 版

那么如何解决呢?

打开 npm-shrinkwrap.json(不确定 packages-lock.json)并更改搜索 graceful-fs - 您会看到它在一些地方有旧版本。将其替换为 ^4.2.6(或更新版本)。

然后 npm audit fix --force 将在任何地方强制安装较新版本。

希望这对您有用,我花了几个小时才找到解决方法。


I
Ishimwe etienne

删除 package-lock.json 或 yarn.lock 文件。

然后删除 node_modules。

之后修改 package.json 文件 - "dependencies": { "gulp": "^4.0.0" }

然后运行 - npm install

解决这个问题就足够了。


R
Rijosh

这是因为您的系统中 nodegulp 之间的兼容性问题。降级 node 或升级 gulp 将解决此问题。

sudo npm i -g n
sudo n 11.15.0

如果仍然无法正常工作,请尝试删除 node_modules 文件夹和 package-lock.json 文件并使用 npm i 命令重新安装。


P
Peter Mortensen

对于使用 Yarn 的用户:

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

请不要使用短暂的 NodeJS 分支(所有奇数版本号,如 9 和 11),请使用 NodeJS 10。