作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Martin Gouws
Verified Expert in Engineering

Martin是一位年轻而有才华的JavaScript开发人员和软件工程师,他的根基是企业Java.

Expertise

PREVIOUSLY AT

Discovery Limited,南非
Share

当涉及到网站和web应用程序的开发时,JavaScript很容易成为最常用的语言. 资源之多令人震惊,而可用的库的数量更是如此.

At first, these libraries are few and easy to maintain; however, 很快就会出现依赖地狱,需要一个更成熟的解决方案.

npm可能是JavaScript中最流行的包管理器.

进入Node包管理器(npm)——一个JavaScript包管理器,通常与 Node.js,尽管它也可以独立使用. 它为您提供了对项目依赖项的特殊控制,并提供了一种为开源世界做出贡献的好方法.

你可以从简单的跑步开始 npm install 并将其注入到JavaScript文件中.

想要安装特定的版本? No problem. Run npm install @1.2.3.

想要全局安装一个包(比如Mocha,或者Angular-CLI)? Just add a -g like so: NPM install -g angular-cli mocha.

诚然,大多数用例都停留在npm安装上,不需要其他任何东西. However, NPM有很多额外的特性, 我来教你怎么做, 强调那些我认为重要的, really useful, or just plain awesome.

CLI commands

CLI是用户花大部分时间与npm交互的地方, 它的帮助界面也很有用.

Querying help (npm help)会弹出一个完整的选项数组,然后运行 npm help-search 为您提供直接来自NPM markdown的搜索结果列表.

以下是突出的核心命令.

  • install这里提到它是因为它在使用npm时是绝对必要的. 用于本地或全局安装新包(当添加 -g中列出的依赖项 package.json 文件(稍后详细介绍).

  • uninstall这也是必不可少的. 它用来清除特定的包裹 node_modules 本地或全局目录(添加时) -g).

  • access:这是npm用户权限管理员在npm-organizations和scoped (private)包上下文中的游乐场. Seriously powerful stuff. Used in conjunction with adduser, owner, team等等,它提供了细粒度控制谁可以访问什么.

  • bin软件包究竟安装在哪里? 执行此命令查看文件的绝对路径.

  • cache如果你从npm的左边、右边和中间开始安装包,这个命令非常有用. Either call it with the ls 子命令查看本地缓存包的列表,或者使用 clean 子命令清除缓存中的所有包. 在npm注册表还不太稳定的时候, 这对于恢复稳定的环境或在未正确设置NPM权限时重置内容至关重要.

  • config我们将在后面讨论不同的配置选项, 但是,该命令主要处理在本地或全局配置文件中持久化配置属性的问题 set, get or delete subcommands.

  • dedupe or ddp:当在一个项目上工作了很长一段时间,并直接从npm安装包时, 该命令将遍历本地包树并尝试简化依赖项.

  • link:当你在开发自己的npm包时, 这允许您创建一个指向全局上下文的符号链接,以便可以测试它,就好像它是从NPM注册表全局安装的一样. 例如,如果你正在写一个 assembly 全局安装了CLI的节点中的工具, 您可以运行此命令并测试CLI的行为,而无需首先部署它.

  • ls:它用于可视化包的依赖关系及其依赖关系,以树状结构呈现. 这看起来很酷,并且对于与其他项目进行比较也很有用.

  • outdated:这用于评估已安装依赖项的当前状态,以及它们是否过时. 在根依赖项列表长达数百行的项目中, 手工检查包裹几乎是不可能的. Adding -g --depth=0 该命令还允许您检查全局安装的包.

  • publish在为npm开发自己的包时,这个命令是必不可少的. It does exactly as the name suggests; it publishes your package to the npm registry.

  • search:使用它在注册表中搜索包含第三个参数中提供的文本的所有包.

  • shrinkwrap: In short, 该命令允许您按顺序锁定包中的特定依赖版本, 因此,一个放松的semver (semantic versioning)数字不会破坏生产代码.

  • star你真的喜欢你正在使用的套餐吗? 使用这个命令可以直接从终端显示您的赞赏, 然后在NPM注册表上的包页面上反映出来.

  • update这通常跟在 outdated 命令更新任何过时的包.

  • version这给了你一个快捷的方式 package.json 版本属性,并做一个git标签.

请注意,这些命令中的大多数都可以接受子命令和/或配置, 这个列表绝不是关于CLI的所有讨论的结束.

npm-config

配置是npm的主要部分,有多种方式可以设置配置变量.

通过CLI和环境变量进行配置

首先,可以在终端通过命令行进行配置.

它通常看起来像这样: npm -- [].

如果未指定该值,则默认将该选项设置为true.

For example, 假设你正在处理一个有作用域的(私有的)NPM包, 你决定把它作为一个公共包发布.

这很容易通过追加来完成 --access=public to your publish command. 如果没有将属性指定为public,则默认属性将受到限制(private)。.

像这样附加到其他命令的配置不会保存在任何地方, 因此,通过CLI设置一系列配置可能会变得令人厌烦.

在这些情况下,使用环境变量设置配置可能会更好.

设置的任何环境变量 npm_config_ Prefix将用于配置NPM.

For example: 出口npm_config_registry = localhost: 4321 是否全局设置注册表配置选项, 当NPM执行时,它将使用位于端口4321上的localhost上的NPM注册表.

通过npmrc文件进行配置

您还可以使用特殊的 .npmrc 文件,可以根据需要设置不同的级别:

  • 项目级:在项目代码的根目录中,连同它的 package.json file, typically path/to/project/.npmrc
  • 用户级:通常配置特定用户帐户的目录 ~/.npmrc
  • 全局级:npm查找全局配置的目录 $PREFIX/etc/npmrc
  • 内置级别:要谨慎. 这个配置不仅是全局的,而且也是npm源代码的一部分, 最佳实践建议(实际上是要求)不要更改我们不负责维护的代码. 它通常可以在 /path/to/npm/npmrc.

中的配置设置 .npmrc file可以在CLI中修改和持久化,命令格式如下: npm config set .

For example, you can run NPM config set access public 将作用域(私有)包的发布配置永久公开.

By default, 该命令将在本地持久化配置(如上所述的用户级配置), but you can add -g to persist it globally.

当需要在项目级别或内置级别上进行持久化配置时 .npmrc 文件必须使用文本编辑器修改.

通过包进行配置.json

最后,可以从 package.json file. However, 很少使用(只有在明确需要时才应该使用), because a project level .npmrc File通常是设置包配置的首选位置.

重要的配置设置

  • access如上所述,它用于设置权限.

  • always-auth需要注意的是,此设置默认为false. 当它被设置为true时,npm在联系注册表时总是需要身份验证.

  • ca:默认为npm证书颁发机构(CA). 可以将其更改为null,以只允许访问已知的注册商, 或特定的CA证书,以仅授予对该特定证书的访问权限. This setting, along with cafile, cert and strict-ssl, are seldom used, 但是谈到NPM的安全性和可靠性方面, 让您放心,您正在安装的软件包来自您期望的源代码.

  • color: This defaults to true, 让你从标准的黯淡终端机中解脱出来,通过着色 stdout tty文件描述符允许这样做. 如果设置为false,则终端保持无响应. When it is set to always,它总是以彩色输出.

  • depth:此设置允许对递归命令所看到的内容进行粒度控制,例如 lsand outdated通过分配他们被执行的深度. 值为0将只计算第一层依赖关系,而无穷大(默认值)将导致计算所有级别的依赖关系. 此规则的例外情况是与 outdated; in that case, infinity is interpreted as 0 to ensure more relevant output.

  • dev:默认情况下设置为false,但是当它被设置为true时(当执行命令时) npm install的所有开发依赖项 package.json 文件将与正常的依赖项一起安装.

  • dry-run:当设置为true时, NPM不会对你的包做任何修改,而是告诉你它应该做什么. 这在运行某些命令时非常有用,例如 dedupe or update.

  • git-tag-version:默认为true. 这个设置在git中标记一个版本 npm version command. 如果你正在使用npm作为一个大型项目的包管理器,该项目在git中有标记的版本, it can save you time, 记住要更新 package.json file for you.

  • loglevel:默认设置为 warn,它会在运行NPM命令时给出错误和警告输出. Other settings include silent,不提供输出; error,它只将错误记录到输出; http,它只宣布HTTP请求错误; info,表示需要信息输出); verbose, which logs almost everything; and silly,顾名思义,它给出了一个愚蠢的输出量,然后是一些.

  • production:当该参数被设置为true时,npm会相应地执行,并在生产模式下运行所有命令. 这意味着不会安装开发或可选依赖项, 也不会执行任何与开发相关的任务.

  • rollback:当设置为true时,将删除所有失败的安装. 当依赖项安装失败时,这将派上用场. 这取决于您的日志级别, 您应该能够看到哪些安装失败了, make a note of these, and run the npm install 命令,回滚选项设置为true. 然后,使用您的注释和一个试运行安装(如上所述),您就可以调试问题了.

  • save:当直接从注册表安装包时,您可以附加 –save 的依赖项选项中添加已安装的包 package.json file. For example, NPM install lodash '会将lodash添加到你的依赖项中.

  • save-dev:与保存配置选项类似,添加 --save-dev 的devDependencies选项中添加 package.json file.

  • save-optional:与保存配置选项类似,添加 --save-optional 选项中的optionalDependencies选项 package.json file.

  • save-exact:安装软件包时,使用 save, save-dev and save-optional options modify the package.json 使用semver范围操作符将已安装的包插入到其各自的属性中. 当调用值为true的' save-exact '配置设置时, 与上面提到的一个设置一起使用, 使用特定的版本号, 忽略semver范围.

  • save-prefix:在使用时设置服务器范围操作符 save, save-dev or save-optional. The default is ^,允许在安装时对软件包进行小的升级. 这可以设置为任何有效的带前缀的服务器范围操作符.

  • tag-version-prefix:常规默认值为 v,指定运行时附加到git标签版本的内容 npm version.

Updating npm Using npm

你也可以使用npm来更新自己.

Simply run NPM install -g npm@latest, NPM将更新到最新的稳定版本. 值得注意的是,每个版本的 Node.js 附带特定版本的NPM, and in my experience, 你不应该过多地使用这种配对.

最后,我的建议是坚持按照预期的方式进行配对.

当使用npm作为一个独立的工具, 确保您理解使用您选择的任何版本的含义. 有一个很好的工具可以管理不同的Node.Js版本(以及NPM版本)在同一个系统上调用 nvm.

The package.json File

The package.json 文件是连接一切的关键元素.

这是将包发布到npm注册表的必要条件, 这就是依赖关系的管理部分发挥作用的地方.

它有两个必填字段, 即“名称”和“版本”,这些属性加在一起应该是一个唯一的标识符.

名称字段应该遵循某些规则,如 关于命名的NPM文档, version字段受 semver specificiations.

npm reads the package.Json文件用于依赖管理.

Over and above that, 你可以有一个一英里长的依赖项列表, 并定义一个特定的版本,用于每一个, 使用semver版本和范围操作符. 以下是其他值得注意的属性列表.

“main”

" main "定义应用程序的入口点,默认为 index.js. 根据惯例或您的框架,它可能是 app.js or main.js. 当然,你可以随心所欲.

“scripts”

这是一个被低估的属性.

首先,它可以用来做预发布的事情.

Second, 它提供了一个地方,您可以在其中为经常使用的命令数组设置别名, 从构建任务(在gulp或grunt中定义), 触发其他依赖项的安装(使用类似于bower的东西), 用webpack启动一个开发服务器, 或者运行一组bash命令.

“dependencies”

此属性是应用程序所需的包的列表, 以及兼容的服务器号. 这是一个值得注意的属性,因为它可以在安装本地包时从终端修改.

This is done by adding --save (or the shorthand -S) at the end of the npm install command.

当您执行此操作时,新安装包将被添加到您的 package.json file.

类似地,也可以通过添加 --save when running the npm uninstall command.

了解每个依赖项的服务器版本控制模式及其含义非常重要.

如果semver规则太严格, 你失去了新功能和改进, 然而,如果semver规则太宽松, 一个包的中断版本可以沿着这条线安装.

损坏的包安装可能很难解决, 特别是当使用包的缩小版本时.

“devDependencies”

从dependencies属性中分离出来, " devDependencies "属性允许你定义只在开发阶段使用的依赖,而不是生产构建(如ESLint)所需要的依赖, grunt-contrib packages, and Protractor). 与依赖项一样,可以在终端通过添加 --save-dev (or the shorthand -D) to the end of the npm install command or the npm uninstall command. 同样的注意事项也适用于依赖项中提到的版本控制.

“bin”

在这里,您可以指定包的可执行文件,例如CLI实用程序的路径. 这个属性告诉npm在安装包时创建本地或全局符号链接到你的可执行文件.

“config”

如前所述,这是通过您的 package.json file.

“private”

当设置为true时,npm将拒绝发布包.

不应将此与访问配置设置混淆.

当你的项目使用npm和它的 package.json 但它不打算发布到NPM注册中心,无论是范围还是公共.

如果你的意图改变了, 只需将设置更改为false, 然后你就可以发布你的包了.

Custom Properties

The package.json 文件也接受自定义属性,只要名称尚未定义或保留.

开发自己的npm包

npm生态系统中充满了包, 由世界各地数千名不同的开发人员编写. 每个都解决了某种问题, providing an abstraction, 或者展示某物的实现.

很有可能,在某些时候,您也希望开发自己的包来共享.

首先,您需要编写一个 package.json 具有最小要求属性“name”和“version”的文件, 然后是“main”属性来指定入口点, for example index.js.

在该索引中编写代码.js file, 使用您的NPM用户帐户登录, 或者从终端创建一个新用户, 现在就可以将它发布到NPM注册表了.

包可以是公共的也可以是私有的.

公共包可以免费发布,并且每个人都可以使用.

Private packages, called scoped packages, 只能发布,如果你付费的私人模块用户, 它们可以被区分开来 @username/ 它附加在包名之前.

作用域化的包也可以通过调用 publish command with --access=public.

Furthermore, 如果您花更多的时间扩展和改进包的代码库, 现在是出版新版本的时候了, 中包的版本(根据服务器规则和惯例)进行更改 package.json file and type npm publish.

您也可以使用命令行接口和调用 npm version ,其中update_type为 patch, minor, or major的版本号,然后自动增加 package.json file.

npm Organizations

Again, the npm documentation 因为这是极好的,只是重复他们的话是徒劳的.

关于npm上下文中的组织,可以说它是非常细粒度的, 如果管理得当, 大型团队和个人, 在一个名称下处理作用域或公共包, 可以很好地管理和限制吗.

虽然掌握起来很复杂,但却非常值得.

The Power of npm

最后,npm提供的文档非常广泛,应该参考它们了解细节, 但是本文提供了对基本和高级的有用概述, involved functionality, 传达NPM的妙处.

与所有的事情一样,强烈的意见是存在的,也会发现许多缺点. 但是,如果您从未尝试过npm(或node),那么请深入研究,并亲自探索它. 很有可能你会比你想象的更喜欢它.

有关npm的更多有趣文章,请考虑阅读 Using Scala.使用npm和Browserify.

聘请Toptal这方面的专家.
Hire Now
Martin Gouws

Martin Gouws

Verified Expert in Engineering

南非豪登省比勒陀利亚

2016年11月7日成为会员

About the author

Martin是一位年轻而有才华的JavaScript开发人员和软件工程师,他的根基是企业Java.

作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Expertise

PREVIOUSLY AT

Discovery Limited,南非

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 privacy policy.

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 privacy policy.

Toptal Developers

Join the Toptal® community.