ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

NodeJS之NPM模块管理器

NodeJS之NPM模块管理器 文章目录1 npm模块管理器1.1 npm简介1.2 修改全局包安装目录1.3 npm常用命令1.3.1 npm init1.3.2 npm set1.3.3 npm info1.3.4 npm search1.3.5 npm list1.3.6 install add1.3.6.1 npm install1.3.6.2 npm add1.3.7 npm updatenpm uninstall1.3.8 npm run1.3.8.1 参数1.3.9 通配符1.3.10 npm version1.3.11 npm deprecate1.4 模块标签1.5 语义版本SemVer2 npm被墙问题2.1 安装淘宝镜像2.2 指定单个下载文件为淘宝镜像地址2.3 修改配置文件为淘宝镜像地址2.4 使用nrm提供的地址3 pnpm3.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可能不是最新版本最好用下面的命令更新到最新版本。$npminstallnpmlatest-g上面的命令之所以最后一个参数是npm是因为npm本身也是Node.js的一个模块。Node安装完成后可以用下面的命令查看一下npm的帮助文件。# npm命令列表$npmhelp# 各个命令的简单用法$npm-l下面的命令分别查看npm的版本和配置。$npm-v$npmconfig list-l1.2 修改全局包安装目录创建新目录# 在 D 盘创建目录mkdirD:\nodejs\npm-globalmkdirD:\nodejs\npm-cache修改配置# 设置全局安装路径npmconfigsetprefixD:\nodejs\npm-global# 设置缓存路径npmconfigsetcacheD:\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 initnpm init用来初始化生成一个新的package.json文件。它会向用户提问一系列问题如果你觉得不用修改默认配置一路回车就可以了。如果使用了-f代表force、-y代表yes则跳过提问阶段直接生成一个新的package.json文件。$npminit-y1.3.2 npm setnpm set用来设置环境变量。$npmsetinit-author-nameYour name$npmsetinit-author-emailYour email$npmsetinit-author-urlhttp://yourdomain.com$npmsetinit-licenseMIT上面命令等于为npm init设置了默认值以后执行npm init的时候package.json的作者姓名、邮件、主页、许可证字段就会自动写入预设的值。这些信息会存放在用户主目录的~/.npmrc文件使得用户不用每个项目都输入。如果某个项目有不同的设置可以针对该项目运行npm config。$npmsetsave-exacttrue上面命令设置加入模块时package.json将记录模块的确切版本而不是一个可选的版本范围。1.3.3 npm infonpm 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 JavaScripts functional programming helper library. $ npm info underscore homepage http://underscorejs.org $ npm info underscore version 1.5.21.3.4 npm searchnpm 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 runrebuildunder… //...1.3.5 npm listnpm list命令以树型结构列出当前项目安装的所有模块以及它们依赖的模块。$npmlist加上global参数会列出全局安装的模块。$npmlist-globalnpm list命令也可以列出单个模块。$npmlist underscore1.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 installNode模块采用npm install命令安装。每个模块可以全局安装也可以本地安装。两者的差异是模块的安装位置以及调用方法。全局安装指的是将一个模块直接下载到Node的安装目录中各个项目都可以调用。本地安装指的是将一个模块下载到当前目录的node_modules子目录然后只有在当前目录和它的子目录之中才能调用这个模块。一般来说全局安装只适用于工具模块比如npm和grunt。注意默认情况下npm install命令是“本地安装”某个模块。$ npm installpackagenamenpm也支持直接输入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 saxlatest $ npm install sax0.1.1$ npm install sax0.1.0 0.2.0如果使用--save-exact参数会在package.json文件指定安装模块的确切版本但是在npm 5之后就不需要--save就会自动保存了$ npm install readable-stream--save--save-exactinstall命令可以使用不同参数指定所安装的模块属于哪一种性质的依赖关系即出现在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 installmodule-namebeta(latest beta)# 安装指定的beta版 $ npm installmodule-name1.3.1-beta.3npm 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加上自动保存到dependencies或devDependencies的功能。优点更直观简洁npm add自动更新package.json不需要再加--save或其他选项。使用场景类似于 Yarn 的 yarn add 命令。默认行为默认将依赖添加到dependencies。使用--save-dev选项可以将依赖添加到devDependencies。1.3.7 npm updatenpm uninstallnpm update命令可以升级本地安装的模块。$npmupdate[package name]加上global参数可以升级全局安装的模块。$npmupdate-global[package name]npm uninstall命令删除本地安装的模块。$npmuninstall[package name]加上global参数可以删除全局安装的模块。$sudonpmuninstall[package name]-global1.3.8 npm runnpm不仅可以用于模块管理还可以用于执行脚本。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 run是npm 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 test1.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 test1.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 versionnpm version命令用来修改项目的版本号。当你完成代码修改要发布新版本的时候就用这个命令更新一下软件的版本。$npmversionupdate_type-mmessagenpm version命令的update_type参数有三个选项patch、minor、major。npm version patch增加一位补丁号比如 1.1.1 - 1.1.2npm version minor增加一位小版本号比如 1.1.1 - 1.2.0npm version major增加一位大版本号比如 1.1.1 - 2.0.0。下面是一个例子。$npmversion patch-mVersion %s - xxxxxx上面命令的%s表示新的版本号。除了增加版本号npm version命令还会为这次修改新增一个git commit记录以及一个新的git tag。1.3.11 npm deprecate如果想废弃某个版本的模块可以使用npm deprecate命令。$npmdeprecate my-thing 0.2.3critical bug fixed in v0.2.3运行上面的命令以后小于0.2.3版本的模块的package.json都会写入一行警告用户安装这些版本时这行警告就会在命令行显示。1.4 模块标签Npm允许为模块的某个版本新建一个标签。$npmdist-tagaddpkgversion[tag]同一种方法是发布的时候加上标签。$npmpublish--tagbeta有了标签以后就可以指定安装该标签的版本或者该标签的依赖。1.5 语义版本SemVernpm采用”语义版本“管理软件包。所谓语义版本就是指版本号为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.01.0.0-alpha1.0.0-rc.01.0.1 ^22.2||2.3注意如果使用连字号它的两端必须有空格。如果不带空格会被npm理解成预发布的tag比如1.0.0-rc.1。2 npm被墙问题npm存储包在国外被墙的话下载很慢http://npm.taobao.org淘宝开发团队把npm在国内做了一个备份2.1 安装淘宝镜像安装淘宝cnpm--global表示安装到全局在任意目录执行都可以npminstall--globalcnpm--registryhttps://registry.npmmirror.com然后在安装包的时候把之前的npm换成cnpm就可以了走的是国外的服务器npminstalljquery 走的是国内服务器 cnpminstalljquery2.2 指定单个下载文件为淘宝镜像地址如果不想安装cnpm又要使用淘宝服务器下载npminstalljquery--registryhttps://registry.npmmirror.com2.3 修改配置文件为淘宝镜像地址由于每次都要加这样的参数很麻烦可以把这个选项加入到配置文件中npmconfigsetregistry https://registry.npmmirror.com查看npm配置信息npmconfig list2.4 使用nrm提供的地址nrm提供了一些最常用的NPM包镜像地址能够让我们快速的切换安装包时候的服务器地址使用方法运行npm i nrm -g全局安装nrm包使用nrm ls查看当前所有可用的镜像源地址以及当前所使用的镜像源地址前面有一个*号表示是当前正在使用的镜像地址使用nrm use npm或nrm use taobao切换不同的镜像源地址切换后就在其列前端会有*标识3 pnpm3.1 简介pnpm是一个新的包管理工具它的设计理念是为了节省磁盘空间并提高安装速度。pnpm通过使用硬链接技术解决了npm和Yarn中存在的重复依赖安装问题。点击了解Yarn包管理工具pnpm的特点节省磁盘空间pnpm通过硬链接机制避免了重复安装相同的包显著减少了磁盘空间的占用。更快的安装速度通过使用磁盘链接和缓存机制pnpm在安装依赖时比npm和Yarn更为高效。严格的依赖树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 usesaria2cformulti-connection downloads. WARN Should it cause issues, runscoop config aria2-enabled falseto disable it. WARN To disable this warning, runscoop config aria2-warning-enabled false.Installingpnpm(10.30.3)[64bit]frommainbucket 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. URIhttps://scoop.201704.xyz/https://github.com/pnpm/pnpm/reDownload: Exception: [AbstractCommand.cc:312] errorCode1 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-loptioninhelp/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\currentD:\Scoop\apps\pnpm\10.30.3 Creating shimforpnpm.Creating shimforpnpx.pnpm(10.30.3)was installed successfully!3.3.2 修改基础配置指定全局缓存存储文件夹配置项作用store-dir存放所有包的硬链接内容地址存储最占空间cache-dir网络下载的临时缓存global-dir全局安装的包本体存放位置node_modules 风格查看配置pnpmcofig list 结果如下 jsr:registryhttps://npm.jsr.io/ cache-dirD:\Scoop\persist\pnpm\cache global-bin-dirD:\Scoop\persist\pnpm\bin 该命令是另外加的 global-dirD:\Scoop\persist\pnpm\globalglobalconfigC:\Users\s0206\AppData\Local\pnpm\config\rc npm-globalconfigD:\Scoop\apps\pnpm\current\etc\npmrcregistryhttps://registry.npmmirror.com 该参数是另外改的 store-dirD:\Scoop\persist\pnpm\store user-agentpnpm/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\bin3.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
返回列表