目录
安装包的命令
卸载包的命令
devDependencies节点
解决下包速度慢的问题
导入moment包案例
包的分类
项目包
全局包
模块的加载机制
优先从缓存中加载
内置模块的加载机制
自定义模块的加载机制
第三方模块的加载机制
目录作为模块
包是由第三方个人或团队开发出来的,Node.js 中的包都是免费且开源的,不需要付费即可免费下载使用。
为什么需要包
- 由于Node.js的内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发的时,效率很低。
- 包是基于内置模块封装出来的,提供了更高级、更方便的API,极大的提高了开发效率。
搜索包:https://www.npmjs.com/
下载包: https://registry.npmjs.org/
安装包的命令
npm install 包名[@版本号] 简写为 npm i 包名[@版本号]
注:版本号省略则下载最新版
卸载包的命令
npm uninstall 包名
devDependencies节点
如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies 节点中。
与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies节点中。
您可以使用如下的命令,将包记录到devDependencies节点中:
解决下包速度慢的问题
在使用npm下包的时候,默认从国外的 https://registry.npmjs.org/服务器进行下载,此时,网络数据的传输需要经过漫长的海底光缆,因此下包速度会很慢。
查看npm下载地址:npm config get registry
切换npm的下包镜像源
导入moment包案例
执行如下命名:
此时项目中就会出现如下两个文件:
package-lock.json文件中就存放了下了那些包以及下载的版本和下载的地址等待信息
注意:程序员不要手动修改node modules 或 package-lockjson文件中的任何代码,npm包管理工具会自动维护它们.
const moment = require('moment') // 导入moment
const nowtime = moment().format('YYYY MM DD : HH mm ss') // 使用moment中的api获取当前时间
console.log(nowtime)
包的分类
项目包
那些被安装到项目的node modules目录中的包,都是项目包。
项目包又分为两类,分别是:
- 开发依赖包(被记录到devDependencies节点中的包,只在开发期间会用到)
- 核心依赖包(被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到)
全局包
在执行npm install命令时,如果提供了-g参数,则会把包安装为全局包。
全局包会被安装到C:\Users\用户目录\AppData\Roaming\npm\node modules目录下。
模块的加载机制
优先从缓存中加载
模块在第一次加载后会被缓存。这也意味着多次调用require()不会导致模块的代码被执行多次。
注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。
内置模块的加载机制
内置模块是由Node.js 官方提供的模块,内置模块的加载优先级最高。
例如,require("fs')始终返回内置的fs模块,即使在node_modules目录下有名字相同的包也叫做fs。
自定义模块的加载机制
使用require()加载自定义模块时,必须指定以』或../开头的路径标识符。在加载自定义模块时,如果没有指定/或../这样的路径标识符,则 node会把它当作内置模块或第三方模块进行加载。
同时,在使用require()导入自定义模块时,如果省略了文件的扩展名,则Nodejs 会按顺序分别尝试加载以下的文件:
- 按照确切的文件名进行加载
- 补全.js扩展名进行加载
- 补全.json扩展名进行加载
- 补全.node扩展名进行加载
- 加载失败,终端报错
第三方模块的加载机制
如果传递给require()的模块标识符不是一个内置模块,也没有以‘”或‘./”开头,则Node,js 会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块。
如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。
例如,假设在'C:\Users\itheimalproject\foojs'文件里调用了require('tools'),则 Node.js 会按以下顺序查找:
- C:\Users\itheimaproject\node_modules\tools
- C:\Users\itheima\node_modules\tools
- C\Users\node_modules\tools
- C:\node_modules\tools
目录作为模块
当把目录作为模块标识符,传递给require()进行加载的时候,有三种加载方式:
- 在被加载的目录下查找一个叫做 package.json的文件,并寻找main属性,作为require()加载的入口
- 如果目录里没有package.json文件,或者main入口不存在或无法解析,则 Node.js将会试图加载目录下的 indexjs文件。
- 如果以上两步都失败了,则Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module 'xo'