重温NPM

1,592 阅读12分钟

本文字数7300+,图片19张,阅读时间约为18分钟。

第一节:NPM基本信息

【01】官方网址:www.npmjs.com/

【02】文档网址:docs.npmjs.com/

【03】安装包搜索地址:www.npmjs.com/


【04】npm 包
数量: 700,000+

【05】node.js 安装后,等于npm也安装好了。

【06】有哪些知名的包:
有网站开发框架,有 MySQL、PostgreSQL、MongoDB 数据库接口。
有模板语言解析、CSS 生成工具、邮件、加密、图形、调试支持。
有图形用户界面和操作系统 API工具。

【07】npm是什么?
NPM(node package manager)。
是node包的管理器。(包又称为模块)

【08】npm的用途?
将开发者从包管理工作(版本、依赖等)中解放出来,更加专注于功能的开发。
可以对模块进行管理:
  • 安装
  • 卸载
  • 更新
  • 查看
  • 搜索
  • 发布自己的包提供给别人使用。

【09】npm的实质是什么?
npm的背后,是基于couchdb的一个数据库,记录了每个包的信息,包括作者、版本、依赖、授权信息等。
【10】如何判断npm安装成功?
通过在终端输入 "npm -v" 来测试是否成功安装。
命令如下,出现版本提示表示安装成功:
npm -v
6.4.1

【11】如果之前是在官网下载的 node 安装包,运行后会自动安装在全局目录,其中

node 命令在 /usr/local/bin/node ,npm 命令在全局 node_modules 目录中,具体路径为 /usr/local/lib/node_modules/npm

【12】版本号
使用NPM下载和发布代码时都会接触到版本号。
NPM使用语义版本号来管理代码。
语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。

当代码变更时,版本号按以下原则更新:
  • 如果只是修复bug,需要更新Z位。
  • 如果是新增了功能,但是向下兼容,需要更新Y位。
  • 如果有大变动,向下不兼容,需要更新X位。
版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。

NPM支持的所有版本号范围指定方式可以查看官方文档

——————————我是垃圾分类的分割线————————

第二节:通过npm安装包


【00】npm在默认情况下会从http://npmjs.org搜索或下载包,将包安装到当前目录的node_modules子目录下。
如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
【01】安装包
方式1:
安装最新版本的模块语法:
安装特定版本的模块。

【02】npm install 所有的参数形式
npm install --help
npm install <tarball file>
npm install <tarball url>
npm install <folder>
npm install <pkg>
npm install <pkg>@<tag>
npm install <pkg>@<version>
npm install <pkg>@<version range>

【03】安装包时,将包信息添加到package.json中。这样代码提交到github时,就不用提交node_modules这个文件夹了。

npm install module_name --save

【04】本地安装(local) vs 全局安装(global)本地安装:

01、package会被下载到当前所在目录的node_modules文件夹中,也只能在当前目录下使用。(运行 npm 命令时所在的目录)

02、安装方式:npm install module_name
测试结果:


简单说明一下:

grunt-cli@0.1.9:当前安装的package为grunt-cli,版本为0.19
node_modules/grunt-cli:安装目录
resolve@0.3.1:依赖的包有resolve、nopt、findup-sync,它们各自的版本、依赖在后面的括号里列出来。

03、可以通过require("module_name");来引用模块,无需指定模块路径。
例子:
var express = require('express');
04、不能通过命令行来运行它们,因为没有注册PATH环境变量。
只能在对应安装目录下使用。

全局安装:

01、包会被下载到到特定的系统目录下,安装的package能够在所有目录下使用。
主要的区别在于安装目录,现在变成了/usr/local/lib/node_modules/grunt-cli ,/usr/local/lib/node_modules/ 也就是之前所说的全局安装目录啦。
grunt-cli@0.1.9 /usr/local/lib/node_modules/grunt-cli
├── resolve@0.3.1
├── nopt@1.0.10 (abbrev@1.0.4)
└── findup-sync@0.1.2 (lodash@1.0.1, glob@3.1.21)

02、安装方式:npm install module_name -g
03、将安装包放在 /usr/local 下。
04、可以直接在终端命令行里使用。
05、不能通过 require("module_name") 来引入本地安装的包。因为 require 不会搜索 /usr/local/lib/node_modules/。

【05】为什么要使用全局模式?
当我们要把某个包作为工程运行时的一部分时,通过本地安装获取,如果要在命令行下使用,则使用全局安装。
因为需要注册PATH环境变量。这样才可以在命令行中运行它。
也可以是许多程序都需要使用它,减少多个副本。
比如:gulp xx.js。
npm本地安装,只是把包安装在项目根目录下的node_modules中。其中的bin目录并没有包含在PATH环境变量中,不能直接在命令行中调用。

而当我们使用全局模式安装时,npm 会将包安装到系统目录,譬如 /usr/local/lib/node_modules/,同时 package.json 文件中 bin 字段包含的文件会被链接到 /usr/local/bin/。/usr/local/bin/ 是在PATH 环境变量中默认定义的,因此就可以直接在命令行中运行 gulp script.js命令了。

第三节:npm常用命令

【01】卸载包

卸载grunt-cli
npm uninstall grunt-cli
结果:

卸载0.1.9版本的grunt-cli
npm uninstall grunt-cli@"0.1.9"

【02】查看包

方式1:查看当前项目,安装了哪些包
npm ls
方式2:查看全局安装了哪些包
npm ls -g
方式3:查看某个具体的包
npm ls grunt-cli
npm ls babel-cli@6.26.0
方式4:查看某个具体的包的全面信息,包括作者、版本、依赖等。
npm info grunt-cli

【03】更新包

npm update packageName
npm update grunt-cli

【04】搜索包

npm search module_name
npm search grunt-cli

【05】升级npm自己

可以通过npm安装自己就可以升级了。
npm install npm -g

【06】删除包

npm rm package_name[@版本号] [package_name[@版本号]...]

使用这个命令删除包。如果省略版本号, 那么这个包的所有被找到的版本都将被删除。

举例:

npm rm sax

如果你想删除以全局模式安装的包,你需要在命令中显式的使用”-g”参数:
npm rm -g express

【07】查看帮助命令

npm help

【08】初始化

会引导你创建一个package.json文件,包括名称、版本、作者这些信息等。
npm init

第四节:一些不常用的命令

【01】清空NPM本地缓存
用于处理使用相同版本号发布新版本代码的人。
npm cache clear
【02】撤销发布自己发布过的某个版本代码
npm unpublish package@version
【03】查看
01、查看node模块的package.json中的信息。
//moduleNames 是模块名
npm view moduleNames 
例子:
npm view express
结果截图:

注意事项:如果想要查看package.json文件夹下某个属性的内容,可以使用
npm view moduleName labelName
02、查看包的依赖关系:
npm view moudleName dependencies
03、查看包的源文件地址
npm view moduleName repository.url
04、查看包所依赖的Node的版本
npm view moduleName engines
zyx456结果:
【04】检查包是否已经过时,此命令会列出所有已经过时的包,可以及时进行包的更新
npm outdated
【05】访问包的package.json文件
一个npm包是包含了package.json的文件夹,package.json描述了这个文件夹的结构。访问npm的json文件夹的方法如下:
npm help json 
此命令会以默认的方式打开一个网页,如果更改了默认打开程序则可能不会以网页的形式打开。
结果:

【06】查看当前包的安装路径
npm root



【07】查看全局的包的安装路径
npm root -g

第五节:对NPM配置

【01】方式1:
直接修改配置文件。
有时候觉得一条配置一条配置地修改有些麻烦,就直接进配置文件修改了
npm config edit
这个命令会打开.npmrc文件。以记事本的方式打开。 


【02】方式2:
通过npm config命令,包含增、删、改、查。
以最为常用的proxy配置为例。
设置proxy
内网使用npm很头痛的一个问题就是代理,假设我们的代理是 proxy.example.com:8080,那么命令如下:
npm config set proxy http://proxy.example.com:8080
由于 npm config set 命令比较常用,于是可以如下简写
npm set proxy http://proxy.example.com:8080    
查看proxy
设置完,我们查看下当前代理设置
npm config get proxy
输出如下:
http://proxy.example.com:8080/
同样可如下简写:
npm get proxy
删除proxy
代理不需要用到了,那删了吧
npm delete proxy
【03】查看所有配置
npm config list
测试:


第六节:nrm(npm源管理工具)

【01】nrm

nrm (https://github.com/Pana/nrm)是一个管理 npm 源的工具。

比如可以使用淘宝镜像,这样安装和更新会比较快。慢的原因,国情,你懂得。

nrm 用来切换官方 npm 源和国内的 npm 源(如: cnpm),也可以用来切换官方 npm 源和公司私有 npm 源。

【02】全局安装 nrm:

npm i nrm -g

查看当前 nrm 内置的几个 npm 源的地址:

切换到 cnpm:

nrm use cnpm

【】zyx456:安装nrm后,使用nrm ls。告诉我缺失了很多库。

Cannot find module 'config-chain'

Error: Cannot find module 'nopt'

Error: Cannot find module 'osenv'


Error: Cannot find module 'umask'

Error: Cannot find module 'npmlog'

Error: Cannot find module 'has-unicode'


Error: Cannot find module 'uid-number'

Error: Cannot find module 'abbrev'

Error: Cannot find module 'npm-registry-client'

Error: Cannot find module 'chownr'

Error: Cannot find module 'dezalgo'

Error: Cannot find module 'npm-cache-filename'


……………………给自己的耐心点个赞。



第七节:package.json的基本信息

【01】是项目中所有的包的描述信息。
是JSON格式,不能是JS对象。

假设当我们下载了node应用,这个node应用依赖于A、B、C三个包,如果没有package.json,我们需要手动逐次安装这三个包(如果对版本有特定要求就更悲剧了):
npm install A
npm install B
npm install C
有了package.json,一行命令安装所有依赖。
npm install

【02】package.json字段简介
字段相当多,但最重要的的是下面几个。

01、name:
包的名字(由于它会成为url的一部分,所以不符合url规则的字母不会通过,也不允许出现"."、"_"),最好先在 registry.npmjs.org/上搜下你取的名字是否已…
会出现在require()中,最好用有含义的名字。

02、version:
package的版本,当package发生变化时,version也应该跟着一起变化,同时,你声明的版本需要通过semver的校验(semver可自行谷歌)node-semver

03、dependencies:
package的应用依赖模块,即别人要使用这个package,至少需要安装哪些东东。应用依赖模块会安装到当前模块的node_modules目录下。
"dependencies": {
    "request": "*",
    "async": "*"
}
这个文件表明这个应用程序依赖的模块是”request”和”async”,不限版本, 用”*”表明任意版本均可使用。如果这个应用程序依赖某个特定的模块版本,应当像这样指定版本号:
"dependencies": {
    "request": "2.27.0",
    "async": "0.2.9"
  }
这里我们限定这个应用程序使用这两个特定版本,但我们可以更加宽松的限定版本号的范围:
"dependencies": {
    "request": "2.27.x",
    "async": "0.2.x"
  }
04、main

指定一个入口文件,

如果你包的名字叫foo,然后用户require("foo"),main配置的模块的exports对象会被返回。

这应该是一个相对于根目录的文件路径。

"main": "js/entry.js",

main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require("express")。

05、devDependencies:
package的开发依赖模块,即别人要在这个package上进行开发需要的包。

如果有人要使用你的模块,那么他们可能不需要你开发使用的外部测试或者文档框架。

在这种情况下,最好将这些附属的项目列在devDependencies中。

这些东西会在执行npm link或者npm install的时候初始化,并可以像其他npm配置参数一样管理。

【03】其他:
参见官网

  • description - 包的描述。字符串。便于在npm search搜索。
  • homepage - 包的官网 url 。
  • author - 包的作者姓名。
  • contributors - 包的其他贡献者姓名。
  • dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
  • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
  • keywords - 关键字,数组或字符串。便于在npm search搜索。
  • scripts- “scripts”是一个由脚本命令组成的hash对象,他们在包不同的生命周期中被执行。key是生命周期事件,value是要运行的命令。

第八节:node多版本管理器概念

【01】迄今为止Node.js 更新速度还很快,有时候新版本还会将旧版本的一些 API 废除,以至于写好的代码不能向下兼容。有时候想要尝试一下新版本有趣的特性,但又想要保持一个相对稳定的环境。


基于这种需求,Node.js 的社区开发了多版本管理器,用于在一台机器上维护多个版本的 Node.js 实例,方便按需切换。

【02】Node 多版本管理器( Node Version Manager,nvm)是一个通用的叫法,它目前有许多不同的实现。

【03】通常有2种nvm。
第一种:github.com/creationix/…nvm 不支持 Windows。

笔者根据个人偏好推荐使用 visionmedia/n。(n 不支持 Windows。

如果你使用Windows系统,可以改用nvmwnvm-windows代替。