重要命令
npx
npx 是 npm 5.2.0 及以上版本中自带的一个工具,用于更方便地执行 npm 包中的命令行工具。它的主要功能是在不全局安装包的情况下,直接运行包中的命令。下面是对 npx 的详细解析:
1. npx 的基本用途
npx 的核心作用是解决以下问题:
- 避免全局安装包 :传统方式下,许多工具需要全局安装(如
npm install -g <package>),而npx可以直接运行这些包,无需全局安装。 - 自动下载并运行包 :如果本地项目或全局环境未安装某个包,
npx会自动从 npm 仓库下载并运行它。 - 简化命令:可以直接运行包中的命令,而不需要手动安装或配置。
2. 基本语法
bash
npx <command> [options]
<command>:要执行的命令或包名。[options]:传递给命令或包的选项。
3. npx 的主要功能
1. 直接运行本地项目中的包
如果本地项目已经安装了某个包,npx 会自动在项目的 node_modules/.bin 目录中查找并运行它。
示例:
npx webpack
如果项目中安装了 webpack,则直接运行项目中的 webpack 命令。
2. 运行未安装的包
如果本地项目或全局环境中未安装某个包,npx 会临时从 npm 仓库下载并运行它。
注意: 前提是:reate-react-app 发布到了npm上 并且 reate-react-app包中的bin中有个和包名一样的命令
示例:
lua
npx create-react-app my-app
如果本地未安装 create-react-app,npx 会自动下载并执行它。
3. 运行指定版本的包
可以使用 @ 符号指定包的版本。
示例:
sql
npx webpack@4.0.0 --version
运行指定版本的 webpack,并查看其版本号。
4. 运行 GitHub 上的代码
npx 可以直接运行 GitHub 仓库中的代码。
示例:
arduino
npx https://gist.github.com/username/script.js
5. 交互式运行包
npx 可以以交互模式运行包,例如打开命令行工具或 REPL 环境。
示例:
npx node
启动 Node.js 的 REPL 环境。
6. 运行二进制文件
npx 可以直接运行本地或远程的二进制文件。
示例:
bash
npx ./my-script.js
4. 常用选项
| 选项 | 说明 |
|---|---|
--ignore-existing |
忽略本地已安装的包,强制从远程下载并运行。 |
--package |
指定要运行的包(可以用于运行未暴露命令的包)。 |
--no-install |
如果本地未找到包,则不自动安装,直接报错。 |
--quiet |
静默模式,不输出额外信息。 |
--yes |
自动回答所有提示为 yes。 |
5. 使用场景
场景 1:创建 React 项目
使用 create-react-app 创建项目,但无需全局安装:
lua
npx create-react-app my-app
场景 2:运行本地脚本
运行项目中的脚本文件:
bash
npx ./scripts/my-script.js
场景 3:检查包版本
检查某个包的版本:
css
npx webpack --version
场景 4:运行特定版本的包
运行指定版本的 eslint:
kotlin
npx eslint@7.0.0 --init
场景 5:交互式运行工具
以交互模式运行 ts-node:
npx ts-node
6. npx 与 npm exec 的关系
在 npm 7 及以上版本中,npx 实际上是 npm exec 的别名。因此,以下两个命令是等价的:
bash
npx webpack
npm exec webpack
7. 注意事项
npx默认会检查本地是否有已安装的包,如果本地没有,则会从远程下载。如果需要强制从远程下载,可以使用--ignore-existing选项。- 如果运行未安装的包,
npx会在运行结束后删除临时下载的包。 - 对于一些常用的工具,建议还是全局安装,以减少每次运行时下载的时间。
8. 总结
npx 是一个非常强大的工具,它简化了 npm 包的运行流程,避免了全局安装的繁琐,同时支持临时下载和运行包。它的主要优势包括:
- 方便性:无需全局安装即可运行包。
- 灵活性:支持运行本地、远程或指定版本的包。
- 高效性:自动管理临时包的下载与删除。
exec
npm exec 是 npm 7 及以上版本引入的一个命令,用于在项目中执行本地安装的包(或全局安装的包)中的可执行文件。它的主要目的是提供一种更方便的方式来运行 npm 包中的工具,而不需要全局安装这些工具或手动配置路径。
以下是 npm exec 的详细解析和使用方法:
1. 基本语法
perl
npm exec <package-name> [args]
参数说明:
<package-name>:要执行的 npm 包的名称。[args]:传递给可执行文件的参数。
示例:
运行 eslint 检查当前目录的文件:
bash
npm exec eslint .
2. npm exec 的工作原理
运行本地安装的包
如果包已经安装在项目的 node_modules 中,npm exec 会直接运行它的可执行文件。
运行全局安装的包
如果包未在本地安装,但已全局安装,npm exec 仍然可以运行它。
运行远程包(临时安装并运行包)
如果包既未在本地安装,也未全局安装,npm exec 会临时安装它并运行。临时安装的包不会被持久化到 package.json 或 node_modules 中。
3. 主要功能
(1) 运行本地工具
通过 npm exec,可以直接运行项目中安装的工具,而无需手动配置路径。
示例:
运行 typescript 编译文件:
bash
npm exec tsc
(2) 运行全局工具
如果包已全局安装,npm exec 会自动找到并运行它。
示例:
运行全局安装的 webpack:
bash
npm exec webpack
(3) 临时安装并运行包
如果包未在本地或全局安装,npm exec 会临时安装它并运行。
示例:
临时安装并运行 create-react-app:
perl
npm exec create-react-app my-app
(4) 指定包版本
可以通过 @ 符号指定包的版本。
示例:
运行 eslint 的 8.0.0 版本:
perl
npm exec eslint@8.0.0 .
(5) 传递参数
可以向可执行文件传递参数。
示例:
向 jest 传递 --watch 参数:
sql
npm exec jest -- --watch
(6) 运行 package.json 中的脚本
可以使用 npm exec 运行 package.json 中定义的脚本。
示例:
运行 package.json 中的 build 脚本:
sql
npm exec -- npm run build
4. npm exec 与 npx 的区别
npm exec 和 npx 的功能几乎相同,但 npm exec 是 npm 7 及以上版本的官方推荐方式。主要区别如下:
| 特性 | npm exec |
npx |
|---|---|---|
| 版本支持 | npm 7 及以上版本 | npm 5.2 及以上版本 |
| 官方推荐 | 是 | 否 |
| 临时安装行为 | 完全相同 | 完全相同 |
| 执行本地脚本 | 不支持(可间接运行) | 支持 |
5. 环境变量
npm exec 会自动设置以下环境变量:
npm_package_name:当前包的名称。npm_package_version:当前包的版本。
6. 常见用例
(1) 运行工具
css
npm exec prettier --write src/
(2) 使用指定版本的工具
sql
npm exec typescript@4.9.0 --version
(3) 临时安装并运行脚手架工具
perl
npm exec create-react-app my-app
7. 总结
npm exec提供了一种便捷的方式来运行 npm 包中的工具,无需全局安装或手动配置路径。- 它支持运行本地安装的包、全局安装的包,以及临时安装的包。
- 在 npm 7 及以上版本中,
npm exec是官方推荐的方式,可以替代npx。 - 适合用于运行开发工具、脚手架工具以及临时调试工具。
如果你使用的是 npm 7 及以上版本,建议优先使用 npm exec!
exec如何运行本地脚本
npm exec 主要用于执行 npm 包中的可执行文件,而不是直接执行 package.json 中定义的本地脚本。如果你想要执行本地脚本,应该使用 npm run 命令,而不是 npm exec。
为什么不使用 npm exec 执行本地脚本?
npm exec 的设计目的是运行 npm 包中的可执行文件,而 package.json 中的脚本是通过 npm run 来执行的。npm exec 并不支持直接运行 package.json 中定义的脚本。
如何正确执行本地脚本?
使用 npm run 命令来执行 package.json 中定义的脚本。
示例:
假设 package.json 中有以下脚本:
json
{
"scripts": {
"build": "webpack --mode production",
"test": "jest"
}
}
你可以通过以下命令运行这些脚本:
arduino
npm run build
npm run test
npm exec 与 npm run 的区别
| 特性 | npm exec |
npm run |
|---|---|---|
| 功能 | 运行 npm 包中的可执行文件 | 运行 package.json 中的脚本 |
| 支持本地脚本 | 不支持 | 支持 |
| 包安装行为 | 可以临时安装包并运行 | 需要先安装包 |
| 适用场景 | 运行工具或可执行文件 | 运行定义好的脚本 |
如何在 npm exec 中运行脚本?
虽然 npm exec 不能直接运行本地脚本,但你可以通过以下方式间接实现:
方法 1:使用 npm exec 运行 npm run
sql
npm exec -- npm run build
这会通过 npm exec 运行 npm run build。
方法 2:将脚本逻辑封装到可执行文件中
如果你希望脚本可以通过 npm exec 运行,可以将脚本逻辑封装到一个可执行文件中。例如:
- 在
package.json的bin字段中定义可执行文件路径。 - 创建一个可执行文件(如
bin/my-script.js)。 - 然后通过
npm exec my-script运行。
总结
npm exec不能直接执行package.json中的脚本。- 如果要运行本地脚本,请使用
npm run。 - 如果你确实需要通过
npm exec运行脚本,可以间接使用npm exec -- npm run <script>,但这种做法并不推荐。
npx不能运行本地脚本
要使用 npx 运行 package.json 中 scripts 字段定义的脚本,不能直接使用 npx,而是需要使用 npm run。
原因是:npx 主要用于执行本地或远程包中的可执行文件,而不是 package.json 中定义的脚本。package.json 中的 scripts 是由 npm 直接管理的,因此需要使用 npm run 来运行这些脚本。
正确方式:使用 npm run
假设你的 package.json 如下:
json
{
"scripts": {
"start": "node ./src/index.js",
"test": "jest",
"build": "webpack --mode production"
}
}
要运行这些脚本,使用以下命令:
-
运行
start脚本:arduinonpm run start -
运行
test脚本:arduinonpm run test -
运行
build脚本:arduinonpm run build
为什么 npx 不能直接运行 package.json 中的脚本?
npx 的设计目的是查找并执行可执行文件 ,而不是解析 package.json 中的 scripts 字段。scripts 字段的解析和执行是由 npm 处理的,因此需要使用 npm run。
npx 可以和 npm run 结合使用吗?
虽然 npx 不能直接运行 package.json 中的脚本,但它可以在 scripts 中用于运行特定的可执行文件。例如:
在 scripts 中使用 npx
json
{
"scripts": {
"lint": "npx eslint .",
"format": "npx prettier --write ."
}
}
然后可以通过 npm run 运行这些脚本:
arduino
npm run lint
npm run format
总结
- 运行
package.json中scripts定义的脚本必须使用npm run,而不是npx。 npx可以用于执行本地或远程包中的可执行文件。- 如果需要,可以在
scripts中使用npx来运行特定的可执行文件,然后通过npm run调用这些脚本。
运行命令的方式总结
运行项目中的命令
json
// 方式一
npx xxx || npm exec xxx
// 方式二:在package.json中配置scripts然后通过npm run 运行脚本
// npm run 会在项目的 node_modules/.bin 目录下查找可执行文件,因此可以直接运行本地安装的工具(如 webpack、jest 等),而无需全局安装
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"tt": "set EDITOR=code && npm edit vue"
}
运行全局的命令
arduino
// 方式一:
xxx
// 方式二:
npm exec vue -v || npx vue -v
运行远程的命令
json
// 前提是:xx发布到了npm上 并且 xx包中的bin中有个和包名一样的命令
npx xx || npm exec xx
// xx包的package.json
{
"bin": {
"xx": "./bin/index.js"
}
}
explain
npm explain 是 npm 提供的一个命令,用于解析和查看包依赖关系。它可以帮助你快速了解某个包是如何被安装到你的项目中的,以及为什么特定版本的包被依赖。
npm explain 的基本用法
go
npm explain <package-name>
<package-name>:你需要查看的包的名称。
npm explain 的功能
- 显示包的依赖路径 它会显示某个包是如何被安装的,包括直接依赖和间接依赖的关系。
- 解释为什么安装特定版本的包 它会告诉你为什么安装了某个特定版本的包,以及是哪个包依赖了它。
- 帮助解决依赖冲突 如果你在依赖关系中遇到问题,
npm explain可以帮助你找到问题的根源。
示例
假设你想查看 lodash 包是如何被安装的,运行以下命令:
npm explain lodash
可能的输出如下:
kotlin
lodash@4.17.21
node_modules/lodash
lodash@"^4.17.21" from the root project
解释:
lodash@4.17.21:当前安装的版本是4.17.21。node_modules/lodash:包的实际安装位置。lodash@"^4.17.21" from the root project:该包是根项目直接依赖的,版本范围是^4.17.21。
输出解析
-
包的版本和安装位置
lodash@4.17.21:包的名称和版本。node_modules/lodash:包的安装路径。
-
依赖来源
lodash@"^4.17.21" from the root project:包是如何被依赖的,以及版本约束。
-
依赖层级 如果包是间接依赖的,输出会显示完整的依赖链。例如:
kotlinlodash@4.17.21 node_modules/lodash lodash@"^4.17.21" from express@4.17.1 node_modules/express express@"^4.17.1" from the root project解释:
lodash是express的依赖。express是项目的直接依赖。
常见场景
-
解决依赖冲突 如果你遇到版本冲突问题,可以使用
npm explain查看某个包是被哪些包依赖的,以及它们的版本要求。例如:npm explain react输出可能显示多个包依赖了不同版本的
react,从而帮助你找到冲突的根源。 -
检查包来源 如果你不确定某个包是如何被安装的,
npm explain可以帮助你快速找到答案。 -
调试依赖问题 如果某些功能无法正常工作,
npm explain可以帮助你验证是否是依赖版本问题。
总结
npm explain 是一个非常有用的工具,用于解析包的依赖关系和版本信息。它可以帮助你:
- 查看包的安装路径和依赖关系。
- 了解为什么安装了特定版本的包。
- 解决依赖冲突或调试问题。
help
查看帮助信息
scss
npm help // 查看所有帮助信息
npm help init // 查看init命令的帮助信息
config
npm config 是 npm 提供的一个用于管理和查看 npm 配置的命令。npm 的配置可以影响 npm 的全局行为,例如默认的包安装路径、代理设置、缓存路径等。以下是对 npm config 的详细解析:
npm 配置的层级
npm 的配置分为多个层级,优先级从高到低依次为:
-
命令行参数:
- 例如:
npm install --registry=https://registry.npm.taobao.org
- 例如:
-
环境变量:
- 以
npm_config_开头的环境变量会被 npm 读取。 - 例如:
npm_config_registry=https://registry.npm.taobao.org
- 以
-
项目级配置(
.npmrc文件) :- 位于项目根目录的
.npmrc文件。
- 位于项目根目录的
-
用户级配置(
.npmrc文件) :- 位于用户主目录的
.npmrc文件(~/.npmrc)。
- 位于用户主目录的
-
全局配置(
.npmrc文件) :- 位于 npm 的全局配置目录下的
.npmrc文件。
- 位于 npm 的全局配置目录下的
-
内置默认配置:
- npm 自带的默认配置。
npm config 命令的常用操作
1. 查看当前配置
arduino
npm config list
- 显示所有当前的 npm 配置。
2. 查看某个配置项的值
arduino
npm config get <key>
-
例如:
arduinonpm config get registry
3. 设置某个配置项的值
arduino
npm config set <key> <value>
-
例如:
arduinonpm config set registry https://registry.npm.taobao.org
4. 删除某个配置项
arduino
npm config delete <key>
-
例如:
arduinonpm config delete registry
5. 编辑配置文件
arduino
npm config edit
- 打开当前生效的
.npmrc文件进行编辑。
6. 查看配置文件的路径
arduino
npm config get userconfig # 用户级配置文件路径
npm config get globalconfig # 全局配置文件路径
npm config get prefix # 全局安装路径
常用的 npm 配置项
以下是一些常用的 npm 配置项及其说明:
| 配置项 | 默认值 | 说明 |
|---|---|---|
registry |
https://registry.npmjs.org/ |
npm 包的下载源 |
prefix |
操作系统依赖 | 全局安装的包存放路径 |
cache |
操作系统依赖 | npm 缓存路径 |
proxy |
无 | HTTP 代理地址 |
https-proxy |
无 | HTTPS 代理地址 |
strict-ssl |
true |
是否严格验证 SSL 证书 |
save |
true |
是否自动将安装的包添加到 package.json |
save-dev |
false |
是否自动将安装的包添加到 devDependencies |
save-exact |
false |
是否在 package.json 中保留精确的版本号 |
ignore-scripts |
false |
是否忽略 package.json 中的脚本 |
package-lock |
true |
是否生成 package-lock.json |
audit |
true |
是否启用安全检查 |
scripts-prepend-node-path |
warn-only |
是否在运行脚本时自动添加 Node.js 路径 |
配置示例
1. 设置淘宝镜像源
arduino
npm config set registry https://registry.npm.taobao.org
2. 设置全局安装路径
arduino
npm config set prefix ~/.npm-global
3. 设置 HTTP 代理
arduino
npm config set proxy http://proxy.example.com:8080
npm config set https-proxy http://proxy.example.com:8080
4. 禁用严格 SSL 验证
arduino
npm config set strict-ssl false
5. 启用精确版本号保存
arduino
npm config set save-exact true
配置文件的格式
.npmrc 文件是一个简单的键值对文件,格式如下:
ini
registry=https://registry.npm.taobao.org
prefix=~/.npm-global
strict-ssl=false
优先级示例
-
命令行参数:
ininpm install lodash --registry=https://registry.npm.taobao.org -
环境变量:
arduinoexport npm_config_registry=https://registry.npm.taobao.org -
项目级
.npmrc文件:iniregistry=https://registry.npm.taobao.org -
用户级
.npmrc文件:iniregistry=https://registry.npmjs.org/ -
全局
.npmrc文件:iniprefix=/usr/local
总结
npm config是管理和查看 npm 配置的强大工具。- 通过命令行、环境变量或
.npmrc文件,可以灵活地配置 npm 的行为。 - 在团队开发或 CI/CD 环境中,合理配置 npm 可以提高开发效率和稳定性。
通过命令行设置了配置,这个配置会一直存在吗?
通过命令行(使用 npm config set)设置的配置是否会一直存在,取决于你设置的配置的作用范围。具体如下:
1. 永久保存的配置
默认情况下,npm config set 会将配置保存到 用户级的 .npmrc 文件 中(位于用户的主目录下,例如 ~/.npmrc),因此该配置会 永久生效,即使关闭终端或重启系统也不会丢失。
例如:
arduino
npm config set registry https://registry.npm.taobao.org
这条命令会将 registry 配置写入 ~/.npmrc 文件,永久生效。
2. 临时生效的配置
如果只想在 当前终端会话 中临时使用某个配置,可以通过以下方式:
-
直接使用命令行参数: 例如:
ininpm install lodash --registry=https://registry.npm.taobao.org这种方式仅对当前命令生效,不会保存到配置文件中。
-
通过环境变量临时覆盖: 例如:
arduino// export 是 Linux/macOS 和 Unix 系统中的一个 Shell 命令,用于设置环境变量 // 并使这些环境变量在当前 Shell 会话及其子进程中生效, 关闭了shell设置的值就没了 export npm_config_registry=https://registry.npm.taobao.org npm install lodash // win-cmd set npm_config_registry=https://registry.npm.taobao.org npm install lodash // win-powershell $env:npm_config_registry = "https://registry.npm.taobao.org" npm install lodash这种方式仅在当前终端会话中生效,关闭终端后失效。
3. 项目级配置
如果希望配置仅对 当前项目 生效,可以将配置写入项目的 .npmrc 文件(位于项目根目录)。
例如:
bash
echo "registry=https://registry.npm.taobao.org" >> .npmrc
这条命令将 registry 配置写入当前项目的 .npmrc 文件,仅对该项目生效。
4. 全局配置
如果希望配置对所有项目生效,可以将配置写入 全局的 .npmrc 文件(位于 npm 的全局配置路径)。例如:
csharp
npm config set prefix ~/.npm-global --global
这条命令会将 prefix 配置写入全局的 .npmrc 文件,对所有项目生效。
如何查看配置的存储位置
可以通过以下命令查看配置的存储位置:
arduino
npm config get userconfig # 用户级配置文件的路径
npm config get globalconfig # 全局配置文件的路径
例如,npm config get userconfig 会返回 ~/.npmrc 文件的路径。
总结
通过 npm config set 设置的配置默认会保存到用户级的 .npmrc 文件中,因此会 永久生效 。如果需要临时生效,可以使用命令行参数或环境变量。如果需要仅对当前项目生效,可以写入项目级的 .npmrc 文件。
init
别名:create(npm init === npm create)
npm init 是 npm 提供的一个命令,用于初始化一个新的 npm 项目 。它会创建一个 package.json 文件,该文件是 Node.js 项目的核心配置文件,包含了项目的元数据、依赖、脚本等信息。以下是关于 npm init 的详细解析:
1. npm init 的作用
npm init 的核心功能是创建一个 package.json 文件。这个文件的作用包括:
- 项目元数据:如项目名称、版本、描述、作者等。
- 依赖管理 :记录项目依赖的包(
dependencies和devDependencies)。 - 脚本管理:定义一些常用的命令脚本,如启动、测试、构建等。
2. 如何使用 npm init
(1)默认用法
在项目根目录运行以下命令:
csharp
npm init
这时,npm 会通过命令行交互的方式,依次询问以下问题,生成 package.json 文件:
package name:项目名称(默认是当前文件夹名称)。version:项目版本(默认是1.0.0)。description:项目描述。entry point:项目的入口文件(默认是index.js)。test command:测试命令(如jest或mocha)。git repository:Git 仓库地址(可选)。keywords:项目关键词(可选,用于 npm 搜索)。author:项目作者。license:项目使用的许可证(默认是ISC)。
完成问答后,package.json 文件会被生成在当前目录中。
(2)快速初始化
如果不想通过交互式的方式回答问题,可以直接使用 -y 或 --yes 参数,快速生成默认的 package.json 文件:
csharp
npm init -y
这时,npm 会使用默认值生成 package.json 文件,文件内容类似:
bash
{
"name": "my-project",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
(3)自定义初始值
如果你想为 npm init 提供自定义的默认值,可以通过以下方式设置:
-
在命令行中使用
npm config set设置默认值,例如:arduinonpm config set init-author-name "John Doe" npm config set init-license "MIT" -
运行
npm init时,这些默认值会被自动填充。
3. package.json 文件的结构
以下是一个典型的 package.json 文件的结构:
json
{
"name": "my-project", // 项目名称
"version": "1.0.0", // 项目版本
"description": "A sample project", // 项目描述
"main": "index.js", // 项目入口文件
"scripts": { // 脚本命令
"start": "node index.js",
"test": "jest"
},
"dependencies": { // 生产环境依赖
"express": "^4.17.1"
},
"devDependencies": { // 开发环境依赖
"jest": "^27.0.0"
},
"keywords": ["sample", "project"], // 关键词
"author": "John Doe", // 作者
"license": "MIT" // 许可证
}
4. npm init 的常见问题
(1)package.json 文件已经存在
如果当前目录中已经存在 package.json 文件,npm init 会提示你是否要覆盖或修改它。
(2)项目名称规则
- 项目名称必须是小写字母、数字、连字符(
-)和下划线(_)的组合。 - 项目名称不能以点(
.)或下划线(_)开头。 - 项目名称不能包含空格。
(3)版本号规则
版本号必须符合 Semantic Versioning (SemVer) 规范,格式为 主版本号.次版本号.修订号,例如 1.0.0。
5. npm init 的进阶用法
(1)使用自定义初始化脚本
你可以创建一个自定义的初始化脚本(.npm-init.js),定义 npm init 的行为。例如:
css
module.exports = {
name: 'my-custom-project',
version: '1.0.0',
description: 'This is a custom npm init script',
main: 'app.js',
scripts: {
start: 'node app.js'
},
keywords: ['custom', 'npm', 'init'],
author: 'Jane Doe',
license: 'MIT'
};
运行 npm init 时,npm 会自动读取 .npm-init.js 文件并使用其内容。
(2)npm init <initializer>
npm init 支持通过初始化器(initializer)创建特定类型的项目。例如:
-
使用
create-react-app初始化一个 React 项目:csharpnpm init react-app my-app -
使用
create-next-app初始化一个 Next.js 项目:perlnpm init next-app my-app
这种方式实际上是调用了 npx,例如:
lua
npx create-react-app my-app
init 命令将转换为相应的 npm exec作,如下所示:
npm init foo@latest# 从注册表中获取并运行最新的create-foonpm init foo@1.2.3# 专门运行create-foo@1.2.3npm init foo->npm exec create-foonpm init @usr/foo->npm exec @usr/create-foonpm init @usr->npm exec @usr/createnpm init @usr@2.0.0->npm exec @usr/create@2.0.0npm init @usr/foo@2.0.0->npm exec @usr/create-foo@2.0.0
6. npm init 和npx 、npm exec的关系
npm exec 和 npx等效的,详情看 exec的笔记。
npx是完整的包名(npx create-vite),npm init省略了create(npm init vite)
npm init 就是调用了 npm exec
npm init foo@latest# 从注册表中获取并运行最新的npm exec create-foo@latestnpm init foo@1.2.3# 专门运行npm exec create-foo@1.2.3npm init foo->npm exec create-foonpm init @usr/foo->npm exec @usr/create-foonpm init @usr->npm exec @usr/createnpm init @usr@2.0.0->npm exec @usr/create@2.0.0npm init @usr/foo@2.0.0->npm exec @usr/create-foo@2.0.0
传递参数
任何其他选项都将直接传递给命令,因此 npm init foo -- --hello 将映射到 npm exec -- create-foo --hello .
为了更好地说明选项是如何转发的,这里有一个更进化的示例,显示了传递给 npm cli 和 create 包的选项,以下两个命令是等效的:
npm init foo -y --registry=<url> -- --hello -anpm exec -y --registry=<url> -- create-foo --hello -a
7. 总结
npm init 是初始化 npm 项目的核心工具,它的主要功能是生成 package.json 文件。通过交互式或快速模式,你可以轻松地创建和管理项目的元数据、依赖和脚本。npm init 还支持自定义初始化和使用初始化器创建特定类型的项目,功能非常强大且灵活。
以下是 npm init 的常用命令总结:
- 交互式初始化:
npm init - 快速初始化:
npm init -y - 使用初始化器:
npm init <initializer>
install
npm install-test // npm i + npm test npm install-ci-test // npm ci + npm test
npm install 是 Node.js 包管理工具 npm 的核心命令之一,用于安装项目依赖或全局包。以下是关于 npm install 的详细解析,包括其功能、用法、参数以及常见场景。
1. 基本功能
npm install 的主要功能是安装项目依赖包或全局包。它会根据配置文件(如 package.json)或命令行参数来安装指定的包,并将包及其依赖下载到项目目录中的 node_modules 文件夹中。
2. 基本语法
css
npm install [<package-spec> ...] [<options>]
<package-spec>:指定要安装的包名称及其版本。例如,npm install lodash或npm install lodash@4.17.21。<options>:指定安装选项,例如-g(全局安装)、--save-dev(开发依赖)等。
3. 常见用法
安装项目依赖
如果项目根目录下存在 package.json 文件,运行以下命令会自动安装 dependencies 和 devDependencies 中列出的所有包:
npm install
- 结果:将依赖包安装在
node_modules目录中。 - 生成文件:如果不存在
package-lock.json文件,会自动创建一个。
安装指定包
安装指定的包并将其添加到 dependencies 中:
go
npm install <package-name>
示例:
npm install lodash
- 结果:安装
lodash,并将其添加到package.json的dependencies中。
安装指定版本的包
安装指定版本的包:
xml
npm install <package-name>@<version>
示例:
css
npm install lodash@4.17.21
- 结果:安装
lodash的4.17.21版本。
安装开发依赖
安装包并将其添加到 devDependencies 中:
lua
npm install <package-name> --save-dev
示例:
css
npm install jest --save-dev
- 结果:安装
jest,并将其添加到package.json的devDependencies中。
全局安装
将包安装到全局环境,通常用于命令行工具:
go
npm install -g <package-name>
示例:
npm install -g typescript
- 结果:将
typescript安装到全局环境,可以直接在命令行中使用tsc命令。
安装开发环境的依赖
仅安装 devDependencies 中列出的包:
ini
npm install --only=dev
安装生产环境的依赖
仅安装 dependencies 中列出的包:
ini
npm install --only=prod
4. 重要选项
| 选项 | 说明 |
|---|---|
-g 或 --global |
全局安装包。 |
--save |
将包添加到 dependencies 中(npm@5 后默认启用,无需显式指定)。 |
--save-dev |
将包添加到 devDependencies 中。 |
--save-optional |
将包添加到 optionalDependencies 中。 |
--no-save |
安装包但不添加到 package.json 中。 |
--optional |
仅安装 optionalDependencies 中的包。 |
--production |
仅安装 dependencies 中的包(等同于 --only=prod)。 |
--force |
强制重新安装包。 |
--legacy-peer-deps |
忽略 peerDependencies 冲突。 |
--strict-peer-deps |
严格处理 peerDependencies 冲突。 |
--package-lock-only |
仅更新 package-lock.json,不安装包。 |
5. 常见场景
从 package.json 安装依赖
运行以下命令会根据 package.json 文件安装所有依赖:
npm install
安装并更新 package.json
安装新包并自动更新 package.json 文件:
npm install axios
安装开发工具
将开发工具(如测试框架、构建工具)安装为开发依赖:
css
npm install jest --save-dev
安装全局工具
安装全局命令行工具:
npm install -g nodemon
处理依赖冲突
如果安装过程中遇到依赖冲突,可以使用以下选项:
css
npm install --legacy-peer-deps
6. 其他相关命令
| 命令 | 说明 |
|---|---|
npm uninstall <package> |
卸载指定包。 |
npm update <package> |
更新指定包。 |
npm ls |
列出当前项目安装的所有包及其依赖。 |
npm ci |
根据 package-lock.json 安装依赖(适用于 CI/CD 环境)。 |
7. 总结
npm install 是 Node.js 开发中最常用的命令之一,用于安装和管理项目依赖。通过 package.json 文件,可以方便地记录和管理项目所需的依赖包。
8. 文档中的用法
安装文件夹
如果 位于项目根目录中,其依赖项将被安装,并可能像对其他类型依赖项一样被提升到顶级 node modules 节点。如果位于项目根目 录之外,npm 不会安装目录中的包依赖项,但会创建到的符号链接。
注:如果您想从注册表安装目录的内容,而不是创建链接:您需要使用 --install-links 选项。
lua
npm install ../../other-package --install-links
npm install ./sub-package
安装压缩文件
npm install a package that is sitting on the filesystem. Note: if you just want to link a dev directory into your npm root, you can do this more easily by using npm link.
Tarball requirements:
- The filename must use
.tar,.tar.gz, or.tgzas the extension. - The package contents should reside in a subfolder inside the tarball (usually it is called
package/). npm strips one directory layer when installing the package (an equivalent oftar x --strip-components=1is run). - The package must contain a
package.jsonfile withnameandversionproperties.
bash
npm install ./package.tgz
从url安装压缩文件
ruby
npm install https://github.com/indexzero/forever/tarball/v0.5.6
使用别名
npm install jquery2@npm:jquery@2 什么意思?
这个命令的意思是:安装一个名为 jquery2 的包,但实际安装的是 jquery@2 版本。
以下是详细解释:
语法
ruby
npm install <alias>@npm:<name>
1. 解析
ruby
npm install jquery2@npm:jquery@2
-
npm install:安装包的命令。 -
jquery2:这是你想要在项目中使用的包名(别名)。 -
@npm:jquery@2:这是包的来源和目标版本:npm:表示从 npm 官方仓库中安装包。jquery是实际的包名。@2是包的版本号(这里是 jQuery 2.x 版本)。
因此,这个命令的意思是:从 npm 仓库中安装 jquery 的 2.x 版本,并将其在项目中命名为 jquery2。
2. 为什么需要这种写法?
这种写法通常用于以下几种场景:
(1)使用不同版本的同一个包
例如,项目中已经安装了 jquery 的最新版本(如 3.x),但某些模块需要依赖 jquery 的 2.x 版本。为了避免版本冲突,可以将 2.x 版本安装为另一个名称(如 jquery2)。
(2)避免命名冲突
如果项目中已经有一个名为 jquery 的包,但你需要安装另一个版本的 jquery,可以使用别名来安装。
(3)使用语义化的别名
例如,你可能希望将 jquery@2 安装为 jquery-legacy,以便在代码中更清晰地表达其用途。
3. 安装后的结果
执行这个命令后,package.json 中会添加一个依赖项,例如:
perl
{
"dependencies": {
"jquery2": "npm:jquery@^2.2.4"
}
}
在代码中,你可以通过 require('jquery2') 或 import 'jquery2' 来使用这个包。
4. 类似的使用场景
这种写法不仅适用于 jQuery,还适用于其他包。例如:
ruby
npm install lodash2@npm:lodash@2
这将安装 lodash 的 2.x 版本,并将其命名为 lodash2。
5. 注意事项
- 版本号 :
@2表示安装 2.x 的最新版本。如果需要指定具体的版本号,可以使用@2.2.4等。 - 包管理:如果需要同时使用多个版本的包,请确保代码中正确引用它们,以避免混淆。
- 兼容性:不同版本的包可能会有 API 差异,使用时需要注意兼容性问题。
6. 总结
npm install jquery2@npm:jquery@2 的意思是:
- 从 npm 仓库中安装
jquery的 2.x 版本。 - 在项目中将其命名为
jquery2,以便与现有的jquery包区分开。
这种写法适用于需要安装同一包的不同版本或避免命名冲突的场景。
从仓库安装包
bash
npm install git+ssh://git@github.com:npm/cli.git#v1.0.27
这个命令的意思是:通过 SSH 协议从 GitHub 仓库 npm/cli 中安装标签为 v1.0.27 的版本。
以下是详细解析:
1. 命令解析
-
npm install:安装包的命令。 -
git+ssh://git@github.com:npm/cli.git:指定从 Git 仓库安装包:git+ssh表示使用 SSH 协议访问 Git 仓库。git@github.com:npm/cli.git是 Git 仓库的地址(npm/cli是 npm 官方的命令行工具仓库)。
-
#v1.0.27:指定安装的版本(这里是标签v1.0.27)。
因此,这个命令的意思是:通过 SSH 协议从 GitHub 的 npm/cli 仓库中安装标签为 v1.0.27 的版本。
2. 为什么需要这种写法?
这种写法通常用于以下几种场景:
(1)安装未发布到 npm 的包
某些包可能尚未发布到 npm 仓库,但已经托管在 Git 仓库中。这时可以直接从 Git 安装。
(2)安装特定版本的包
如果 npm 仓库中的版本不符合需求(例如需要测试某个 Git 标签或分支的代码),可以直接从 Git 仓库安装。
(3)使用私有仓库
如果 Git 仓库是私有的,可以通过 SSH 协议进行安全访问。
3. Git 协议的变体
除了 git+ssh,还可以使用以下协议格式:
-
https:通过 HTTPS 协议访问 Git 仓库。bashnpm install https://github.com/npm/cli.git#v1.0.27 -
git:使用 Git 协议(不推荐,因为 Git 协议不支持加密)。bashnpm install git://github.com/npm/cli.git#v1.0.27
4. 指定版本的方式
在 Git 仓库中,可以通过以下方式指定版本:
- 标签(Tag) :例如
#v1.0.27,指向仓库中的某个发布版本。 - 分支(Branch) :例如
#main,指向某个分支的最新代码。 - 提交哈希(Commit Hash) :例如
#a1b2c3d,指向某次提交。
5. 安装后的结果
执行这个命令后,npm 会:
-
克隆
npm/cli仓库。 -
切换到
v1.0.27标签对应的代码。 -
将代码安装到项目的
node_modules目录中。 -
在
package.json中添加一条依赖记录:perl{ "dependencies": { "cli": "git+ssh://git@github.com:npm/cli.git#v1.0.27" } }
在代码中,可以通过 require('cli') 或 import 'cli' 来使用这个包。
6. 注意事项
- SSH 配置 :使用
git+ssh需要确保本地 SSH 配置正确,并且有权限访问仓库。 - 网络问题:如果网络不稳定,可能会因克隆仓库失败而导致安装失败。
- 版本兼容性:直接从 Git 安装的包可能没有经过 npm 的发布流程,使用时需要注意版本兼容性问题。
- 依赖管理:如果包依赖其他 npm 包,npm 会自动处理子依赖的安装。
7. 总结
npm install git+ssh://git@github.com:npm/cli.git#v1.0.27 的意思是:
- 通过 SSH 协议从 GitHub 的
npm/cli仓库中安装代码。 - 安装的是标签为
v1.0.27的版本。
这种写法适用于从 Git 仓库直接安装特定版本的包,尤其是未发布到 npm 或需要测试特定版本代码的场景。
uninstall
npm uninstall 是 npm 的一个命令,用于从项目中卸载已安装的依赖包。它可以帮助你移除不再需要的依赖,或者清理项目中的无用包。
1. 命令格式
go
npm uninstall <package-name>
<package-name>:需要卸载的包的名称。
其他格式
- 使用别名:
npm uninstall可以简写为npm un、npm remove或npm rm。
-
卸载全局包:
gonpm uninstall -g <package-name> -
卸载多个包:
xmlnpm uninstall <package1> <package2> <package3>
2. 功能解析
卸载本地包
默认情况下,npm uninstall 会从当前项目的 node_modules 文件夹中移除指定的包,并更新 package.json 和 package-lock.json。
例如,卸载 lodash:
npm uninstall lodash
执行后:
lodash会从node_modules中移除。package.json中的dependencies或devDependencies字段会移除lodash。package-lock.json会更新,移除lodash的相关信息。
卸载全局包
如果需要卸载全局安装的包,可以加上 -g 或 --global 标志。例如:
npm uninstall -g typescript
执行后:
typescript会从全局的node_modules中移除。
卸载开发依赖
如果包是作为开发依赖安装的(即在 devDependencies 中),npm uninstall 会自动更新 package.json 中的 devDependencies 字段。
3. 常用选项
| 选项 | 说明 |
|---|---|
--save |
从 dependencies 中移除包(默认行为)。 |
--save-dev |
从 devDependencies 中移除包。 |
--no-save |
卸载包,但不更新 package.json 和 package-lock.json。 |
--global, -g |
卸载全局安装的包。 |
--dry-run |
模拟卸载过程,显示将会发生的变化,但不实际执行。 |
示例
-
卸载开发依赖:
cssnpm uninstall --save-dev jest -
卸载包但不更新
package.json:cssnpm uninstall --no-save lodash
4. 注意事项
package.json更新:
- 默认情况下,
npm uninstall会更新package.json和package-lock.json。如果不想更新,可以使用--no-save选项。
-
全局包的路径:
-
全局包的安装路径可以通过以下命令查看:
npm root -g
-
-
卸载后检查:
- 卸载包后,可以运行
npm list或npm ls查看当前项目的依赖树,确保包已成功移除。
-
清理无用依赖:
-
如果你不确定项目中是否有无用依赖,可以运行以下命令检查:
npm prune这会移除
package.json中未列出的依赖。
-
5. 示例场景
场景 1:卸载本地依赖
假设项目中安装了 lodash,但不再需要它,可以执行:
npm uninstall lodash
执行后:
lodash会从node_modules中移除。package.json的dependencies字段会移除lodash。
场景 2:卸载全局依赖
假设全局安装了 typescript,但不再需要它,可以执行:
npm uninstall -g typescript
执行后:
typescript会从全局node_modules中移除。
场景 3:卸载开发依赖
假设项目中安装了 jest 作为开发依赖,但不再需要它,可以执行:
css
npm uninstall --save-dev jest
执行后:
jest会从node_modules中移除。package.json的devDependencies字段会移除jest。
6. 总结
npm uninstall 是一个非常实用的命令,用于从项目中移除依赖包。它的主要功能包括:
- 移除本地或全局安装的包。
- 更新
package.json和package-lock.json。 - 支持卸载开发依赖。
- 提供多种选项以满足不同需求。
link
npm link 是一个非常有用的工具,用于在本地开发和测试 npm 包时,将本地包链接到其他项目,而无需发布到 npm 或使用文件路径安装。以下是它的详细解析:
1. npm link 的作用
npm link 允许你将本地的 npm 包符号链接 到全局目录,然后在其他项目中链接使用它。这样,你可以在开发时实时测试本地包,而无需频繁发布或重新安装。
2. 使用场景
- 本地包开发:当你开发一个 npm 包时,可以将其链接到其他项目进行测试。
- 依赖调试 :当你需要调试某个依赖包的代码时,可以将其克隆到本地,然后通过
npm link进行实时修改和测试。 - 避免频繁发布 :在开发阶段,使用
npm link可以避免频繁发布到 npm 进行测试。
3. npm link 的使用步骤
(1)将本地包链接到全局
在你的 npm 包项目根目录中执行:
bash
npm link
这会将该包符号链接 到全局的 node_modules 目录中(路径通常是 ~/.nvm/versions/node/<版本>/lib/node_modules)。
(2)在项目中使用链接的包
进入你需要使用这个包的项目目录,执行:
bash
npm link <包名>
这会将全局链接的包符号链接 到当前项目的 node_modules 目录中。
(3)取消链接
如果想取消链接,可以在项目中执行:
bash
npm unlink <包名>
或者删除项目中的 node_modules 目录并重新安装依赖。
(4)简写
完整写法
bash
cd ~/projects/node-redis # go into the package directory
npm link # creates global link
cd ~/projects/node-bloggy # go into some other package directory.
npm link redis # link-install the package
简写
bash
cd ~/projects/node-bloggy # go into the dir of your main project
npm link ../node-redis # link the dir of your dependency
相当于是↓
(cd ../node-redis; npm link)
npm link redis
4. 示例
(1)开发一个本地 npm 包
假设你正在开发一个名为 my-package 的 npm 包,路径是 ~/projects/my-package。
-
进入
my-package目录:bashcd ~/projects/my-package -
将其链接到全局:
bashnpm link
(2)在项目中使用该包
假设你有一个项目 my-app,路径是 ~/projects/my-app,并且你希望在 my-app 中使用 my-package。
-
进入
my-app目录:bashcd ~/projects/my-app -
将全局的
my-package链接到当前项目:perlnpm link my-package
(3)取消链接
如果不想再使用链接的包,可以执行:
perl
npm unlink my-package
或者删除 node_modules 并重新安装依赖:
bash
rm -rf node_modules
npm install
5. 注意事项
(1)符号链接的影响
npm link创建的符号链接指向的是本地包的源码,因此对源码的任何修改都会立即反映在项目中。- 如果本地包有
postinstall脚本,可能不会在链接后被触发。
(2)版本冲突
如果项目已经安装了某个版本的包,npm link 会覆盖它。取消链接后,可能需要重新安装依赖。
(3)全局包的管理
链接到全局的包会占用全局 node_modules 空间,如果不再需要,可以通过以下命令取消全局链接:
bash
npm unlink -g <包名>
(4)跨项目依赖
如果被链接的包本身依赖其他本地包,你需要手动将这些依赖也链接到项目中。
(5)Windows 系统的兼容性
在 Windows 系统上,符号链接可能需要管理员权限才能创建。如果遇到权限问题,可以尝试以管理员身份运行终端。
6. 与 npm install 的区别
| 功能 | npm install |
npm link |
|---|---|---|
| 安装方式 | 从 npm 仓库或本地文件安装 | 创建符号链接到本地包 |
| 修改实时性 | 需要重新安装才能生效 | 实时生效 |
| 发布需求 | 需要将包发布到 npm 或指定文件路径 | 不需要发布 |
| 适用场景 | 正式项目依赖 | 本地开发和测试 |
7. 总结
npm link 是一个非常强大的工具,适用于以下场景:
- 开发本地 npm 包时进行实时测试。
- 调试项目依赖包的代码。
- 避免频繁发布到 npm。
通过 npm link,你可以将本地包链接到其他项目,实时查看修改效果,极大提高开发效率。
set-script
npm set-script 是 npm 7.0.0 版本引入的一个命令,用于方便地在 package.json 文件的 scripts 字段中添加或更新脚本。它可以简化脚本管理的操作,避免了手动编辑 package.json 文件的繁琐。
命令格式
arduino
npm set-script <script-name> "<command>"
<script-name>:脚本的名称(例如start、build等)。<command>:要执行的命令(例如node app.js、react-scripts build等)。
功能解析
- 添加新脚本 : 如果
package.json的scripts字段中没有同名脚本,npm set-script会自动创建一个新的脚本。 - 更新已有脚本 : 如果
package.json的scripts字段中已经存在同名的脚本,npm set-script会覆盖原有的命令。 - 避免手动编辑
package.json: 使用npm set-script可以避免直接修改package.json文件,减少人为错误。
示例
添加一个新脚本
假设你想在 scripts 中添加一个 lint 脚本来运行 ESLint:
arduino
npm set-script lint "eslint ."
运行后,package.json 中会新增一个脚本:
json
"scripts": {
"lint": "eslint ."
}
更新已有脚本
假设你有一个 start 脚本,想要更新其命令:
sql
npm set-script start "node server.js"
运行后,package.json 中的 start 脚本会更新为:
json
"scripts": {
"start": "node server.js"
}
查看结果
你可以通过以下命令查看 scripts 的部分内容:
arduino
npm run
或者直接打开 package.json 文件查看。
注意事项
-
npm 版本要求 :
npm set-script需要 npm 7.0.0 或更高版本。如果你的 npm 版本较低,可以通过以下命令升级:cssnpm install -g npm@latest -
命令中的引号 : 如果命令中包含空格或特殊字符,需要用引号将其包裹(例如
"node app.js")。 -
删除脚本 :
npm set-script只能添加或更新脚本,无法删除脚本。如果需要删除脚本,需要手动编辑package.json文件。
总结
npm set-script 是一个简洁高效的工具,特别适合快速添加或更新 package.json 中的脚本,避免了手动编辑文件可能带来的错误。如果你的 npm 版本支持它,强烈推荐使用它来管理脚本!
pkg
npm pkg 是 npm 提供的一个命令,用于直接操作 package.json 文件 。它允许你通过命令行读取、修改或删除 package.json 中的字段,而不需要手动编辑文件。这个命令在脚本自动化或快速修改配置时非常有用。
基本用法
xml
npm pkg <command> [<key>=<value>]
支持的子命令:
get:获取package.json中的字段值。set:设置package.json中的字段值。delete:删除package.json中的字段。
详细解析
1. npm pkg get
获取 package.json 中指定字段的值。
vbnet
npm pkg get <key>
示例 : 获取 name 字段的值:
arduino
npm pkg get name
输出:
arduino
"my-project"
2. npm pkg set
设置 package.json 中指定字段的值。
arduino
npm pkg set <key>=<value>
示例 : 设置 version 字段为 1.0.0:
ini
npm pkg set version=1.0.0
注意:
-
如果需要设置嵌套字段,可以使用
.分隔。例如:ininpm pkg set scripts.start="node index.js"
3. npm pkg delete
删除 package.json 中指定的字段。
arduino
npm pkg delete <key>
示例 : 删除 description 字段:
arduino
npm pkg delete description
常用选项
| 选项 | 说明 |
|---|---|
--json |
以 JSON 格式输出结果。 |
--workspace <name> |
在工作区模式下,指定要操作的工作区(需启用 workspaces)。 |
高级用法
1. 批量设置字段
可以使用多个 key=value 对,一次性设置多个字段。
ini
npm pkg set version=1.0.0 description="My awesome project"
2. 使用 --json 选项
以 JSON 格式输出结果,便于程序化处理。
sql
npm pkg get name --json
输出:
arduino
"my-project"
3. 在工作区中使用
如果你的项目启用了工作区(workspaces),可以使用 --workspace 选项操作指定的工作区。
ini
npm pkg set version=1.0.0 --workspace=my-workspace
使用场景
- 自动化脚本 在 CI/CD 或自动化脚本中,使用
npm pkg动态修改package.json。 - 快速修改 不需要手动编辑文件,直接通过命令行修改
package.json的字段。 - 配置管理 批量设置或删除多个字段,提高效率。
常见问题
-
如何修改嵌套字段? 使用
.分隔嵌套字段。例如:ininpm pkg set scripts.start="node index.js" -
如何删除嵌套字段? 同样使用
.分隔嵌套字段。例如:arduinonpm pkg delete scripts.start -
如何避免覆盖现有字段? 如果字段已经存在,
npm pkg set会覆盖其值。如果需要避免覆盖,可以先使用npm pkg get检查字段是否存在。 -
如何恢复默认值? 如果需要恢复某个字段的默认值,可以使用
npm pkg delete删除该字段,然后重新运行npm init或其他相关命令。
总结
npm pkg 是一个强大的工具,它的核心功能包括:
- 读取、设置、删除
package.json中的字段。 - 支持嵌套字段和批量操作。
- 适用于自动化脚本和快速配置修改。
分隔 npm run 参数和脚本参数
在使用 npm run 执行脚本时,-- 的作用是将传递给 npm run 的参数与脚本参数分隔开。具体来说,-- 符号后面的所有内容都会被当作参数传递给脚本本身,而不是传递给 npm 命令。
详细解释:
npm run test:执行package.json文件中定义的test脚本。npm run test -- --coverage:执行test脚本,并将--coverage参数传递给test脚本。
为什么需要 --:
npm run 本身可以接受一些参数(比如 --silent、--verbose 等),这些参数是配置 npm 命令的行为的。为了让 npm 明确区分哪些参数是给 npm 的,哪些是给脚本的,需要使用 -- 来分隔。
- 没有
--时:npm run test --coveragenpm会认为--coverage是npm自己的参数,而不是传递给test脚本的参数,因此会报错或忽略。 - 有
--时:npm run test -- --coveragenpm会将--后面的内容(--coverage)明确传递给test脚本。
举个例子:
假设 package.json 中的 test 脚本是:
json
"scripts": {
"test": "jest"
}
npm run test会执行jest命令。npm run test -- --coverage会执行jest --coverage命令。
如果去掉 --,写成 npm run test --coverage,npm 会尝试将 --coverage 作为自己的参数,导致错误或无法正确传递参数。
总结:
-- 是 npm 中用于分隔 npm run 参数和脚本参数的符号,确保参数被正确地传递给脚本。
查看package.json中有哪些可用的脚本
arduino
npm run
arduino
npm pkg get scripts
run
npm run 是 npm 提供的一个命令,用于运行在 package.json 文件的 scripts 字段中定义的脚本。它是在开发和构建 Node.js 项目时最常用的命令之一。以下是 npm run 的详细解析和使用场景。
1. 基本语法
xml
npm run <script-name> [-- <args>]
<script-name>:package.json中scripts字段定义的脚本名称。-- <args>:可选参数,传递给脚本的附加参数。
示例:
运行 start 脚本:
arduino
npm run start
运行 test 脚本并传递参数:
arduino
npm run test -- --coverage
2. package.json 中的 scripts 字段
npm run 的核心是 package.json 中的 scripts 字段。这些脚本可以是任何可以在命令行中运行的命令,例如启动服务器、运行测试、构建项目等。
示例 package.json:
json
{
"name": "my-app",
"version": "1.0.0",
"scripts": {
"start": "node server.js",
"test": "jest",
"build": "webpack --mode production",
"lint": "eslint src"
},
"dependencies": {
"express": "^4.17.1"
}
}
3. 常见用法
(1)运行预定义的脚本
运行 package.json 中定义的脚本,例如:
arduino
npm run start
npm run test
npm run build
(2)运行带参数的脚本
通过 -- 传递参数给脚本:
arduino
npm run test -- --coverage
(3)运行 pre 和 post 脚本
npm 会自动运行以 pre 和 post 为前缀的脚本。例如,如果你运行 npm run build,npm 会依次执行:
prebuild(如果存在)buildpostbuild(如果存在)
示例:
json
{
"scripts": {
"prebuild": "echo 'Preparing to build...'",
"build": "webpack --mode production",
"postbuild": "echo 'Build completed!'"
}
}
运行 npm run build 时,输出如下:
shell
> my-app@1.0.0 prebuild
> echo 'Preparing to build...'
Preparing to build...
> my-app@1.0.0 build
> webpack --mode production
> my-app@1.0.0 postbuild
> echo 'Build completed!'
Build completed!
4. 特殊脚本
(1)start 和 test
start 和 test 是 npm 的默认脚本,可以直接运行而无需使用 npm run:
bash
npm start
npm test
cssscripts: { "dev": "vite", "start": "node bin/index.js", }运行start、stop、restart的方式 -> npm run start 或 npm start(必须要在scripts中定义好start、stop命令) restart等于 npm stop + npm start
运行除了上面之外的命令,只能通过 npm run xxx 运行命令不能省略 run,因为start、stop是npm的预置命令
(2)prestart 和 poststart
类似于 prebuild 和 postbuild,prestart 和 poststart 会在 npm start 前后自动执行。
(3)prepublish 和 postpublish
这些脚本在发布包时自动执行。
5. 使用场景
(1)启动开发服务器
通常使用 npm start 或 npm run dev 来启动开发服务器。
示例:
sql
npm start
(2)运行测试
使用 npm test 或 npm run test 来运行测试。
示例:
bash
npm test
(3)构建项目
使用 npm run build 来构建生产环境代码。
示例:
arduino
npm run build
(4)代码检查
使用 npm run lint 来运行代码检查工具(如 ESLint)。
示例:
arduino
npm run lint
6. 高级用法
(1)传递环境变量
可以通过环境变量向脚本传递参数。
示例:
ini
NODE_ENV=production npm run build
(2)并行运行脚本
使用 npm-run-all 工具并行运行多个脚本。
示例:
json
{
"scripts": {
"start": "npm-run-all --parallel server watch",
"server": "node server.js",
"watch": "webpack --watch"
}
}
(3)钩子脚本
利用 pre 和 post 脚本实现自动化任务。
示例:
json
{
"scripts": {
"prebuild": "echo 'Preparing to build...'",
"build": "webpack --mode production",
"postbuild": "echo 'Build completed!'"
}
}
7. 常见问题
(1)npm run 和直接运行命令的区别
npm run 会在项目的 node_modules/.bin 目录下查找可执行文件,因此可以直接运行本地安装的工具(如 webpack、jest 等),而无需全局安装。
(2)如何查看可用脚本?
可以通过以下命令查看 package.json 中定义的脚本:
arduino
npm run
(3)脚本运行失败怎么办?
检查 package.json 中的脚本定义,确保命令正确。如果脚本中有错误,npm 会输出详细的错误信息。
8. 总结
npm run 是运行 package.json 中定义脚本的主要命令,常用场景包括:
- 启动开发服务器
- 运行测试
- 构建项目
- 代码检查
- 自动化任务
update
npm update 是 npm 的一个命令,用于更新项目中已安装的依赖包到最新兼容版本。它会根据 package.json 中指定的版本范围更新包,并更新 package-lock.json 文件。
1. 命令格式
css
npm update [<package-name>]
<package-name>:可选参数,指定需要更新的包名称。如果不提供,则更新所有包。
其他格式
-
更新全局包:
gonpm update -g <package-name> -
更新特定范围的包:
xmlnpm update <package1> <package2>
2. 功能解析
更新本地包
默认情况下,npm update 会更新本地项目的依赖包到最新版本。例如:
sql
npm update lodash
执行后:
- 如果
lodash有新的兼容版本,npm 会更新它。 package-lock.json会更新为新的版本号。package.json中的版本范围不会改变。
更新全局包
如果需要更新全局安装的包,可以加上 -g 或 --global 标志。例如:
sql
npm update -g typescript
更新所有包
如果不指定包名称,npm update 会更新所有依赖包:
sql
npm update
3. 常用选项
| 选项 | 说明 |
|---|---|
--global, -g |
更新全局安装的包。 |
--save |
更新 dependencies 中的包(默认行为)。 |
--save-dev |
更新 devDependencies 中的包。 |
--dry-run |
模拟更新过程,显示将会发生的变化,但不实际执行。 |
--json |
以 JSON 格式输出更新结果。 |
示例
-
更新所有开发依赖:
sqlnpm update --save-dev -
模拟更新:
sqlnpm update --dry-run
4. 结合 package.json 的版本范围
npm update 的行为与 package.json 中指定的版本范围密切相关。以下是常见的版本范围及其影响:
| 版本范围 | 说明 |
|---|---|
^1.2.3 |
更新到最新的次要版本和补丁版本(例如 1.x.x,但不包括 2.0.0)。 |
~1.2.3 |
更新到最新的补丁版本(例如 1.2.x,但不包括 1.3.0)。 |
1.2.3 |
固定版本,不会更新。 |
* |
更新到最新版本。 |
例如:
- 如果
package.json中指定^1.2.3,npm update会更新到最新的1.x.x版本。 - 如果指定
~1.2.3,npm update会更新到最新的1.2.x版本。
5. 注意事项
package.json版本范围:
npm update不会改变package.json中的版本范围,只会更新package-lock.json。
package-lock.json:
npm update会更新package-lock.json中的版本号,确保依赖关系的一致性。
- 全局包:
- 更新全局包时,确保你有足够的权限。
- 安全性:
- 在更新依赖包时,建议检查包的更新日志(Changelog),确保新版本没有引入破坏性变更或安全问题。
-
结合
npm outdated:-
在更新之前,可以使用
npm outdated查看哪些包需要更新:npm outdated
-
6. 示例场景
场景 1:更新单个包
假设项目中安装了 lodash,需要更新到最新版本:
sql
npm update lodash
场景 2:更新所有包
更新项目中所有依赖包:
sql
npm update
场景 3:更新全局包
更新全局安装的 typescript:
sql
npm update -g typescript
7. 总结
npm update 是一个非常有用的命令,用于更新项目中的依赖包到最新兼容版本。其主要功能包括:
- 更新本地或全局安装的包。
- 根据
package.json中的版本范围更新包。 - 更新
package-lock.json文件。 - 支持更新开发依赖。