彻底解决 node/npm, Electron下载失败相关问题, 从底层源码详解node electron 加速配置

发布于:2024-09-19 ⋅ 阅读:(7) ⋅ 点赞:(0)

最近玩了一下electron项目, 总是会遇到electron的下载失败问题, 于是看了一下node源码, 做一个记录.

node/npm 加速配置

这个配置通过设置node配置里面的registry 这个配置项来完成加速. 配置方法

npm config set registry https://registry.npmmirror.com

上面的命令就是将当前的npm命令的registry设置为阿里的这个npm镜像.

当然,如果你还想自定义node的其他的配置, 可以通过 命令 npm config edit 来对所有的npm的可配置项进行自定义, 如下图所示, 下面的这个项目就是我们通过上面的命令自动配置上去的.

这个些配置信息,实际上是保存在了我们用户目录下的  .npmrc 文件里面,  当然, 如果你觉得命令行不习惯,你也可以直接编辑这个文件,如果不存在直接创建这个文件然后编辑即可.  注意这个文件中 以 ; 开头的内容为注释信息

Electron下载加速配置

这个配置较为丰富, 我们先来看一下electron源码里面关于下载地址的拼接是如何完实现的吧. 这个下载相关逻辑的文件位于 node_modules/electron-download/lib/index.js  

最后的下载URL地址是这样拼接的:  

 get url () {
    return process.env.ELECTRON_DOWNLOAD_OVERRIDE_URL ||
      `${this.baseUrl}${this.middleUrl}/${this.urlSuffix}`
  }

从上面的拼接逻辑我们可以看出,这个下载地址可以通过直接指定一个系统环境变量ELECTRON_DOWNLOAD_OVERRIDE_URL来指定下载地址 或者通过 `${this.baseUrl}${this.middleUrl}/${this.urlSuffix}` 来进行动态的拼接, 在我们平时的使用过程中第一种方式用得很少, 常用的是第二种 动态拼接的方式,  而我们所配置的electron加速地址也就是对这种动态拼接地址的各个部分进行配置, 以下我们就着重讲解一下这3部分构成, 了解了这3部分的构成我们就可以随心所欲的配置electron的加速地址了. 他们每一个部分的优先级是从上到下依次递减(这里也就是 js中 或操作的优先级, 从左到右执行, 左边的代码优先级高于右边的代码)

baseUrl 就是我们要配置的加速地址, 对于华为,阿里加速地址后面必须要带上 /  否则最后生成的url就不对了

 因为这2个加速最后的url是类似这样的https://mirrors.huaweicloud.com/electron/8.2.0/electron-v8.2.0-darwin-x64.zip 这里的红色部分就是我们配置的加速地址, 而第二部分的middleUrl就是版本信息, 第三部分是urlSuffix就是文件下载的名称. 

middleUrl 这个是加速地址后面的那一部分,一般是版本信息,既中间的那部分,  这个对于阿里或者华为的加速地址是可以省略不配置的,默认就是版本信息.

urlSuffix 这个部分就是我们要下载的文件名称, 一般情况由electron自动生成即可,如 electron-v4.2.12-darwin-x64.zip  这个也不需要我们配置,它会更加当前版本和系统平台自动生成. 

electron url下载地址生成逻辑

了解了url地址的拼接, 让我们再来看看上面3部分的生成逻辑的核心代码, 他们每一个部分的优先级从上到下(左到右)依次递减(这里也就是 js中 或操作的优先级, 从左到右执行, 左边的代码优先级高于右边的代码)

// ${this.baseUrl}部分的构成逻辑
return process.env.NPM_CONFIG_ELECTRON_MIRROR ||
      process.env.npm_config_electron_mirror ||
      process.env.npm_package_config_electron_mirror ||
      process.env.ELECTRON_MIRROR ||
      this.opts.mirror ||
      'https://github.com/electron/electron/releases/download/v'

// ${this.middleUrl} 的构成逻辑
return process.env.NPM_CONFIG_ELECTRON_CUSTOM_DIR ||
  process.env.npm_config_electron_custom_dir ||
  process.env.npm_package_config_electron_custom_dir ||
  process.env.ELECTRON_CUSTOM_DIR ||