news 2026/8/22 11:57:40

NodeJS之NPM模块管理器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NodeJS之NPM模块管理器

文章目录

  • 1 npm模块管理器
    • 1.1 npm简介
    • 1.2 修改全局包安装目录
    • 1.3 npm常用命令
      • 1.3.1 npm init
      • 1.3.2 npm set
      • 1.3.3 npm info
      • 1.3.4 npm search
      • 1.3.5 npm list
      • 1.3.6 install & add
        • 1.3.6.1 npm install
        • 1.3.6.2 npm add
      • 1.3.7 npm update,npm uninstall
      • 1.3.8 npm run
        • 1.3.8.1 参数
      • 1.3.9 通配符
      • 1.3.10 npm version
      • 1.3.11 npm deprecate
    • 1.4 模块标签
    • 1.5 语义版本(SemVer)
  • 2 npm被墙问题
    • 2.1 安装淘宝镜像
    • 2.2 指定单个下载文件为淘宝镜像地址
    • 2.3 修改配置文件为淘宝镜像地址
    • 2.4 使用nrm提供的地址
  • 3 pnpm
    • 3.1 简介
    • 3.2 npm、Yarn 和 pnpm 的区别
    • 3.3 安装操作
      • 3.3.1 下载
      • 3.3.2 修改基础配置
      • 3.3.3 修改默认配置

1 npm模块管理器

1.1 npm简介

npm有两层含义

  • 一层含义是Node.js的开放式模块登记和管理系统,网址为http://npmjs.org
  • 另一层含义是Node.js默认的模块管理器,是一个命令行下的软件,用来安装和管理node模块。
    npm不需要单独安装。在安装node的时候,会连带一起安装npm。但是,node附带的npm可能不是最新版本,最好用下面的命令,更新到最新版本。
$npminstallnpm@latest-g

上面的命令之所以最后一个参数是npm,是因为npm本身也是Node.js的一个模块。
Node安装完成后,可以用下面的命令,查看一下npm的帮助文件。

# npm命令列表$npmhelp# 各个命令的简单用法$npm-l

下面的命令分别查看npm的版本和配置。

$npm-v$npmconfig list-l

1.2 修改全局包安装目录

创建新目录

# 在 D 盘创建目录mkdirD:\nodejs\npm-globalmkdirD:\nodejs\npm-cache

修改配置

# 设置全局安装路径npmconfigsetprefix"D:\nodejs\npm-global"# 设置缓存路径npmconfigsetcache"D:\nodejs\npm-cache"

验证

npmconfig get prefix# 输出: D:\nodejs\npm-globalnpminstall-gtypescript# 应该装到 D 盘

1.3 npm常用命令

https://npm.js.com网站搜索常用的包

npm--version//查看npm版本npminstall--globalnpm//升级npmnpminit //生成包的json说明文件npminit-y//可以跳过选择,快速生成npminstalljquery art-template;//装多个文件的命令用空格隔开npminstalljquery--save(或者npminstall--savejquery)//会把包依赖的版本信息保存成json文件npminstall;//会在误把包删除后,直接从package.json文件中查找依赖项逐一安装npmuninstall 包名 //只删除,如果有依赖项会依然保存npmuninstall--save包名 //删除也会把依赖项删除npm--help//查看使用帮助npm包名--help//查看具体包的使用帮助npmsearch 包名//要查询某个模块插件的时候可以直接运用search命令进行查找npmremove 包名//如果想移除所安装的npm包

1.3.1 npm init

npm init用来初始化生成一个新的package.json文件。它会向用户提问一系列问题,如果你觉得不用修改默认配置,一路回车就可以了。
如果使用了-f(代表force)、-y(代表yes),则跳过提问阶段,直接生成一个新的package.json文件。

$npminit-y

1.3.2 npm set

npm set用来设置环境变量。

$npmsetinit-author-name'Your name'$npmsetinit-author-email'Your email'$npmsetinit-author-url'http://yourdomain.com'$npmsetinit-license'MIT'

上面命令等于为npm init设置了默认值,以后执行npm init的时候,package.json的作者姓名、邮件、主页、许可证字段就会自动写入预设的值。这些信息会存放在用户主目录的~/.npmrc文件,使得用户不用每个项目都输入。如果某个项目有不同的设置,可以针对该项目运行npm config

$npmsetsave-exacttrue

上面命令设置加入模块时,package.json将记录模块的确切版本,而不是一个可选的版本范围。

1.3.3 npm info

npm info命令可以查看每个模块的具体信息。比如,查看underscore模块的信息。

$npminfo underscore{name:'underscore', description:'JavaScript\'s functional programming helper library.', 'dist-tags': { latest: '1.5.2', stable: '1.5.2' }, repository: { type: 'git', url: 'git://github.com/jashkenas/underscore.git' }, homepage: 'http://underscorejs.org', main: 'underscore.js', version: '1.5.2', devDependencies: { phantomjs: '1.9.0-1' }, licenses: { type: 'MIT', url: 'https://raw.github.com/jashkenas/underscore/master/LICENSE' }, files: [ 'underscore.js', 'underscore-min.js', 'LICENSE' ], readmeFilename: 'README.md'}

上面命令返回一个JavaScript对象,包含了underscore模块的详细信息。这个对象的每个成员,都可以直接从info命令查询。

$ npm info underscore description JavaScript's functional programming helper library. $ npm info underscore homepage http://underscorejs.org $ npm info underscore version 1.5.2

1.3.4 npm search

npm search命令用于搜索npm仓库,它后面可以跟字符串,也可以跟正则表达式

$npmsearch<搜索词>

下面是一个例子。

$npmsearch node-gyp // NAME DESCRIPTION // autogypi Autogypi handles dependenciesfornode-gyp projects. // grunt-node-gyp Run node-gyp commands from Grunt. // gyp-io Temporary solution toletnode-gyp run`rebuild`under… //...

1.3.5 npm list

npm list命令以树型结构列出当前项目安装的所有模块,以及它们依赖的模块。

$npmlist

加上global参数,会列出全局安装的模块。

$npmlist-global

npm list命令也可以列出单个模块。

$npmlist underscore

1.3.6 install & add

区别对比

功能npm installnpm add
添加依赖到 package.json需要手动添加 --save 或 --save-dev自动添加到 dependencies 或 devDependencies
安装所有依赖支持(npm install 无参数)不支持
更新锁文件(package-lock.json)支持支持
使用简洁性命令较复杂更简洁,类似 Yarn 的 add
版本支持较早版本即可使用需要较新的 npm 版本(6.x 及以上)
1.3.6.1 npm install

Node模块采用npm install命令安装。每个模块可以全局安装,也可以本地安装。两者的差异是模块的安装位置,以及调用方法。

  • 全局安装:指的是将一个模块直接下载到Node的安装目录中,各个项目都可以调用。
  • 本地安装:指的是将一个模块下载到当前目录的node_modules子目录,然后只有在当前目录和它的子目录之中,才能调用这个模块。一般来说,全局安装只适用于工具模块,比如npm和grunt。

注意:默认情况下,npm install命令是“本地安装”某个模块。

$ npm install<packagename>

npm也支持直接输入github地址

$ npm install git://github.com/package/path.git $ npm install git://github.com/package/path.git#0.1.0

运行上面命令后,模块文件将下载到当前目录的node_modules子目录
使用global参数,可以“全局安装”某个模块。global参数可以被简化成g参数

$ sudo npm install-global[packagename]$ sudo npm install-g[packagename]

install命令总是安装模块的最新版本,如果要安装模块的特定版本,可以在模块名后面加上@和版本号

$ npm install sax@latest $ npm install sax@0.1.1$ npm install sax@">=0.1.0 <0.2.0"

如果使用--save-exact参数,会在package.json文件指定安装模块的确切版本,但是在npm 5之后,就不需要--save就会自动保存了

$ npm install readable-stream--save--save-exact

install命令可以使用不同参数,指定所安装的模块属于哪一种性质的依赖关系,即出现在packages.json文件的哪一项中。

  • --save:模块名将被添加到dependencies,可以简化为参数-S。
  • --save-dev: 模块名将被添加到devDependencies,可以简化为参数-D。
$ npm install sax--save $ npm install node-tap--save-dev # 或者 $ npm install sax-S$ npm install node-tap-D

如果要安装beta版本的模块,需要使用下面的命令。

# 安装最新的beta版 $ npm install<module-name>@beta(latest beta)# 安装指定的beta版 $ npm install<module-name>@1.3.1-beta.3

npm install默认会安装dependencies字段和devDependencies字段中的所有模块,如果使用production参数,可以只安装dependencies字段的模块。但是在npm 5之后,就不需要--save就会自动保存了

1.3.6.2 npm add

用法:npm add [package-name]
功能:npm add是一个较新的命令,主要用于直接将依赖添加到package.json中,同时安装该依赖包到node_modules
相当于npm install加上自动保存到dependenciesdevDependencies的功能。

优点:

  • 更直观简洁:npm add自动更新package.json,不需要再加--save或其他选项。
  • 使用场景类似于 Yarn 的 yarn add 命令。

默认行为:

  • 默认将依赖添加到dependencies
  • 使用--save-dev选项可以将依赖添加到devDependencies

1.3.7 npm update,npm uninstall

npm update命令可以升级本地安装的模块。

$npmupdate[package name]

加上global参数,可以升级全局安装的模块。

$npmupdate-global[package name]

npm uninstall命令,删除本地安装的模块。

$npmuninstall[package name]

加上global参数,可以删除全局安装的模块。

$sudonpmuninstall[package name]-global

1.3.8 npm run

npm不仅可以用于模块管理,还可以用于执行脚本。package.json文件有一个scripts字段,可以用于指定脚本命令,供npm直接调用。

{"name":"myproject","devDependencies":{"jshint":"latest","browserify":"latest","mocha":"latest"},"scripts":{"lint":"jshint **.js","test":"mocha test/"}}

上面代码中,scripts字段指定了两项命令lint和test
命令行输入npm run-script lint或者npm run lint,就会执行jshint **.js
输入npm run-script test或者npm run test,就会执行mocha test/
npm runnpm run-script的缩写,一般都使用前者,但是后者可以更好地反应这个命令的本质。
npm内置了两个命令简写,npm test等同于执行npm run testnpm start等同于执行npm run start
npm run会创建一个shell,执行指定的命令,并将node_modules/.bin加入PATH变量,这意味着本地模块可以直接运行。也就是说,npm run lint直接运行jshint* *.js即可,而不用./node_modules/.bin/jshint ** .js
如果直接运行npm run不给出任何参数,就会列出scripts属性下所有命令。

$npmrun Available scriptsinthe user-service package: lint jshint **.jstestmocha test/

下面是另一个package.json文件的例子。

"scripts":{"watch":"watchify client/main.js -o public/app.js -v","build":"browserify client/main.js -o public/app.js","start":"npm run watch & nodemon server.js","test":"node test/all.js"},

上面代码在scripts项,定义了四个别名,每个别名都有对应的脚本命令。

$npmrunwatch$npmrun build $npmrun start $npmruntest

其中,start和test属于特殊命令,可以省略run

$ npm start $ npm test
1.3.8.1 参数

npm run命令还可以添加参数。

"scripts":{"test":"mocha test/"}

上面代码指定npm test,实际运行mocha test/。如果要通过npm test命令,将参数传到mocha,则参数之前要加上两个连词线。

$ npm run test -- anothertest.js # 等同于 $ mocha test/ anothertest.js

上面命令表示,mocha要运行所有test子目录的测试脚本,以及另外一个测试脚本anothertest.js
npm run本身有一个参数-s,表示关闭npm本身的输出,只输出脚本产生的结果。

// 输出npm命令头 $ npm run test // 不输出npm命令头 $ npm run -s test

1.3.9 通配符

npm的通配符的规则如下。

  • *匹配0个或多个字符
  • ?匹配1个字符
  • [...]匹配某个范围的字符。如果该范围的第一个字符是!或^,则匹配不在该范围的字符。
  • !(pattern|pattern|pattern)匹配任何不符合给定的模式
  • ?(pattern|pattern|pattern)匹配0个或1个给定的模式
  • +(pattern|pattern|pattern)匹配1个或多个给定的模式
  • *(a|b|c)匹配0个或多个给定的模式
  • @(pattern|pat*|pat?erN)只匹配给定模式之一
  • **如果出现在路径部分,表示0个或多个子目录。

1.3.10 npm version

npm version命令用来修改项目的版本号。当你完成代码修改,要发布新版本的时候,就用这个命令更新一下软件的版本。

$npmversion<update_type>-m"<message>"

npm version命令的update_type参数有三个选项:patch、minor、major

  • npm version patch增加一位补丁号(比如 1.1.1 -> 1.1.2)
  • npm version minor增加一位小版本号(比如 1.1.1 -> 1.2.0)
  • npm version major增加一位大版本号(比如 1.1.1 -> 2.0.0)。
    下面是一个例子。
$npmversion patch-m"Version %s - xxxxxx"

上面命令的%s表示新的版本号。
除了增加版本号,npm version命令还会为这次修改,新增一个git commit记录,以及一个新的git tag。

1.3.11 npm deprecate

如果想废弃某个版本的模块,可以使用npm deprecate命令。

$npmdeprecate my-thing@"< 0.2.3""critical bug fixed in v0.2.3"

运行上面的命令以后,小于0.2.3版本的模块的package.json都会写入一行警告,用户安装这些版本时,这行警告就会在命令行显示。

1.4 模块标签

Npm允许为模块的某个版本,新建一个标签。

$npmdist-tagadd<pkg>@<version>[<tag>]

同一种方法是发布的时候,加上标签。

$npmpublish--tag=beta

有了标签以后,就可以指定安装该标签的版本,或者该标签的依赖。

1.5 语义版本(SemVer)

npm采用”语义版本“管理软件包。所谓语义版本,就是指版本号为a.b.c的形式,其中a是大版本号,b是小版本号,c是补丁号
一个软件发布的时候,默认就是1.0.0版。

  • 如果以后发布补丁,就增加最后一位数字,比如1.0.1;
  • 如果增加新功能,且不影响原有的功能,就增加中间的数字(即小版本号),比如1.1.0;
  • 如果引入的变化,破坏了向后兼容性,就增加第一位数字(即大版本号),比如2.0.0。
    npm允许使用特殊符号,指定所要使用的版本范围,假定当前版本是1.0.4
  • 只接受补丁包:1.0 或者 1.0.x 或者 ~1.0.4
  • 只接受小版本和补丁包:1 或者 1.x 或者 ^1.0.4
  • 接受所有更新:* or x
    对于~和^,要注意区分,前者表示接受当前小版本(如果省略小版本号,则是当前大版本)的最新补丁包,后者表示接受当前大版本的最新小版本和最新补丁包。
~2.2.1 // 接受2.2.1,不接受2.3.0 ^2.2.1 // 接受2.2.1和2.3.0 ~2.2 // 接受2.2.0和2.2.1,不接受2.3.0 ^2.2 // 接受2.2.0、2.2.1和2.3.0 ~2 // 接受2.0.0、2.1.0、2.2.0、2.2.1和2.3.0 ^2 // 接受2.0.0、2.1.0、2.2.0、2.2.1和2.3.0

还可以使用数学运算符(比如>, <, =, >= or <=等),指定版本范围。

>2.11.0.0 -1.2.0>1.0.0-alpha>=1.0.0-rc.0<1.0.1 ^2<2.2||>2.3

注意,如果使用连字号,它的两端必须有空格。如果不带空格,会被npm理解成预发布的tag,比如1.0.0-rc.1。

2 npm被墙问题

  • npm存储包在国外,被墙的话,下载很慢
  • http://npm.taobao.org淘宝开发团队把npm在国内做了一个备份

2.1 安装淘宝镜像

安装淘宝cnpm

--global表示安装到全局,在任意目录执行都可以npminstall--globalcnpm--registry=https://registry.npmmirror.com

然后在安装包的时候,把之前的npm换成cnpm就可以了

走的是国外的服务器npminstalljquery 走的是国内服务器 cnpminstalljquery

2.2 指定单个下载文件为淘宝镜像地址

如果不想安装cnpm又要使用淘宝服务器下载

npminstalljquery--registry=https://registry.npmmirror.com

2.3 修改配置文件为淘宝镜像地址

由于每次都要加这样的参数很麻烦,可以把这个选项加入到配置文件中

npmconfigsetregistry https://registry.npmmirror.com

查看npm配置信息

npmconfig list

2.4 使用nrm提供的地址

nrm:提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址;
使用方法:

  1. 运行npm i nrm -g全局安装nrm包;
  2. 使用nrm ls查看当前所有可用的镜像源地址以及当前所使用的镜像源地址,前面有一个*号表示是当前正在使用的镜像地址;
  3. 使用nrm use npmnrm use taobao切换不同的镜像源地址,切换后就在其列前端会有*标识

3 pnpm

3.1 简介

pnpm是一个新的包管理工具,它的设计理念是为了节省磁盘空间并提高安装速度。pnpm通过使用硬链接技术解决了npmYarn中存在的重复依赖安装问题。点击了解Yarn包管理工具

pnpm的特点:

  • 节省磁盘空间:pnpm通过硬链接机制,避免了重复安装相同的包,显著减少了磁盘空间的占用。
  • 更快的安装速度:通过使用磁盘链接和缓存机制,pnpm在安装依赖时,比npmYarn更为高效。
  • 严格的依赖树:pnpm强制要求每个依赖都必须明确声明,这确保了项目的依赖结构更清晰。

3.2 npm、Yarn 和 pnpm 的区别

特性npmYarnpnpm
安装速度较慢较快更快
磁盘占用可能有重复依赖通过缓存减少重复使用硬链接节省磁盘空间
锁文件package-lock.jsonyarn.lockpnpm-lock.yaml
离线支持不支持完全离线支持离线安装支持离线安装
依赖管理自动安装依赖,但可能出现版本冲突严格保证依赖一致性强制依赖清晰和一致
社区支持全球最大的开源库Facebook 及相关团队支持社区发展迅速

3.3 安装操作

3.3.1 下载

使用scoop 安装pnpm
点击此次了解Scoop包管理

scoopinstallmain/pnpm WARN Scoop uses'aria2c'formulti-connection downloads. WARN Should it cause issues, run'scoop config aria2-enabled false'to disable it. WARN To disable this warning, run'scoop config aria2-warning-enabled false'.Installing'pnpm'(10.30.3)[64bit]from'main'bucket proxy: https://github.com/pnpm/pnpm/releases/download/v10.30.3/pnpm-win-x64.exe#/pnpm.exeStarting download with aria2... Download: 03/0710:12:06[ERROR]CUID#8 - Download aborted. URI=https://scoop.201704.xyz/https://github.com/pnpm/pnpm/reDownload: Exception: [AbstractCommand.cc:312] errorCode=1 Network problem has occurred. cause:A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because Download: Download Results: Download: gid |stat|avg speed |path/URIDownload:======+====+===========+=======================================================Download: 7ab91d|ERR|0B/s|D:/Scoop/cache/pnpm#10.30.3#b4d986e.exeDownload: Status Legend: Download:(ERR):error occurred. Download: aria2 will resume downloadifthe transfer is restarted. Download: If there are any errors,thensee the log file. See'-l'optioninhelp/man pagefordetails. Fallback to default downloader... proxy: https://github.com/pnpm/pnpm/releases/download/v10.30.3/pnpm-win-x64.exe pnpm-win-x64.exe(50.6MB)[==================================================================================]100% Checkinghashof pnpm-win-x64.exe... ok. Linking D:\Scoop\apps\pnpm\current=>D:\Scoop\apps\pnpm\10.30.3 Creating shimfor'pnpm'.Creating shimfor'pnpx'.'pnpm'(10.30.3)was installed successfully!

3.3.2 修改基础配置

指定全局,缓存,存储文件夹

配置项作用
store-dir存放所有包的硬链接内容地址存储(最占空间)
cache-dir网络下载的临时缓存
global-dir全局安装的包本体存放位置(node_modules 风格)

查看配置

pnpmcofig list 结果如下: @jsr:registry=https://npm.jsr.io/ cache-dir=D:\Scoop\persist\pnpm\cache global-bin-dir=D:\Scoop\persist\pnpm\bin (该命令是另外加的) global-dir=D:\Scoop\persist\pnpm\globalglobalconfig=C:\Users\s0206\AppData\Local\pnpm\config\rc npm-globalconfig=D:\Scoop\apps\pnpm\current\etc\npmrcregistry=https://registry.npmmirror.com (该参数是另外改的) store-dir=D:\Scoop\persist\pnpm\store user-agent=pnpm/10.30.3 npm/? node/v20.11.1 win32 x64

下载时会报错:

Run “pnpm setup” to create it automatically, or set the global-bin-dir setting, or the PNPM_HOME env variable. The global bin directory should be in the PATH.

报错原因是:pnpm不知道应该把全局命令的快捷方式(可执行文件/Bin)放在哪里,或者系统环境变量PATH里找不到对应的路径
需要 配置global-bin-dir路径:pnpm config set global-bin-dir "D:\Scoop\persist\pnpm\bin",同时在用户变量系统变量中找到Path变量,双击编辑,填入:D:\Scoop\persist\pnpm\bin

3.3.3 修改默认配置

如果 想更换下载缓存等文件夹地址,可以执行如下命令:

# 指定全局pnpmconfigsetglobal-dir D:\Scoop\persist\pnpm\global# 指定主体pnpmconfigsetstore-dir D:\Scoop\persist\pnpm\store# 指定缓存pnpmconfigsetcache-dir D:\Scoop\persist\pnpm\cache

修改包镜像源地址

# 改为淘宝镜像(推荐)pnpmconfigsetregistry https://registry.npmmirror.com/# 或腾讯云镜像pnpmconfigsetregistry https://mirrors.cloud.tencent.com/npm/# 或华为云镜像pnpmconfigsetregistry https://repo.huaweicloud.com/repository/npm/

删除属性恢复默认则用delete命令

# 删除 prefix 配置,恢复默认值pnpmconfig delete prefix
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 11:50:45

十分钟搭建个人博客:浪浪云与Halo的免运维部署实践

之前想搭建个人博客&#xff0c;要么得折腾服务器、域名、备案&#xff0c;要么得忍受免费平台的广告和限制&#xff0c;技术门槛和精力成本都不低。最近发现“浪浪云”和“Halo”的组合&#xff0c;简直是个人站长的福音&#xff0c;从零到上线一个功能完整、界面美观的博客&a…

作者头像 李华
网站建设 2026/8/22 11:50:08

C++11三件套:可变模板、Lambda与std::function深度解析

1. 这不是语法糖&#xff0c;是C11重构底层思维的三把钥匙 你翻过《C Primer》第16章&#xff0c;对着 template<typename... Args> 发过呆&#xff1b;你在Qt信号槽里写过 [](int x, double y) { return x y; } &#xff0c;却说不清捕获列表方括号里到底发生了什么…

作者头像 李华
网站建设 2026/8/22 11:48:15

IntelliJ IDEA中文汉化与编码配置全攻略:从安装到实战避坑

1. 从“Error: Module not specified”到中文界面&#xff1a;一个IDE本地化的完整旅程最近在帮团队新来的小伙伴配置开发环境&#xff0c;他刚从学校出来&#xff0c;对全英文的IntelliJ IDEA界面有点发怽&#xff0c;上来就问我&#xff1a;“哥&#xff0c;这玩意儿能调成中…

作者头像 李华
网站建设 2026/8/22 11:47:34

linux微信闪退解决sh脚本

#!/bin/bash set -e echo "" echo " Linux微信 malloc崩溃一键修复脚本" echo ""# 1. 杀掉微信全部残留进程 echo "[1/5] 终止微信残留进程..." pkill -f wechat 2>/dev/null || true pkill -f WeChatAppEx 2>/dev/null || tru…

作者头像 李华
网站建设 2026/8/22 11:47:21

基于TVA的具身智能因果推理与反事实学习

前沿技术探索&#xff1a;TVA智能体&#xff08;简称TVA&#xff09;TVA智能体&#xff08;亦称“AI智能体视觉”或“TVA视觉智能体”&#xff09;是依托Transformer架构与“因式智能体”理论构建的系统级视觉技术框架。它融合深度强化学习&#xff08;DRL&#xff09;、卷积神…

作者头像 李华