Maison > interface Web > js tutoriel > le corps du texte

Enregistrez et analysez un bug de fil qui existe depuis 6 ans

青灯夜游
Libérer: 2022-11-04 19:29:42
avant
1497 Les gens l'ont consulté

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. . .

1. Description du problème

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.... . Enregistrez et analysez un bug de fil qui existe depuis 6 ansyarn@v1.22.19,在安装依赖后无论是否成功,总是出现网络连接问题而且会卡很长时间,然后会出现几行这样的异常日志:info There appears to be trouble with your network connection. Retrying...Enregistrez et analysez un bug de fil qui existe depuis 6 ans

有时一些神奇的包(比如 node-sass)出现异常会导致安装失败,结果卡了半天才发现失败,真的让人很崩溃。另外在yarngithub 仓库中有数十条相关的 issue,时间跨度从2016年到2022年足足6年,原因和方案众说纷纭。我很好奇这到底是个什么神奇的问题居然6年都没解决,因此决定一探究竟。【相关教程推荐:nodejs视频教程 、编程视频

Enregistrez et analysez un bug de fil qui existe depuis 6 ans

2、问题排查

2.1、关键词搜索

2.1.1、搜索 github

碰到没啥思路的问题和报错,第一技巧是搜它。在yarngithub 仓库中搜索报错信息 There appears to be trouble with your network connection,可以看到结果中有1个相关代码和91个相关 issue。在 issue 里找了一会没找到合适的方案,接着进入下一步:搜索代码。Enregistrez et analysez un bug de fil qui existe depuis 6 ans

2.1.2、搜索代码

由于网络原因这里直接转到本地 yarn 的安装目录进行查找。用 vscode 打开 yarn 的安装目录(我的本地目录是~/.volta/tools/image/yarn/1.22.19),全局搜索关键词 There appears to be trouble with your network connection。可以看到结果同样只有1个,整串错误信息赋值给了一个变量offlineRetryingEnregistrez et analysez un bug de fil qui existe depuis 6 ans

全局搜索关键词offlineRetrying 共2处结果,除去上一步的结果只有1处引用。这里的代码主要是抛出异常和重试,没有更多关键词可以挖掘。接下来进入调试环节,在 offlineRetrying 这行代码前面打个断点,调试看看具体错误信息和上下文。Enregistrez et analysez un bug de fil qui existe depuis 6 ans

2.2、程序调试

2.2.1、确定调试命令

安装依赖需要运行命令 yarn, 那要怎么调试它呢?yarn 是一个 npm 包,执行时实际是调用 node xxx.js,而这个 xxx.js 一般配置在 package.jsonbin 字段中。从下图可以看到 yarn 对应的文件是 ./bin/yarn.js,所以可以使用这行调试命令:node --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js。(关于 Node.js 的调试可以参考官方文档Enregistrez et analysez un bug de fil qui existe depuis 6 ans

2.2.2、开始调试

先在变量 offlineRetrying 所在的代码行cli.js:66099parfois 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 Enregistrez et analysez un bug de fil qui existe depuis 6 ans

🎜Enregistrez et analysez un bug de fil qui existe depuis 6 ans🎜

🎜2. Dépannage🎜🎜

🎜2.1. Recherche par mot clé🎜

🎜2.1.1. Recherche sur github🎜

🎜Problèmes et erreurs rencontrés sans idées, l'astuce du chapitre un consiste à recherchez-le. Recherchez le message d'erreur 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. Enregistrez et analysez un bug de fil qui existe depuis 6 ans🎜

🎜2.1.2. Code de recherche🎜

🎜Pour des raisons de réseau, accédez directement au répertoire d'installation local de 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. Enregistrez et analysez un bug de fil qui existe depuis 6 ans🎜🎜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. Enregistrez et analysez un bug de fil qui existe depuis 6 ans🎜

🎜2.2. Débogage du programme🎜

🎜2.2.1 Déterminer la commande de débogage🎜

🎜L'installation des dépendances nécessite l'exécution du commandyarn, comment le déboguer ? 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 🎜)Enregistrez et analysez un bug de fil qui existe depuis 6 ans 🎜

🎜2.2.2. Commencez le débogage🎜

🎜Allez d'abord sur la ligne de code où se trouve la variable 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 :  Enregistrez et analysez un bug de fil qui existe depuis 6 ansnode --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js。此时程序挂起等待调试工具连接,并打印出以下日志:Enregistrez et analysez un bug de fil qui existe depuis 6 ans

接着打开 chrome 内置的调试页面 chrome://inspect/#devices,找到文件路径相同的 Target,点击 inspect按钮开始调试。

Enregistrez et analysez un bug de fil qui existe depuis 6 ans

接着 chrome 会打开一个独立的 DevTools 窗口,由于使用的是 node --inspect-brk 命令,此时 DevTools 自动断点在被调试文件的起始位置,需要按下 F8 跳过该断点继续执行。Enregistrez et analysez un bug de fil qui existe depuis 6 ans

等待一小段时间后,DevTools 停在之前添加的断点处,可以看到这是一个超时异常,导致异常的请求是GET: https://yarnpkg.com/latest-version。使用 curl 请求这个链接,结果是 210s 超时。使用代理访问这个链接可以成功,但是请求被重定向到 classic.yarnpkg.com/latest-vers…,其返回结果是 1.22.19Enregistrez et analysez un bug de fil qui existe depuis 6 ans

至此问题基本清楚了,主要是请求超时并且多次重试导致了文章开头的问题,可以使用代理规避这个问题。如果排查到此结束就没意思了。

2.2.3、深入排查

为了进一步了解 yarn 为什么要请求 yarnpkg.com/latest-vers…,以该链接为关键词在代码中搜索,找到了这个关键词链条:https://yarnpkg.com/latest-version -> SELF_UPDATE_VERSION_URL ->  _checkUpdate -> checkUpdate,实际调用关系则正好相反,具体如下图:

Enregistrez et analysez un bug de fil qui existe depuis 6 ans

Enregistrez et analysez un bug de fil qui existe depuis 6 ans

Enregistrez et analysez un bug de fil qui existe depuis 6 ans

3、确定原因

前面已经推断出超时链接的调用关系是: checkUpdate ->  _checkUpdate  ->  SELF_UPDATE_VERSION_URL -> https://yarnpkg.com/latest-version,再结合 checkUpdate函数的注释和代码来看,每次执行 yarn 安装命令的时候都会请求 yarnpkg.com/latest-vers…,从而检查是否有新版本需要更新。但是这个链接访问超时而且失败后会重试,默认的超时时间为 30s 重试次数为 4 次,所以安装完成后还会卡 120s 程序才会真正结束。

4、解决方案

引发问题的关键因素有3个:检查更新、超时、重试,因此可以从优化网络、调整超时时间、跳过检查更新3个方向去解决问题,以下有6个解决方案可以参考。

4.1、优化网络

这个思路很容易想到,既然访问超时,那就提升请求速度。

  • 【方案1】使用代理优化网络(推荐)
$ yarn install --proxy "http://{domain}:{port}" --https-proxy "http://{domain}:{port}"
Copier après la connexion

以我的开发环境举例,命令长这样:

yarn install --proxy "http://10.180.55.191:7890" --https-proxy "http://10.180.55.191:7890"
Copier après la connexion

4.2、调整超时时间

这个思路比较直接,适用场景更多些,如果其他方法不奏效可以试试。

  • 【方案2】修改 network-timeout(看情况)

默认超时时间为 30s 可以改小为 2s,修改后异常依然存在,但是可以让检查更新快速失败不用等几分钟。

yarn install --network-timeout 2000
Copier après la connexion

有一部分开发者表示出现异常是因为某些大型 npm 包安装太久超过了默认超时时间 30s,因此也可以把network-timeout 改得更大避免异常。

4.3、跳过检查更新

这个思路的解决方案主要来自 checkUpdate

Ensuite, ouvrez la page de débogage intégrée chrome chrome://inspect/#devices et recherchez le Cible, cliquez sur le bouton inspecter pour démarrer le débogage. 🎜🎜Enregistrez et analysez un bug de fil qui existe depuis 6 ans🎜🎜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. Enregistrez et analysez un bug de fil qui existe depuis 6 ans🎜🎜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…< /a>, le résultat renvoyé est 1.22.19. Enregistrez et analysez un bug de fil qui existe depuis 6 ans🎜🎜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à. 🎜

2.2.3, enquête approfondie

🎜Afin de mieux comprendre pourquoi fils devrait demander < a href=" https://yarnpkg.com/latest-version" target="_blank">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 : 🎜🎜image. png🎜🎜Enregistrez et analysez un bug de fil qui existe depuis 6 ans🎜🎜image. png🎜

3. Déterminez la raison

🎜Il a été déduit plus tôt que la relation d'appel du le lien de délai d'attente est : 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. 🎜

4. Solution

🎜Il existe trois facteurs clés qui causent des problèmes : la vérification des mises à jour, l'expiration du délai et la nouvelle tentative, afin que vous puissiez optimiser. Il existe trois façons de résoudre le problème : réseau, réglage du délai d'attente et ignorer la vérification des mises à jour. Voici 6 solutions à titre de référence. 🎜

4.1. Optimiser le réseau

🎜Cette idée est facile à penser puisque le délai d'accès expire, puis augmentez la vitesse de la requête. 🎜
  • [Option 1] Utiliser un proxy pour optimiser le réseau (recommandé)
$ yarn config set disable-self-update-check true$ yarn install
Copier après la connexion
Copier après la connexion
🎜 En prenant mon environnement de développement comme exemple, la commande ressemble à ceci : 🎜
$ yarn config set lastUpdateCheck 1e13
$ yarn install
Copier après la connexion
Copier après la connexion

4.2. Ajuster le délai d'attente

🎜Cette idée est plus simple et applicable à davantage de scénarios. Si d'autres méthodes ne fonctionnent pas, vous pouvez l'essayer. 🎜
  • [Option 2] Modifier le délai d'expiration du réseau (selon la situation)
🎜Le délai d'expiration par défaut est de 30 s et peut être modifié à 2 s. Après modification, l'exception existe toujours, mais les mises à jour peuvent être vérifiées. Échouez rapidement sans attendre quelques minutes. 🎜
$ yarn install --non-interactive
Copier après la connexion
Copier après la connexion
🎜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. 🎜

4.3 Ignorer la vérification des mises à jour

🎜La solution à cette idée vient principalement de checkUpdate</code. > Plusieurs conditions de terminaison dans la fonction. 🎜<ul><li>【方案3】修改配置禁止检查更新(推荐)</li></ul><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">$ yarn config set disable-self-update-check true$ yarn install</pre><div class="contentsignin">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div><ul><li>【方案4】修改配置把上次更新时间调到百年后(推荐)</li></ul><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">$ yarn config set lastUpdateCheck 1e13 $ yarn install</pre><div class="contentsignin">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div><ul><li>【方案5】执行命令时禁用交互式提示(推荐)</li></ul><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">$ yarn install --non-interactive</pre><div class="contentsignin">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div><ul><li>【方案6】修改代码跳过检查更新(不推荐)<ul> <li>找到 <code>yarn 的安装目录注释 checkUpdate 的调用,具体代码行为 cli.js:7261,修改后长这样:// this.checkUpdate();
  • 也可以修改其他可以阻断 checkUpdate 函数的代码...
  • 5、最后

    以上主要是分享一些问题分析排查的经验,另外也提供了一些 yarn install 超时异常的解决方案,希望能对前端同学们有所帮助。

    在快写完这篇文章的时候,yarnpkg.com/latest-vers… 已经可以正常访问,不知道还会不会有人再遇到这个问题。

    另外我在 yarngithub 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!

    Étiquettes associées:
    source:juejin.cn
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!