Npm

摩森特沃 2021年05月11日 865次浏览

声明:本文多处直接引用了文末的参考链接中的内容,如有侵权,请联系删除

npm是什么

  • npm 是 JavaScript 的包管理工具,并且是 Node.js 平台的默认包管理工具
  • 通过 npm 可以安装、共享、分发代码,管理项目依赖关系

npm安装和卸载

安装

  • 安装node时自动安装npm
  • 手动重装:curl -L https://npmjs.com/install.sh | sh

升级

  • npm install npm[@指定版本] -g

卸载

  • 通过命令卸载:npm uninstall npm -g

npm常用命令

基础命令

  • npm -v: 查看 npm 的版本
  • npm -l:查看各个命令的简单用法
  • npm help:查看 npm 命令列表
  • npm config list -l:查看 npm 的配置

设置环境变量和镜像

常用的环境变量设置

  • npm set init-author-name 'your name'
  • npm set init-author-email 'your email'
  • npm set init-author-url 'http://most-all.com'
  • npm set init-license 'MIT'

如果已经有 package.json 文件了,则执行以上的设置后,package.json 不会发生变化,需要重新执行npm init才会变化

镜像配置与镜像加速解决方案

  • npm config set registry 镜像地址:设置镜像源

示例:npm config set registry https://registry.npm.taobao.org

  • npm config get registry:查看镜像源
  • npm install 模块 --registry 镜像地址:使用指定源安装模块

示例:npm install express --registry https://registry.npm.taobao.org

镜像管理

  • npm install -g nrm:安装镜像管理依赖
  • nrm常用命令
  • nrm ls:查看npm镜像
  • nrm use taobao:切换镜像
  • nrm add URL 'registry_name':添加自己的镜像
  • nrm del 'registry_name':删除镜像
  • nrm test ['registry_name']:测试镜像响应速度

常用镜像地址

创建模块

  • npm init:初始化生成一个新的package.json文件

它会向用户提问一系列问题,如果觉得不用修改默认配置,一路回车就可以了
常用后缀

  • -f:代表force
  • -y:代表yes

同时增加以上两个后缀,则会跳过提问阶段,直接生成一个新的package.json文件

模块搜索和查看

  • npm search <搜索词> [-g]:搜索npm仓库,它后面可以跟字符串,也可以跟正则表达式
  • npm list:查看当前项目安装的所有模块
  • npm list -g --depth 0:列出全局安装的模块(带上[--depth 0]不深入到包的支点,更简洁)

安装模块

常用命令简写

  • i:install的简写,根据package.json配置文件中的依赖配置下载安装各种依赖文件
  • -g:-global的简写,用于全局安装依赖

示例:npm i -g gulp 或者 npm i gulp -g

  • -P:--save-prod的简写,安装生产阶段的依赖并将其添加到package.json的dependencies中,
  • -S:--save的简写,安装依赖并将其添加到package.json的dependencies中

示例:npm i gulp --save 或 npm i gulp -S

  • -D:--save-dev的简写,安装开发阶段的依赖并将其添加到package.json的devDependencies中

示例:npm i gulp --save-dev 或 npm i gulp -D

  • -O:--save-optional的简写,安装可选阶段的依赖并将其添加到package.json的optionalDependencies中
  • -E:--save-exact的简写,安装模块的确切版本,而不是使用npm的默认semver range运算符

示例:npm i gulp --save-exact 或 npm i gulp -E

  • -B:--save-bundle的简写,安装依赖并将其添加到package.json的bundleDependencies中
  • -f:--force的简写,模块不管是否安装过,npm 都要强制重新安装

示例:npm install sax --force

模块安装基础命令

  • npm install:读取并按照package.json里面的配置进行安装
  • npm install [<@scope>/]:安装指定模块的最新(@latest)版本

示例:npm install gulp

  • npm install [<@scope>/]@:安装指定模块的指定版本

示例:npm install gulp@3.9.1

  • npm install [<@scope>/]@:安装指定指定版本范围内的模块

示例:npm install vue@">=1.0.28 < 2.0.0"

  • npm install [<@scope>/]@:安装指定模块的指定标签 默认值为(@latest)

示例:npm install sax@0.1.1

  • npm install :通过Github代码库地址安装

示例:npm install git://github.com/package/path.git

模块更新和卸载

  • npm update [-g]:升级当前项目[或全局]的指定模块

示例:npm update express -g

  • npm uninstall [-g]:卸载当前项目[或全局]模块

引用模块

  • npm link [<@scope>/][@]:引用依赖,有些包是全局安装了,在项目里面只需要引用即可
  • npm unlink gulp:解除依赖引用

模块版本规则和格式

  • 版本规则:MAJOR.MINOR.PATCH
  • 主版本号(MAJOR):对应大版本迭代,做了不兼容旧版本的修改
  • 次版本号(MINOR):对应小版本迭代,做了可以向下兼容的功能性新增
  • 修订号(PATCH):对应修正版本迭代,做了向下兼容的问题修复
  • 版本格式
  • ^2.2.1 指定的主版本号下,所有更新的版本,匹配 2.2.3, 2.3.0;不匹配1.0.3, 3.0.1
  • ~2.2.1 知道的主版本号.次版本号下,所有更新的版本,匹配 2.2.3,2.2.9;不匹配2.3.0,2.4.5
  • >=2.1 版本号大于或等于2.1.0,匹配2.1.2,3.1;不匹配 2.0,1.0
  • <=2.3 版本号小于等于2.2.0,匹配1.0.0,2.1.2;不匹配 2.3,2.4.1
  • 1.0.0 - 2.0.0 版本号在1.0.0(含)到2.0.0(含)之间,匹配1.0.0,1.9.9;不匹配2.1.1
  • * 或者 x 匹配所有主版本
  • 1 或 1.x 匹配主版本号为1的所有版本
  • 1.2 或 1.2.x 匹配主版本号为1次版本号为2的所有版本

执行脚本

使用npm run [--param]命令执行脚本,除此之外package.json的scripts字段,可以用于指定脚本命令,供npm直接调用。

start和test属于特殊命令,可以省略run,其余的都得带上run

npm 脚本的原理非常简单。每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell(一般是 Bash)可以运行的命令,就可以写在 npm 脚本里面。

比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。

这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。

"test": "mocha test"

而不用写成下面这样

"test": "./node_modules/.bin/mocha test"

由于 npm 脚本的唯一要求就是可以在 Shell 执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面。

npm 脚本的退出码,也遵守 Shell 脚本规则。如果退出码不是0,npm 就认为这个脚本执行失败。

npm run的参数

---package.json文件--- 
"scripts": { "test": "mocha test/" } 

---------终端--------- 
npm run test -- anothertest.js
# 等同于直接执行 
mocha test/ anothertest.js

内部变量

---package.json文件---
{
    "name": "npm_test",
    "version": "1.0.0",
    "config": {
        "reporter": "xunit"
    },
    "script":{
        "bundle": "mkdir -p build/$npm_package_version/",
        //$npm_package_version 读的是外层"version"的值,同理$npm_package_name 读的是外层"name"的值
        "test": "mocha test/ --reporter $npm_package_config_reporter"
        //$npm_package_config_reporter读的是"config"里的"reporter"
    }
}

pre-和post-两个钩子(hook)

npm在执行命令前,会先查看有没有定义pre-命令名post-命令名两个钩子,如果有的话,就会先执行npm run pre-命令名,然后执行npm run 命令名,最后执行npm run post-命令名。

---package.json文件---
"scripts": {
    "lint": "eslint --cache --ext .js --ext .jsx src",
    "test": "karma start --log-leve=error karma.config.js --single-run=true",
    "pretest": "npm run lint",
    "posttest": "echo 'Finished running tests'"
  }
  
-------终端-------
npm run lint
//直接执行 npm run lint 结束

npm run test
//因为有定义了两个钩子pretest、posttest。
//所以先执行 npm run pretest
//然后执行 npm run test
//最后执行 npm run posttest

发布模块

其他命令

  • npm cache clean --force:清除node_module文件缓存,用于对付使用相同版本号发布新版本代码的人

npm与yarn

yarn与npm一样,都是用于前端的包和模块管理工具。在npm5之前,可以说yarn是为解决npm中存在的问题而推出的新的包管理工具,随着npm的不断迭代和更新,npm5以后的版本与yarn在使用上几乎已经趋于一致。但是在语法上依然不同,如下为常用的命令对比

  • 从package.json中安装项目依赖

npm install
yarn

  • 向package.json中添加/安装新的项目依赖

npm isntall 库名 --save
yarn add 库名

  • 向package.json中添加/安装新的dev项目依赖

npm install 库名 --save-dev
yarn add 库名 --dev

  • 删除项目依赖

npm uninstall package --save
yarn remove package

  • 升级项目依赖

npm update --save
yarn upgrade

引用参考