0 前言
包的基础使用方法已在【Node.js】基础篇 中讲述,本篇将不再赘述!!!
1 package.json(包管理配置文件)
以下代码片段为package.json基础内容及介绍
javascript
{
"name": "code", //包名称
"version": "1.0.0", //包版本号
"description": "", //包的描述
"main": "index.js", //包的入口文件
"scripts": { //自定义脚本
...
},
"keywords": [], //包的关键词
"author": "", //包的作者
"license": "ISC", //包的许可证
"dependencies": { //核心依赖包:开发和项目上线之后都需要用到的包名及版本
...
},
"devDependencies": { //开发依赖包:开发时需要用到的包名及版本
...
}
}
2 包的分类
2.1 项目包
那些被安装到项目的node_modules 目录中的包,都是项目包
2.1.1 开发依赖包(devDependencies)
被记录到devDependencies节点中的包,只在开发期间会用到
命令:
-D : --save-dev的简写
CoffeeScript
npm i 包名 -D
2.1.2 核心依赖包(dependencies)
被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到
命令:
CoffeeScript
npm i 包名
2.2 全局包
在执行npm install 命令时,如果提供了-g参数,则会把包安装为全局包
全局包会被安装到C:\Users\用户目录\AppData\Roaming\npm\node_modules 目录下
CoffeeScript
npm i 包名 -g
npm uninstall 包名 -g
注意:
① 只有工具性质的包,才有全局安装的必要性,因为它们提供了好用的终端命令
② 判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可
3 下包镜像
3.1内置镜像命令
CoffeeScript
# 查看当前的下包镜像源
npm config get registry
# 切换镜像源(如淘宝)
npm config set registry=https://registry.npm.taobao.org/
缺点:容易输错链接
3.2 nrm工具
CoffeeScript
# 通过npm安装nrm并设置为全局可用的工具
npm i nrm -g
# 查看所有可用的镜像源
nrm ls
# 将下包镜像源切换为taobao镜像
nrm use taobao
4 md转html小工具(i5ting_toc)
CoffeeScript
# 将 i5ting_toc 安装为全局包
npm i -g i5ting_toc
# 调用 i5ting_toc -o:转化为自动打开html文件
i5ting_toc -f 要转换的md文件路径 -o
5 开发自己的包
① 新建自定义文件夹,作为包的根目录
② 在该文件夹中,新建如下三个文件:
- package.json (包管理配置文件)
- index.js (包的入口文件)
- README.md (包的说明文档)
5.1 package.json
javascript
{
"name": "abc", //包名
"version": "1.0.0", //版本号
"main": "index.js", //入口
"description": "描述内容", //搜索时的描述内容
"keywords": ["user", "dateFormat", "escape"], //搜索关键词
"license": "ISC" //包的许可证,写这种即可
}
5.2 编写自己的包内容
...
5.3 README.md
包根目录中的README.md 文件,是包的使用说明文档
通过它,我们可以事先把包的使用说明,以markdown 的格式写出来,方便用户参考
README 文件中具体写什么内容,没有强制性的要求;
只要能够清晰地把包的作用、用法、注意事项等描述清楚即可
我们所创建的这个包的README.md 文档中,会包含以下6 项内容:
安装方式、导入方式、格式化时间、转义HTML 中的特殊字符、还原HTML 中的特殊字符、开源协议
6 发布包
6.1 注册npm账号
① 访问https://www.npmjs.com/ 网站,点击sign up 按钮,进入注册用户界面
② 填写账号相关的信息:Full Name、Public Email、Username、Password
③ 点击Create an Account 按钮,注册账号
④ 登录邮箱,点击验证链接,进行账号的验证
6.2 登录npm账号
npm 账号注册完成后,可以在终端中执行npm login 命令,依次输入用户名、密码、邮箱后,即可登录成功
注意:在运行npmlogin 命令之前,必须 先把下包的服务器地址切换为npm的官方服务器,否则会导致发布包失败!
6.3 把包发布到npm上
将终端切换到包的根目录之后,运行npm publish 命令,即可将包发布到npm 上(注意:包名不能雷同)
6.4 删除已发布的包
运行 npm unpublish 包名 --force 命令,即可从npm 删除已发布的包
注意:
① npm unpublish 命令只能删除72 小时以内发布的包
② npm unpublish 删除的包,在24 小时内不允许重复发布
③ 发布包的时候要慎重,尽量不要往npm 上发布没有意义的包!
7 加载机制
7.1 优先从缓存中加载
模块在第一次加载后会被缓存
这也意味着多次调用require() 不会导致模块的代码被执行多次
注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率
7.2 内置模块的加载机制
内置模块是由Node.js 官方提供的模块,内置模块的加载优先级最高
例如,require('fs') 始终返回内置的fs 模块,即使在node_modules 目录下有名字相同的包也叫做fs
7.3 自定义模块的加载机制
使用require() 加载自定义模块时,必须指定以./或../开头的路径标识符
在加载自定义模块时,如果没有指定./ 或../ 这样的路径标识符,则node 会把它当作内置模块或第三方模块进行加载
同时,在使用require() 导入自定义模块时,如果省略了文件的扩展名,则Node.js 会按顺序分别尝试加载以下的文件:
① 按照确切的文件名进行加载
② 补全.js扩展名进行加载
③ 补全.json 扩展名进行加载
④ 补全.node 扩展名进行加载
⑤ 加载失败,终端报错
7.4 第三方模块的加载机制
如果传递给require()的模块标识符不是一个内置模块,也没有以'./' 或'../' 开头,则Node.js 会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块
如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录
例如,假设在'C:\Users\user\project\foo.js' 文件里调用了 require('tools'),则 Node.js 会按以下顺序查找:
① C:\Users\user\project\node_modules\tools
② C:\Users\user\node_modules\tools
③ C:\Users\node_modules\tools
④ C:\node_modules\tools
7.5 目录作为模块
当把目录作为模块标识符,传递给require() 进行加载的时候,有三种加载方式:
① 在被加载的目录下查找一个叫做package.json 的文件,并寻找main 属性,作为require() 加载的入口
② 如果目录里没有package.json 文件,或者main 入口不存在或无法解析,则Node.js 将会试图加载目录下的index.js 文件
③ 如果以上两步都失败了,则Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module 'xxx'