《拿下奇怪的前端报错》:npm install卡住了一个钟- 从原理搞定安装的全链路问题

news2024/11/13 8:05:38

 相信前端的小伙伴稍微入行一段时间的,接触过不同的项目,就可能遇到过npm install卡住的情况,下面我就来分析下几种场景、定位的方法和解决办法。不再只是删除node_modules然后重来了,虽然它能解决80%的问题

1  npm install 的原理

1.1 读取 package.json 文件

读取项目根目录下的 package.json 文件,确认当前项目所依赖的模块及其版本。

1.2 解析依赖关系

基于依赖的版本信息解析出需要安装的具体版本,并处理依赖之间的版本冲突等问题,最终生成一个依赖树。

                 **注意如果有lock文件,会按照lock文件来

1.3. 下载模块

   根据解析的依赖树,npm 会从注册源头载所需的模块包。

                ** 如果本地缓存有,会读取本机的缓存

1.4. 安装模块

  • 下载的模块会解压到 node_modules 目录下,并会处理依赖树中每个模块的依赖,确保每个模块都有其所需的依赖项。

1.5. 生成或更新 package-lock.json

  • 安装完成后,npm 会更新或生成 package-lock.json 文件,以确保以后可以确定性地安装相同版本的依赖。

1.6. 执行生命周期钩子

  • 有些包会在安装过程中触发钩子(如 preinstall, postinstall),执行额外的任务。

 从上面六个步骤就可以看到一些问题了,首先1很难会卡住但可能格式不对会报错,4,5也很难卡住但可能因为权限问题无法写入。于是可以从 2 3 6 来分析了

2  可能原因和解决办法

2.1 网络问题

  • 问题描述:
    • npm install 的过程中,需要从 npm 官方仓库或代理服务器上下载依赖包。如果网络不通畅,下载速度过慢,或者请求超时,可能会导致安装过程卡住,甚至失败。
  • 解决方法:
    • 切换 npm 源,使用国内镜像源,如淘宝镜像:
      # 注意啦,天大的事情啦!!淘宝源2023年底就换新域名啦!
      npm config set registry https://registry.npmmirror.com
    • 使用代理工具如 VPN 来加速访问 npm 官方服务器。
    • 如果使用 yarn 作为包管理工具,yarn 在处理依赖时的缓存机制和下载速度有时会比 npm 快。

2.2 Node.js 版本不兼容

  • 问题描述:
    • 有些依赖包可能只支持某些特定版本的 Node.js 或 npm。如果当前使用的 Node.js 版本与依赖包要求的版本不兼容,可能会导致安装卡住或出错。
  • 解决方法:
    • 切换到适配的 Node.js 版本。可以使用工具如 nvm (Node Version Manager) 来管理多个 Node.js 版本:
      nvm install <version> 
      nvm use <version>

      需要注意的是,切换 Node.js 版本后,可能会有旧版本的依赖缓存残留在本地,建议清理缓存:

    • npm cache clean --force

2.3 缓存问题(最高概率)

  • 问题描述:
    • npm 有缓存机制,会将已经下载的依赖包存储在本地,以便以后再次安装时加快速度。但是,某些情况下(如版本切换、依赖包损坏),本地缓存可能会引起安装卡住或依赖冲突。
  • 解决方法:
    • 清理 npm 缓存:
      npm cache clean --force

      如果怀疑是由于残留的 node_modules 目录导致问题,可以尝试删除 node_modules 并重新安装依赖:

    • # 我猜,这是大家做的最多,或者第一反应的办法
      rm -rf node_modules 
      npm install

2.4 权限问题 

  • 问题描述:
    • 有时候,npm 可能因为权限不足而无法正常安装依赖包,特别是在全局安装 (-g) 时,容易遇到这种情况。
  • 解决方法:
    • 避免使用 sudo npm install,这可能会导致文件权限混乱。
    • 可以通过更改 npm 的全局安装路径,避免使用全局权限安装:
      npm config set prefix /user-path
    • 或者使用 nvm 这样的工具,它会将 Node.js 和 npm 环境放在用户目录下,避免权限问题。

2.5 包冲突或依赖解析问题

  • 问题描述:
    • 当不同的依赖包需要的依赖项版本不兼容时,npm 可能会卡在解析依赖关系上。特别是在复杂的项目中,有大量依赖时,这种情况更容易发生。
  • 解决方法:
    • 检查是否存在冲突依赖,手动修改 package.json 中的版本号,使其兼容。
    • 使用 npm ls 命令查看依赖树,确认是否有版本冲突或循环依赖。

这里尤其容易出现在存在lock文件的时候,或者存在多个lock文件的时候:

我曾经遇到过某个版本的某个包、在代理源那里没有!!!

2.6 过时的 npm 版本

  • 问题描述:
    • 较老版本的 npm 可能存在一些已知的性能问题或 bug,这可能会导致安装时出现卡顿现象。
  • 解决方法:
    • 更新 npm 到最新版本:
      npm install -g npm

2.7 系统资源不足 

  • 问题描述:
    • 当系统内存不足或者 CPU 资源紧张时,npm install 可能会卡住甚至崩溃。
  • 解决方法:
    • 关闭不必要的后台程序,释放系统资源。
    • 可以尝试通过 Docker 或虚拟机等方式在隔离的环境中执行安装,避免系统资源冲突。

2.8 脚本问题

  • 问题描述:
    • 安装没开始或者一直不结束
  • 解决方法:
    • 由于安装时会在之前调用preinstall,在之后调用postinstall脚本,移除掉脚本再看情况
    • 确保脚本能够及时退出进程而不至于挂起

在上述的情况中,silly idealTree buildDeps 和 卡住不动大概率就是网络和缓存问题,也在nodejs版本不对遇到过-但也是由于缓存原因引起的~这时候建议切换版本 **不然lock文件会有个超大的更新**

3 其它场景的处理

3.1 开启全部日志

npm install --verbose

3.2 使用替代工具

例如yarn或者pnpm,在本地开发时很不错,但因为要安装额外的工具,不建议生产用,毕竟多一个环节多一个出错概率

3.3 使用docker来提供node环境(***)

这是我比较推荐的啦~大家都不用装依赖了,每次来新员工,给他装好docker丢个镜像,然后把源码映射进去就可以了。

至于如何构建,可参考《拿下奇怪的前端报错》:nvm不可用报错`GLIBC_2.27‘‘GLIBCXX_3.4.20‘not Found?+ 使用docker构建多个前端项目实践-CSDN博客

我就是那样搭建了一个多项目-新老混合的jenkins流水线的啦~

最后祝大家写代码不卡壳,不然我也帮不到了。看完记得眺望远方休息下嘞

2cy

YU.H

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 常用高级指令解析

Vue 高级指令的重要性 Vue 高级指令是一种扩展 Vue.js 框架的功能的方式&#xff0c;可以让你在处理 DOM 元素时具有更多的控制权。它们可以通过自定义指令的方式进行编写和应用。 高级指令的重要性在于&#xff0c;它们使开发者能够通过 Vue 框架来创建更加复杂和灵活的交互…

数据库函数

1.字符串函数 例子&#xff1a; 2.数值函数 例子&#xff1a; 3.日期函数 例子&#xff1a; 4.流程函数 例子&#xff1a; 参考视频&#xff1a;27. 基础-函数-字符串函数_哔哩哔哩_bilibili

FinGPT金融大模型

FinGPT仓库https://github.com/AI4Finance-Foundation/FinGPT 功能&#xff1a; Adviser。根据新闻判断市场情绪&#xff08;积极、消极、中性&#xff09;&#xff0c;给出投资建议。Quantitative Trading。定制属于自己的金融助手。叫它关注某几个股票、监测消息等。可以直…

Linux安装、Nginx反向代理、负载均衡学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

代码管理-使用TortoiseGit同步项目到Github/Gitee

1 什么是TortoiseGit TortoiseGit下载地址 TortoiseGit是Git的Windows桌面可视化工具&#xff0c;通过软件的操作来实现Git命令的效果&#xff0c;使所有的操作都能用图形化实现。TortoiseGit安装很简单&#xff0c;这里不对安装流程进行讲解。下载之后即可按照普通软件的方式…

无人机之AI跟踪篇

无人机的AI识别技术依托于计算机视觉和深度学习技术&#xff0c;实现了对目标的快速精准识别&#xff0c;在多个领域展现出了巨大的应用潜力和价值。以下是对无人机AI识别技术的详细解析&#xff1a; 一、无人机AI识别算法的基础原理 无人机AI识别算法主要基于先进的计算机视觉…

使用FLBOOK快速制作3D电子版翻页产品册

​随着数字化时代的到来&#xff0c;传统纸质产品册已逐渐无法满足人们快节奏、便捷的生活方式。而FLBOOK&#xff0c;一款强大的3D电子版翻页产品册制作工具&#xff0c;凭借其简洁的操作界面、丰富的功能和出色的展示效果&#xff0c;已成为越来越多企业的首选。 1.要制作电子…

Ceph官方文档_01_Ceph简介

目录 Ceph介绍Ceph介绍 Ceph可用于向云平台提供Ceph对象存储,Ceph可用于向云平台提供Ceph块设备服务。Ceph可用于部署Ceph文件系统。所有Ceph存储群集部署开始都是先设置每个Ceph节点,然后再设置网络。 Ceph存储集群需要以下内容:至少一个Ceph监视器和至少一个Ceph管理器,…

DA14531开发板原理图设计

一、TYPE-C接口: 二、基于CP2102的USB转UART: 三、UART串口电平转换&#xff1a; 四、扩展接口部分&#xff1a; 五、DA14531蓝牙部分&#xff1a;

【纯小白论文代码带读】医学图像分割MASDF-Net(问题产生及解决)

论文链接&#xff1a;https://www.semanticscholar.org/paper/MASDF-Net%3A-A-Multi-Attention-Codec-Network-with-and-Fu-Deng/6ab609eb93dfd12596032174ca9603712f5c050a 代码链接&#xff1a;https://github.com/Rayicer/TransFuse 初见面代码&#xff1a; Q&am…

多路径文件批量下载工具V1.0.3-支持批量下载文件到单独文件夹的工具-供大家学习研究参考

1、支持批量下载列表文件中的所有文件到每个文件指定的目录下。 2、支持TXT文件导入。 3、支持TXT文件拖入。 4、支持下载错误文件筛选导出。 5、支持单文件多线程下载。 6、其它功能还在开发中。 7、支持断点续传。 8、支持递归下载&#xff08;递归下载就是按照服务器目录结构…

【资料分析】刷题日记2

第一套 √ 2013-2016一共有13&#xff0c;14&#xff0c;15&#xff0c;16四年&#xff0c;亦即16 - 13 1 4年 √ 是多少倍 ③vs④&#xff1a;都是只给出了年均增速&#xff0c;③求的是其中一年的&#xff0c;无法确定&#xff1b;④求的是这个时段总共的&#xff0c;可…

web - JavaScript

JavaScript 1&#xff0c;JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言&#xff0c;而Java语言也是跨平台的、面向对象的语言&#xff0c;只不过Java是编译语言&#xff0c;是需要编译成字节码文件才能运行的&#xff1b;JavaScript是脚本语言&#xff0c;不…

江科大笔记—OLED显示屏

OLED显示屏 OLED的GND接到负极&#xff0c;OLED的VCC接正极&#xff0c;同时也会接到stm32上的PB6和PB7 SCL接PB8 SDA接PB9 在Hardware文件夹里面放3个文件&#xff1a;OLED.c、OLED.h、OLED_Font.h OLED_Font.h:存的是OLED的字库数据&#xff0c;因OLED是不带字库的&#xf…

RK3568平台(网络篇)MAC地址烧录

一.max地址简介 MAC地址(Media Access Control Address)也称为硬件地址或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第二层数据链路层则负责MAC位址 。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都…

Spring3~~~

目录 多例 后置处理器BeanPostProcessor XML配置 通过注解 AOP与后置处理器 JdbcTemplate jdbc.properties jdbc.xml Test 具名参数 DAO 声明式事务 GoodsDao GoodsService xml 传播机制 种类 隔离级别 超时回滚 如果是普通的java项目&#xff0c;xml文件放…

microchip中使用printf给AVR单片机串口重定向

重定向中修改需要的串口 #ifndef USART1_H_ #define USART1_H_#ifndef F_CPU #define F_CPU 11059200UL #endif #define BAUDRATE 9600 #include <avr/io.h> #include <avr/interrupt.h>#include <stdio.h> #include <string.h>#define PRINT /*…

现在开始备考11月PMP考试,来得及吗?

根据官方发布的消息&#xff0c;11月份的PMP考试预计在11月30日举行&#xff0c;距离考试还有两个多月的时间。如果你现在开始准备&#xff0c;完全有足够的时间来备战11月的考试。如果你之前有相关经验&#xff0c;一个半月左右的时间就足够你备考了。 但如果你对PMP考试一无…

A review on rumour prediction and veracity assessment in online social network

ABSTRACT 在当今时代&#xff0c;社交网络被用作分享个人思想和观点的重要媒介。其背后的主要原因是&#xff0c;它可以轻松地在公众中快速传播信息&#xff0c;并且访问成本非常低。这导致在线社交媒体成为鼓励虚假内容并影响公众舆论及其决策的垫脚石之一。谣言是社交媒体上误…

PyRFC 适用于 Python 的异步、非阻塞 SAP NetWeaver RFC SDK 绑定

Asynchronous, non-blocking SAP NetWeaver RFC SDK bindings for Python. 适用于 Python 的异步、非阻塞 SAP NetWeaver RFC SDK 绑定 Call for Maintainers This project is currently looking for new maintainers. Please see this issue for details. Features Client …