npm与包
包
1.什么是包及来源
Node.js中的第三方模块又叫做包,包与Node.js中的内置模块和自定义模块,包是由第三方个人或团队开发出来的
2.为什么需要包
由于Node.js 的内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发的时,效率很低。包是基于内置模块封装出来的,提供了更高级、更方便的API,极大的提高了开发效率。
3.下载包
npm
1.格式化时间
1)自定义做法
步骤:
- 创建格式化时间的自定义模块
- 定义格式化时间的方法
- 创建补零函数
- 从自定义模块中导出格式化时间的函数
- 导入格式化时间的自定义模块
首先我们需要自定义一个格式化时间的方法
//定义格式化时间的方法
function dateFormat(dtstr) {
const dt = new Date(dtstr)
const y = dt.getFullYear() //年
const m = padZero(dt.getMonth() + 1) //月
const d = padZero(dt.getDate()) //日
const hh = padZero(dt.getHours()) //小时
const mm = padZero(dt.getMinutes()) //分钟
const ss = padZero(dt.getSeconds()) //秒
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
}
//补零
function padZero(n) {
if (n > 9) {
return n
} else {
return '0' + n
}
}
module.exports = {
dateFormat
}
然后,再用require()模块导入,使用自定义格式化时间方法
//导入自定义的格式化时间模块
const time = require('./格式化时间')
//调用方法,进行时间的格式化
const dt = new Date()//获得当前时间
const newdt = time.dateFormat(dt)//调用dateFormat对时间格式化
console.log(newdt);
2)高级做法——使用第三方包
步骤:
- 使用npm包管理工具,在项目中安装格式化时间的包 moment
- 使用require()导入格式化时间的包
- 参考moment的官方API文档对时间进行格式化
首先,在终端中用npm i moment
安装moment包,接下来就可以在项目中使用包,这样出来的效果和我们自定义格式化时间方法出来的效果一样
//导入包
const moment = require('moment')
//使用包
const dt = moment().format('YYYY-MM-DD HH:mm:ss')
console.log(dt);
2.在项目中安装使用包
1.在项目终端中输入npm i 包的名称
,就可以完成在项目中安装包
2.在安装好对应包之后,我们肯定要去使用包,可以在npmjs中去搜索下载好的包,在其中就会有如何使用的说明
1)初次装包,多哪些文件
初次装包完成后,在项目文件夹下多一个叫做node_modules的文件夹和package-lock.json的配置文件:
- node modules 文件夹用来存放所有已安装到项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包。
- package-lock.json配置文件用来记录node modules目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。
2)安装指定版本包
默认情况下,使用npm install命令安装包的时候,会自动安装最新版本的包。如果需要安装指定版本的包,可以在包名之后,通过@符号指定具体的版本,例如:npm i moment@2.22.2
3.卸载包
运行npm uninstall命令,来卸载指定包,例如:npm uninstall moment
就可以卸载安装好的moment包
模块加载机制
1.优先从缓存中加载
模块在第一次加载后会被缓存,这意味着多次调用require()不会导致模块的代码被执行多次,可以提高模块的加载效率
2.内置模块加载机制
内置模块是由Node.js官方提供的模块,内置模块的加载优先级最高
3.自定义模块加载机制
- 使用require()加载自定义模块时,必须指定以/或…/开头的路径标识符。在加载自定义模块时,如果没有指定.或…这样的路径标识符,则node会把它当作内置模块或第三方模块进行加载。
- 同时,在使用require()导入自定义模块时,如果省略了文件的扩展名,则Node.js 会按顺序分别尝试加载以下的文件:
1.按照确切的文件名进行加载
2.补全.js扩展名进行加载
3.补全.json扩展名进行加载
4.补全.node扩展名进行加载
5.加载失败,终端报错
4.第三方模块加载机制
如果传递给require()的模块标识符不是一个内置模块,也没有以‘.”或‘./”’开头,则Node,js 会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块。
如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。
5.目录作为模块
当把目录作为模块标识符,传递给require()进行加载的时候,有三种加载方式:
- 在被加载的目录下查找一个叫做
package.json
的文件,并寻找 main属性,作为require()加载的入口 - 如果目录里没有
package.json
文件,或者main入口不存在或无法解析,则Node.js
将会试图加载目录下的index.js
文件。 - 如果以上两步都失败了,则Node.js 会在终端打印错误消息,报告模块的缺失:Error:
Cannot find module 'xx'