MacOS Ventura下Ionic Angular项目Node-20/npm10的node-gyp语法错误修复求助
问题:Node v20 + npm 10环境下Ionic Angular项目npm install失败(node-gyp语法错误)
在MacOS Ventura 13.3.1的Ionic Angular项目中,升级Node到v20.11.0、npm到10后,执行npm install时触发node-gyp语法错误,无法安装任何npm包。项目在Node v12.22.12(npm v6.14.16)环境可正常运行,目标是适配Node 16+、npm 8+环境。
错误日志
npm ERR! code 1 npm ERR! path /Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-sass npm ERR! command failed npm ERR! command sh -c node scripts/build.js npm ERR! Building: /Users/ashad/.nvm/versions/node/v20.11.0/bin/node /Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library= npm ERR! gyp info it worked if it ends with ok npm ERR! gyp verb cli [ npm ERR! gyp verb cli '/Users/ashad/.nvm/versions/node/v20.11.0/bin/node', npm ERR! gyp verb cli '/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/bin/node-gyp.js', npm ERR! gyp verb cli 'rebuild', npm ERR! gyp verb cli '--verbose', npm ERR! gyp verb cli '--libsass_ext=', npm ERR! gyp verb cli '--libsass_cflags=', npm ERR! gyp verb cli '--libsass_ldflags=', npm ERR! gyp verb cli '--libsass_library=' npm ERR! gyp verb cli ] npm ERR! gyp info using node-gyp@3.8.0 npm ERR! gyp info using node@20.11.0 | darwin | x64 npm ERR! gyp verb command rebuild [] npm ERR! gyp verb command clean [] npm ERR! gyp verb clean removing "build" directory npm ERR! gyp verb command configure [] npm ERR! gyp verb check python checking for Python executable "python2" in the PATH npm ERR! gyp verb `which` succeeded python2 /usr/local/bin/python2 npm ERR! gyp verb check python version `/usr/local/bin/python2 -c "import sys; print "2.7.17 npm ERR! gyp verb check python version .%s.%s" % sys.version_info[:3];"` returned: %j npm ERR! gyp verb get node dir no --target version specified, falling back to host node version: 20.11.0 npm ERR! gyp verb command install [ '20.11.0' ] npm ERR! gyp verb install input version string "20.11.0" npm ERR! gyp verb install installing version: 20.11.0 npm ERR! gyp verb install --ensure was passed, so won't reinstall if already installed npm ERR! gyp verb install version is already installed, need to check "installVersion" npm ERR! gyp verb got "installVersion" 9 npm ERR! gyp verb needs "installVersion" 9 npm ERR! gyp verb install version is good npm ERR! gyp verb get node dir target node version installed: 20.11.0 npm ERR! gyp verb build dir attempting to create "build" dir: /Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-sass/build npm ERR! gyp verb build dir "build" dir needed to be created? /Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-sass/build npm ERR! gyp verb build/config.gypi creating config file npm ERR! gyp verb build/config.gypi writing out config file: /Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-sass/build/config.gypi npm ERR! gyp verb config.gypi checking for gypi file: /Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-sass/config.gypi npm ERR! gyp verb common.gypi checking for gypi file: /Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-sass/common.gypi npm ERR! gyp verb gyp gyp format was not specified; forcing "make" npm ERR! gyp info spawn /usr/local/bin/python2 npm ERR! gyp info spawn args [ npm ERR! gyp info spawn args '/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/gyp_main.py', npm ERR! gyp info spawn args 'binding.gyp', npm ERR! gyp info spawn args '-f', npm ERR! gyp info spawn args 'make', npm ERR! gyp info spawn args '-I', npm ERR! gyp info spawn args '/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-sass/build/config.gypi', npm ERR! gyp info spawn args '-I', npm ERR! gyp info spawn args '/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/addon.gypi', npm ERR! gyp info spawn args '-I', npm ERR! gyp info spawn args '/Users/ashad/.node-gyp/20.11.0/include/node/common.gypi', npm ERR! gyp info spawn args '-Dlibrary=shared_library', npm ERR! gyp info spawn args '-Dvisibility=default', npm ERR! gyp info spawn args '-Dnode_root_dir=/Users/ashad/.node-gyp/20.11.0', npm ERR! gyp info spawn args '-Dnode_gyp_dir=/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp', npm ERR! gyp info spawn args '-Dnode_lib_file=/Users/ashad/.node-gyp/20.11.0/ npm ERR! sys.exit(gyp.script_main()) npm ERR! File "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/pylib/gyp/__init__.py", line 545, in script_main npm ERR! return main(sys.argv[1:]) npm ERR! File "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/pylib/gyp/__init__.py", line 538, in main npm ERR! return gyp_main(args) npm ERR! File "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/pylib/gyp/__init__.py", line 514, in gyp_main npm ERR! options.duplicate_basename_check) npm ERR! File "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/pylib/gyp/__init__.py", line 130, in Load npm ERR! params['parallel'], params['root_targets']) npm ERR! File "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/pylib/gyp/input.py", line 2783, in Load npm ERR! variables, includes, depth, check, True) npm ERR! File "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/pylib/gyp/input.py", line 399, in LoadTargetBuildFile npm ERR! includes, True, check) npm ERR! File "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/pylib/gyp/input.py", line 271, in LoadOneBuildFile npm ERR! aux_data, includes, check) npm ERR! File "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/pylib/gyp/input.py", line 308, in LoadBuildFileIncludesIntoDict npm ERR! LoadOneBuildFile(include, data, aux_data, None, False, check), npm ERR! File "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/gyp/pylib/gyp/input.py", line 251, in LoadOneBuildFile npm ERR! None) npm ERR! File "/Users/ashad/.node-gyp/20.11.0/include/node/common.gypi", line 1 npm ERR! incremental linking npm ERR! ^ npm ERR! SyntaxError: invalid syntax npm ERR! gyp ERR! configure error npm ERR! gyp ERR! stack Error: `gyp` failed with exit code: 1 npm ERR! gyp ERR! stack at ChildProcess.onCpExit (/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/lib/configure.js:345:16) npm ERR! gyp ERR! stack at ChildProcess.emit (node:events:518:28) npm ERR! gyp ERR! stack at ChildProcess._handle.onexit (node:internal/child_process:294:12) npm ERR! gyp ERR! System Darwin 22.4.0 npm ERR! gyp ERR! command "/Users/ashad/.nvm/versions/node/v20.11.0/bin/node" "/Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library=" npm ERR! gyp ERR! cwd /Users/ashad/abdullahSalam/ioniceatonlineapp/node_modules/node-sass npm ERR! gyp ERR! node -v v20.11.0 npm ERR! gyp ERR! node-gyp -v v3.8.0 npm ERR! gyp ERR! not ok npm ERR! Build failed with error code: 1 npm ERR! A complete log of this run can be found in: /Users/ashad/.npm/_logs/2024-02-01T09_21_26_284Z-debug-0.log
核心原因
错误根源是旧版node-sass依赖的node-gyp@3.8.0不兼容Node 16+版本,同时node-sass已停止维护,无法适配Node v20的新特性。
修复方案
方案1:替换node-sass为dart-sass(推荐)
dart-sass是官方推荐的sass替代方案,完全兼容Node 16+,且长期维护:
- 卸载旧依赖:
npm uninstall node-sass - 安装dart-sass:
npm install sass --save-dev - 修改项目配置:将
angular.json、组件样式引用中所有node-sass相关配置替换为sass。
方案2:升级node-gyp并适配Node版本
若必须保留node-sass,需升级node-gyp至兼容版本:
- 清除缓存与旧依赖:
rm -rf node_modules package-lock.json npm cache clean --force - 升级项目中的
node-gyp:npm install node-gyp@latest --save-dev - 配置Python 3(Node 16+要求
node-gyp使用Python 3):# 若未安装Python3,先通过brew安装 brew install python3 # 配置npm默认使用Python3 npm config set python python3 - 重新安装依赖:
npm install
方案3:降级Node到16.x/18.x(过渡方案)
若上述方案暂时无法落地,可先切换到Node长期支持版:
- 使用nvm切换版本:
nvm install 18.19.0 nvm use 18.19.0 - 清除缓存后重新安装:
rm -rf node_modules package-lock.json npm install
内容的提问来源于stack exchange,提问作者g.m.ashaduzzaman
相关产品推荐
相关产品推荐

