NPM学习笔记

npm 是世界上最大的软件注册表。来自各大洲的开源开发人员都使用 npm 来共享和借用包,许多组织也使用 npm 来管理私有开发。

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
npm login #   登录
npm whoami # 查看当前登录用户
npm profile get # 查看当前用户信息。修改当前用户信息参考: https://docs.npmjs.com/managing-your-profile-settings
npm install npm@latest -g # 升级npm
npm -v # 查看npm版本

npm outdated # 查看所有已安装的包是否有更新
npm update # 更新所有已安装的包
npm update <package> # 更新指定包
npm update -g # 更新全局安装的包
npm update -g <package> # 更新全局安装的指定包
npm outdated -g # 查看全局安装的包是否有更新
npm update -g <package> # 更新全局安装的指定包

npm uninstall # 卸载所有已安装的包
npm uninstall <package> # 卸载指定包
npm uninstall -g # 卸载全局安装的包
npm uninstall -g <package> # 卸载全局安装的指定包

npm audit # 查看安全漏洞
npm audit fix # 扫描项目以查找漏洞,并自动为易受攻击的依赖项安装任何兼容的更新
npm audit fix --force # 强制修复安全漏洞
npm audit fix --package-lock-only # 只修复 package-lock.json 中的安全漏洞

npm cache add <package-spec> # 将包添加到缓存
npm cache clean [<key>] # 清除缓存。请注意,这通常是不必要的,因为 npm 的缓存是自我修复的,并且能够抵抗数据损坏问题。除了回收磁盘空间之外,永远不需要出于任何原因清除缓存。
npm cache ls [<name>@<version>] # 列出缓存中的包
npm cache verify # 验证缓存的包

npm ci # 类似于 npm install,主要用于自动化平台。1. 项目必须具有现有的 package-lock.json。2. 如果 package-lock.json 与 package.json 依赖项不匹配,npm ci 将退出并显示错误。3. npm ci 一次只能安装整个项目,不能添加单个依赖项。4. 自动删除已存在的 node_modules。5. npm ci 永远不会写入 package.json 或 package-lock.json。

npm config set <key>=<value> [<key>=<value> ...] # 设置 npm 配置项
npm config get [<key> [<key> ...]] # 获取 npm 配置项
npm config delete <key> [<key> ...] # 删除 npm 配置项
npm config list [--json] # 列出 npm 配置项
npm config ls -l # 列出 npm 内部的配置项
npm config edit # 编辑 npm 配置项
npm config fix # 修复 npm 配置项

npm dedupe # 递归地删除重复的依赖项

npm doctor # 检查 npm 配置

npm outdated [<package-spec> ...] # 列出所有已安装的包是否有更新

npx # 运行 npm 包的无需安装的可执行文件

pnpm store path # 查看 pnpm 返回活跃的存储目录的路径

设置代理

1
npm config set proxy http://username:password@server:port

关于 Https

经过上面设置使用了 http 开头的源,因此不需要设 https_proxy 了,否则还要增加一句:

1
npm config set https-proxy http://username:password@server:port

取消代理

1
2
npm config delete proxy
npm config delete https-proxy

运行脚本

调用 package.json 的参数

1
2
3
4
5
6
7
8
{
"config": {
"test_key": "123abc"
},
"scripts": {
"show-test-key": "echo $npm_package_config_test_key"
}
}

传递参数

1
2
3
4
5
6
{
"scripts": {
"xo": "xo",
"xo:fix": "npm run xo -- --fix"
}
}

Adding the -- --fix option is like executing xo --fix.

前脚本后脚本

1
2
3
4
5
6
7
{
"scripts": {
"pretest": "echo 'This runs before the test script.'",
"test": "echo 'This is the test script.'",
"posttest": "echo 'This runs after the test script.'"
}
}

在此示例 npm run test 中,将按所述执行这些脚本。

与 pnpm 不同,pnpm 不会执行前后脚本,参考 https://pnpm.io/zh/cli/run#%E4%B8%8E-npm-run%E7%9A%84%E4%B8%8D%E5%90%8C%E4%B9%8B%E5%A4%84

生命周期

参考 https://docs.npmjs.com/cli/v10/using-npm/scripts#life-cycle-operation-order

更新 NPM 版本

1
npm install -g npm@latest

设置 init 命令的配置选项

1
2
3
4
5
npm set init-author-email "example-user@example.com"
npm set init-author-name "example_user"
npm set init-license "MIT"

npm init -y

指定 dependencies 和 devDependencies

1
2
3
4
5
# 指定 dependencies
npm install <package-name> [--save-prod]

# 指定 devDependencies
npm install <package-name> [--save-dev]

重启

1
npm restart

如果当前项目具有 中 package.json 指定的脚本,则将运行以下 “restart” 脚本:

  1. prerestart
  2. restart
  3. postrestart

如果它没有指定脚本 “restart” ,但它确实有 stop and/或 start 脚本,则将运行以下脚本:

  1. prerestart
  2. prestop
  3. stop
  4. poststop
  5. prestart
  6. start
  7. poststart
  8. postrestart

npmrc

npm 从命令行、环境变量和 npmrc 文件中获取其配置设置。

每个项目的配置文件

在项目中本地工作时,项目根目录中 .npmrc 的文件(即 node_modulespackage.json 的同级)将设置特定于此项目的配置值。

请注意,这仅适用于运行 npm 的项目的根目录。当您的模块发布时,它不起作用。例如,您不能发布强制自身全局安装或安装在其他位置的模块。

此外,在全局模式下不会读取此文件,例如在运行 npm install -g 时。

每个工作区配置文件

pnpm 的特性,包含 pnpm-workspace.yaml 文件的目录。

每用户配置文件

$HOME/.npmrc (或 userconfig 参数,如果在环境或命令行中设置)。

全局配置文件

$PREFIX/etc/npmrc (或 globalconfig 参数,如果在环境或命令行中设置)。

环境变量

npm_config_ 前缀的环境变量将覆盖 npmrc 文件中的任何设置。

命令行选项

npm config set 命令将覆盖 npmrc 文件中的任何设置。

cnpm

store-dir

所有包被保存在磁盘上的位置。

1
npm config set store-dir ~/.pnpm-store
  • 默认值:
    • If the $PNPM_HOME env variable is set, then $PNPM_HOME/store
    • 如果设置了 $XDG_DATA_HOME 环境变量,则为 $XDG_DATA_HOME/pnpm/store
    • 在 Windows 上: ~/AppData/Local/pnpm/store
    • 在 macOS 上: ~/Library/pnpm/store
    • 在 Linux 上: ~/.local/share/pnpm/store
  • 类型:path

package.json

name

  • 名称必须小于或等于 214 个字符。这包括作用域包的作用域。
  • 作用域包的名称可以以点或下划线开头。如果没有范围,这是不允许的。
  • 新包的名称中不得包含大写字母。
  • 该名称最终成为 URL 的一部分、命令行上的参数和文件夹名称。因此,名称不能包含任何非 URL 安全字符。
  • 不要使用与核心 Node 模块相同的名称。
  • 不要在名称中加入“js”或“node”。
  • 该名称可能会作为参数传递给 require(),因此它应该简短,但也具有合理的描述性。
  • 在你过于依恋它之前,你可能想检查一下 https://www.npmjs.com,看看是否已经有这个名字的东西。

version

1
npm install semver

files

可选。类似.gitignore语法。

.npmignore文件可以排除文件。

main

main 字段是一个模块 ID,它是程序的主要入口点。也就是说,如果您的软件包被命名为 foo ,并且用户安装了它,然后进行了 require("foo") 安装,则将返回主模块的导出对象。

如果 main 未设置,则默认位于 index.js 包的根文件夹中。

config

“config”对象可用于设置包脚本中使用的配置参数,这些参数在升级后保持不变。例如,如果一个包包含以下内容:

1
2
3
4
5
6
{
"name": "foo",
"config": {
"port": "8080"
}
}

可以用 npm_package_config_port 引用。

engines

您可以指定您的内容所使用的 node 或 npm 版本:

1
2
3
4
5
6
{
"engines": {
"node": ">=0.10.3 <15",
"npm": "~1.0.20"
}
}

除非用户设置了 engine-strict 配置标志,否则此字段仅是建议字段,并且仅在包作为依赖项安装时才会生成警告。

os

您可以指定模块将在哪些操作系统上运行:

1
2
3
4
5

{
"os": ["darwin", "linux"],
"os": ["!win32"]
}

主机操作系统由以下因素 process.platform 决定。

cpu

如果您的代码仅在某些 CPU 架构上运行,您可以指定哪些架构。

1
2
3
4
{
"cpu": ["x64", "ia32"],
"cpu": ["!arm", "!mips"]
}

主机体系结构由以下因素 process.arch 决定

package-lock.json

package-lock.json 对于 npm 修改树或 node_modules package.json .它描述了生成的确切树,以便后续安装能够生成相同的树,而不考虑中间依赖项更新。

npm-shrinkwrap.json

区别在于 package-lock.json 无法发布,如果在根项目以外的任何地方找到它,它将被忽略。

相比之下,npm-shrinkwrap.json 允许发布,并从遇到的点定义依赖关系树。除非部署 CLI 工具或以其他方式使用发布过程来生成生产包,否则不建议这样做。

如果 和 npm-shrinkwrap.jsonpackage-lock.json 存在于项目的根目录中, npm-shrinkwrap.json 则优先 package-lock.json 并被忽略。

工作区

参考 https://docs.npmjs.com/cli/v10/using-npm/workspaces