Maison >interface Web >js tutoriel >Enregistrez et analysez un bug de fil qui existe depuis 6 ans
J'ai récemment rencontré un bug de fil Après avoir cherché, j'ai découvert qu'il existait depuis 6 ans. De quel genre de problème magique s'agit-il ? Après quelques analyses et investigations, j'ai donné 6 solutions. . .
Le gestionnaire de packages de plusieurs projets que j'ai repris récemment est yarn@v1.22.19
Après avoir installé les dépendances, que cela réussisse ou non, la connexion réseau. des problèmes surviennent toujours et se produiront. La carte reste bloquée pendant une longue période, puis plusieurs lignes de journaux d'exceptions comme celle-ci apparaîtront : info Il semble y avoir un problème avec votre connexion réseau. Nouvelle tentative...
. . yarn@v1.22.19
,在安装依赖后无论是否成功,总是出现网络连接问题而且会卡很长时间,然后会出现几行这样的异常日志:info There appears to be trouble with your network connection. Retrying...
。
有时一些神奇的包(比如 node-sass
)出现异常会导致安装失败,结果卡了半天才发现失败,真的让人很崩溃。另外在yarn
的 github
仓库中有数十条相关的 issue
,时间跨度从2016年到2022年足足6年,原因和方案众说纷纭。我很好奇这到底是个什么神奇的问题居然6年都没解决,因此决定一探究竟。【相关教程推荐:nodejs视频教程 、编程视频】
碰到没啥思路的问题和报错,第一技巧是搜它。在yarn
的 github
仓库中搜索报错信息 There appears to be trouble with your network connection
,可以看到结果中有1个相关代码和91个相关 issue
。在 issue
里找了一会没找到合适的方案,接着进入下一步:搜索代码。
由于网络原因这里直接转到本地 yarn
的安装目录进行查找。用 vscode
打开 yarn
的安装目录(我的本地目录是~/.volta/tools/image/yarn/1.22.19
),全局搜索关键词 There appears to be trouble with your network connection
。可以看到结果同样只有1个,整串错误信息赋值给了一个变量offlineRetrying
。
全局搜索关键词offlineRetrying
共2处结果,除去上一步的结果只有1处引用。这里的代码主要是抛出异常和重试,没有更多关键词可以挖掘。接下来进入调试环节,在 offlineRetrying
这行代码前面打个断点,调试看看具体错误信息和上下文。
安装依赖需要运行命令 yarn
, 那要怎么调试它呢?yarn
是一个 npm
包,执行时实际是调用 node xxx.js
,而这个 xxx.js
一般配置在 package.json
的 bin 字段中。从下图可以看到 yarn
对应的文件是 ./bin/yarn.js
,所以可以使用这行调试命令:node --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js
。(关于 Node.js
的调试可以参考官方文档)
先在变量 offlineRetrying
所在的代码行cli.js:66099
parfois magique Un une anomalie dans le package (telle que node-sass
) entraînera l'échec de l'installation. En conséquence, l'installation sera bloquée pendant longtemps avant que l'échec ne soit découvert, ce qui est vraiment frustrant. De plus, il existe des dizaines de problèmes
associés dans l'entrepôt github
de yarn
, s'étalant sur 6 années complètes de 2016 à 2022, avec les raisons et solutions Les avis varient. J'étais très curieux de savoir de quel genre de problème magique il s'agissait et qui n'avait pas été résolu depuis 6 ans, alors j'ai décidé de le découvrir. [Tutoriels associés recommandés : tutoriel vidéo nodejs, Vidéo de programmation 】
Il semble y avoir un problème avec votre connexion réseau
dans le référentiel github
de yarn
. Vous pouvez voir qu'il y en a 1 associé. code dans les résultats et 91 problème
associé. J'ai cherché pendant un moment dans issue
mais je n'ai pas trouvé de solution appropriée, je suis donc passé à l'étape suivante : rechercher le code. 🎜yarn
pour effectuer la recherche. Utilisez vscode
pour ouvrir le répertoire d'installation de yarn
(mon répertoire local est ~/.volta/tools/image/yarn/1.22.19
) , Mots-clés de recherche globale Il semble y avoir un problème avec votre connexion réseau
. Vous pouvez voir qu'il n'y a également qu'un seul résultat et que l'intégralité du message d'erreur est affecté à une variable offlineRetrying
. 🎜🎜Clé de recherche globale Il y a 2 résultats pour le mot offlineRetrying
. En excluant les résultats de l'étape précédente, il n'y a qu'une seule référence. Le code ici génère principalement des exceptions et des tentatives, et il n'y a plus de mots-clés à extraire. Ensuite, entrez dans le processus de débogage, placez un point d'arrêt devant la ligne de code offlineRetrying
et déboguez pour voir le message d'erreur et le contexte spécifiques. 🎜yarn
est un package npm
lorsqu'il est exécuté, il appelle en fait node xxx.js
, et ce xxx.js
. est généralement configuré dans bin🎜 dans package.json code> dans le champ. Comme vous pouvez le voir sur l'image ci-dessous, le fichier correspondant de <code>yarn
est ./bin/yarn.js
, vous pouvez donc utiliser cette ligne de commande de débogage : node --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js
. (Pour le débogage de Node.js
, veuillez vous référer au document officiel 🎜) 🎜offlineRetrying
cli .js:66099
Ajoutez l'instruction 🎜debugger🎜 avant. 🎜🎜Retournez ensuite au répertoire racine du projet métier et exécutez la commande de débogage node --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js
. À ce stade, le programme se bloque en attendant que l'outil de débogage se connecte et imprime le journal suivant : node --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js
。此时程序挂起等待调试工具连接,并打印出以下日志:
接着打开 chrome
内置的调试页面 chrome://inspect/#devices
,找到文件路径相同的 Target
,点击 inspect
按钮开始调试。
接着 chrome
会打开一个独立的 DevTools
窗口,由于使用的是 node --inspect-brk
命令,此时 DevTools
自动断点在被调试文件的起始位置,需要按下 F8
跳过该断点继续执行。
等待一小段时间后,DevTools
停在之前添加的断点处,可以看到这是一个超时异常,导致异常的请求是GET: https://yarnpkg.com/latest-version
。使用 curl
请求这个链接,结果是 210s 超时。使用代理访问这个链接可以成功,但是请求被重定向到 classic.yarnpkg.com/latest-vers…,其返回结果是 1.22.19
。
至此问题基本清楚了,主要是请求超时并且多次重试导致了文章开头的问题,可以使用代理规避这个问题。如果排查到此结束就没意思了。
为了进一步了解 yarn
为什么要请求 yarnpkg.com/latest-vers…,以该链接为关键词在代码中搜索,找到了这个关键词链条:https://yarnpkg.com/latest-version
-> SELF_UPDATE_VERSION_URL
-> _checkUpdate
-> checkUpdate
,实际调用关系则正好相反,具体如下图:
前面已经推断出超时链接的调用关系是: checkUpdate
-> _checkUpdate
-> SELF_UPDATE_VERSION_URL
-> https://yarnpkg.com/latest-version
,再结合 checkUpdate
函数的注释和代码来看,每次执行 yarn
安装命令的时候都会请求 yarnpkg.com/latest-vers…,从而检查是否有新版本需要更新。但是这个链接访问超时而且失败后会重试,默认的超时时间为 30s 重试次数为 4 次,所以安装完成后还会卡 120s 程序才会真正结束。
引发问题的关键因素有3个:检查更新、超时、重试,因此可以从优化网络、调整超时时间、跳过检查更新3个方向去解决问题,以下有6个解决方案可以参考。
这个思路很容易想到,既然访问超时,那就提升请求速度。
$ yarn install --proxy "http://{domain}:{port}" --https-proxy "http://{domain}:{port}"
以我的开发环境举例,命令长这样:
yarn install --proxy "http://10.180.55.191:7890" --https-proxy "http://10.180.55.191:7890"
这个思路比较直接,适用场景更多些,如果其他方法不奏效可以试试。
默认超时时间为 30s 可以改小为 2s,修改后异常依然存在,但是可以让检查更新快速失败不用等几分钟。
yarn install --network-timeout 2000
有一部分开发者表示出现异常是因为某些大型
npm
包安装太久超过了默认超时时间 30s,因此也可以把network-timeout 改得更大避免异常。
这个思路的解决方案主要来自 checkUpdate
chrome
chrome://inspect/#devices
et recherchez le Cible
, cliquez sur le bouton inspecter
pour démarrer le débogage. 🎜🎜🎜🎜Continuer chrome
ouvrira une fenêtre indépendante DevTools
Puisque la commande node --inspect-brk
est utilisée, DevTools
le fera. code> Le point d'arrêt automatique se trouve au début du fichier en cours de débogage. Vous devez appuyer sur F8
pour ignorer le point d'arrêt et continuer l'exécution. 🎜🎜Attendez un while Après un certain temps, DevTools
s'arrête au point d'arrêt précédemment ajouté. Vous pouvez voir qu'il s'agit d'une exception de délai d'attente. La requête qui a provoqué l'exception est GET : https://yarnpkg.com/. dernière version
. L'utilisation de curl
pour demander ce lien entraîne un délai d'attente de 210 s. L'accès à ce lien à l'aide d'un proxy réussit, mais la requête est redirigée vers classic.yarnpkg.com/latest-vers…, le résultat renvoyé est 1.22.19
. 🎜🎜Jusqu'à présent, le Le problème est essentiellement Il est clair que le problème au début de l'article est principalement dû à l'expiration du délai de demande et à plusieurs tentatives. Vous pouvez utiliser un proxy pour éviter ce problème. Ce serait ennuyeux si l'enquête s'arrêtait là. 🎜fils
devrait demander yarnpkg.com/latest-vers…, utilisez ce lien comme mot-clé pour rechercher dans le code et trouvez ceci chaîne de mots-clés : https://yarnpkg.com/latest-version
-> SELF_UPDATE_VERSION_URL
-> , la relation d'appel réelle est exactement le contraire, comme indiqué ci-dessous : 🎜🎜🎜🎜🎜🎜🎜checkUpdate
-> _checkUpdate
-> version, puis combinée avec À en juger par les commentaires et le code de la fonction checkUpdate
, elle demandera yarnpkg.com/latest-vers… pour vérifier s'il existe une nouvelle version qui doit être mise à jour. Cependant, l'accès à ce lien expire et sera réessayé après un échec. Le délai d'expiration par défaut est de 30 secondes et le nombre de tentatives est de 4, donc une fois l'installation terminée, il sera toujours bloqué pendant 120 secondes avant la fin du programme. 🎜$ yarn config set disable-self-update-check true$ yarn install🎜 En prenant mon environnement de développement comme exemple, la commande ressemble à ceci : 🎜
$ yarn config set lastUpdateCheck 1e13 $ yarn install
$ yarn install --non-interactive
🎜Certains développeurs ont déclaré que l'exception s'est produite parce que certains gros packages npm
ont été installés depuis trop longtemps et ont dépassé le délai d'expiration par défaut de 30 secondes. Par conséquent, le délai d'expiration du réseau peut également être modifié en un. valeur plus grande pour éviter les exceptions. 🎜
checkUpdate Plusieurs conditions de terminaison dans la fonction. 🎜<ul><li>【方案3】修改配置禁止检查更新(推荐)</li></ul><pre class="brush:js;toolbar:false;">$ yarn config set disable-self-update-check true$ yarn install</pre><ul><li>【方案4】修改配置把上次更新时间调到百年后(推荐)</li></ul><pre class="brush:js;toolbar:false;">$ yarn config set lastUpdateCheck 1e13
$ yarn install</pre><ul><li>【方案5】执行命令时禁用交互式提示(推荐)</li></ul><pre class="brush:js;toolbar:false;">$ yarn install --non-interactive</pre><ul><li>【方案6】修改代码跳过检查更新(不推荐)<ul>
<li>找到 <code>yarn
的安装目录注释 checkUpdate
的调用,具体代码行为 cli.js:7261
,修改后长这样:// this.checkUpdate();
checkUpdate
函数的代码...以上主要是分享一些问题分析排查的经验,另外也提供了一些 yarn install
超时异常的解决方案,希望能对前端同学们有所帮助。
在快写完这篇文章的时候,yarnpkg.com/latest-vers… 已经可以正常访问,不知道还会不会有人再遇到这个问题。
另外我在
yarn
的github issue
中回复了以上的解决方案,希望前端同学们少受点折磨,也希望官方早点修复这个6年陈的老Bug。?
更多编程相关知识,请访问:编程教学!!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!