Node.js - npm与包

177 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

什么是包

Node.js 中的第三方模块又叫做包


包的来源

  • 不同于 Node.js 中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供所有人使用
  • Node.js 中的包都是免费且开源的,不需要付费即可免费下载使用

为什么需要包

  • 由于 Node.js 的内置模块仅提供了一些底层的 API,导致在基于内置模块进行项目开发时,效率很低
  • 包是基于内置模块封装出来的,提供了更高级、更方便的 API,极大的提高了开发效率

从哪里下载包

全球最大的包共享平台 npm,www.npmjs.com ,可以从这个网站上搜索到任何你需要的包


如何下载包

  • 通过使用包管理工具 Node Package Manager (简称 npm 包管理工具)下载包,这个包管理工具是随着 Node.js 的安装包一起被安装到电脑上

  • 在终端可以通过命令 npm -v 查看包管理工具的版本


在项目中安装包

  • 终端命令 (默认下载最新版本)

    npm install 包的完整名字
    
    eg:
    npm install moment
    
    • 命令简写

      npm i 包的完整名字
      
      eg:
      npm i moment
      
    • 安装指定版本的包

      npm install 包的完整名字@版本号
      
      eg:
      npm i moment@2.22.2
      
  • 初次安装包,项目文件夹下的变化

    初次安装包,在项目文件夹中多了一个叫 node_modules 的文件夹和 package-lock.json 的配置文件

    • node_modules 文件夹用来存放所有已安装到项目中的包,require 导入第三方时,就是从这个目录中查找并加载包

    • package-lock.json 配置文件用来记录 node_modules 目录下的每一个包的下载信息,如包的名字、版本号、下载地址等等

    • 开发人员不要手动去修改 node_modulespackage-lock.json 文件中的任何代码,npm 包管理工作会自动维护它们


包的语义化版本规范

  • 包的版本号是以 点分十进制 形式进行定义的,总共有三位数字,如 2.24.0

  • 其中每一位数字所代表的含义如下

    • 第一位数:大版本
    • 第二位数:功能版本
    • 第三位数:bug修复
  • 版本号升级规则:只有前面版本号增长,则后面的版本号归零


包管理配置文件

npm 规定,在项目根目录中,必须提供一个叫做 package.json 的包管理配置文件,用来记录与项目有关的一些配置信息。例如

  • 项目的名称、版本号、描述
  • 项目中都会用到哪些包
  • 哪些包只在开发中用,哪些包在发布时用

多人协作

  • 多人通过 git 共享项目代码,为了避免项目体积太大,一般建议不上传第三方包,共享时会删除 node_modules,只共享package.json 配置文件

  • 记录项目安装了哪些包

    在项目根目录中,创建一个叫做 package.json 的配置文件,即可用来记录项目中安装了哪些包,从而方便剔除 node_modules 目录之后,在团队成员之间共享项目的源代码

  • 在项目开发中,可将 node_modules 添加到 .gitignore 忽略文件中


快速创建 package.json

  • npm 包管理工具提供了一个快捷命令,可以在执行命令时所在的目录中,快速创建 package.json 这个包管理配置文件

    npm init -y
    
  • 上述命令只能在英文目录下安装成功,不要使用中文和空格

  • 运行 npm install 命令安装包的时候, npm 包管理工具会自动把包的名称和版本号记录到 package.json

  • dependencies 节点

    package.json 文件中,有一个 dependencies 节点,专门用来记录使用 npm install 命令安装过的包

    "dependencies": {
        "moment": "^2.29.1"
    }
    
  • 一次性安装所以的包

    执行 npm install 命令时,npm 包管理器会先读取 package.json 文件中 dependencies 节点,读取到记录的所有依赖包名称和版本号之后,npm 包管理工具会把这些包一次性下载到项目中

  • 卸载包

    • 执行 npm uninstall 命令时,来卸载指定的包

      npm uninstall 包名
      
      eg:
      npm uninstall moment
      
    • npm uninstall 命令执行成功后,会把卸载的包,自动从 package.jsondependencies 节点中移除

  • devDependencies 节点

    • 如果某些包只在项目开发阶段会用到, 在项目上线之后不会用到,则建议把这些包记录到 devDependencies 节点中。与之对应,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到 dependencies 节点中

    • 示例

      • 执行命令

        //简写
        npm install 包名 -D
        //完整写法
        npm install 包名 -save-dev
        
        eg:
        npm install moment -D
        
      • package.json 文件

        "devDependencies": {
            "moment": "^2.29.1"
        }
        

解决下包速度慢的问题

  • 为什么下包速度慢

    在使用 npm 下包时,默认是从国外的服务器进行下载的的,所以比较慢

    Snip20220327_33.png

  • 解决下包速度慢

    • 镜像:镜像是一种存储形式,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像

    • 淘宝在国内搭建了一个服务器(淘宝镜像),每隔一段时间,自动把 npm 官方服务器的包同步到国内,然后在国内提供下包服务,极大提高了下载速度

    Snip20220327_34.png

  • 切换 npm 的下包镜像源

    下包镜像源指的是下包的服务器地址

    • 查看当前的下包镜像源

      npm config get registry
      
    • 将下包的镜像源切换为淘宝镜像源

      npm config set registry=http://registry.npm.taobao.org/
      
    • 检查镜像源是否下载成功

      npm config get registry
      

nrm

为了更方便的切换下包的镜像源,可以安装 nrm 小工具,利用 nrm 提供的终端命令,可以快速查看和切换下包的镜像源

  • 通过 npm 包管理器,将 nrm 安装为全局可用的工具

    npm i nrm -g
    
  • 查看所有可能的镜像源

    nrm ls
    

    结果: Snip20220327_36.png

  • 将下包的镜像源切换成 taobao 镜像

    nrm use 要切换的镜像名称
    
    eg:
    nrm use taobao
    

包的分类

  • 使用 npm 包管理工具下载的包,共分为俩大类

    • 项目包
    • 全局包
  • 项目包

    被安装到项目的 node_modules 目录中的包,都是项目包

    项目包分为俩类

    • 开发依赖包(开发中使用,被记录在 devDependencies 节点下 )
    • 核心依赖包(开发和发布使用,被记录在 dependencies 节点下 )
  • 全局包

    • 在执行 npm install 命令时,如果提供了 -g 参数,则会把包安装为全局包

    • 查看全局包

      npm ls -g
      
    • 安装、卸载全局包

      //安装
      npm i 包名 -g
      
      //卸载
      npm uninstall 包名 -g    
      
    • 只有工具性质的包,才有全局安装的必要性

    • 判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明


规范包的结构

一个规范的包,组成结构必须符合三个要求

  • 包必须以单独的目录而存在

  • 包的顶级目录下必须包含 package.json 文件

  • package.json 中必须包含 nameversionmain 三个属性,分别代表包的名字、包的版本和包的入口