npm详细教程

npm介绍

包管理器(Package Manager)

npm 最初它只是被称为 Node Package Manager,用来作为Node.js的包管理器。但是随着其它构建工具(webpack、browserify)的发展,npm已经变成了 "the package manager for JavaScript",它用来安装、管理和分享JavaScript包,同时会自动处理多个包之间的依赖。

安装npm

新版的nodejs已经集成了npm

Node.js:nodejs分为了长期支持版当前版本

Linux中安装nodejs的方法:

升级现有npm版本

npm install npm -g

貌似也可使用这种方法安装node,但是安装的是当前版本的node而非长期支持版本的node。

更换 npm 镜像站点

对于国内的情形,在使用npm安装JS包之前建议先更改npm的镜像。

配置 npm 的国内镜像站点为:https://registry.npm.taobao.org

方法一:在系统的HOME目录新建.npmrc文件并添加 registry = https://registry.npm.taobao.org

方法二:你可以使用淘宝定制的 cnpm 命令行工具代替默认的 npm:

npm install -g cnpm --registry=https://registry.npm.taobao.org
//之后即可使用cnpm来安装包
cnpm install <包>

详情请参考: 淘宝 NPM 镜像

本地安装(默认)

npm 的包安装分为本地安装(local)、全局安装(global)两种。

npm install <包>      # 本地安装
# 或者
npm i <包>
  • 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
  • 可以通过 require() 来引入本地安装的包。

全局安装

npm install <包> -g   # 全局安装
  • 将安装包放在 /usr/local 下或者你 node 的安装目录。
  • 可以直接在命令行里使用。这是使用全局安装的主要原因

使用下面的命令来查看全局的包安装的位置:

npm prefix -g

创建全局链接

如果你希望具备两者功能(本地安装和全局安装的功能),则需要在两个地方安装它或使用 npm link

npm link的功能是在本地包和全局包之间创建符号链接。我们说过使用全局模式安装的包不能直接通过 require 使用,但通过 npm link 命令可以打破这一限制。

比如我们将 express安装到了全局环境,使用下面的命令可以将其链接到本地环境:

npm link express

使用 npm link命令还可以将本地的包链接到全局。使用方法是在包目录( package.json 所在目录)中运行 npm link 命令。

如果你的项目不再需要该模块,可以在项目目录内使用npm unlink命令,删除符号链接。

像gem 或 pip 总是以全局模式安装,使包可以供所有的程序使用,而 npm 默认会把包安装到当前目录下。这反映了 npm 不同的设计哲学。如果把包安装到全局,可以提高程序的重复利用程度,避免同样的内容的多份副本,但坏处是难以处理不同的版本依赖。

常用命令

查看命令帮助

npm help <某命令>

列出各命令

npm -l

查看安装信息

安装信息和它们的依赖

//全局安装信息
npm ls -g

//列出当前项目中的包
npm ls

卸载包

npm uninstall <包名>

更新包

//更新当前项目中安装的某个包
npm update <包名>

//更新当前项目中安装的所有包
npm update

//更新全局安装的包
npm update <包名> -g

搜索包

npm search <关键字>

列出npm的配置

npm config list -l

列出bin目录

npm bin

使用 package.json

当你的项目需要依赖多个包时,推荐使用 package.json。其优点为:

  • 它以文档的形式规定了项目所依赖的包
  • 可以确定每个包所使用的版本
  • 项目的构建可以重复,在多人协作时更加方便

创建package.json文件

  • 手动创建
  • 或者 通过 npm init 命令生成遵守规范的 package.json文件

文件中必须包含: name 和 version

指定依赖包

两种依赖包:

  • dependencies: 在生产环境中需要依赖的包。通过npm install <packge> --save命令自动添加依赖到文件(或者使用简写的参数 -S)。
  • devDependencies:仅在开发和测试环节中需要依赖的包。通过npm install <packge> --save-dev命令自动添加依赖到文件(或者使用简写的参数 -D)。

当然你也可以在文件中手动添加依赖

如果其他人也需要这个项目,只需要把这个 package.json 文件给他,然后进行简单的 npm install 即可。

设置默认配置

使用 npm set 命令用来设置环境变量。

也可以用它来为 npm init设置默认值,这些值会保存在 ~/.npmrc文件中。

$ npm set init-author-name 'Your name'
$ npm set init-author-email 'Your email'
$ npm set init-author-url 'http://yourdomain.com'
$ npm set init-license 'MIT'

更改全局安装目录

使用npm config命令可以达到此目的。

npm config set prefix <目录>

或者手动在 ~/.npmrc文件中进行配置:

prefix = /home/yourUsername/npm

更改目录后记得在系统环境变量 PATH中添加该路径:

# .bashrc 文件
export PATH=~/npm/bin:$PATH

多版本管理器

Node.js 的社区开发了多版本管理器,用于在一台机器上维护多个版本的 Node.js 实例,方便按需切换。Node 多版本管理器(Node Version Manager,nvm)是一个通用的叫法,它目前有许多不同的实现。这里使用visionmedia/n。n 是一个十分简洁的 Node 多版本管理器。

如果已经安装好npm则可以简单的使用 npm install -g n来安装n。事实上,n 并不需要 Node.js 驱动,它只是 bash 脚本;我们可以在 https://github.com/visionmedia/n 下载它的代码,然后使用 make install 命令安装。

n的常用命令:

# 查看帮助 
n --help

# 安装 6.9.5版本的nodejs。 
# 通过 n 获取的 Node.js 实例都会安装在 /usr/local/n/versions/ 目录中(看情况吧)
n 6.9.5

# 列出已经安装的 Node.js 。结果中 * 表示默认版本
n

# 版本切换,与安装node.js一样
n 6.9.5

# 指明使用某版本的 node.js 执行某脚本(比如 script.js)
n use 6.9.5 script.js
  • PREFIX=$CUSTOM_LOCATION make install; 自定义 n 的安装路径(避免使用sudo)
  • 自定义node.js的安装路径(通过n安装);通过设置环境变量 export N_PREFIX=$HOME
  • 自定义 source。(镜像站点)
  • 自定义 架构(architecture)
  • 如果使用n切换了node.js的版本后,npm没有正确运行,通过运行相关脚本解决。(见 n: working-with-npm

详细用法见 : n: Node version management

注意:n 无法管理通过其他方式安装的 Node.js 版本实例(如官方提供的安装包、发行版软件源、手动编译),也就说无法管理不是用 n 安装的node.js。

n 不支持在Windows上使用:“Unfortunately n is not supported on Windows yet”。

GNVM 是一个简单的 Windows 下 Node.js 多版本管理器。

发布包

在发布之前,首先需要让我们的包符合 npm 的规范,npm 有一套以 CommonJS 为基础包规范,但与 CommonJS并不完全一致,其主要差别在于必填字段的不同。通过使用 npm init 可以根据交互问答产生一个符合标准的 package.json。

npm init 运行示例:

$ npm init
name: (node) test
version: (1.0.0) 
description: 
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /tmp/node/package.json:

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) 

该文件就是一个符合 npm 规范的 package.json 文件。这里的 index.js 作为包的接口。

也可简单的使用 npm init -y。其中-y(代表yes)

创建帐号:

npm adduser

测试是否取得帐号:

npm whoami

发布

npm publish

更新包:修改 version字段,再重新发布

取消发布:

npm unpublish

npm 脚本

npm scripts 使用指南 - 阮一峰的网络日志

npm run

package.json文件有一个scripts字段,可以用于指定脚本命令,供npm直接调用。

  "scripts": {
    "lint": "jshint **.js",
    "test": "mocha test/"
  }

npm run lint可以运行脚本中的 lint 命令。npm run test可以运行脚本中的 test 命令。

npm run命令会自动在环境变量$PATH添加node_modules/.bin目录,所以scripts字段里面调用命令时不用加上路径,这就避免了全局安装NPM模块。

starttest属于特殊命令,可以省略run

npm start 
npm test

如果仅仅使用npm run会列出scripts属性下所有的命令:

npm run

npm模块安装机制

npm 模块安装机制简介 - 阮一峰的网络日志

学习资料

NPM 使用介绍 - 菜鸟教程
npm Documentation
如何卸载使用npm链接安装的软件包?
package.json文件 -- JavaScript 标准参考教程(alpha)
npm模块管理器 -- JavaScript 标准参考教程(alpha)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容