最近玩了一下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 ||