macOS下由yarn与npm差异引发的Electron镜像地址读取问题

这篇具有很好参考价值的文章主要介绍了macOS下由yarn与npm差异引发的Electron镜像地址读取问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录macOS下由yarn与npm差异引发的Electron镜像地址读取问题

写在前面:该问题仅仅出现在Linux和macOS上,Windows上不存在该问题!

初始背景

最近笔者重新拾起了Electron,把最新版Electron的官方文档阅读了一遍。众所周知,Electron作为依赖在安装的时候,其二进制文件下载在国内一直以来都是问题(因为默认会从github上下载),好在现在Electron的官方文档已经写的非常详细了:安装指导 | Electron (electronjs.org),只需要配置一个镜像地址到.npmrc中:

ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"

记住这个大写的Key

笔者由于是新的机器,还没有配置改值,所以找到.npmrc文件的配置了上述的镜像后,便开开心心的准备进行项目搭建了。

问题出现

然而,当笔者准备使用yarn执行如下命令的时候,却出了问题:

yarn add -D electron

运行启动以后,在Electron安装的环境一直卡住了很久很久。

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

咦,难道镜像配置写错了吗?仔细对比以后,没有问题。难道因为我的网络访问很慢吗?等到访问超时以后,发现一个IP地址超时了,心想国内镜像再怎么也不应该超时,盲猜镜像地址没有生效。于是乎,准备尝试对下载Electron二进制文件的过程进行debug。

问题排查

首先定位到node_module/electron包,能够看到有一段安装后脚本执行命令(postinstall):

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

关于postinstall的详细说明:scripts | npm Docs (npmjs.com)

也就是说,node_module/electron本身npm包install完成以后,还会执行其包内的install.js。

定位进入了node_module/electron包下的install.js,该脚本内部主要逻辑是先检查Electron的二进制缓存,如果不存在缓存,则使用来自@electron/get包中提供的downloadArtifact方法从远端下载Electron二进制制品文件。

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

我们暂时先不看缓存读写的逻辑,着重了解远端下载的逻辑,所以我们进入@electron/get包中的downloadArtifact

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

查看@electron/get包下的index.js内容:

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

前面我们提到,怀疑镜像地址没有生效导致下载超时,所以我们重点关注一下这里通过getArtifactRemoteURL方法得到的url值,

由于每一次这个包都会重新安装,我们不太好调试这个值,所以,我们做一个简单的trick:

  1. 找到这个包的缓存(macOS上的路径为:~/Library/Caches/Yarn/v6/npm-@electron-get-xxxx):

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

  1. 找到上述indexjs代码,并添加一段日志打印:

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

  1. 准备完毕以后,我们重新在demo项目下执行yarn add -D electron。执行以后,等到超时以后,发现控制台日志打印如下:

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

Why!?为什么这个下载的Electron二进制文件地址依然是github的?于是,我们有必要进一步查看这个URL是如何得到。

继续查看代码,这个url来源于artifact-utils中的getArtifactRemoteURL方法,而这个方法里面关于最终返回的url最重要的部分是下图所示的base的值:

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

而这个base值来源于mirrorVar这个方法:

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

根据上面代码的逻辑,name值为"mirror",options未使用,defaultValue为:

"https://github.com/electron/electron/releases/download/"

也就是说,在后面的逻辑中,如果没有从process.env中找到对应的值,那么就会使用默认的github官方制品地址的值。按照代码逻辑,运行到这个方法的时候,会从process.env中尝试获取:

  1. "NPM_CONFIG_ELECTRON_MIRROR"
  2. "npm_config_electron_mirror"
  3. "npm_package_config_electron_mirror"
  4. "ELECTRON_MIRROR"

环境变量—— 配置 | npm 中文网 (nodejs.cn)

任何以 npm_config_ 开头的环境变量都将被解释为配置参数。 例如,将 npm_config_foo=bar 放入您的环境中会将 foo 配置参数设置为 bar。 任何未赋值的环境配置都将被赋值为 true。 配置值不区分大小写,因此 NPM_CONFIG_FOO=bar 的工作方式相同。 但是,请注意,在 scripts 内部,npm 将设置自己的环境变量,并且 Node 会更喜欢那些小写版本,而不是您可能设置的任何大写版本。 详情见此问题。

请注意,您需要使用下划线而不是破折号,因此 --allow-same-version 将变为 npm_config_allow_same_version=true

此外,如果是配置在npmrc里面的配置,也会在npm/yarn启动的时候被作为环境变量放到process.env中被访问。

那我们在.npmrc中配置的ELECTRON_MIRROR,在process.env中变成了什么呢?通过添加日志打印,我们会看到:

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

可以看到,在process.env中,这个键为"npm_config_ELECTRON_MIRROR"npm_config小写,ELECTORN_MIRROR大写)。我们知道,nodejs中object对象的属性值是大小写敏感的!所以,当上面的mirrorVar代码运行,尝试获取process.env中的值的时候,根本找不到了,因为没有"NPM_CONFIG_ELECTRON_MIRROR""npm_config_electron_mirror""npm_package_config_electron_mirror""ELECTRON_MIRROR"这些属性。

然而,如果我们使用npm进行安装的时候:

npm install -D electron

又能够很快安装。Why?!难道npm和yarn下的运行环境有差异吗?为了验证,我们编写一个简单的index.js代码:

console.log("process.env['npm_config_electron_mirror']", process.env['npm_config_electron_mirror']);
console.log("process.env['NPM_CONFIG_ELECTRON_MIRROR']", process.env['NPM_CONFIG_ELECTRON_MIRROR']);
console.log("process.env['npm_config_ELECTRON_MIRROR']", process.env['npm_config_ELECTRON_MIRROR']);

然后,在package.json中添加脚本:

{
  "name": "simple-electron-main-app",
  "version": "1.0.0",
  "scripts": {
+   "start": "node index.js"
  },
  "devDependencies": {}
}

最后,我们分别使用yarn(yarn start)和npm(npm run start)来运行脚本:

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

在yarn运行上下文中,.npmrc中的"ELECTRON_MIRROR"直接拼接到了"npm_config_"后边,作为process.env的一个属性,所以你只能访问process.env["npm_config_ELECTRON_MIRROR"]得到值;

在npm运行山下文中,.npmrc中的"ELECTRON_MIRROR"首先被转为了小写,然后拼接到了"npm_config_"后边,作为了process.env的属性,所以你需要访问process.env["npm_config_electron_mirror"]来得到值。

macOS解决方式

终于,我们能解释为什么当我们在.npmrc配置大写的ELECTRON_MIRROR的时候,使用yarn add -D electron安装electron的时候,二进制镜像地址没有生效了。那么,解决的办法也非常简单,两种:

  1. .npmrc配置改为小写key:electron_mirror="https://npmmirror.com/mirrors/electron/"
  2. 使用npm上下文环境进行安装。

个人更加建议按照第一种方式配置,不然大小写敏感的坑太容易发生了。

关于Windows的特别说明

process.env | Node.js API 文档 (nodejs.cn)

在 Windows 操作系统上,环境变量不区分大小写。

const { env } = require('node:process');

env.TEST = 1;
console.log(env.test);
// => 1

也就是说,在Windows机器上,即使process.env中的key为"npm_config_ELECTRON_MIRROR",你也可以通过"npm_config_electron_mirror"或者是"NPM_CONFIG_ELECTRON_MIRROR"来访问这个值:

macOS下由yarn与npm差异引发的Electron镜像地址读取问题

macOS下由yarn与npm差异引发的Electron镜像地址读取问题文章来源地址https://www.toymoban.com/news/detail-456105.html

到了这里,关于macOS下由yarn与npm差异引发的Electron镜像地址读取问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 淘宝npm镜像源换新地址,npm设置最新淘宝镜像

     然后再执行以下操作查看是否成功 查看当前镜像地址 或者 2.使用cnpm 可以使用定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的  npm :  

    2024年02月11日
    浏览(37)
  • npm镜像地址设置和查看

    设置npm的镜像地址 查看npm当前镜像地址:    

    2024年02月04日
    浏览(29)
  • 前端npm, yarn, pnpm下载速度太慢,设置国内镜像源的几种方式,让其速度飞起来

     一、说明 在前端开发的时候使用国外的镜像源速度很慢并且容易下载失败,有时候需要尝试多次才有可能下载成功,很麻烦,因此可以切换为国内镜像源,下面为常用的npm,yarn,pnpm切换国内镜像源(以淘宝为例)的方式。  二、NPM切换镜像源 1. 查看当前的镜像源。 ``` npm c

    2024年02月10日
    浏览(50)
  • MacOS上配置docker国内镜像仓库地址

    docker官方镜像仓库网速较差,我们需要设置国内镜像服务 我的MacOS docker版本如下 点击Settings 点击Docker Engine 修改配置文件,添加 registry-mirrors 参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 上述链接需要登录阿里云账号获取专属用户的镜像加速器地

    2024年02月09日
    浏览(40)
  • 淘宝npm镜像源换新地址

    简介:用CNPM/淘宝源的开发者们请注意,淘宝NPM 镜像站喊你切换新域名啦。 新的Web 站点:https://npmmirror.com,Registry Endpoint:https://registry.npmmirror.com。 随着新的域名已经正式启用,老 http://npm.taobao.org 和 http://registry.npm.taobao.org 域名将于 2022 年 05 月 31 日零时起停止服务。(望

    2024年02月12日
    浏览(52)
  • macOS Ventura 13.5.1(22G90)发布(附黑/白苹果系统镜像地址)

    黑果魏叔 8 月 18 日消息,苹果今日向 Mac 电脑用户推送了 macOS 13.5.1 更新(内部版本号:22G90),本次更新距离上次发布隔了 24 天。 本次更新重点修复了 应用位置服务问题 。苹果于 7 月 24 日发布了 macOS Ventura 13.5 更新,不过用户反馈升级到新版本之后,无法再管控应用的定

    2024年02月11日
    浏览(32)
  • macOS Sonoma 14beta 3(23A5286g)发布(附黑/白苹果镜像地址)

    黑果魏叔 7 月 6 日消息,苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 3 更新(内部版本号:23A5286g),本次更新距离上次发布隔了 14 天。 小部件在更多地方变得更加强大。现在,您可以使用WidgetKit构建对交互性和动画过渡的支持,因此人们可以直接在您的小部件

    2024年02月13日
    浏览(87)
  • macOS Sonoma 14 正式版(23A344)发布,附黑/白苹果镜像下载地址

    黑果魏叔9 月 27日消息,苹果今日向 Mac 电脑用户推送了 macOS Sonoma 14 正式版(23A344)。 macOS 14正式版系统发布:全新功能与改进,打造更出色的苹果体验 2023年9月27日,苹果公司正式发布了期待已久的macOS 14正式版系统。作为macOS系列的最新版本,这款操作系统为用户带来了许

    2024年02月08日
    浏览(32)
  • 关于安装Node/Yarn/Electron过程中遇到的问题

    【参考文章】Node.js下载安装及环境配置教程 【问题描述】 使用 yarn create vite 命令安装项目依赖,报错如下: 【问题解决】 (1)在电脑的开始菜单中,搜索 PowerShell ,然后以 管理员身份运行 , (2)以管理员身份运行后,会出现命令窗口,接下来,输入命令 get-ExecutionPol

    2024年02月03日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包