NodeJs 第四章(详解npm)

255 阅读13分钟

介绍

公共 npm 注册表是 JavaScript 包的数据库,每个包都由软件和  package.json 文件描述的文件或目录。包含 package.json 文件才能发布到 npm 注册表。 注意,npm 支持发布公共包和私有两种包,由于私有包需要付费这里大部分公司都采用的是私有镜像来管理包。

npm 的安装

在安装node的时候会自动安装npm

略...

npm 的注册

注册

image.png 在用户注册表单中,输入以下字段:

  • 用户名: 当你在 npmjs.com 上发布包或与其他 npm 用户交互时将显示的用户名。你的用户名必须小写,并且可以包含连字符和数字。
  • 电子邮件地址: 你的公共电子邮件地址将被添加到你的包的元数据中,并且任何下载你的包的人都可以看到。当你更新包以及不定期的产品更新和信息时,我们也会向此账户发送电子邮件。
  • 密码: 你的密码必须
    • 超过十个字符
      • 不匹配或明显包含你的用户名,例如不要使用 'username123'
    • 没有被 Have I Been Pwned 泄露数据库入侵和知晓

登录

  1. 在命令行上,键入以下命令:

    npm login

  2. 出现提示时,输入你的用户名、密码和电子邮件地址。

  3. 如果你启用了 双重身份验证,当出现提示时,输入一次性密码。

  4. 要测试你是否已成功登录,请键入:

    npm whoami

    应该显示你的 npm 用户名。

npm 命令

项目初始化

  • npm init

    • 说明:用于初始化一个新的 Node.js /其他项目,会引导你逐步输入项目的名称、版本、描述等信息,最终生成 package.json 文件。
    • 示例
npm init
  • 快捷方式:使用 npm init -y 可以跳过交互式问答,直接使用默认值生成 package.json 文件。

包的安装

安装生产依赖
  • npm install <package-name>

    • 说明:安装指定名称的包,并将其添加到 package.json 文件的 dependencies 字段中,这些依赖是项目在生产环境中运行所必需的。

    • 示例:安装 express 框架

npm install express
安装开发依赖

注意 开发依赖指的是在打包时候不会打入你的应用程序在,常用与一些工程化配置工具或插件

  • npm install <package-name> --save-dev 或 npm install <package-name> -D

    • 说明:安装指定名称的包,并将其添加到 package.json 文件的 devDependencies 字段中,这些依赖仅在开发和测试过程中需要。

    • 示例:安装 jest 测试框架作为开发依赖

npm install jest --save-dev
安装全局包

注意 全局安装的包常用于一些工程化脚手架或是一些服务工具

  • npm install <package-name> -g

    • 说明:将包安装到全局环境中,使其可以在任何项目中使用。全局安装的包通常是一些命令行工具。

    • 示例:安装 nodemon 工具

npm install nodemon -g
安装特定版本的包
  • npm install <package-name>@<version>

    • 说明:安装指定版本的包。

    • 示例:安装 lodash 的 4.17.21 版本

npm install lodash@4.17.21
根据 package.json 安装所有依赖
  • npm install 或 npm i

    • 说明:在项目根目录下运行此命令,会根据 package.json 文件中记录的依赖信息,安装所有生产依赖和开发依赖。
npm install

包的更新

  • npm update <package-name>

    • 说明:更新指定名称的包到最新的兼容版本,更新后会修改 package.json 文件中的版本号。

    • 示例:更新 express 包

npm update express
  • npm update

    • 说明:更新项目中所有依赖到最新的兼容版本。
npm update

包的卸载

  • npm uninstall <package-name>

    • 说明:卸载指定名称的包,并从 package.json 文件的 dependencies 或 devDependencies 字段中移除。
    • 示例:卸载 express 包
npm uninstall express
  • npm uninstall <package-name> -g

    • 说明:卸载全局安装的包。

    • 示例:卸载全局的 nodemon 工具

npm uninstall nodemon -g

脚本命令执行

  • npm run <script-name>

    • 说明:执行 package.json 文件中 scripts 字段下定义的脚本命令。

    • 示例:如果 package.json 中有如下配置:

{
    "scripts": {
        "start": "node index.js"
    }
}
  • 可以使用以下命令启动项目:
npm run start
  • 对于一些常用的脚本命令,如 starttest,可以省略 run 直接使用,例如 npm startnpm test

包信息查看

  • npm list

    • 说明:查看当前项目中安装的所有包及其依赖关系。

    • 示例

npm list
  • npm list -g

    • 说明:查看全局安装的所有包。
npm list -g
  • npm view <package-name>

    • 说明:查看指定包的详细信息,如版本、描述、依赖等。
    • 示例:查看 express 包的信息
npm view express

包搜索

  • npm search <keyword>

    • 说明:在 npm 注册表中搜索包含指定关键字的包。

    • 示例:搜索与 date 相关的包

npm search date

设置镜像

由于一些不可抗力所以我们可能直接从npm下载包很慢这里就可以设置国内源

配置淘宝镜像

npm config set registry registry.npmmirror.com

配置成默认地址

npm config set registry registry.npmjs.org/

查看全局安装的模块

npm list -g

查看某个模块版本号

npm list 包名

 

查看 配置的源地址

npm config get registry

迁移到其他账户

由于目前无法更改你的 npm 用户名。 你需要创建一个新账户并将数据手动迁移到新账户。

  1. 使用你想要的用户名创建一个 新的用户账户
  2. 转移你的包到你的新账户。
    要使用 CLI 将包转移给另一个 npm 用户,请运行 npm owner add 命令,将 <their-username> 替换为其他用户的 npm 用户名。向其他用户发送电子邮件邀请。用户接受邀请后,运行 npm owner rm 命令,将 <your-username> 替换为你的 npm 用户名:
// 添加其他人作为贡献者
npm owner add <their-username> <package-name>
// 删除自己作为贡献值
npm owner rm <your-username> <package-name>

如果你为写入启用了双重身份验证,请向命令 --otp=123456 添加一次性密码(其中 123456 是你的身份验证器应用的代码)。

npm owner add <their-username> <package-name> --otp=123456
npm owner rm <your-username> <package-name> --otp=123456

4. 如果你是任何 组织 的成员,请求组织管理员 邀请你的新账户加入组织。 5. 删除你的 原始账户。请注意,这是永久性的,30 天后,此账户名称可供其他人使用。

npm 包的权限

范围访问权限可以查看和下载可写(发布)
组织私有组织中对包具有读取权限的团队成员组织中对包具有读写权限的团队成员
组织公共所有人组织中对包具有读写权限的团队成员
用户私有包所有者和已被授予对包的读取权限的用户包所有者和被授予对包的读写权限的用户
用户公共所有人包所有者和被授予对包的读写权限的用户
无范围公共所有人包所有者和被授予对包的读写权限的用户

错误排除

常见错误 | npm 中文网

当一个包安装或发布失败时,npm CLI 将生成一个 npm-debug.log 文件。此日志文件可以帮助你找出问题所在。

如果需要生成 npm-debug.log 文件,可以运行以下命令之一。

对于安装包:

npm install --timing

对于发布包:

npm publish --timing

你可以在 .npm 目录中找到 npm-debug.log 文件。要查找你的 .npm 目录,请使用 npm config get cache

npm 包发布

(一)准备工作
  1. 初始化项目:在项目根目录下,运行npm init命令,按照提示填写项目名称、版本、描述、入口文件等信息,生成package.json文件。

  2. 编写代码:确保你的代码遵循模块化规范,并且功能完备、测试通过。

  3. 配置 .npmignore 文件:如果你有一些文件或目录不想发布到 npm 上,比如node_modules、测试文件、日志文件等,可以在项目根目录下创建.npmignore文件,写入要忽略的文件或目录规则。

(二)发布步骤
  1. 登录 npm:在命令行中运行npm login,输入你的 npm 账号(用户名、密码和邮箱)。如果没有账号,需要先在npm 官网注册。

  2. 发布包:在项目根目录下运行npm publish命令。如果一切正常,你的包就会发布到 npm 注册表中,其他开发者可以通过npm install 来安装使用。

(三)发布注意事项
  1. 版本管理:遵循语义化版本控制(SemVer)规范,即MAJOR.MINOR.PATCH格式。MAJOR版本号在有不兼容的 API 变更时递增;MINOR版本号在有向下兼容的新功能添加时递增;PATCH版本号在有向下兼容的错误修复时递增。

  2. 包名唯一性:确保你的包名在 npm 注册表中是唯一的,避免与已有的包名冲突。可以在 npm 官网搜索包名,确认是否可用。

npm 包撤销

撤销步骤
  1. 撤销最近发布的版本
    • 确保已登录 npm 账号。
    • 在命令行中运行npm unpublish <package - name>,<package - name>是你要撤销的包名。执行后,最近发布的版本将从 npm 注册表中移除。
  1. 撤销特定版本
    • 同样需先登录 npm 账号。
    • 运行npm unpublish <package - name>@,<package - name>为包名,是要撤销的具体版本号,如npm unpublish my - package@1.0.0。
撤销注意事项
  1. 时间限制:npm 允许在包发布后的 24 小时内无限制地撤销版本。超过 24 小时后,通常只能撤销存在安全漏洞等特殊情况的包,且需联系 npm 支持团队。
  1. 对依赖项目的影响:撤销包可能会影响依赖该包的其他项目,导致构建失败或运行时错误。所以在撤销前,务必通知依赖该包的项目开发者。
  1. 重新发布:撤销包后若要重新发布,建议修改版本号,遵循语义化版本控制规范,避免与之前撤销的版本混淆。

npm 包取消(发布过程中取消)

  1. 发布中取消:在执行npm publish命令期间,如果想要取消发布,可在命令行中按下Ctrl + C组合键中断发布操作。

  2. 发布完成但未同步取消:若发布操作已完成但还未完全同步到 npm 注册表(这种情况较为少见),可尝试立即使用上述撤销步骤撤销刚刚发布的包。

npmrc

.npmrc 是一个用于配置 npm(Node Package Manager)行为的文件,它允许开发者根据自己的需求定制 npm 的各种设置,这些设置可以影响包的安装、发布等操作。以下从文件位置、配置内容、优先级、使用场景几个方面详细介绍:

配置优先级

当存在多个 .npmrc 文件时,npm 会按照以下优先级读取配置:

  1. 命令行参数:通过命令行直接传递的参数优先级最高,例如 npm install --registry=https://registry.npmmirror.com 会覆盖 .npmrc 中的 registry 配置。
  2. 项目级 .npmrc:位于项目根目录下的 .npmrc 文件,只对当前项目有效。
  3. 用户级 .npmrc:位于用户主目录下的全局配置文件。
  4. 全局配置文件(通过 npm config get globalconfig 查看路径)。
  5. 内置 .npmrc:npm 自带的默认配置。

使用场景

  • 使用镜像源:国内网络访问官方 npm 注册表可能较慢,通过配置 .npmrc 使用国内镜像源(如淘宝镜像、npmmirror)可以显著提高包的下载速度。
  • 访问私有包:企业内部可能有自己的私有 npm 注册表,开发者可以在 .npmrc 中配置认证信息和注册表地址,以便访问和使用私有包。
  • 统一开发环境:在项目级 .npmrc 中配置一些特定的设置,可以确保团队成员在开发过程中使用相同的 npm 配置,避免因配置差异导致的问题。

注册表配置

注册表是存储和分发 npm 包的地方,默认的 npm 注册表是 https://registry.npmjs.org/,但你可以根据需求切换到其他注册表,例如国内的镜像以提高下载速度。

收起

plaintext

# 使用淘宝镜像
registry=https://registry.npmmirror.com

如果你需要在不同的注册表间切换,可以使用以下命令临时修改注册表:

收起

bash

npm config set registry https://registry.npmjs.org

认证信息配置

当访问私有注册表时,通常需要提供认证信息,比如 token。

收起

plaintext

# 配置私有注册表的认证信息
//your-private-registry-url/:_authToken=your-auth-token

这里的 your-private-registry-url 是私有注册表的地址,your-auth-token 是你获得的认证令牌。

代理配置

如果你的网络环境需要通过代理才能访问外部资源,就需要配置代理信息。

收起

plaintext

# HTTP 代理
proxy=http://proxy.example.com:8080
# HTTPS 代理
https-proxy=http://proxy.example.com:8080

若代理需要认证,可使用如下格式:

收起

plaintext

proxy=http://username:password@proxy.example.com:8080
https-proxy=http://username:password@proxy.example.com:8080

日志级别配置

可以设置 npm 输出日志的详细程度,常见的日志级别有 silenterrorwarnhttpinfoverbose 和 silly

收起

plaintext

# 设置日志级别为 info
loglevel=info

日志级别越高,输出的信息越详细。

缓存配置

可以指定 npm 缓存的存储位置,以及是否强制重新下载包而不使用缓存。

# 指定缓存目录
cache=/path/to/your/cache
# 强制重新下载,不使用缓存
force=true

包安装配置

可以配置包的安装行为,例如是否自动保存依赖到 package.json 文件。

收起

plaintext

# 自动将安装的包保存到 dependencies 字段
save=true
# 自动将安装的包保存到 devDependencies 字段
save-dev=true

安装包时忽略脚本

有时候,你可能希望在安装包时忽略包中定义的脚本(如 preinstallinstallpostinstall 等)。

# 忽略安装脚本
ignore-scripts=true

配置默认包版本范围

当安装包时,npm 默认会使用语义化版本范围(如 ^),你可以修改这个默认行为。

# 使用精确版本安装包,不使用版本范围
save-exact=true

配置并行安装

可以控制 npm 并行安装包的数量,以提高安装速度。

# 设置并行安装的最大数量
maxsockets=5

示例 .npmrc 文件

registry=http://registry.npmjs.org/

# 定义npm的registry,即npm的包下载源

 

proxy=http://proxy.example.com:8080/

# 定义npm的代理服务器,用于访问网络

 

https-proxy=http://proxy.example.com:8080/

# 定义npm的https代理服务器,用于访问网络

 

strict-ssl=true

# 是否在SSL证书验证错误时退出
cafile=/path/to/cafile.pem
# 定义自定义CA证书文件的路径
user-agent=npm/{npm-version} node/{node-version} {platform}
# 自定义请求头中的User-Agent
save=true
# 安装包时是否自动保存到package.json的dependencies中
save-dev=true
# 安装包时是否自动保存到package.json的devDependencies中
save-exact=true
# 安装包时是否精确保存版本号
engine-strict=true
# 是否在安装时检查依赖的node和npm版本是否符合要求
scripts-prepend-node-path=true
# 是否在运行脚本时自动将node的路径添加到PATH环境变量中

这个示例文件配置了使用淘宝镜像、设置了代理、日志级别为 info、自动保存依赖到 package.json 并使用精确版本。