1. 包的来源

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

2. 为什么需要包

由于Node.js的内置模块仅提供了一些底层的API, 导致在基于内置模块进行项目开发时, 包是基于内置模块封装出来的, 提供了更高级更方便的api, 极大的提高开发效率
内置模块之间的关系, 类似与jquery浏览器内置api之间的关系。

3. 从哪里下载包

国外有一家IT公司, 叫做npm.inc,这家公司旗下有非常有名的网站:

  • https://www.npmjs.com。它是全球最大的包共享平台,
  • https://www.npmjs.com网站搜索自己所需要的包
  • https://registry.npmjs.org服务器上下载自己所需要的包

    4. 下载包

    下载包使用的命令npm install packageName或者npm i packageName
    初次装包完成之后, 在项目文件夹多一个叫做node_modules的文件夹和package-lock.json的配置文件。
    其中: node_modules文件用来存放所有已经安装到项目中的包,require()导入的第三方时, 就是从这个目录中查找并加载包
    package-lock.json配置文件用来记录node_modules目录下的每一个包的下载信息, 例如:包的名字、版本、下载地址等等。
    包的语义化规范版本:
    包的版本号是以“点分十进制”形式进行定义的, 总共有三位数字, 例如:2.24.0, 其中每一位数字所代表的含义如下:

  • 第一位数字: 大版本

  • 第二位数字: 功能版本
  • 第三位数字: Bug修复版本

版本号提升的规则: 只需要前面的版本号增长, 则后面的版本号归零

5. 快速创建package.json

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

5.1 nrm

为了更方便的切换镜像源, 我们可以安装nrm这个工具, 利用nrm提供的中断命令, 可以快速的查看和切换下包的镜像源。

  • 下载nrm: npm i nrm -g
  • 查看所有可用的镜像源: nrm ls
  • 切换镜像源: nrm use taobao

    5.2 包的分类

    项目包: 哪些被安装到项目的node_modules目录中的包, 都是项目包。
    项目包又分为两类, 分别是:

  • 开发依赖包:被记录到devDependencies节点中的包, 只是在开发期间会用到;

  • 核心依赖包: 被记录到dependencies节点中的包, 在开发期间和项目上线之后都会用到
  • npm i 包名 -D 开发依赖包
  • npm i 包名 核心依赖包

全局包:
在执行npm install命令时, 如果提供-g参数,则会把包安装为全举包。
i5ting_top是一个可以把md文档转为html页面的小工具。

  • 全局安装:npm i i5ting_top -g
  • 全局卸载:npm uninstall i5ting_top -g

    5.3 规范的包结构

    一个规范的包, 它组成结构, 必须符合以下3个要求:

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

  • 包的顶级目录下要求必须包含package.json这个包管理配置文件
  • package.json中必须包含name,version,main这三个属性, 分别代表名字、版本号、包的入口。

    6. 开发属于自己的包

    6.1 初始化基本结构

    初始化包的基本结构
    新建文件夹, 作为包的根目录
    在文件夹中新建以下三个文件夹

  • package.json(包管理配置文件)

  • index.js(包的入口文件)
  • README.md(包的说明文档)

    6.2 注册npm账号

    clipboard.png

    6.3 发布包

    npm 账号注册完之后, 可以在终端执行npm login命令, 一次输入用户名、密码、邮箱后, 即可登录。
    clipboard.png

    6.4 删除已发布的包

    clipboard.png

    7. 模块的加载机制

    7.1 优先从缓存中加载

    模块在第一次加载后会被缓存。 这也以为着多次调用require()不会导致米快的代码会被执行多次。
    注意: 不论是内置模块, 用户自定义模块还是第三方模块, 他们都会有限从缓存中加载, 从而提高模块的加载效率。

    7.2 自定义模块的加载机制

    加载自定义模块时,路径要以 ./ ../ 开头,否则会作为内置模块或第三方模块加载。
    导入自定义模块时,若省略文件扩展名,则 Node.js 会按顺序尝试加载文件:

  • 按确切的文件名加载

  • 补全 .js 扩展名加载
  • 补全 .json 扩展名加载
  • 补全 .node 扩展名加载
  • 报错

    7.3第三方模块的加载机制

  • 若导入第三方模块, Node.js 会从当前模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块。

  • 如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。

例如,假设在 C:\Users\bruce\project\foo.js 文件里调用了 require(‘tools’),则 Node.js 会按以下顺序查找:

  • C:\Users\bruce\project\node_modules\tools
  • C:\Users\bruce\node_modules\tools
  • C:\Users\node_modules\tools
  • C:\node_modules\tools