一、包
1.什么是包
Node.js中的第三方模块又叫做包
2.包的来源
不同于node.js中的内置模块或自定义模块,包是第三方个人或团队开发出来的,免费供所有人使用。
3.为什么需要包
因为node.js的内置模块仅提供了一些底层的api,开发效率很低,而包是基于内置模块开发出来,提供了更高级方便的api,提高开发效率。
4.从哪里下载包
国外一家it公司叫npm,Inc,他旗下有一个全球最大的包共享平台https://www.npmjs.com/
他还提供了一个包管理工具叫Node Package Manager(npm 包管理工具),这个包管理工具随着用户安装node一起到了用户电脑上,npm -v可以查看包管理工具的版本号
(用了这么久的东西头一次去了解)
二、npm初体验
格式化时间的包 moment
安装包:npm install 包的完整名称(简写npm i 包的完整名称)
当我们初次下载包的时候会出现node_modules文件和package-lock.json配置文件
node_modules负责存放所有已安装到项目里的包,require()导入第三方包的时候就从这个目录中查找并加载包
package-lock.json用来记录node_modules里下载的包的信息(名字、版本、下载地址等等)
(dependencies节点)
程序员不要手动去修改这两个文件,npm会去管理的
安装指定版本的包在后面加@版本号就行
版本号第一位:大版本
第二位:功能版本
第三位:bug修复版本
三、包管理配置文件
npm规定,在项目根目录中,必须提供一个package.json 的包配置文件,用来记录项目相关的配置信息(项目名称、版本号、描述、项目用到了哪些包、哪些包在开发期间用到,哪些在开发和部署都会用到)
如果第三方包体积过大,当我们需要团队协作把整个包都传到github上的话体积过大 ,那我们就想到了只上传不包括node_modules这个文件夹的源码,并在根目录中创建一个叫package.json的文件记录用到了哪些包,方便各成员使用。
所以我们在开发过程中注意要把node_modules放进.gitignore忽略文件中
1.快速创建package.json文件
npm包管理工具提供了一个快捷命令在执行命令所处的目录中,快速创建package.json包配置文件
npm init -y
注意:这个命令只能在英文目录下执行,也不能出现空格
使用npm i的时候,npm包管理工具会自动把包的名称和版本号记录到package.json文件里去
2.dependencies节点
上面那个命令初始化package.json的文件默认没有dependencies这个节点,在npm i之后就有了dependencies节点就是记录npm i命令安装了哪些包的。
当我们拉代码之后npm包管理工具就会读取package.json中的dependencies节点,然后把包一次性下载到项目里
3.卸载包
使用命令npm uninstall(没有简写形式)+包名称,卸载之后的包会自动从package.json中的dependencies节点去掉
4.devDependencies节点
如果某些包只在开发的时候用,上线不用就把这些包记录在devDependencies节点里,都需要用到的话记录在dependencies节点里
命令:npm i 包名称 -D(完整命令是 npm install 包名称 --save-dev)
问题:为什么不是去读取package-lock.json呢,之前不是说
?
答:项目最开始创建没有node_modules文件夹和package_lock.josn文件,然后只有package.json,当我npm i之后才有了node_modules文件夹和package_lock.josn文件(并且是按照package.json来下载的)
package_lock.josn文件就记录实际下载的信息和版本号之类的
5.解决包下载慢的问题
npm包下载默认使用国外的 https://registry.npmjs.org/ 服务器进行下载,所以下载速度特别慢
淘宝npm镜像服务器:淘宝在国内搭了一个服务器(每隔一段时间自动把外国包同步过来)专门把国外的包同步到国内的服务器
6.切换npm下包镜像源
下包的镜像源指的就是下包的服务器地址
//查看当前下包的镜像源
npm config get registry
//将下包的镜像切换为淘宝镜像
npm config set registry=https://registry.npmmirror.com/
7.nrm
为了防止写错单词可以下载这个nrm小工具
//安装
npm i nrm -g
//查看所有的镜像源
nrm ls
//将下包的镜像源改为淘宝的
nrm use taobao
四、包的分类和规范管理工具
1.包的分类
使用npm包管理工具下载的包分为两类:
- 项目包
- 全局包
(1)项目包
被安装到项目的node_modules文件夹里的包都是项目包,项目包又分为两种:开发依赖包(devDependencies只在开发用)和核心依赖包(dependencies开发和上线都用)
(2)全局包
使用npm的时候加了 -g参数,包就会成为全局包,全局包会被安装到这个目录:

安装npm i 包 -g
卸载npm uninstall 包 -g
只有工具性质的包才有全局安装的必要
2.i5ting_toc
这是一个可以把md文档转为html的小工具
//安装
npm i i5ting_toc -g
//转换
i5ting_toc -f 要转换的md路径 -o
-f去指定转换哪个文件
-o表示转换完自动在浏览器打开(转换完的文件自动放在跟md文件同目录下)
3.规范的包的内部结构
规范的包需要满足:
- 包必须以单独的目录而存在
- 包的顶级目录下必须包含package.json包配置文件(不是包外层,而是里面)
- 包里面的package.json包配置文件必须包含name名字、version版本号、main包的入口(被项目引入是加载入口)三个属性
五、发布包
1.开发属于自己的包
包的结构其实就是个文件夹,文件夹名字不是别人以后下载的名字(package.json里面的name才是)(注意包名称不能重复),里面新建仨文件package.json、index.js(入口文件)、README.md
{
"name": "heima",
"version": "1.0.0",
"main": "index.js",
"description": "geeker-admin open source management system",
"keywords": ["escape","itheima"],
"license":"ISC"
}
version默认1.0.0
2.发布包步骤
步骤:先注册一个npm账号,然后打开终端,将下包服务器地址转换为官方地址,再npm login命令以此输入用户名和密码
登录之后将终端切换为包的根目录,然后npm publish即可发布到npm
删除已发布包的话npm unpublish 包名 --force
注意:npm unpublish 包名只能删除72小时内发布的包(搜了一下npm unpublish 包名 --force如果引用量低超过72h也能删除,一删就是删整个包,npm unpublish还能删除某个版本)
npm unpublish的包在24小时内不能重复发布
六、模块的加载机制
1.优先从缓存中去加载
模块在第一次加载后会被缓存,也就是说不是每次require()都重新去执行模块的代码。
注意:不管是内置模块、自定义模块、第三方模块都优先从缓存中加载,从而提高模块的加载效率。
2.内置模块的加载机制
内置模块是node.js官方提供的,他的加载优先级最高(如果内置和第三方/内置的重名了的话)
3.自定义模块的加载机制
自定义模块引入一定要以./或者../为开头,要不然会被认为是内置模块或者第三方模块。
而且如果引入的时候落了扩展名的话会这样去寻找:
(1)按照确切文件名进行加载
(2)补全.js扩展名进行加载
(3)补全.json扩展名进行加载
(4)补全.node扩展名进行加载
(5)加载失败,报错
4.第三方模块的加载机制
如果传递给require()的不是内置也不是./或者../开头的话,他就会去node.modules里找了,如果没有找到就移动到再上一层的父目录中去寻找,直到文件的根目录

都找不到就报错
5.目录作为模块
目录传给require()的时候,有三种加载方式
(1)找目录下的package.json里的main去找入口文件,作为require()加载的入口
(2)如果没有package.json或者没定义main或者main里的文件无法解析,则node.js就会加载目录下的index.js
(3)以上都失败的话就报错
