网络埋伏纪事

Node Hero - 2. 使用 NPM

网络埋伏纪事 · 2016-11-21翻译 · 1519阅读 原文链接

本章将学习什么是 NPM,以及如何使用它。我们开始吧!

NPM 概述

NPM 是 Node.js 应用程序所用的包管理器 - 你可以在 NPM 中找到大量模块,这样你就不用重新造轮子了。它就像 Java 的 Maven 或者 PHP 的 Composer。与 NPM 交互有两种主要的接口 - NPM 网站以及 NPM 命令行工具。

网站和 CLI 使用同样的注册库来显示模块以及查找模块。

NPM 网站

NPM 网站地址为 https://npmjs.com。你可以注册成一个新用户,或者只查找包。

npm website for Node Hero using npm tutorial

命令行界面

要运行 CLI,只需执行:

npm

注意,NPM 是与 Node.js 二进制文件捆绑在一起的,所以不必安装它 - 但是,如果想使用指定的 npm 版本,可以更新它。如果想安装 npm 第三版,那么就可以执行:npm install npm@3 -g

使用 NPM

在上一章 开始使用 Node.js 中,当创建 package.json 文件时,已经遇到了 NPM。下面我们继续扩展知识!

添加依赖

本节将学习如何给应用程序添加运行时依赖。

有了 package.json 文件之后,就可以给应用程序添加依赖了。下面我们先添加一个!试试下面的命令:

npm install lodash --save

用这一条命令,我们做了两件事情:首先,lodash 被下载,并放到 node_modules 文件夹。所有外部依赖都会放在这个文件夹中。一般不会将这个文件夹添加到源代码管理,所以如果你在用 git,要确保将 lodash 添加到 .gitignore 文件中。

这对你的 .gitignore 是一个好起点。

# Logs
logs
*.log
npm-debug.log*

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules
jspm_packages

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history

现在我们来看看 package.json 文件中有啥变化!文件中出现了一个新属性dependencies

"dependencies": {
  "lodash": "4.6.1"
}

这意味着 lodash 版本 4.6.1 现在安装好了,可以使用了。注意,NPM 遵循 SemVer 规则来控制包的版本。

> 假设版本号格式为 “主版本号.次版本号.补丁版本号”,当作出不兼容的 API 修改时,增加主版本号;当以向后兼容的方式添加功能时,增加次版本号;当作出向后兼容的错误修正时,增加补丁版本号。更多信息参见:http://semver.org/

既然 lodash 已经可以用了,我们来看看能怎么用!可以像你用自己的模块一样的方式用它,不过现在不需要定义路径,只需要模块的名称:

// index.js
const _ = require('lodash')

_.assign({ 'a': 1 }, { 'b': 2 }, { 'c': 3 });  
// → { 'a': 1, 'b': 2, 'c': 3 }

添加开发依赖

本节将学习如何把构建时依赖添加到应用中。

在创建 Web 应用程序时,可能需要压缩 JavaScript 文件,合并 CSS 文件等等。做这种事情的模块只会在资源构建期间运行,所以运行的应用程序不需要它们。

你可以像这样安装这些脚本:

npm install mocha --save-dev

之后,package.json 文件中会出现一个称为 devDependencies 的新小节。所有带有 --save-dev 安装的模块都会被放在这里 - 它们也会被放在同一 node_modules 目录中。

NPM 脚本

NPM 脚本是一个很强大的概念 - 有了它们相助,就可以创建小的实用工具,甚至构成复杂的构建系统。

最常见的就是 starttest 脚本。用 start 脚本可以定义别人如何启动你的应用程序,用 test 脚本定义如何运行测试。在 package.json 中,它们可以像这样:

  "scripts": {
    "start": "node index.js",
    "test": "mocha test",
    "your-custom-script": "echo npm"
  }

这里要注意的事情:

  • start: 很简单,它只描述应用程序的起点,可以被 npm start 调用。
  • test: 用途是执行你的测试 - 这里有个陷阱,在本例中 mocha 不需要全局安装,因为 npm 会在 node_modules/.bin 文件夹下查找它,而 mocha 也会放在这里。它可以用 npm test 调用。
  • your-custom-script: 任何你想要的东西,你可以挑任何名称。它可以用 npm run your-custom-script 调用 - 不要忘记 run 部分!

作用域包/私有包

起初 NPM 对于模块名称有一个全局共享的命名空间 - 在注册库中有超过 250,000 个模块,大部分简单名称都已经被采用了。此外,全局命名空间只包含公共模块。

NPM 通过引入作用域包(Scoped Package)来解决此问题。作用域包有如下命名模式:

@myorg/mypackage

可以采用与以前一样的方式安装作用域包:

npm install @myorg/mypackage --save-dev

它会以如下方式出现在 package.json 中:

"dependencies": {
  "@myorg/mypackage": "^1.0.0"
}

不出所料,请求作用域包应该是如下方式:

require('@myorg/mypackage')

> 更多信息,请参考 NPM 作用域模块文档

下一步:异步编程

下一章学习使用回调和 Promises 实现异步编程的原理

相关文章