• npm install 的原理


    1. 执行命令发生了什么 ?

    执行命令后,会将安装相关的依赖,依赖会存放在根目录的node_modules下,默认采用扁平化的方式安装,排序规则为:bin文件夹为第一个,然后是@开头系列的文件夹,后面是按照文件夹首字母排序的文件夹。

    安装依赖时,使用的算法是广度优先遍历,在遍历依赖树时,npm会首先处理项目根目录下的依赖,然后逐层处理每个依赖包的依赖,直到所有依赖都被处理完毕。在处理每个依赖时,npm会检查该依赖的版本号是否符合依赖树中其他依赖的版本要求,如果不符合,则会尝试安装适合的版本。

    2. 什么是扁平化?

    安装某个二级模块时,若发现第一层级有相同名称,相同版本的模块,便直接复用那个模块。因为A模块下的C模块被安装到了第一级,这使得B模块能够复用处在同一级下相同的C模块。

    扁平化只是理想状态,非理想状态如下图所示:

    因为B和A所要求的依赖模块版本不同,所以B不能复用A下的C 1.0模块,所以如果这种情况还是会出现模块冗余的情况,他就会给B继续加一层node_modules,就是非扁平化了。

    3. 执行命令后续流程

    执行命令后续流程具体过程如下图所示:

    npmrc的配置如下图所示:

    1. registry=http://registry.npmjs.org/
    2. # 定义npm的registry,即npm的包下载源
    3. proxy=http://proxy.example.com:8080/
    4. # 定义npm的代理服务器,用于访问网络
    5. https-proxy=http://proxy.example.com:8080/
    6. # 定义npm的https代理服务器,用于访问网络
    7. strict-ssl=true
    8. # 是否在SSL证书验证错误时退出
    9. cafile=/path/to/cafile.pem
    10. # 定义自定义CA证书文件的路径
    11. user-agent=npm/{npm-version} node/{node-version} {platform}
    12. # 自定义请求头中的User-Agent
    13. save=true
    14. # 安装包时是否自动保存到package.json的dependencies中
    15. save-dev=true
    16. # 安装包时是否自动保存到package.json的devDependencies中
    17. save-exact=true
    18. # 安装包时是否精确保存版本号
    19. engine-strict=true
    20. # 是否在安装时检查依赖的node和npm版本是否符合要求
    21. scripts-prepend-node-path=true
    22. # 是否在运行脚本时自动将node的路径添加到PATH环境变量中

    4. package-lock.json 的作用

    这个东西可以锁定版本记录依赖树详细信息。

    version 该参数指定了当前包的版本号;

    resolved 该参数指定了当前包的下载地址;

    integrity 用于验证包的完整性;

    dev 该参数指定了当前包是一个开发依赖包;

    bin 该参数指定了当前包中可执行文件的路径和名称;

    engines 该参数指定了当前包所依赖的Node.js版本范围;

    package-lock.json 帮我们做了缓存,他会通过name + version + integrity信息生成一个唯一的key,这个key能找到对应的index-v5 下的缓存记录,也就是npm cache 文件夹下的。

    如果发现有缓存记录,就会找到tar包的hash值,然后将对应的二进制文件解压到node_modules。

  • 相关阅读:
    mybatis注解开发
    大数据_湖仓一体:下一代存储解决方案
    校招面试真题 | 测试流程大概是什么?
    Ansible自动化运维工具之playbook剧本编写(上)
    👋 和我一起学 Three.js【初级篇】:0. 总论
    Hive的基本操作(查询)
    Android Studio 实现登录注册-源代码 (连接MySql数据库)
    密码学的基础:X.690和对应的BER CER DER编码
    【数据结构初阶】 顺序表三道题,带你见力扣
    UniVue更新日志:使用ObservableList优化LoopList/LoopGrid组件的使用
  • 原文地址:https://blog.csdn.net/weixin_40629244/article/details/139582982