npm 指南:Node.js 包管理器

已发表: 2022-03-11

在开发网站和 Web 应用程序时,JavaScript 很容易成为最常用的语言。 资源之多令人震惊,可用图书馆的数量更是惊人。

起初,这些库很少且易于维护; 但是,很快就会出现依赖地狱,需要更成熟的解决方案。

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

进入 Node Package Manager (npm)——一个 JavaScript 包管理器,最显着地与 Node.js 结合使用,尽管它也可以独立使用。 它使您可以对项目的依赖项进行出色的控制,并提供了一种为开源世界做出贡献的好方法。

您可以通过简单地运行npm install <package name>并将其注入到您的 JavaScript 文件中开始。

想要安装特定版本? 没问题。 运行npm install <package name>@1.2.3

想要全局安装包(如 Mocha 或 Angular-CLI)? 只需像这样添加-gnpm install -g angular-cli mocha

诚然,大多数用例都在 npm 安装时停止,不需要其他任何东西。 然而,npm 有很多额外的功能,我将引导你完成,重点介绍我认为必不可少的、真正有用的或非常棒的那些。

CLI 命令

CLI 是用户大部分时间与 npm 交互的地方,它的帮助界面实际上很有帮助。

查询帮助 ( npm help ) 会输出一整套选项,运行npm help-search <searchText>会直接从 npm 降价中为您提供搜索结果列表。

以下是突出的核心命令。

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

  • uninstall :这也是必不可少的。 它用于在本地或全局(添加-g时)从node_modules目录中清除特定包。

  • access :这是上下文 npm-organizations 和范围(私有)包中 npm 用户权限管理员的游乐场。 非常强大的东西。 与adduserownerteam等一起使用,它可以细粒度地控制谁可以访问什么。

  • bin : 包到底安装在哪里? 运行此命令以查看绝对文件路径。

  • cache :如果你从 npm left、right 和 center 开始安装包,这个命令非常有用。 使用ls子命令调用它以查看本地缓存包的列表,或者使用clean子命令清除缓存中的所有包。 回到 npm 注册表仍然有点不稳定的时候,这对于回到稳定的环境或在您没有正确设置 npm 权限时重置事物至关重要。

  • config :稍后我们将介绍不同的配置选项,但此命令主要处理通过使用setgetdelete子命令在本地或全局配置文件中持久化配置属性。

  • dedupeddp :当长时间从事项目并直接从 npm 安装包时,此命令将遍历本地包树并尝试简化依赖关系。

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

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

  • outdated :这用于评估已安装依赖项的当前状态以及它们是否已过时。 在根依赖列表长达数百行的项目中,手动检查包几乎是不可能的。 将-g --depth=0添加到此命令中,您还可以检查全局安装的软件包。

  • publish :在为 npm 开发自己的包时,此命令是必不可少的。 顾名思义,它确实如此; 它将你的包发布到 npm 注册表。

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

  • shrinkwrap :简而言之,此命令允许您按顺序锁定包中的特定依赖项版本,以便宽松的 semver(语义版本控制)编号不会破坏生产代码。

  • star :你真的喜欢你正在使用的包吗? 使用此命令直接从终端表达您的赞赏,然后反映在 npm 注册表上的包页面上。

  • update :这通常遵循outdated的命令来更新任何过时的包。

  • version :这为您提供了一种简写方式来提升package.json版本属性,并合而为一地执行 git 标记。

请注意,这些命令中的大多数都可以采用子命令和/或配置,并且此列表绝不是对 CLI 的最终讨论。

npm-配置

配置是 npm 的主要部分,可以通过多种方式设置配置变量。

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

首先,可以从终端通过 CLI 设置配置。

通常它看起来像这样: npm <command> --<configuration option> [<optional value>]

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

例如,假设您正在处理一个作用域(私有)npm 包,并且您决定将其发布为公共包。

这很容易通过将--access=public附加到您的publish命令来完成。 如果我们没有将属性指定为公共,则默认为受限(私有)。

像这样附加到其他命令的配置不会随处保留,因此通过 CLI 设置一组配置会变得很烦人。

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

任何带有npm_config_前缀的环境变量都将用于配置 npm。

例如: export npm_config_registry=localhost:4321将全局设置注册表配置选项,当执行 npm 时,它将使用位于 localhost 端口 4321 上的 npm 注册表。

通过 npmrc 文件进行配置

您还可以使用特殊的.npmrc文件设置配置选项,该文件可以根据您的要求设置为不同的级别:

  • 项目级别:在项目代码及其package.json文件的根目录中,通常是path/to/project/.npmrc
  • 用户级别:配置特定用户账户的目录,一般为~/.npmrc
  • 全局级别:npm 查找全局配置的目录,通常$PREFIX/etc/npmrc
  • 内置级别:小心。 此配置不仅是全局的,而且也是 npm 源代码的一部分,最佳实践建议(实际上是要求)我们不要更改我们不负责维护的代码。 它通常可以在/path/to/npm/npmrc中找到。

.npmrc文件中的配置设置可以使用 CLI 通过运行以下格式的命令进行修改和持久化: npm config set <key> <value>

例如,您可以运行npm config set access public以使作用域(私有)包的发布配置永久公开。

默认情况下,此命令将在本地持久化配置(如上所述的用户级别配置),但您可以添加-g以将其全局持久化。

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

通过 package.json 配置

最后,可以从package.json文件中设置配置。 但是,这很少使用(只有在明确需要时才应使用),因为项目级别的.npmrc文件是设置包配置的传统首选位置。

值得注意的配置设置

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

  • always-auth :请务必注意,此设置默认为 false。 当它设置为 true 时,npm 在联系注册表时将始终要求身份验证。

  • ca :默认为 npm 证书颁发机构 (CA)。 可以将其更改为 null 以仅允许访问已知注册商,或更改为特定 CA 证书以仅授予对该特定注册商的访问权限。 此设置以及cafilecertstrict-ssl很少使用,但谈到 npm 的安全性和可靠性方面,让您可以放心地知道您正在安装的软件包来自您期望的源。

  • color :默认为 true,通过着色stdout文件描述符允许的标准输出,让您摆脱终端的标准黯淡。 如果设置为 false,则终端仍然是枯燥的。 当它设置为always时,它总是以彩色输出。

  • depth :此设置允许通过指定执行的深度来精细控制使用递归命令(例如lsoutdated )看到的内容。 值 0 将仅评估第一级依赖关系,而无穷大(默认值)将导致评估所有级别的依赖关系。 此规则的例外是与outdated一起使用时; 在这种情况下,无穷大被解释为 0 以确保更相关的输出。

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

  • dry-run :当此设置设置为 true 时,npm 不会对您的包进行任何更改,而是会告诉您它会做什么。 这在运行某些命令时非常有用,例如dedupeupdate

  • git-tag-version :默认设置为 true。 运行npm version命令时,此设置在 git 中标记版本。 如果您使用 npm 作为在 git 中标记了版本的大型项目的包管理器,它可以节省您的时间,并记得为您更新package.json文件。

  • loglevel :默认设置为warn ,在运行 npm 命令时会给出错误和警告输出。 其他设置包括silent ,它不提供输出; error ,仅将错误记录到输出; http ,只通告http请求错误; info ,用于需要信息输出); verbose ,几乎记录所有内容; 和silly ,就像名字所暗示的那样,它给出了一个愚蠢的输出量,然后是一些。

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

  • rollback :设置为 true 时,将删除所有失败的安装。 当依赖项安装失败时,这会派上用场。 根据您的日志记录级别,您应该能够查看哪些安装失败,记下这些,然后运行npm install命令并将回滚选项设置为 true。 然后使用您的笔记和试运行安装(如上所述),您可以调试问题。

  • save : When installing a package directly from the registry, you can append –save to the command which will add the installed package to the dependencies option in the package.json file. For example, file. For example, npm install lodash` 会将 lodash 添加到您的依赖项中。

  • save-dev : 类似于 save 配置选项,在安装包时添加--save-dev ,然后会添加到package.json文件中的 devDependencies 选项中。

  • save-optional : 与 save 配置选项类似,在安装包时添加--save-optional ,然后将其添加到package.json文件中的 optionalDependencies 选项中。

  • save-exact :安装包时, savesave-devsave-optional选项通过使用 semver 范围运算符将已安装的包插入其各自的属性来修改package.json文件。 当调用值为 true 的“save-exact”配置设置时,结合上述设置之一,使用特定版本号,忽略 semver 范围。

  • save-prefix :这会在使用savesave-devsave-optional时设置 semver 范围运算符。 默认值为^ ,允许在安装时对包进行小幅升级。 这可以设置为任何有效的前缀 semver 范围运算符。

  • tag-version-prefix :常规默认值是v ,指定在运行npm version时添加到 git tag version 的内容。

使用 npm 更新 npm

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

只需运行npm install -g npm@latest ,npm 就会更新到最新的稳定版本。 重要的是要注意每个版本的 Node.js 都附带一个特定版本的 npm,根据我的经验,你不应该过多地混淆这种配对。

归根结底,我的建议是坚持按预期配对。

将 npm 用作独立工具时,请确保您了解使用您选择的任何版本的含义。 有一个很棒的工具可以在名为 nvm 的同一系统上管理不同的 Node.js 版本(以及 npm 版本)。

package.json 文件

package.json文件是将所有内容链接在一起的关键元素。

这是将包发布到 npm 注册表的要求,也是依赖项的管理部分发挥作用的地方。

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

name 字段应遵守 npm 命名文档中定义的某些规则,version 字段受 semver 规范的约束。

npm 读取 package.json 文件进行依赖管理。

除此之外,您可以拥有一英里长的依赖项列表,并使用 semver 版本和范围运算符定义要用于每个依赖项的特定版本。 这是其他值得注意的属性的列表。

“主要的”

“main” 定义应用程序的入口点,默认为index.js 。 根据约定或您的框架,它可能是app.jsmain.js 。 当然,您可以随意制作。

“脚本”

这是一个被低估的财产。

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

其次,它提供了一个可以为一系列常用命令设置别名的地方,包括构建任务(在 gulp 或 grunt 中定义)、触发安装其他依赖项(使用类似 bower)、使用 webpack 启动开发服务器或运行一组 bash 命令。

“依赖”

此属性是您的应用程序所需的包列表,以及兼容的 semver 编号。 这是一个值得注意的属性,因为可以在安装本地软件包时从终端进行修改。

这是通过在npm install命令末尾添加--save (或简写-S )来完成的。

执行此操作时,新安装的包将添加到package.json文件中的依赖项列表中。

同样,也可以通过在运行npm uninstall命令时添加--save来删除依赖项。

了解每个依赖项的 semver 版本控制模式及其含义非常重要。

如果 semver 规则过于严格,您将失去新功能和改进,而如果 semver 规则过于宽松,则可以沿线安装软件包的破坏版本。

损坏的软件包安装可能很难解决,尤其是在使用软件包的缩小版本时。

“开发依赖”

与 dependencies 属性分开,“devDependencies”属性允许您定义仅在开发阶段使用且生产构建不需要的依赖项(如 ESLint、grunt-contrib 包和 Protractor)。 与依赖项一样,可以通过在npm install命令或npm uninstall命令的末尾添加--save-dev (或简写-D )从终端修改此属性。 同样的注意事项也适用于依赖项下提到的版本控制。

“斌”

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

“配置”

如前所述,这是您通过package.json文件定义配置设置的地方。

“私人的”

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

这不应与访问配置设置相混淆。

当您有一个使用 npm 及其package.json的项目但它不打算发布到 npm 注册表(无论是作用域的还是公共的)时,这是一个方便的设置。

如果您的意图发生变化,只需将设置更改为 false,您就可以发布您的包。

自定义属性

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

开发你自己的 npm 包

npm 生态系统充满了包,由世界各地成千上万的不同开发人员编写。 每个都解决某种问题,提供抽象,或呈现某事的实现。

很有可能,在某些时候,您也会想要开发自己的包来分享。

首先,您需要创建一个package.json文件,其中包含“name”和“version”所需的最少属性,然后是“main”属性来指定入口点,例如 index.js。

在 index.js 文件中编写您的代码,使用您的 npm 用户帐户登录,或者从终端创建一个新用户,然后您就可以将其发布到 npm 注册表了。

包可以是公共的或私有的。

公共软件包可以免费发布,并且可供所有人使用。

私有包,称为作用域包,只有在您向私有模块用户付费的情况下才能发布,并且它们可以通过附加在包名称前面的不同@username/来标识。

范围包也可以通过使用--access=public调用publish命令来公开发布。

此外,如果您花费更多时间扩展和改进包的代码库,并且是时候发布新版本了,您只需在package.json中更改包的版本(根据 semver 规则和约定)文件并输入npm publish

您还可以使用命令行界面并调用npm version <update_type> ,其中 update_type 是patchminormajor ,如 semver 所述,然后会自动增加package.json文件中的版本号。

npm 组织

同样,这方面的 npm 文档非常好,重复他们的话是徒劳的。

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

虽然掌握起来很复杂,但它非常有益。

npm 的力量

归根结底,npm 提供的文档是广泛的,应该查阅具体细节,但本文提供了对基本和更高级的相关功能的有用概述,传达了 npm 的强大之处。

与所有事物一样,存在强烈的意见,并且可以发现许多错误。 但是,如果您从未尝试过 npm(或 node,就此而言),请潜入并自己探索它。 您可能会比您想象的更享受它。

有关 npm 的更多有趣文章,请考虑阅读 Using Scala.js with npm and Browserify。