npm - node环境canvas安装慢、安装失败的解决方法

这篇博客讲述了Node.js模块如canvas在安装时可能遇到的跨平台问题,尤其是涉及C/C++原生代码的模块。安装慢和失败通常由于网络问题和源码编译复杂性。解决方案包括使用国内镜像加速下载,如npmmirror,并在.npmrc文件中配置模块的二进制文件镜像地址。文中还提醒了淘宝NPM镜像站已切换至新域名npmmirror.com,旧域名将停止服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

node是跨平台的,那么对于任何的node模块理论也是应该是跨平台的。然而,有些node模块直接或间接使用原生C/C++代码,这些东西要跨平台,就需要使用源码根据实际的操作平台环境进行原生模块编译。这也是canvas、SQLite3等模块安装的折磨之源。

canvas的安装过程

  1. npm下载在仓库中的canvas包
  2. 执行canvas的package.json中的install命令(node-pre-gyp install --fallback-to-build)
  3. node-pre-gyp下载canvas已编译好的 macOS、Linux 和 Windows 的二进制文件,如果预构建的二进制文件不存在或不可用,则回退到从源代码构建
  4. node-gyp编译为当前平台可用的node模块

为什么安装慢,还容易失败

从安装过程可以发现, 步骤3和步骤4是核心问题区, canvas的二进制文件托管在https://github.com/Automattic/node-canvas/releases/download/ ,下载服务由https://objects.githubusercontent.com 提供,如果你的网络运营商给力,你将会大概率成功,否则你将会得到read ECONNRESET的提示。而使用源码构建非常繁琐,对系统os存在诸多限制,开发环境和运行环境的系统os不一致也会大大增加我们的工作量且导致一些不可预料且难以捉摸的问题。

如何解决canvas安装过程中的慢、失败问题

既然github相关的服务在国内速度不理想,我们自然可以使用国内镜像的方式加速。那我们如何对canvas的二进制文件指定下载镜像呢? 我们需要给npm提供config参数--{module_name}_binary_host_mirror可以通过镜像下载二进制文件

例如:npm install canvas --canvas_binary_host_mirror=https://registry.npmmirror.com/-/binary/canvas

当然我们不希望在命令行中添加参数,因为它不便于维护。我们更希望能在配置文件中固化,我们可以在.npmrc(npm的配置文件)中设置一个或多个模块的二进制文件下载镜像地址,一个好的长期维护的.npmrc文件可以让我们的任何项目安装过程更加轻松愉悦。

我的.npmrc文件

registry=https://registry.npmmirror.com

disturl=https://registry.npmmirror.com/-/binary/node/
# node-sass预编译二进制文件下载地址
sass_binary_site=https://registry.npmmirror.com/-/binary/node-sass
# sharp预编译共享库, 截止2022-09-20 sharp@0.31.0的预编译共享库并未同步到镜像, 入安装失败可切换到sharp@0.30.7使用
sharp_libvips_binary_host=https://registry.npmmirror.com/-/binary/sharp-libvips
python_mirror=https://registry.npmmirror.com/-/binary/python/
electron_mirror=https://registry.npmmirror.com/-/binary/electron/
electron_builder_binaries_mirror=https://registry.npmmirror.com/-/binary/electron-builder-binaries/
# 无特殊配置参考{pkg-name}_binary_host_mirror={mirror}
canvas_binary_host_mirror=https://registry.npmmirror.com/-/binary/canvas
node_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/sqlite3
better_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/better-sqlite3

为什么使用https://registry.npmmirror.com

目前网上搜索到的canvas二进制文件镜像配置均是如下,此镜像在年前的时候确实可以正常安装,但是年后我在执行npm i构建项目时却执行失败。浏览器访问镜像地址,镜像地址下已没有任何文件。

canvas_binary_host_mirror=https://npm.taobao.org/mirrors/node-canvas-prebuilt/

在知乎发现淘宝 NPM 镜像站切换新域名啦的文章,老 http://npm.taobao.orghttp://registry.npm.taobao.org 域名将于 2022 年 05 月 31 日零时起停止服务,由https://registry.npmmirror.com域名继续提供服务。目前两个老的域名均会301重定向到新的镜像域名,但强烈建议大家在停服之前切换到新的新的镜像域名。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值