如何发布npm包

1、npm是什么?

NPM (node package manager),通常称为node包管理器。顾名思义,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。

npm 可以让 JavaScript 开发者在共享代码、复用代码以及更新共享的代码上更加方便。

当一个 JavaScript 开发者为了解决某个问题而编写了一些代码并将其共享出来的话,其他的开发者能够在自己的应用程序中复用这些代码,npm 让这些事情变得简单。

如果你使用了其他开发者开发的代码,你就可以很方便地使用 npm 来检查这些代码是否有了新的版本,然后可以下载新版本。

这些能够被复用的小段代码叫做 package (包),或者也可以叫成 module(模块)。一个 package 仅仅只是一个文件夹,里面带有一个或者多个文件而已。其中有一个叫做 "package.json" 的文件是用来描述这个 package 的信息的。通常一个应用(比如一个网站)会依赖几十个或上百个 package,并且这些 package 通常都不会很大。一个基本的思想就是建立一个精小的代码块专门用来解决某个问题,然后再通过这些小的代码块组合起来来解决一个更大的问题。

这种工作方式是有很多好处的。比如有些专家针对某个问题设计出一个 package,我们可以很方便地使用 npm 来获取这个 package。又或者你不想使用团队之外的代码,我们也可以使用这些基于模块的开发方式来让我们团队更好地协作开发,并且自己开发的模块还能够在不同的项目中使用。

在 npm 网站可以找到很多 package 用于构建你的应用。当你浏览 npm 网站时,可以找到很多不同类型的 Node 模块(Node module)。最开始的时候,npm 只是被当做 Node 的包管理器,因此可以找到大量能够应用在服务器端的模块。还有大量能够作为命令行工具使用的 package 。当然还可以找到很多用于前端开发的包。

npm 由三个独立的部分组成:网站、注册表(registry)和命令行工具(CLI)。网站主要是让用户查找 package 的;注册表(registry)是一个巨大的数据库,保存了每个 package 信息的;命令行工具(CLI)是开发者用来发布自己的 package 到注册表或者下载所需 package 的工具。

npm 是一种重用其他开发者所开发的代码的一种方式,并且也是一种与他人共享代码的方式,还能够让你很容易地管理代码的版本。

npm的背后,是基于couchdb的一个数据库,详细记录了每个包的信息,包括作者、版本、依赖、授权信息等。它的一个很重要的作用就是:将开发者从繁琐的包管理工作(版本、依赖等)中解放出来,更加专注于功能的开发。

2、安装 Node.js 以及更新 npm

2.1安装Node.js

如果你使用的是 OS X 或者 Windows,安装 Node.js 的最好方式就是使用
Node.js 下载页面的安装程序。

运行 node -v来查看 Node 的版本号。

2.2更新npm

Node 中捆绑了 npm,因此当你安装好Node.js后你的电脑上应该已经安装了某个版本的 npm。不过,npm 的更新比 Node 频繁多了,因此我们应该确保我们使用的是最新版本的 npm。

npm install npm@latest -g

运行 npm -v查看npm的版本号。

3、本地安装npm包

3.1本地安装or全局安装

有两种方式用来安装 npm 包:本地安装和全局安装。至于选择哪种方式来安装,取决于我们如何使用这个包。

如果你自己的模块依赖于某个包(比如通过 Node.js 的require加载),那么你应该选择本地安装,这种方式也是npm install命令的默认行为。 如果你想将包作为一个命令行工具,比如 grunt CLI,那么你应该选择全局安装。

想要了解更多关于install命令行的行为,可以查看CLI 文档

3.2本地安装

可以使用下面的命令来本地安装一个包:

npm install <package_name>

上述命令执行之后将会在当前的目录下创建一个 node_modules 的目录(如果不存在的话),然后将下载的包保存到这个目录下。

为了确认 npm install 是正常工作的,可以检查 node_modules 目录是否存在,并且里面是否含有你安装的包的文件夹。在类 Unix 系统中(例如 "OSX"、"Debian"),你可以使用 ls node_modules 命令来查看,在 Windows 系统中则可以使用 dir node_modules 命令来查看。

例如,安装一个叫做 lodash 的包。安装成功之后,如果 node_modules 目录下存在一个名为 lodash 的文件夹,则说明成功安装了这个包。

> npm install lodash
> ls node_modules               # 在 Windows 系统中使用 `dir` 命令

#=> lodash

3.3全局安装

将包安装到全局,你应该使用 如下命令:

npm install -g <package_name>

如果你遇到 EACCES 错误,那么你_需要修复权限问题。你还可以尝试使sudo来解决这个问题,不过最好避免这样做

sudo npm install -g jshint

3.4哪个版本的包会被安装?

在本地目录中如果没有package.json这个文件的话,那么最新版本的包会被安装。如果存在package.json文件,则会在package.json文件中查找针对这个包所约定的语义化版本规则,然后安装符合此规则的最新版本。

3.5使用已安装的包

一旦将包安装到 node_modules 目录中,你就可以使用它了。比如在你所创建的 Node.js 模块中,你可以 require 这个包。

实例,创建一个名为 index.js 的文件,并保存如下代码:

// index.js
var lodash = require('lodash');
 
var output = lodash.without([1, 2, 3], 1);
console.log(output);

运行 node index.js 命令。应当输出 [2, 3]。

如果你没能正确安装 lodash,你将会看到如下的错误信息:

module.js:340
    throw err;
          ^
Error: Cannot find module 'lodash'

可以在 index.js 所在的目录中运行 npm install lodash 命令来修复这个问题。

3.6node_modules的查找路径是怎样的?

从当前文件目录开始查找node_modules目录,如果没有,则进入父级目录,查找父级目录下的node_modules目录;直到根目录下的node_modules目录。

比如当前脚本文件/demo/src/foo.js,在该模块中使用require('bar')方式加载模块时,node内部运行过程如下:

/demo/src/node_modules/bar

/demo/node_modules/bar

/node_modules/bar

4、卸载本地安装的包

通过 npm uninstall <package> 命令可以将 node_modules 目录下的包删除掉:

npm uninstall lodash

如需从 package.json 文件中删除依赖,需要在命令后添加参数 --save:

npm uninstall --save lodash

注意:如果你将安装的包作为 "devDependency"(也就是通过 --save-dev 参数保存的),那么 --save 无法将其从 package.json 文件中删除。所以必须通过 --save-dev 参数可以将其卸载。

为了确定 npm uninstall 能够正常工作,请先检查 node_modules 目录是否存在,并且你所删除的包不在这个目录下。

实例,安装 lodash。为了确认安装成功,请检查 node_modules 目录下存在 lodash 目录。

通过 npm uninstall 命令卸载 lodash。为了确认执行成功,请检查 node_modules 目录下不存在 lodash 目录。

> npm install lodash
> ls node_modules               # Windows 系统下使用 `dir` 命令

#=> lodash

> npm uninstall lodash
> ls node_modules

#=>

5、更新本地安装的包

很多时候,我们会更新我们所依赖的包以获取最新的更新。

为了完成这个任务,在 package.json 文件所在的目录中执行 npm update 命令即可。

运行 npm outdated 命令。不输出任何结果表示成功。

6、更新全局安装的包

如需更新全局安装的包,运行npm update -g <package_name>命令即可:

npm update -g jshint

想要查看哪些全局安装的包需要更新,你可以使用

npm outdated -g --depth=0

命令来查看。

如果需要更新所有全局安装的包的话,你应该使用npm update -g
命令。不过,如果 npm 版本低于 2.6.1 的话,建议通过此脚本更新所有陈旧的包。

7、卸载全局安装的包

安装到全局的包可以通过 npm uninstall -g <package_name> 来卸载,如:

npm uninstall -g jshint

8、创建Node.js 模块

Node.js 模块就是可以发布到 npm 的代码包。当你创建一个新模块时,创建 package.json 文件是第一步。

你可以使用 npm init 命令创建 package.json 文件。命令行中将会提示 package.json 字段中需要你输入的值。名称(name) 和 版本(version) 这两个字段是必填的。你还需要输入入口文件字段(main) 字段,当然,可以使用默认值 index.js。

如果你想为作者(author)字段添加信息,你可以使用以下格式(邮箱、网址都是选填的):

Your Name <email@example.com> (http://example.com)

创建 package.json 文件之后,还需要创建模块的入口文件。如果使用默认值,文件名是 index.js。

创建好的package.json是长这样的


image.png

在入口文件中,添加一个函数,作为 exports对象的一个属性。这样,require 此文件之后,这个函数在其他代码中就可以使用了。

exports.printMsg = function() {
  console.log("This is a message from the demo package");
}

这样的话,你的node模块就已经创建完成了。

发布完自己的包之后,可以做如下尝试:

  1. 将你的包发布到 npm。
  2. 在你的项目外新建一个目录,然后 cd 进入这个新目录。
  3. 运行 npm install <package>。
  4. 创建一个 test.js 文件,require 这个包,并调用其中的方法。
  5. 运行 node test.js。查看是否和代码中的信息一致。

9、发布npm包

可以发布任何具有package.json文件的目录到npm服务器上。要发布,必须是npm注册表上的用户。

9.1创建一个用户

注册一个npm账号,2个方式,最简单的就是去npm官网注册

  1. npm注册
  2. 还有一个方式就是 npm adduser,按照它的提示去创建

9.2首次需要登录,使用npm login 存储证书到本地,后面就不需要每次都登录了

登录需要输入用户名,密码,还有邮箱,这些都是刚刚注册时候填写的

image.png

9.3发布包

使用npm publish发布包。

发布过程会把整个目录发布,不想发布的内容模块,可以通过 .gitignore.npmignore 文件忽略。发布成功之后可以去npm官网搜索一下,是否已经存在npm

发布过程可能会遇到这样的一个问题:

使用 cnpm 的注意报错:
no_perms Private mode enable, only admin can publish this module
设置回原本的就可以了
npm config set registryhttp://registry.npmjs.org
发布完成之后,如果还想回到之前的cnpm,使用下面的命令
npm config set registry https://registry.npm.taobao.org

9.4创建一个案例,引用刚上传的包

假设已经成功发布了,并且包名叫做test-module,这时候可以新建一个空目录,cd进去,运行npm install test-module,然后在这个目录下会出现一个叫node_modules的文件夹,你之前写的包就会出现在这个文件夹下面。

然后写一个index.js文件,代码如下

var test = require('toniqian-test-module');
test.showMsg();

运行index.js

node index.js

运行结果显示

This is my first module

那么刚刚上传的包,目前已经可以使用,到目前的话,你已经成功创建了一个npm包了。

9.5如何更新npm包

当你包的内容修改之后,比如:

exports.showMsg = function () {
  console.log("This is my second module");
};

修改了提示文字,那么我们需要

npm version <update_type>

update_type就是版本号的意思,会自动更新package.json里面的版本号
然后重新 npm publish,更新就会完成。

10、npm script是什么?如何使用?

  • package.json 文件有一个 scripts 字段,可以用于指定脚本命令,供 npm 直接调用。

  • npm 内置了两个简写的命令:npm testnpm start,其它命令要写成 npm run xxx 形式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容