“无关紧要”的小知识点:“xx Packages Are Looking for Funding”——npm fund 命令及运行机制
在 Node.js 和 npm
生态系统中,开源项目的持续发展和维护常常依赖于贡献者的支持和资助。为了让开发者更容易了解他们依赖的项目哪些有资金支持选项,npm 在6.13.0
版本起引入了 npm fund
命令并默认在npm install
安装依赖时触发。本文将详细介绍 npm fund
的作用、运行机制、触发时机、如何避免触发以及相关的副作用和改进建议。
什么是 npm fund 命令?
在日常npm install
安装依赖的过程中,我们可能都忽略了 command 最后输出的一些信息,比如本文相关的 funding 信息,如:
3 packages are looking for funding.
Run "npm fund" to find out more.
npm fund
命令是在 npm 6.13.0
版本中首次引入的,旨在帮助开发者识别其项目依赖中可以资助的开源包。运行该命令时,npm 会列出所有包含资助选项的包及其相关链接,便于开发者快速访问这些页面并提供支持。
命令起源
在 2019 年 8 月份时,Standard JS 在其开源项目中内置广告的事件引发热议,这些广告通过一个名为 Funding
的 npm
软件包展示在终端,该软件包包含在 Standard
的代码库中。之后 npm
公司宣布将禁止此类终端广告行为。
此事件后,npm
公司表示,它打算在年底前为开源开发人员开发一个众筹平台,于是乎在npm 6.13.0
版本上提供了相应支持,这就是npm fund
命令的主要由来。
命令作用
- 显示资助信息:
npm fund
会扫描项目中的node_modules
目录,查找每个包的package.json
文件中是否包含funding
字段。它会将有资助选项的包及其资助链接列出。 - 支持开源生态:通过此功能,
npm
提高了对开源项目资助的透明度,鼓励开发者参与到开源项目的资助中,帮助维护者获得资金支持。
使用方法
基本用法非常简单,只需在项目根目录中运行:
npm fund
命令将输出形如:
xx packages are looking for funding
run `npm fund` for details
再运行 npm fund,就会显示类似如下的详细信息:
package-name https://example.com/donate
如:
├─┬ https://opencollective.com/typescript-eslint
│ │ └── @typescript-eslint/eslint-plugin@4.28.5, @typescript-eslint/experimental-utils@4.28.5, @typescript-eslint/types@4.28.5, @typescript-eslint/typescript-estree@4.28.5, @typescript-eslint/visitor-keys@4.28.5, @typescript-eslint/scope-manager@4.28.5, @typescript-eslint/parser@4.28.5
│ └─┬ https://opencollective.com/eslint
│ │ └── eslint@6.8.0
│ ├── https://github.com/sponsors/epoberezkin
│ │ └── ajv@6.12.6
│ ├── https://github.com/sponsors/sindresorhus
│ │ └── globals@12.4.0, import-fresh@3.3.0, strip-json-comments@3.1.1, ansi-escapes@4.3.2, type-fest@0.21.3, figures@3.2.0, onetime@5.1.2, globby@11.0.4
│ ├── https://github.com/sponsors/isaacs
│ │ └── glob@7.2.3
│ ├─┬ https://github.com/chalk/chalk?sponsor=1
│ │ │ └── chalk@4.1.2
│ │ └── https://github.com/chalk/ansi-styles?sponsor=1
│ │ └── ansi-styles@4.3.0
│ └── https://github.com/sponsors/ljharb
│ └── minimist@1.2.8, is-generator-function@1.0.9, qs@6.11.2, side-channel@1.0.4, call-bind@1.0.2, get-intrinsic@1.1.1, has-symbols@1.0.2, object-inspect@1.11.0
├── https://github.com/sponsors/RubenVerborgh
│ └── follow-redirects@1.15.2
└── https://ko-fi.com/tunnckoCore/commissions
└── formidable@1.2.2
npm fund 的运行机制和触发时机
运行机制
- 依赖扫描:
npm fund
会读取node_modules
中每个依赖包的package.json
文件,寻找funding
字段。如果找到了该字段,它会提取并显示相关的资助信息。- 字段格式:
funding
字段可以是 URL 字符串或更复杂的对象,指向资助页面。例如:
或者{ "funding": "https://example.com/donate" }
{ "funding": { "type": "individual", "url": "https://example.com/donate" } }
- 字段格式:
触发时机
npm install
提示:在安装项目依赖时,如果项目中存在可以资助的包,npm
会显示类似“xx packages are looking for funding”
的提示,提醒开发者可以运行npm fund
查看详细信息。(这也是我们日常主要触发的时机)- 显式调用:开发者可以手动运行
npm fund
命令,以查看当前项目中支持资助的所有包和资助链接。
如何避免 npm fund 的触发?
在某些情况下,开发者或企业可能希望在 npm install
过程中避免看到这些资助提示。以下是两种实现方式:
1. 在安装时使用 --no-fund
参数
直接在运行 npm install
时添加 --no-fund
参数:
npm install --no-fund
2. 修改 .npmrc
配置文件
在 .npmrc
文件中加入以下配置来永久禁用资助提示:
fund=false
此配置可以放在项目的根目录下(项目下的.npmrc
文件),仅作用于当前项目;也可以放在用户主目录(~/.npmrc
文件),作用于全局。
*可以通过
npm config ls -l
查看当前项目的npm
配置,默认情况下fund
配置会被设置为true
禁用 npm fund 的副作用
优点:
- 简洁输出:禁用
npm fund
提示可以减少npm install
的输出信息,使终端显示更加清晰。 - 减少干扰:在企业级项目中,开发者可能更专注于安装过程和依赖的调试,不需要额外的资助提示。
缺点:
- 支持意识减弱:禁用该提示后,开发者不再会注意到可以资助的依赖,可能错失支持有价值的开源项目的机会。
- 透明度降低:新加入的团队成员或不熟悉项目的开发者可能不知道项目中有哪些包有资助选项。
- 开源支持意识降低:从长远来看,减少对资助信息的提示可能会让开发者对支持开源项目的重要性淡化,从而减少对依赖项目的贡献和支持。
npm fund 源码
源码文件:https://github.com/npm/cli/blob/latest/lib/commands/fund.js
以目前(2024-11)的源码内容来看,其源码机制概括来说是先使用 npm
的内部模块库函数来遍历 node_modules
目录,读取 package.json
并检查是否有 funding
字段,最后将所有符合条件的包信息格式化输出到终端。
代码流程总结:
- 1.读取依赖树:使用
Arborist
加载项目的依赖树。 - 2.解析资助信息:通过
libnpmfund
的readTree
方法提取资助信息。 - 3.输出格式化:根据用户配置输出 JSON 格式或使用
archy
进行可读格式的输出。 - 4.链接打开:当提供了包名时,
openFundingUrl
会尝试在浏览器中打开该包的资助链接。
最后
npm fund
是 npm
引入的一个有用的命令,帮助开发者支持开源项目并维持开源生态的可持续发展。虽然在某些情况下禁用它有其合理性,但在默认情况下保留该提示可以提高团队对开源项目支持的意识。根据项目和团队的实际需求,开发者可以灵活选择是否禁用 npm fund
提示。
相关链接
- npm fund
- npm 6.13.0
- npm config——funding
- What does ‘x packages are looking for funding’ mean when running
npm install
? - npm cli document