NodeJs系列-Day04-包的管理
NodeJs系列-Day04-包的管理
小码同学包的管理
在某目录下安装包时,不会安装到全局的包里面,只会安装到执行命令的位置。所以不需要担心本地Nodejs
环境混乱的问题。
在安装包的时候,一般只有工具性质的包,才有全局安装的必要性,因为它们提供了好用的终端命令。判断某个包是否需要全局安装可以参考官方的使用说明。
初始化项目
1 | npm init -y |
执行该命令后会在该目录下出现一个package.json
的文件,该文件会记录你安装的包名
和版本号
。
- 该命令只能在
英文名目录
下运行,不能包括中文
、空格
的目录名。 - 在运行
npm install
命令安装包的时候,npm
包管理工具会自动把包的名称和版本号,记录到package.json
中。
dependencies记录下载的包
在package.json
下有个dependencies
属性记录着该项目所需要用到的包名及版本。
在dependencies
记录的包又称核心依赖包
。
一次性下载项目所需要的全部包
在上述说到package
中有记录到该项目所需要的用到的包,如果该项目用的包非常多,如果一次次安装肯定是非常麻烦的,那么用什么办法一次性全部下载全部的包呢?用以下命令可以实现一次性下载项目所需要的包。
1 | npm install |
或者简便一点npm i
,i
是install
的简写
该命令是读取package
下的``dependencies`属性记录的包信息,然后去下载所需要的包。
一次性安装多个包
npm i 包名 包名 ...
,以空格区分开包
1 | npm install jquery moment |
缺失包
直接运行报错
在运行某项目时缺失某个依赖包,则会报以下错误
1 | Error:Cannot find module '包名' |
卸载包
1 | npm uninstall 包名 |
devDependencies节点
如果某些包只在项目开发阶段
会用到,在项目上线之后不会用到
,则建议把这些包记录到devDependencies
节点中。
devDependencies
记录的包又称开发依赖包
,只会在开发阶段用到。
与之对应的,如果某些包在开发
和项目上线之后
都需要用到,则建议把这些包记录到dependencies
节点中。
- 安装指定的包,并记录到
devDependencies
节点中。
1 | npm i 包名 -D |
- 上诉命令是简写形式,等价于下面完整的写法
1 | npm install 包名 --save-dev |
解决包下载慢的问题
查看当前镜像源
1 | npm config get registry |
更换淘宝镜像源
1 | npm config set registry=https://registry.npm.taobao.org/ |
查看是否更换成功
1 | npm config get registry |
出现以下镜像地址则说明更换淘宝镜像成功。
镜像源切换工具nrm
1 | # 通过 npm 包管理器,将nrm安装为全局可用的工具 |
镜像源
1 | npm ------ https://registry.npmjs.org/ |
切换源
1 | nrm use taobao |
i5ting_toc
这是一个.md
转HTML
的模块
1 | # 将 i5ting_toc 安装为全局包,-g 可以放在包名前面或者后边,不影响下载 |
发布npm包
- 在
npm
注册账号 - 在终端切换
npm
官方源(此处我使用了nrm工具,安装方式npm i nrm -g
)
1 | nrm use npm |
- 输入
npm login
开始登录
注意:在运行npm login命令之前,必须先把下包的服务器地址切换为npm的官方服务器。否则会导致发布包失败!
tips:Enter one-time password from your authenticator app:在邮箱拿到验证码输入
删除已发布的包
1 | npm unpublish 包名 --force |
npm unpublish
命令只能删除72小时以内发布的包npm unpublish
删除的包,在24小时内不允许重复发布- 发布包的时候要慎重,尽量不要往
npm
上发布没有意义的包!
模块的优先级
内置模块
> 第三方模块
一般模块在第一次使用的时候会加载到缓存中,下次使用直接调用缓存,提高使用效率。
加载第三方模块
内置模块和第三方模块
使用require()
加载自定义模块时,必须指定以**./
或../
开头的路径标识符,在加载自定义模块时,如果没有指定./
或../
**这样的路径标识符,则NodeJs
会把它当作内置模块或第三方模块进行加载。
扩展名加载顺序
在使用require()
导入自定义模块时,如果省略了文件的扩展名,则Node.js
会按顺序分别尝试加载以下的文件:
- 按照确切的文件名进行加载
- 补全
.js
扩展名进行加载 - 补全
.json
扩展名进行加载 - 补全
.node
扩展名进行加载 - 加载失败,终端报错
找不到modules文件夹
如果传递给require()
的模块标识符不是一个内置模块,也设有以**./
或../
**开头,则Node.js
会从当前模块的父目录开始,尝试从/node modules
文件夹中加载第三方模块。
如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录(即盘符)。
例如,假设在C:\Users\test\project\foo.js
文件里调用了require(tools)
,则Node.js
会按以下顺序查找:
C:\Users\test\project\node_modules\tools
C:\Users\test\node_modules\tools
C:\Users\node_modules\tools
C:\node_modules\tools
目录作为模块
当把目录作为模块标识符,传递给require()
进行加载的时候,有三种加载方式:
- 在被加载的目录下查找一个叫做
package.json
的文件,并寻找main
属性,作为require()
加载的入口 - 如果目录里没有
package.json
文件,或者main
入口不存在或无法解析,则Node.js
将会试图加载目录下的index.js
文件。 - 如果以上两步都失败了,则
Node.js
会在终端打印错误消息,报告模块的缺失:Error:Cannot find module'xxx'
自定义npm包
包结构如下
1 | ├─ lilbai-tool |
index.js
在index.js中要引入其他js文件,并且选择性暴露出引入对象和对象属性,在对象前加上...对象名
1 |
|
data.js
在其他的js文件也要暴露出对象,不然在index.js方法中找不到其他方法暴露的对象。
1 | function data (str){ |
htmlReplace.js
1 | //防止用户输入奇怪的东西或者跑bug |