升级React16+Node8 LTS时Contextify与node-gyp安装报错求助
解决Mac High Sierra下React16+Node8 LTS安装contextify/node-gyp失败的方案
我之前在Mac High Sierra上升级技术栈到React 16 + Node 8 LTS时,完全碰到了和你一样的问题——第三方依赖里的contextify在安装node-gyp时因为缺失C函数报错,回退Node 6虽然能跑但又不支持React 16。折腾了好几天,终于找到几个亲测有效的解决办法,你可以按顺序试试:
方案一:更新编译工具链并配置Node环境
Mac High Sierra自带的旧版Command Line Tools和Node 8的编译需求不兼容,这是最常见的原因:
- 先更新Xcode Command Line Tools:
如果提示已经安装,先卸载再重装:xcode-select --installsudo rm -rf /Library/Developer/CommandLineTools xcode-select --install - 配置Node编译所需的SDK路径,把这个命令加到你的
~/.bashrc或~/.zshrc里(避免每次重启终端都要重新设置):export SDKROOT=$(xcrun --show-sdk-path) - 清除npm缓存后重新安装:
npm cache clean --force npm install
方案二:替换contextify为维护活跃的替代包
contextify已经多年没有更新(最后一次更新是2017年),很多依赖它的库已经切换到了更兼容的替代方案:
- 先找到项目里依赖contextify的第三方包,检查它是否有更新版本已经移除了contextify依赖,如果有,直接升级该依赖包即可。
- 如果第三方包没有更新,用
npm-force-resolutions强制替换contextify为兼容版本:- 安装依赖:
npm install -D npm-force-resolutions - 在
package.json中添加resolutions字段:"resolutions": { "contextify": "^0.1.17" } - 在
package.json的scripts里添加预安装脚本:"scripts": { "preinstall": "npx npm-force-resolutions", // 其他原有脚本... } - 重新运行
npm install
- 安装依赖:
方案三:指定兼容的node-gyp版本
Node 8和某些新版本的node-gyp不兼容,手动指定一个适配的版本:
- 如果你用nvm管理Node版本,先切换到Node 8:
nvm use 8 - 全局安装兼容的node-gyp版本:
npm install -g node-gyp@3.8.0 - 进入项目目录,先重建node-gyp再安装依赖:
node-gyp rebuild npm install
额外提示
如果你的项目依赖了旧版本的jsdom,那很大概率是jsdom在依赖contextify——直接升级jsdom到支持React 16的最新版本即可,新版jsdom已经完全移除了对contextify的依赖。
内容的提问来源于stack exchange,提问作者TrongBang
相关产品推荐
相关产品推荐

