Node.js 的模块机制可以很好地解决业务代码混乱的难题,但对于第三方模块包,就有些力不从心了,因为第三方模块包分散存放在各地,无法集中式管理。这就需要一个包管理机制,在 Node.js 中,Isaac Z.Schlueter 大神创建了 NPM 库,来集中管理这些第三方包。

对于版本管理,很多语言都有类似的管理库,Java 有 Maven,Ruby 有 Gem,它们的出现,都是为了解决依赖包对于项目开发的痛点。NPM 的出现,优雅地解决了痛点,促进了 Node 生态圈的繁荣发展,Node 社区的空前活跃,也大都归功于此。

NPM常用功能

在安装完 Node.js 之后,随即可查看当前 NPM 的版本:

$ npm -v
6.4.1

如果是新手,可直接执行 npm,来查看其他使用引导说明:

$ npm
Usage: npm <command> where <command> is one of:
access, adduser, audit, bin, bugs, c, cache, ci, cit,
completion, config, create, ddp, dedupe, deprecate,
dist-tag, docs, doctor, edit, explore, get, help,
help-search, hook, i, init, install, install-test, it, link,
list, ln, login, logout, ls, outdated, owner, pack, ping,
prefix, profile, prune, publish, rb, rebuild, repo, restart,
root, run, run-script, s, se, search, set, shrinkwrap, star,
stars, start, stop, t, team, test, token, tst, un,
uninstall, unpublish, unstar, up, update, v, version, view,
whoami npm <command> -h quick help on <command>
npm -l display full usage info
npm help <term> search for help on <term>
npm help npm involved overview Specify configs in the ini-formatted file:
/Users/ok/.npmrc
or on the command line via: npm <command> --key value
Config info can be viewed via: npm help config npm@6.4.1 /usr/local/lib/node_modules/npm

创建package.json

NPM 的关键是 package.json,它负责告知外部,该模块包都具有哪些操作。执行 npm init 命令,可以在当前目录下,初始化一个 package.json 文件,如下所示:

$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields
and exactly what they do. Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file. Press ^C at any time to quit.
package name: (package) code
version: (1.0.0) _

如果你不想在命令行中一项一项填写,可直接使用 -y 参数,按照默认空值创建即可:

$ npm init -y

创建完成后的 package.json 文件内容如下:

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

随后,开发者可按自己需要修改该文件。我们稍后会着重介绍该文件的配置内容。

安装和卸载第三方包

使用 NPM 可以安装和卸载第三方包:

# 安装
$ npm install some-lib # 卸载
$ npm uninstall some-lib

如果是在全局安装,则在命令中加入 -g 参数:

# 安装
$ npm install -g some-lib # 卸载
$ npm uninstall -g some-lib

查看已安装包信息

在安装完第三方包之后,可通过命令来查看目录下已安装的包:

$ npm ls

指定镜像源

开发者在安装第三方包时,如果不能通过官方库源,也可以选择指定的镜像源来安装,只需要使用 --registry 参数即可,例如,下面使用淘宝的镜像源:

$ npm install some-lib --registry=https://registry.npm.taobao.org

使用以上方式时,每次须指定镜像源,毕竟不太方便,我们可以设置NPM默认的库源:

$ npm config set registry https://registry.npm.taobao.org

如果有一天,你不再需要这个镜像源了,那只需执行下面命令,将其删除:

$ npm config rm registry

package.json配置

下面是 package.json 中常用的一些配置项:

scripts

首先,scripts 配置项可以注册 hook 脚本,下面几项配置分别会在 npm installnpm unstall 命令运行时执行相应的脚本代码:

"scripts": {
"preinstall": "node preinstall.js",
"install": "node install.js",
"uninstall": "node uninstall.js"
}

其次,script 有两项默认的配置项,可以直接使用 npm 来执行:

"scripts": {
"start": "node start.js",
"test": "node test.js"
}

上面两个配置项,我们分别可以使用 npm startnpm test 来运行。

最后,我们还可以添加自定义配置项,对于自定义配置项,我们则需要使用 npm run 来执行,例如下面代码,我们需要使用 npm run build 来运行。

"scripts": {
"build": "node build.js"
}

bin

该配置项主要用在命令行工具中。如果我们开发了一个命令行工具,用户在全局安装后,为了能在命令行中直接执行,需要我们来配置该命令所要执行的文件路径。

例如,我们开发了一个 pack 的命令行工具,用户全局安装后,可以直接在命令行中执行 pack 来打包程序,这时候,我们需要这样配置:

"bin": {
"pack": "./bin/pack.js"
}

main

该配置项主要用于指定当前包默认入口文件:

"main": "./lib/index.js"

用户在使用 require() 引入当前包时,会优先检查该配置项,如果不存在,则再试图加载当前包下面的 index.jsindex.nodeindex.json 文件。

dependencies

当前包在 发布环境 中的外部依赖包的集合。一般我们不会手动去配置,可以通过下面方式进行更新:

# 添加外部依赖包
$ npm install some-lib --save # 移除外部依赖包
$ npm uninstall some-lib --save

devDependencies

当前包在 开发环境 中的外部依赖包集合。可以通过下面方式进行更新:

# 添加
$ npm install some-lib --save-dev # 移除
$ npm uninstall some-lib --save-dev

除上述几个之外,下面这些也简单介绍一下。

name

当前包名。命名时使用 小写字母,必要时使用 连字符数字,不要使用其他字符。

description

当前包的功能简介。

version

当前包的版本。定义版本时使用 semver 方式,具体格式为 major.minor.revision

author

当前包的作者。如果我们自己开发了一个开源库,就毫不犹豫地在这一项签上自己的大名吧。

keywords

关键字数组,用于NPM检索。可以尽量多定义与当前包相关的关键字,便于当前包被检索到。

maintainers

包维护者列表。每个维护者包含 nameemailweb 这三个属性。维护者列表内的用户,可以对当前包进行更新升级等操作。下面是该配置项的一个示例:

{
"maintainers": [
{"name":"Jack", "email": "test@gmail.com", "web": "http://test.com"}
]
}

contributors

贡献者列表。如果我们对 expresskoa 等开源库做了一些杰出贡献,那就会出现在这个列表里,是一件比较有荣誉感的事。

对于其他配置项,大家可以参考流行的开源库。

发布自己的包

发布一个高质量的包到 NPM 仓库,是一件比较酷的事情,一方面锻炼了自己的技术,另外也为开源社区做一份小小的贡献,毕竟世界各地有那么多大牛参与,作为开源社区中的一份子,想想也有点自豪呢。

要发布自己的包,首先你需要在 NPM 官网注册一个账号。

然后,进入到包目录,执行下面命令,跟着提示填写自己的账号信息即可:

$ npm adduser
Username: _
Email: _

接着,执行下面命令,上传当前包到 NPM 仓库:

$ npm publish

执行完命令,包就发布到官方 NPM 仓库了,你可以打开浏览器去看看。如果是一个高质量的包,过一段时间,下载量就会上去,到时候,你会不会有一种满满的幸福感呢。

需要注意的是,每次在本地对代码做修改,再次发布时,需要修改升级 package.json 中的版本号,否则会发布失败。

Node: 包管理机制的更多相关文章

  1. 前端工程化 - 剖析npm的包管理机制

    转自https://juejin.im/post/5df789066fb9a0161f30580c 现如今,前端开发的同学已经离不开 npm 这个包管理工具,其优秀的包版本管理机制承载了整个繁荣发展的 ...

  2. Golang 包管理机制

    Golang 包管理机制 1. 历史 在go1.11之前, 并没有官方的包管理机制(Godep算个半官方), 主流的包管理机制有: GoVendor Glide Godep 在go1.11之后, 官方 ...

  3. 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10

    Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就"导包"就行了,无论是内部的还是外部的,使用im ...

  4. Node包管理工具

    Node包管理工具 只是简单的介绍一些工具的使用,有利于开发过程.除了介绍Node包管理工具,还介绍了前端打包工具,前端模块管理工具 Node包管理工具:    --npm    --cnpm    ...

  5. node包管理器

    NPM小结   nodejs的出现,可以算是前端里程碑式的一个事件,它让前端攻城狮们摆脱了浏览器的束缚,踏上了一个更加宽广的舞台.前端的可能性,从此更加具有想象空间. 随着一系列基于nodes的应用/ ...

  6. Android包管理机制(二)PackageInstaller安装APK

    前言 在本系列上一篇文章Android包管理机制(一)PackageInstaller的初始化中我们学习了PackageInstaller是如何初始化的,这一篇文章我们接着学习PackageInsta ...

  7. Android包管理机制(一) PackageInstaller的初始化

    前言 包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一. 包指的是Apk.jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一 ...

  8. ubuntu包管理机制

    1 ubuntu包管理机制 跟大家分享一下ubuntu的软件管理机制.如果你们有过: apt-get install 或者 apt-get update 失败的经历. 在众多的apt命令中迷失. 疑惑 ...

  9. Android的包管理机制浅析(二)

    上篇刚好说到获取到了签名信息,以下进入安装过程,直接上源代码: private void installNewPackageLI(PackageParser.Package pkg, int pars ...

随机推荐

  1. Fiddler抓包Fiddler过滤

    1.User Fiters启用 2.Action Action:Run Filterset now是否运行,Load Filterset加载,Save Filterset保存: 3.Hosts过滤 Z ...

  2. java多线程(六)线程控制类

    1.   多线程控制类 为了保证多线程的三个特性,Java引入了很多线程控制机制,下面介绍其中常用的几种: l  ThreadLocal l  原子类 l  Lock类 l  Volatile关键字 ...

  3. pipeline配置sonar和自动化

    1.sonar配置webhooks, 2.url填写jenkins的地址:http://jenkinsurl/sonarqube-webhook/ 3.前提:jenkins配置好sonar的scann ...

  4. 为什么地址空间分配粒度为64K?Why is address space allocation granularity 64K?

    您可能想知道为什么VirtualAlloc在64K边界分配内存,即使页面粒度为4K. 你有Alpha AXP处理器,感谢你. 在Alpha AXP上,没有“加载32位整数”指令.要加载32位整数,实际 ...

  5. Java的三大版本

    Java的三大版本 Write Once.Run Anywhere JavaSE:标准版(桌面程序,控制台开发......) JavaME:嵌入式开发(手机,小家电......) JavaEE:E企业 ...

  6. POJ-排序-归并排序与逆序对

    排序:归并排序与逆序对 一.概念 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序 ...

  7. 【C++】static关键字有哪些用法?其主要作用是什么?

    static关键字的用法: 1)将全局变量修饰为静态全局变量 存储在静态存储区,整个程序运行期间一直存在 静态全局变量在声明它的文件之外是不可见的,只要声明它的文件可见,而普通的全局变量则是所有文件可 ...

  8. 简单的爬虫程序以及使用PYQT进行界面设计(包含源码解析)

    由于这个是毕业设计的内容,而且还是跨专业的.爬虫程序肯定是很简单的,就是调用Yahoo的API进行爬取图片.这篇博客主要讲的是基础的界面设计. 放上源码,然后分部解析一下重要的地方.注:flickra ...

  9. STM32 系统滴答计时器

    ;//us与系统滴答的被乘数 ;//ms与系统滴答的被乘数 ;//系统运行秒数 /** * @description:系统滴答计时系统初始化 * @param 无 * @retval 无 */ voi ...

  10. 2. Spark GraphX解析

    2.1 存储模式 2.1.1 图存储模式 巨型图的存储总体上有边分割和点分割两种存储方式 1)边分割(Edge-Cut):每个顶点都存储一次,但有的边会被打断分到两台机器上.这样做的好处是节省存储空间 ...