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. aardio类的例子

    论坛里面相关资料太少,这里贴一下 库需要在工程的lib目录下,在ide里面就是用户库目录,比如 my_lib namespace my_lib{ import console class MyLibC ...

  2. 【转载】 tf.ConfigProto和tf.GPUOptions用法总结

    原文地址: https://blog.csdn.net/C_chuxin/article/details/84990176 -------------------------------------- ...

  3. DTLZ

    DTLZ 开新坑,未完待续 觉得有用的话,欢迎一起讨论相互学习~Follow Me Reference [1] Multiobjective Immune Algorithm with Nondomi ...

  4. intellij查找接口的实现类

    拿MyBatis的SqlSession为例 第一步:先找到这个接口 第二步:右击选择 再选择 第三步: 会得到如下 右击Closeable,因为SqlSession实现了它,选择Show Inplem ...

  5. java自定义jar包让jmeter使用---给java参数化

    上一篇文章中,提到怎么生成jar包让jmeter使用,这次我们来试试做参数,因为发现调包的时候其实更多还是参数化,那么开始改造吧 1.在httpclientpost这个类中替换参数,且打印参数 imp ...

  6. 阿里云composer 镜像

    2019年12月2日13:54:32 https://developer.aliyun.com/composer 阿里云的镜像更新时间比较及时 本镜像与 Packagist 官方实时同步,推荐使用最新 ...

  7. MyBatis踩坑之SQLProvider转义字符被删除问题

    目录 踩坑背景 问题描述 原因追踪 解决方案 方法一 方法二 踩坑背景 项目架构:Spring Boot + MyBatis + MySQL. 使用MyBatis作为ORM框架,jdbc驱动使用的是m ...

  8. YII2框架集成go!aop

    AOP实践:YII2框架本身拥有一个功能,叫做行为.它可以动态的为当前的类附加额外的功能,但这种功能在代码层级结构是静态的,有侵入性的. 下面以YII2框架集成go!aop库为例,介绍在YII2中如何 ...

  9. 【问题】Could not locate PropertySource and the fail fast property is set, failing

    这是我遇到的问题 Could not locate PropertySource and the fail fast property is set, failing springcloud的其他服务 ...

  10. Excel在数据表中悬停鼠标显示数据值

    打开一个实例文档,鼠标移动到数据表中,在柱状图上中悬停鼠标,可以看到没有显示数据的值. 鼠标单击左上角的<文件>按钮. 然后单击<选项>按钮. 在弹出的excel选项对话框中单 ...