前段时间,咱们邀请了咱们“城内”(葡萄城)资深开发工程师刘涛为你们分享了一次干货满满的关于Electron线上公开课,在课程过程当中有很多同窗对于NPM的概念和用法有一些疑问,因此此次咱们但愿经过这篇文章来解答各位同窗的问题。另外在介绍的基础上,咱们还会适当的深刻介绍下,如何在npm上发布第一个属于本身的包。那么,让咱们立刻开始吧!php
得益于Node.js的模块化生态系统,咱们基本上能够把NPM认为是任何Node项目的基础组成的一部分。但实际上,咱们甚至能够说NPM是Node.js开发人员在开发者社区中最重要的工具之一。毕竟,他们天天都使用它来管理他们的项目使用的包。html
可是,除了用它安装软件包外,你们是否真正深刻了解过NPM呢?所以,我将尝试介绍该工具的基础知识,让您更深刻地了解并使用它,而不是仅仅了解npm install而已。node
咱们都知道你可使用NPM安装软件包,但到底是什么意思呢?包基本上是包含您须要的代码的文件夹,您能够在本地或全局安装它。git
本地安装意味着您实际上将文件下载到项目的文件夹中。在其中,您将找到一个您未建立的目录,称为“node_modules”。因为这种简单的机制,这个本地文件夹可能会变得很是大。express
那么究竟这个文件夹有多大?一张图来为你形容:npm
其实这只是个玩笑,一般你能够忽略该文件夹,让Node.js为你处理它。json
要执行本地安装,您只需:浏览器
$ npm install [package-name]缓存
您能够添加—save
后缀,Node会把包名称和版本保存到您的package.json
文件中。请记住,这一点很重要(甚至相当重要),由于当你做为团队中的一份子在工做时,你不会分发,也不会将node_modules文件夹添加到版本控制系统(不管是GIT,SVN仍是你正在使用的任何版本管理系统),而只需简单地分享package.json
文件,而后让你的队友执行$npm install
命令,便可完成包的安装和更新。这比共享整个文件夹更快,更容易维护,整个文件夹能够增加到包含千兆字节的数据。安全
如下是一个package.json
文件的结构:
{ |
|
"name": "Project name", |
|
"version": "1.0.0", |
|
"description": "This is a basic description", |
|
"main": "index.js", |
|
"scripts": { |
|
"test": "echo \"Error: no test specified\" && exit 1" |
|
}, |
|
"author": "Fernando Doglio", |
|
"license": "ISC", |
|
"dependencies": { |
|
"config": "^3.1.0", |
|
"express": "^4.17.1", |
|
"socket.io": "^2.2.0", |
|
"winston": "^3.2.1" |
|
} |
|
} |
|
您可能会改变一些,具体取决于您安装的软件包,或者您须要的文件的哪些字段(上面的示例中没有使用的其余许多字段)。
您还能够全局安装软件包,这意味着Node.js将可以从您可能须要的任何项目中访问它们。这样作有什么问题吗?全局安装的包不会添加到package.json
文件中,那么既然不会添加到package.json中,那么为何要安装全局安装呢?
使用Node.js和NPM能作的一个很棒的缘由之一就是构建人们一般称之为“二进制文件”的东西,它们只是能够全局安装的脚本,所以能够从盒子的任何位置访问。这意味着您能够建立命令行工具并使用NPM来安装它们!
例如:ExpressJS(Node.js最受欢迎的Web框架之一)或mocha(很是流行的测试库)等软件包也附带了可使用的可执行二进制文件。例如,mocha要求您在全局和本地安装它,以便拥有一个名为“mocha”的CLI工具,并可以在本地项目上运行测试。
全局包在须要添加到PATH环境变量的常规路径中建立符号连接(或快捷方式)。
install
命令只是您能够与NPM一块儿使用的众多命令之一。事实上,抛开近60种不一样的命令(是的,就这么多!),我将简要介绍一下,NPM还容许你建立本身的自定义命令,以防止内置命令对你不够用。
如下是最多见的命令列表,取自官方文档:
$ npm access public
$ npm addUser
当提示时,将输入用户凭据(用户名和密码)及其电子邮件。fix
自动修复在审核期间可能发现的任何问题。npm install
用于自动化环境(例如持续集成过程)相同。此命令比此命令更严格,install
并确保安装始终是干净的(若是存在,它会自动删除node_modules文件夹)。npm install library-name@latest
,NPM将了解要下载的库的哪一个版本。node
和git
命令是可访问和可执行的,node_modules
文件夹(本地和全局)可由NPM,注册表写入或者它的任何自定义版本都是可访问的,最后,NPM缓存存在而且它正在工做。$npm hook add express
http://your-url.com/new-express-version-endpointpackage.json
使用该信息建立一个全新的文件。您还能够提供自定义初始化程序,以自定义处理到您的特定堆栈。package.json
文件中可见的名称和版本,还会列出它们的依赖关系及其版本。package.json
文件指望的版本以及主注册表中发布的最新版本。package.json
文件的路径。您可使用该-g
标志,您将得到安装全局包的实际位置。这些是您可使用的最多见或最有用的NPM命令,可是仍然有超过10个额外的命令供您查看,所以我建议您将其文档添加为书签,并作一个注释以便返回并仔细检查它!
我要分享关于NPM知识的最后一点是与其余人分享你的工做是多么容易。在上一个列表中,最后一个命令是发布命令,它基本上容许你这样作,但在这里我想给你更多的细节。
NPM的注册表本质上是一个巨大的包搜索引擎,可以同时托管全部内容,所以您没必要同时索引它能够在您的工做中得到的每一点元数据,以帮助其余人找到您的模块尽快。
换句话说,请确保您package.json
的设置正确。由于这些内容是吸引您(以及其余人)开始研究及分享您的包的主要因素。
package.json
文件以跟踪依赖关系时可能已经设置的名称。请注意它的惟一性。package.json
中的标签属性,其余开发人员将很难经过分类导航找到你的包。false
,不然没有人可以经过关键字搜索找到您的模块。package.json
文件的一部分,它将以不一样且更突出的方式显示。您也能够在readme.md上说起它,但在此处添加它将为NPM提供有关您的项目的额外知识。经过提供我上面提到的元数据,NPM可以展现这些数据并突出显示它供开发人员查看。如下示例为Winston的包页面:
因为其团队添加了元数据,添加了多少连接以及额外的位和详细信息。
这步是可选的,但若是你的包是一个可供其余开发人员使用的模块的话,那么我建议你最好提供一份优秀的文档,供他人参考。
由于你真的不能期望你的工具“上手简单、易于理解”。NPM
的目的是为其余人提供一套帮助他们解决问题的预置工具。所以,请尽可能丰富你的文档,吸引更多人来使用你的工具吧。
编码完成后,将有效的package.json
放置到你的目录中,
并编写尽量完善的readme.md
文件,您就能够发布了。
要执行发布操做,您必须作两件事:
npm
CLI 登陆您的NPM账户(若是您已经有了帐号)。也就是只需两步,就能简单的完成发布。登录:
$ npm login
将提示您输入凭据,一旦您成功登陆,您能够再输入:
$ npm publish
请在项目的文件夹中执行此操做,不然第二个命令将失败。
另外,请记住,包的名称将由您的package.json文件中的name属性给出,而不是来自文件夹的名称(一般两者都是相同的,但并这不意味着他俩有什么关系)。所以,若是您遇到重复的名称错误(考虑到NPM中已经有重名的包了),那么您就必须进行更改一个再次发布了。
感谢阅读,我但愿到如今为止,你已经了解了NPM的复杂性和美感。它不只仅是一个安装软件包的简单工具,但若是你花时间检查文档,你能够用它作更多的事情。