NPM-常用命令
NPM 常用命令
npm init 初始化 Node.js 项目
npm init
命令用于初始化 Node.js 项目,也就是创建 package.json 文件。
npm init 交互式创建 package.json
执行 npm init
会启动一个交互式命令行问卷,依次询问 package name, version 等信息。
对于每个问题,可以直接按回车键接受括号内的默认值,也可以手动输入后回车确认:
npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help init` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (ts) # 包名(默认是当前文件夹名)
version: (1.0.0) # 初始版本(遵循语义化版本规范 SemVer),默认 1.0.0
description: # 项目描述
entry point: (index.js) # 主入口 JS 文件
test command: # 测试命令(如 mocha或 jest)
git repository: (https://github.com/masikkk/ts.git) # Git 仓库 URL
keywords: # 关键词(逗号分隔,用于 npm 搜索)
author: # 作者信息(格式如:Your Name <email@example.com>)
license: (ISC) # 许可证(默认为 ISC,常见的有 MIT、Apache-2.0 等)
type: (commonjs)
在输入所有信息(或接受默认值)后,npm 会显示一个 package.json 内容预览,确认无误后回车即可自动创建 package.json 文件。
About to write to /Users/xxx/git/my/ts/package.json:
{
"name": "ts",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/masikkk/ts.git"
},
"author": "",
"license": "ISC",
"type": "commonjs",
"bugs": {
"url": "https://github.com/masikkk/ts/issues"
},
"homepage": "https://github.com/masikkk/ts#readme"
}
Is this OK? (yes)
npm init -y 跳过问卷直接创建 package.json
npm init -y
跳过交互式问卷,用默认值创建 package.json 文件。
npm install 安装模块
npm install
简写为 npm i
npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有 -g
而已:
npm install -g pkg
全局安装,用于安装全局可用的命令行工具,例如 claude-code, hexonpm install pkg
本地安装,用于安装仅在某个项目(文件夹)内使用的依赖
npm install pkg
本地安装(默认)
本地安装(Local Installation) 是默认安装方式。
安装在当前项目(运行 npm
命令时所在的目录)目录下的 ./node_modules
文件夹中,如果没有 node_modules
目录会自动创建。
用于为特定项目提供依赖。依赖信息记录在项目的 package.json
文件的 dependencies
或 devDependencies
中。
安装之前,npm install 会先检查 node_modules 目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。
如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用 -f
或 --force
参数: npm install <packageName> --force
本地安装特点:
- 项目隔离性: 每个项目拥有独立的 node_modules,依赖版本互不影响(避免版本冲突)。
- 版本控制: package.json + package-lock.json 锁定了精确依赖版本,保证不同环境(开发、生产)一致性。
- 依赖引用: 项目代码通过
require('package_name')
或ES6 import
引入本地安装的包。 - 启动脚本: 在 package.json 的
scripts
中定义的项目命令(如 npm start, npm test)可直接使用本地安装的 CLI 工具(无需全局安装)。 - 适用场景: Web 框架(React, Vue, Angular)、功能库(Lodash, Axios)、构建工具(Webpack, Babel - 作为项目依赖时)、测试库(Jest, Mocha)等。
npm install -g pkg
全局安装
通过 -g
参数指定 全局安装(Global Installation)
安装在系统全局目录中(与具体项目无关)。
核心目的是为了安装供命令行(CLI)工具在终端/命令行中全局使用。
通过 npm root -g
命令可查看全局安装路径,例如:
/opt/homebrew/lib/node_modules
Mac 上/usr/local/lib/node_modules
Unix 上%AppData%\npm\node_modules
Windows 上
全局安装特点:
- 全局可用性: 安装后,其提供的命令行命令可在系统任何路径下执行(需确保全局安装目录在系统的 PATH 环境变量中)。
- 非代码依赖: 在项目代码中不能通过 require 或 import 引入全局安装的包(除非项目本地也安装了)。
- 版本单一性: 整个系统通常只有一个版本,可能导致不同项目对全局工具版本要求不同时产生冲突。
- 适用场景: 提供终端命令的工具包
典型的全局工具包括:
- 脚手架工具:create-react-app, vue-cli, @angular/cli, expo-cli
- 构建/任务工具:gulp-cli, grunt-cli
- 包管理工具:yarn, pnpm (可以用npm安装它们自身)
- 实用工具:nodemon (自动重启Node应用), http-server (快速启动静态服务器), typescript (tsc命令)
- 跨项目工具:eslint, prettier (若需全局使用其CLI)
npm install -g npm@latest 升级全局npm版本
全局升级 npm 自身的版本到最新版
npm install -g npm@latest
npm install 根据 package.json 安装包
npm install
命令执行目录有 package.json 文件时,会根据 package.json 安装依赖
package.json 中的 dependencies
和 devDependencies
依赖包都会被安装
npm install --only=prod
或 npm install --production
只安装 dependencies 依赖
npm install pkg –save 安装并写入 package.json(5.0.0+自动)
npm install pkg --save
安装好后写入 package.json 的 dependencies 中(生产环境依赖)
从 npm 5.0.0 开始,npm install pkg
自动等效于 npm install pkg --save
这意味着不需要显式添加 --save
选项,npm 就会把依赖包及其版本添加到 package.json 文件中的 dependencies 部分
npm install pkg –save-dev 安装开发依赖
npm install 模块 --save-dev
安装好后写入 package.json 的 devDepencies 中(开发环境依赖)
npm install --unsafe-perm
npm 出于安全考虑不支持以 root 用户运行,即使你用 root 用户身份运行了,npm 会自动转成一个叫 nobody 的用户来运行,而这个用户几乎没有任何权限。这样的话如果你脚本里有一些需要权限的操作,比如写文件(尤其是写 /root/.node-gyp ),就会崩掉了。
为了避免这种情况,要么按照 npm 的规矩来,专门建一个用于运行 npm 的高权限用户;要么加 –unsafe-perm 参数,这样就不会切换到 nobody 上,运行时是哪个用户就是哪个用户,即使是 root。
一劳永逸的方法:npm config set unsafe-perm
针对当前用户的npm config -g set unsafe-perm
全局的
https://docs.npmjs.com/misc/config#unsafe-perm
npm install permission denied 问题
npm install 的时候,使用了 sudo,还是报权限错误 permission denied
例如 sudo npm update hexo
时
$ sudo npm update hexo
Password:
> fsevents@1.2.9 install /Users/xxx/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents
> node install
node-pre-gyp WARN Using needle for node-pre-gyp https download
node-pre-gyp WARN Pre-built binaries not installable for fsevents@1.2.9 and node@10.4.0 (node-v64 ABI, unknown) (falling back to source compile with node-gyp)
node-pre-gyp WARN Hit error EACCES: permission denied, mkdir '/Users/xxx/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/lib'
gyp ERR! configure error
gyp ERR! stack Error: EACCES: permission denied, mkdir '/Users/xxx/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/build'
gyp ERR! System Darwin 17.7.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--module=/Users/xxx/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64/fse.node" "--module_name=fse" "--module_path=/Users/xxx/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64" "--napi_version=3" "--node_abi_napi=napi" "--napi_build_version=0" "--node_napi_label=node-v64"
gyp ERR! cwd /Users/xxx/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents
gyp ERR! node -v v10.4.0
gyp ERR! node-gyp -v v5.0.3
gyp ERR! not ok
解决方法:
在npm install 的时候,同时使用 sudo
和 --unsafe-perm
sudo npm install --unsafe-perm
$ sudo npm install --unsafe-perm
Password:
> fsevents@1.2.9 install /Users/xxx/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents
> node install
node-pre-gyp WARN Using needle for node-pre-gyp https download
[fsevents] Success: "/Users/xxx/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64/fse.node" is installed via remote
> fsevents@1.2.9 install /Users/xxx/git/madaimeng_backup/node_modules/nunjucks/node_modules/fsevents
> node install
node-pre-gyp WARN Using needle for node-pre-gyp https download
[fsevents] Success: "/Users/xxx/git/madaimeng_backup/node_modules/nunjucks/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64/fse.node" is installed via remote
added 138 packages from 35 contributors and audited 7136 packages in 7.598s
found 6 vulnerabilities (2 low, 3 moderate, 1 high)
run `npm audit fix` to fix them, or `npm audit` for details
sudo npm install 时,报错 permission denied 的解决方案
https://newsn.net/say/sudo-npm-install-permission.html
npm ci 根据 package-lock.json 安装依赖
npm ci
命令类似 npm install
安装依赖,但是严格按 package-lock.json 或 npm-shrinkwrap.json 安装,适用于 CI/CD 或生产环境,用于快速、可靠地安装依赖项。
npm ci
命令的特点:
- npm ci 强制要求项目根目录下必须存在 package-lock.json 或 npm-shrinkwrap.json 文件。
- npm ci 完全依赖 package-lock.json 或 npm-shrinkwrap.json 文件,不修改它。
- npm ci 会严格检查锁定文件 package-lock.json 是否与当前 package.json 文件中的依赖项及其范围兼容。如果不兼容(例如,package.json 修改后没有重新生成锁定文件),会直接报错并退出(返回非 0 状态码),而不会尝试自动修复。
- 在执行任何安装操作之前,
npm ci
总是会删除现有的 node_modules 目录(如果存在)。这是与npm install
的最大行为差异之一 - npm ci 完全忽略 package.json 中的依赖版本范围声明
^
,~
等 - npm ci 会优先尝试从本地 npm 缓存 (~/.npm) 中获取所需的包。如果缓存中有锁定的版本,会直接解压链接,速度极快。
- 通过跳过依赖关系解析和 package.json 中的版本范围匹配,并充分利用缓存,安装速度通常比 npm install 快得多
npm list 查看安装包
npm list 查看本地已安装模块
npm list --depth=0
查看本地安装包–depth
表示深度,我们使用的模块会有依赖,深度为零的时候,不会显示依赖模块
npm list --depth --global
查看全局安装包
npm list -g 查看全局已安装模块
npm list –depth=0 仅查看直接依赖
仅列出项目直接依赖
npm root -g 查看全局安装路径
npm root -g
/opt/homebrew/lib/node_modules
npm update 更新模块
npm update <Module Name>
它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。
npm update <package>
可以把当前目录下 node_modules 子目录里边的对应模块更新至最新版本。npm update <package> -g
可以把全局安装的对应命令行程序更新至最新版。
npm uninstall 删除模块
删除全局模块npm uninstall -g <package>
删除本地模块npm uninstall 模块
删除本地模块时你应该思考的问题:是否将在 package.json
上的相应依赖信息也消除?npm uninstall 模块
删除模块,但不删除模块留在 package.json 中的对应信息npm uninstall 模块 --save
删除模块,同时删除模块留在 package.json 中 dependencies 下的对应信息npm uninstall 模块 --save-dev
删除模块,同时删除模块留在 package.json 中 devDependencies 下的对应信息
例如
sudo npm uninstall hexo-generator-search --save
Password:
removed 1 package and audited 7132 packages in 4.202s
found 6 vulnerabilities (3 low, 2 moderate, 1 high)
run `npm audit fix` to fix them, or `npm audit` for details
npm search 搜索模块
npm search <Module Name>
npm prune 清理无效包
手动删除 package.json 中的依赖后,执行 npm prune
可删除所有 package.json 中不存在的包
npm run script-name 执行脚本
在项目根目录(即包含 package.json
的目录)下运行 npm run script-name
例如 npm run dev
时,内部的执行顺序是:
1、查找 package.json: npm 首先在当前目录及其父目录中查找 package.json 文件。
2、定位 scripts
: 找到 package.json 后,npm 会查找其中的 scripts
对象。
3、匹配脚本名:npm 检查 scripts
对象中是否存在一个键(属性名)与你输入的 script-name
(例如 dev)匹配。
4、执行命令字符串:如果找到了匹配的脚本,npm 会将其值(例如 vite
)作为一个 shell 命令 在一个子进程中执行。
执行脚本命令时有个关键点:环境变量 PATH 的修改: npm 在执行这个命令前,会做一件非常重要的事情:它会将项目本地的 node_modules/.bin 目录 临时地添加到 shell 的 PATH 环境变量的最前面。
5、vite 可执行文件是一个 Node.js 脚本。它被执行后,读取项目的配置文件(如 vite.config.js),然后启动开发服务器(包含模块热重载 - HMR)、编译 Vue 单文件组件(.vue)等,最终让你的 Vue3 应用在浏览器中运行起来。
npx 执行包命令(npm 5.2+)
npx(Node Package Executor) 是随 npm 5.2.0+ 版本一起发布的强大命令行工具,它极大地简化了在 Node.js 生态中执行包(尤其是 CLI 工具)的流程,而无需先进行全局安装或在项目中作为依赖项安装。
npx command
执行时的命令查找顺序:
- 优先项目本地路径
node_modules/.bin/
:npx 首先检查当前目录或父目录中的node_modules/.bin/
下是否存在该命令。如果有,则直接执行本地版本(优先项目依赖)。 - 全局路径
PATH
:如果本地找不到,它会检查系统环境变量 PATH 中是否存在全局安装的命令。 - 远程查找 npm 仓库:如果以上都找不到,npx 会在 npm 远程仓库查找名为
<command>
的包。这才是 npx 最强大的地方。
npx 远程包命令执行过程
如果远程包是一个可执行的 CLI 工具(通常包含一个 bin.js 入口),npx 处理顺序如下:
- 临时安装:将该包的最新版本(或根据指令指定的版本)下载到一个全局缓存目录中,通常是
~/.npm/_npx
- 执行命令:使用该临时安装的包执行用户指定的命令
- 清理(可选):默认情况下,执行完毕后不会保留这个临时安装的包。下次执行时如有需要会再次下载最新版。除非使用 -p(持久化) 或者环境变量控制缓存行为。
npx cmd@ver
执行特定版本的命令
例如 npx create-react-app@4.0.3 my-app
npx <command>
后面的所有额外参数都会直接传递给要执行的命令
例如 npx http-server -p 8080 -c-1
传递参数 -p 8080 和 -c-1 给 http-server
上一篇 Java-RMI
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: