1.npm包的创建
Node.js 的包将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制。Node.js 根据 CommonJS 规范实现了包机制,开发了 npm来解决包的发布和获取需求。
Node.js 的包是一个目录,其中包含一个 JSON 格式的包说明文件 package.json。严格符合 CommonJS 规范的包应该具备以下特征:
(1)package.json 必须在包的顶层目录下;
(2)二进制文件应该在 bin 目录下;
(3)JavaScript 代码应该在 lib 目录下;
(4)文档应该在 doc 目录下;
(5)单元测试应该在 test 目录下。
Node.js 对包的要求并没有这么严格,只要顶层目录下有 package.json,并符合一些规范即可。当然为了提高兼容性,在制作包的时候还是建议严格遵守 CommonJS 规范。
1.1.作为文件夹的模块
模块与文件是一一对应的。文件不仅可以是 JavaScript 代码或二进制代码,还可以是一个文件夹。最简单的包,就是一个作为文件夹的模块。
创建一个叫somepackage的包:
somepackage/index.js:
exports.hello = function(){
console.log('Hello');
}
然后再somepackage之外进行调用:
getpackage.js:
var somemodule = require('./somepackage');
somemodule.hello();
运行并输出:
PS D:\phpStudy\WWW\node> node .\getpackage.js
Hello
我们使用这种方法可以把文件夹封装为一个模块,即所谓的包。包通常是一些模块的集合,在模块的基础上提供了更高层的抽象,相当于提供了一些固定接口的函数库。
通过定制package.json,我们可以创建更复杂、更完善、更符合规范的包用于发布。
1.2.package.json
在somepackage文件夹下新建package.json文件:
{
"main":"./lib/interface.js"
}
将index.js重命名为interface.js,放入lib文件夹下,再次运行外部的getpackage.js,同样能得到结果。
Node.js 在调用某个包时,会首先检查包中 package.json 文件的 main 字段,将其作为包的接口模块,如果 package.json 或 main 字段不存在,会尝试寻找 index.js 或 index.node 作为包的接口。
2.npm包的发布
创建名为mymodule的文件作为包发布路径,在该目录中运行npm init:
package name: (mymodule) mymodule001
version: (1.0.0) 0.0.1
description: A module for learning perpose
entry point: (index.js)
test command:
git repository:
keywords:
author: xcys
license: (ISC)
About to write to D:\phpStudy\WWW\node\mymodule\package.json:
{
"name": "mymodule001",
"version": "0.0.1",
"description": "A module for learning perpose",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "xcys",
"license": "ISC"
}
Is this ok? (yes)
PS D:\phpStudy\WWW\node\mymodule>
package name命名的时候尽量特殊一点,如果命名与已有的包名重复,发布包的时候会报错。
同样再在mymodule目录下新建一个index.js,写入包内容:
exports.hello = function(){
console.log('Hello World!');
};
这样一个包就制作完成。
发布之前还需要一个账号,打开https://www.npmjs.com/signup注册一个自己的npm账号并激活。
回到mymodule文件夹发布包,使用 npm adduser 输入注册的用户名、密码、邮箱,等待账号创建完成。完成后可以使用 npm whoami 测验是否已经取得了账号。
PS D:\phpStudy\WWW\node\mymodule> npm adduser
Username: xcys
Password:
Email: (this IS public) 你注册npm的邮箱
Logged in as xcys on http://registry.npmjs.org/.
PS D:\phpStudy\WWW\node\mymodule> npm whoami
xcys
PS D:\phpStudy\WWW\node\mymodule>
运行npm publish发布包:
出现报错:
PS D:\phpStudy\WWW\node\mymodule> npm publish
npm ERR! publish Failed PUT 403
npm ERR! code E403
npm ERR! You do not have permission to publish "mymodule001". Are you logged in as the correct user? : mymodule001
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\ming\AppData\Roaming\npm-cache\_logs\2018-01-13T09_52_48_485Z-debug.log
PS D:\phpStudy\WWW\node\mymodule>
可能是包名与已有的包名重复,回到package.json文件,改成包名为mymodule0011,再次发布:
PS D:\phpStudy\WWW\node\mymodule> npm publish
+ mymodule0011@0.0.1
出现进度条之后发布成功。
其他报错:如果npm的安装镜像是国内的淘宝等其他镜像发布包的时候也会出现报错,需要改回http://registry.npmjs.org/镜像。
打开https://www.npmjs.com即可搜索到刚才发布的包mymodule0011: