上一节-node.js学习(7)—node.js的模块化输入输出
1.npm介绍
npm——NodeJs Package Manager(nodejs 包管理器)。它是node中自带的命令。我们在node中的大部分操作都需要用到它。在前端开发中,其最明显的两个作用:
1.统一下载路径,我们只需要通过npm install就可以安装所需文件。而不是像电脑中安装软件,百度搜索一看,有复杂的应用市场。
2.通常我们下载模块,有可能该模块又依赖其他模块,npm会自动帮我们处理依赖,我们可以不用关心需要下载的模块以来什么。
举个🌰
我们在a.js中增加如下代码
var mysql=require('mysql');
console.log(mysql);
此时肯定会报错,
Error: Cannot find module 'mysql'
然后,我们在该文件夹中使用命令行,然后开始安装模块
cnpm install mysql
这里本来应该是npm install,但是由于国内墙太高,所以使用了cnpm,具体安装方式可以看我另一篇文章cnpm安装。然后我们会发现,文件夹中会多出一个名为node_modules的文件夹,里面便是下载的mysql以及其依赖。
此时运行a.js文件就不会报错,而是正确输出该模块的内容。
2.自定义模块
在上面,我们曾使用require引用自定义模块时候,使用了./
,那么可以不写./
吗?答案是sure。
我们发现刚才使用install安装的模块会自动安装到node_modules
文件夹中。然而我们使用时候并没有加./
。这些模块也是一些别人自定义的模块。
所以,我们把刚才的安装mysql时候生成的node_modules文件夹删掉,
然后自己新建一个同名的文件夹(node_modules)。然后在里面定义一个b.js。和之前一样导出变量,然后引入的时候去掉./
,发现不会报错,可以正常使用。
1.node_modules是固定名字,不能改为其他名字。
假如我们在node_modules中把刚才的b.js改为http.js,因为node自带模块也有个http模块,那么我么在使用导入过来的模块是哪个呢?经过验证,
2.在Node.js中,如果自定义模块和系统模块名字相同,会优先使用系统模块,如果没有找到,则会使用自定义模块。(这个优先级指的是在node_modules中的模块)。
3.自定义模块发布
我们使用install安装的包都是别人封装好的发布上去的,假如自己写了一个很牛逼的包,那么我们怎么才能共享出来给大家使用?
首先,我们打开npm官网。第三方用户自定义的包发布到这个网站上面。我们可以在上面搜素到我们所需要的模块。如下图:
我们在发布自己的模块时候,肯定是需要自己的一个账号。在上面的官网可以注册,或者
在命令行中数输入npm,发现它后面可以跟有很多命令。其中adduser
就是注册账户的意思。这里我们直接在官网进行注册,操作步骤在这里就不多说了。
接下来我们开始制作自己的模块。我们随便建一个空文件夹。这里叫public,里面增加一个index.js,内容为:
module.exports={
a:1
}
然后,
1.npm init
初始化模块配置文件,具体可以看我的这篇文章package.json讲解。该命令会生成一个package.json文件。这里在执行命令过程中,输入的相关内容如下:
{
"name": "yintest",
"version": "1.0.0",
"description": "这是一个测试文件",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"test",
"yin"
],
"author": "YIN",
"license": "ISC"
}
2.npm login
登录自己之前注册的账号。期间会提示输入账户密码邮箱。我们也可以使用npm whoami
查看当前已登录的用户。
3.登录成功后,我们使用npm publish
,等命令执行成功后,会出现如下
上图成功输出的信息,前面为包名字,后面为版本号。
4.我们进入npm官网搜索yintest,发现可以搜索到我们安装的包了.
5.在public文件夹cnpm install yintest
,会发现生成了node_modules并在其中出现了自己刚才传上去的test.js。
6.后面我们就可以正常在其他文件中正常使用了。
现在我已经发布了testyin的1.0.0版本,假如我更新了test.js文件,然后我再次输入npm publish
,会发现报错了,提示1.0.0版本我已经发布过了,不能再发布相同版本。那么我们只需要
7.更改package.json文件的版本号,这里我随便改成2.0.1.然后再次npm publish
即可。再次去官网验证,更新已经成功。
8.我已经把yintest包更新到2.0.1版本了,但是我之前本地安装的仍然是旧版本怎么办。我们再次输入npm,发现里面有个update
。很明显更新的意思。我们输入npm update yintest
,等更新完成后,再次查看node_modules的文件,发现已经更新成功。不过不知道是自己电脑问题还是其他问题,我输入上面更新命令貌似不管用,node_modules里面还是旧版本。所以我只能使用npm install yintest@lastest
即安装yintest的最新版本即可。
我们已经学会把自己的模块上传到npm服务器其里面,还有个问题,假如我要删除自己曾经发布的包怎么办?
9.我们输入npm发现里面还有个unpublish
,这个就是删除已发布的模块。试一下,我们输入npm unpublish
,此时会出现下图的情况。它提示我们需要添加--force
来强制删除。
10.所以我们输入npm unpublish --force
,稍等片刻提示我们最新的一个版本2.0.1删除成功。去npm官网上看下,只剩下1.0.1版本了,再次输入相同命令才能删除1.0.1版本。
注:①npm默认只能一个一个删除版本,不能一次性删除所有版本。
②假如发布的包已经有人下载使用(npm官网可以看是否有人下载),删除会报错,是无法删除的。具体判断自己的包是否可以删除可以去npm的官网看下文档政策介绍。
至此,npm的介绍总共就这么多,大家可以按照上面步骤去尝试下。