简介
- NPM是基于node.js开发的软件
- NPM是node.js默认包管理工具,现代前端开发必备工具
版本信息
由于nodejs安装包已经内置了npm包管理器,换句话说,安装nodejs就已经顺带把npm也安装成功了,但有时,我们需要检测某台电脑上NPM是否安装成功,或者查看某台设备NPM的版本信息,使用如下命令:
npm -v
NPM 镜像
由于 NPM默认镜像 是在国外,所以下载速度很慢很不稳定,所以需要切换回国内的镜像(国内最出名的镜像是阿里的)
查看NPM当前镜像
npm config get registry
设置镜像
npm config set registry https://registry.npm.taobao.org
nrm镜像管理工具(推荐)
// 安装
npm i nrm -g --registry=https://registry.npm.taobao.org
// 查看所有镜像以及当前使用的镜像
nrm ls
// 切换镜像
nrm use taobao
如何更新 NPM
// npm说到底也是一个普通的包
npm i npm -g
基本使用
安装包
// 生产环境
npm i xxx
npm i xxx -S
npm i xxx@2.0.1 -S
// 开发环境
npm i xxx -D
注意:
1、可用于更新
2、不指定版本的话,就会更新或安装包的latest版本
卸载包
// 卸载全局
npm uninstall xxx -g
// 卸载开发
npm uninstall xxx -D
// 卸载生产
npm uninstall xxx -S
更新包
// 更新全局所有包
npm update -g
// 更新全局某包
npm update -g xxx
// 更新本地所有包
npm update
// 更新本地某包
npm update xxx
注意:
1、会根据package.json文件的版本规则更新
查看包
// 查看全局某包
npm ls -g xxx
// 查看本地某包
npm ls xxx
// 查看当前项目所依赖的包
npm ls
项目中如何使用NPM包
npm 安装的包都存放在 node_moudules 文件夹中
引入方式
// node.js中,使用CommonJS模块规范引入
const $ = require('jquery');
// webpack中,可以使用CommonJS或ES6模块化规范
import $ from 'jquery';
const $ = require('jquery');
注意:
webpack强大到,CommonJS模块也可以使用ES6规范进行导入,相反,ES6模块也可以使用CommonJS规范进行导入
引入路径
npm安装的包:只要引入包名就可以了(package.json中name)
非npm安装的包(自定义模块):以当前文件为相对路径,./为当前文件夹,../为上一级文件夹
引入后缀
npm安装的包:无需后缀名,除非特殊说明
非npm安装的包(自定义模块):js可以省略,但建议加上
命令行中如何执行NPM包命令
有些NPM包中,提供了包命令(存放在.node_modules/.bin中),用于在终端(命令行工具)执行来使用该NPM包功能。
一般NPM包(例如:babel),都会提供多种运行方式,如下:
1. CLI方式
NPM包自带命令,你可以在命令行中执行,也可以通过npm script脚本,如果npm是5.2.0版本以上,还可以直接使用npx来执行命令,实际开发中很少使用此方式,因为过于繁琐,每改一次就要到命令行里输入一次
2. 集成方式
集成到webpack或rollup等应用构建打包工具中使用,推荐此方式,因为更加方便简单
发布NPM包
创建并初始化包项目
1、新建一个目录
2、cd 目录名
3、执行 npm init 初始化包
忽略文件
与git代码版本仓库一样,在发布包时,想忽略某些文件不发布,必须用到
有以下几种方法:
1. 使用 .gitignore 设置忽略哪些文件
.gitignore 设置的忽略文件,在git代码版本管理和npm publish都会被忽略
2. 使用 .npmignore设置忽略哪些文件
.npmignore的写法跟.gitignore的规则完全一样。若同时使用了.npmignore和.gitignore,只有.npmignore会生效,优先级比较高
3. 使用 package.json 的 files 字段选择发布哪些文件
在package.json中files字段设置发布哪些文件或目录。这个优先级高于.npmignore和.gitignore
npm publish 默认的忽略规则
// 默认被忽略
.*.swp
._*
.DS_Store
.git
.hg
.npmrc
.lock-wscript
.svn
.wafpickle-*
config.gypi
CVS
npm-debug.log
node_modules/
// 默认被包含,即便设置忽略也无效
package.json
README (and its variants)
CHANGELOG (and its variants)
LICENSE / LICENCE
发布包
1、在NPM官网注册账号
2、登录
npm login
3、发布
进到包目录中,执行:
npm publish --access public (对外公开)
上面命令会让包发布到npm的包仓库里,并且给定latest标记(可用最新版,默认npm i 包名就是安装latest版)
更新包
更新版本
npm 提供官方提供了npm version来进行版本控制,其效果跟手动修改package.json里面的version字段是一样的,好处在于,可以在构建过程中用npm version命令自动修改,而且具有语义化即Semantic versioning.
npm version [<newversion> | major | minor | patch | premajor | preminor |
prepatch | prerelease | from-git]
其语义为:
major:主版本号(大版本)
minor:次版本号(小更新)
patch:补丁号(补丁)
premajor:预备主版本
preminor: 预备次版本
prepatch:预备补丁版本
prerelease:预发布版本
如初始版本为 1.0.0,执行相关类型命令后,对应的语意为:
npm version patch // 1.0.1 表示小的bug修复
npm version minor // 1.1.0 表示新增一些小功能
npm version mmajor // 2.0.0 表示大的版本或大升级
npm version preminor // 1.1.0-0 后面多了个0,表示预发布
可以在当前模块的package.json里面看到相应的版本变化
更新发布
每当更新完,可能还需要经过测试,所以我们必须发布到NPM包仓库,让别人安装测试,但不能影响现有的latest最新稳定版,所以不能直接执行下面命令:
// 发布更新包,默认标记latest
npm publish
我们要给更新包(需要测试)指定tag(标记),这样发布才不是默认latest标记,命令如下:
// 指定tag为beta发布
npm publish --tag beta
// 当要安装这个beta版本,执行
npm i 包名@beta
当更新包测试通过后,需要把该版本的标记beta改为latest,执行如下命令
npm dist-tag add 包名@版本号 latest
没用的tag(beta),可以使用下面命令删除
npm dist-tag rm 包名 beta
撤销包
由于撤销发布会让把要撤销的包作为依赖的包不能正常工作,所以npm官方对包的撤销是有限制的:
- 不允许撤销发布已经超过24小时的包(
unpublish is only allowed with versions published in the last 24 hours) - 如果在24小时内确实要撤销,需要加--force参数
- 即使撤销了发布的包,再次发布的时候也不能与之前被撤销的包的名称/版本其中之一相同,因为这两者构成的唯一性已经被占用,官方并没有随着撤销而删除
npm unpublish
撤销发布的命令为 npm unpublish
npm unpublish my-test-project
// 报错
npm ERR! Refusing to delete entire project.
npm ERR! Run with --force to do this.
npm ERR! npm unpublish [<@scope>/]<pkg>[@<version>]
// 加 --force参数重新撤销发布
npm unpublish my-test-project --force
npm WARN using --force I sure hope you know what you are doing.
- my-test-project
npm deprecate (推荐)
npm unpublish的推荐替代命令:
npm deprecate <pkg>[@<version>] <message>
这个命令,并不会在npm上里撤销已有的包,但会在任何人尝试安装这个包的时候得到deprecated的警告,例如:
npm deprecate my-test-project 'this package is no longer maintained'