关于npm的介绍和使用

NPM(node package manager),通常称为node包管理器。顾名思义,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。

一.npm的安装

以前的node.js需要自己下载npm,现在只要用户下载node.js,npm就会下载在本地了。
node.js下载网址
安装完成后,在终端输入:

node -v

可以查看node.js的版本号;
同样输入:

npm -v

也可以查看npm的版本号。

二. npm包管理

npm包就想手机app商店里的应用,每一个应用都有一个独一无二的名字,所以安装时只需要通过名称来下载想要的包。
node包的安装分两种:本地安装、全局安装。两者的区别如下:

  1. 本地安装:package会被下载到当前所在目录,也只能在当前目录下使用。(一般cd到当前工作的文件夹下安装)本地安装只需要输入:
npm install xxx

也可以快捷输入为:

npm i xxx

安装指定版本的包:

npm install xxx@x.x.x

卸载一个包:

npm uninstall xxx

本地安装的包,安装在当前项目的node_modules文件夹下。
本地安装后可以直接通过require()的方式引入项目中node_modules目录下的模块,如下示例,本地安装后直接在gulpfile.js中require('gulp')。

var gulp = require('gulp')
var sass = require('sass')

tips: 如果使用npm安装插件太慢(被墙),可执行

npm install -g cnpm --registry=[https://registry.npm.taobao.org

安装好cnpm之后,再安装插件时用cnpm安装node包:

cnpm install gulp
  1. 全局安装:package会被下载到Node安装目录下的node_modules文件夹中,(在windows下,一般在 \Users\用户名\AppData\Roaming\ 目录下)可以使用
npm root -g

查看全局安装目录。
全局安装的命令为:

npm install -g xxx

全局安装的package能够在所有目录下“使用”,一般命令行工具使用全局安装。

这里有一个误区,既然可以全局安装了,我们为什么还要浪费时间在本地安装呢?

  1. 全局安装只是意味着用户可以在全局使用该组件包支持的命令行,并不是所有的项目文件夹中可以require到想要的依赖(包),当我们在本地引用一个包时,首先在引用文件的文件夹中查找node_modules文件夹,如果没就在上一层文件夹中查找node_modules,最后直接到根目录,很明显这个过程不会查找到全局安装的目录。
  2. 全局安装对于包的更新不好管理,可能你需要为每个包重新命名,如gulp@3.8.1、gulp@3.9.1...,为了区别不同项目使用指定的包(我们在项目中可能经常需要使用不同版本的包),保证模块之间的相互依赖,区别每个项目正常运行,所以本地安装也是很有必要的。

三、关于npm的package.json

在我们完成一个项目时,有一些包是开发、测试、打包等工程化所需要的,有一些则是项目运行中所依赖的。当我们把包发布上线时,用户只需要下载项目运行时所需要的包就可以了。那么用户的npm如何知道哪些是必须的依赖呢。这些信息都会写在node包的package.json中。
每一个node包都会有一个package.json文件,在安装一个node包时,当我们执行

npm install --save xxx

安装的node包的名称就会写入package.json中的dependencies字段下,表示这个包是项目运行所依赖的包。
如果我们安装一个包时执行:

npm install --save-dev xxx

则会在packaeg.json中的devDependencies字段下写入node包的名字,说明这个包时开发中依赖的包。
如此一来用户在下载使用我们开发的包时,就可以只下载运行中依赖的包了。
在新建的项目文件夹中执行:

npm init

会生成一个package.json文件,会提示让你输入包的名称、版本号、作者等信息。如果觉得复杂当然可以选择直接按enter过,或者你可以选择:

npm init -y

来快速创建一个package.json文件。
下面是一个完整的package.json文件:

{
    "name": "Hello World",
    "version": "0.0.1",
    "author": "张三",
    "description": "第一个node.js程序",
    "keywords":["node.js","javascript"],
    "repository": {
        "type": "git",
        "url": "https://path/to/url"
    },
    "license":"MIT",
    "engines": {"node": "0.10.x"},
    "bugs":{"url":"http://path/to/bug","email":"bug@example.com"},
    "contributors":[{"name":"李四","email":"lisi@example.com"}],
        "bin": {
                "weather": "./index.js"
        }
    "scripts": {
        "start": "node index.js"
    },
    "dependencies": {
        "express": "latest",
        "mongoose": "~3.8.3",
        "handlebars-runtime": "~1.0.12",
        "express3-handlebars": "~0.5.0",
        "MD5": "~1.2.0"
    },
    "devDependencies": {
        "bower": "~1.2.8",
        "grunt": "~0.4.1",
        "grunt-contrib-concat": "~0.3.0",
        "grunt-contrib-jshint": "~0.7.2",
        "grunt-contrib-uglify": "~0.2.7",
        "grunt-contrib-clean": "~0.5.0",
        "browserify": "2.36.1",
        "grunt-browserify": "~1.3.0",
    }
}

最后值得一提的是scripts字段和bin字段,package.json的scripts字段指定了运行脚本命令的npm命令行缩写,比如上面的start指定了运行npm run start时,所要执行的命令"node index.js"。这更加方便我们调用指令,不用输入一大串的指令来调用模块。
bin字段则指定各个内部命令对应的可执行文件的位置,比如上面的weather指定了可执行文件index.js的位置。下面我们还会相信讲解发布一个node包时,bin的用法。

四、如何发布自己的npm包

在熟悉了npm的使用方法后,我们可以尝试自己写一个简单的npm包,并发布上线,首先我们需要一个npm账号,可以在npm官网,注册一个账号。在完成邮箱验证后就可以发布自己的包了。
在制作自己的node包时,首先我们新建一个项目文件夹,cd到文件夹中,使用

npm init

来创建package.json文件,然后安装自己的开发依赖包和运行依赖包,最后把可执行文件的位置添加到bin字段,使用者就可通过bin字段的命令来快捷执行可执行文件,需要注意的是当js文件作为可执行文件时需要在文件的开始添加

#!/usr/bin/env node

这样文件就会默认在node环境中执行。
我们可以通过命令:

npm login

来登录npm账号
通过

npm publish

来发布完成的node包
当修改一个包后重新发布时,需要修改版本号,才可以发布上线,在发布时最好有一个readme.md来说明如何使用和包的功能示例。

更多详细的npm相关介绍可查看npm官方文档

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

推荐阅读更多精彩内容

  • Node.js使得在服务器端使用JavaScript编写应用程序成为可能。它是基于V8Javascript运行时并...
    间阳幕宾阅读 1,566评论 0 5
  • 什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 ...
    ihoey阅读 6,248评论 2 36
  • NPM NPM 是随同 Node 一起安装的包管理工具,能解决 Node 代码部署上的很多问题,常见的使用场景有以...
    heyi_let阅读 2,568评论 0 2
  • 免责声明:此文章是转载文章,这里给出原链接,以示尊重。原作者名称:knqiufan原作者博客:https://bl...
    振礼硕晨阅读 22,531评论 0 20
  • 环境的劣质直接导致一个人的劣质 和差的人打交道你也不会好到哪里去 毕竟你被淘汰到了普通人之中 心中有狂傲又能怎样 ...
    yangwinner阅读 398评论 0 1