前端学习日记 # NPM

618 阅读6分钟

简介

  1. NPM是基于node.js开发的软件
  2. 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.jsonfiles字段设置发布哪些文件或目录。这个优先级高于.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官方对包的撤销是有限制的:

  1. 不允许撤销发布已经超过24小时的包(unpublish is only allowed with versions published in the last 24 hours
  2. 如果在24小时内确实要撤销,需要加--force参数
  3. 即使撤销了发布的包,再次发布的时候也不能与之前被撤销的包的名称/版本其中之一相同,因为这两者构成的唯一性已经被占用,官方并没有随着撤销而删除
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'