赞
踩
前段时间,我们邀请了我们“城内”(葡萄城)资深开发工程师刘涛为大家分享了一次干货满满的关于Electron线上公开课,在课程过程中有不少同学对于NPM的概念和用法有一些疑问,所以这次我们希望通过这篇文章来解答各位同学的问题。另外在介绍的基础上,我们还会适当的深入介绍下,如何在npm上发布第一个属于自己的包。那么,让我们马上开始吧!
得益于Node.js的模块化生态系统,我们基本上可以把NPM认为是任何Node项目的基础组成的一部分。但实际上,我们甚至可以说NPM是Node.js开发人员在开发者社区中最重要的工具之一。毕竟,他们每天都使用它来管理他们的项目使用的包。
但是,除了用它安装软件包外,大家是否真正深入了解过NPM呢?因此,我将尝试介绍该工具的基础知识,让您更深入地了解并使用它,而不是仅仅了解npm install而已。
我们都知道你可以使用NPM安装软件包,但究竟是什么意思呢?包基本上是包含您需要的代码的文件夹,您可以在本地或全局安装它。
本地安装意味着您实际上将文件下载到项目的文件夹中。在其中,您将找到一个您未创建的目录,称为“node_modules”。由于这种简单的机制,这个本地文件夹可能会变得非常大。
那么究竟这个文件夹有多大?一张图来为你形容:
其实这只是个玩笑,通常你可以忽略该文件夹,让Node.js为你处理它。
要执行本地安装,您只需:
$ 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的复杂性和美感。它不仅仅是一个安装软件包的简单工具,但如果你花时间检查文档,你可以用它做更多的事情。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。