You are on page 1of 48

■■■■■■ ■■

TypeScript■React■Node.js■webpack
■ Docker Frank Zammetti
Visit to download the full and correct content document:
https://ebookmass.com/product/%e7%8e%b0%e4%bb%a3%e5%85%a8%e6%a0%8
8%e5%bc%80%e5%8f%91-%e4%bd%bf%e7%94%a8-typescript%e3%80%81react
%e3%80%81node-js%e3%80%81webpack-%e5%92%8c-docker-frank-zammetti/
现代全栈开发 使用 TypeScript、
React、Node.js、webpack 和
Docker
封面
捐赠
捐赠支持译者,翻译更多书籍

微信
支付宝
现代全栈开发
弗兰克·扎梅蒂

美国宾夕法尼亚州波茨敦

ISBN-13 (pbk): 978-1-4842-5737-1 ISBN-13 (electronic): 978-1-


4842-5738-8

版权所有 © 2020 弗兰克·扎梅蒂


第一章服务器端实战:node和npm
欢迎阅读本书!我希望你下面有一把舒适的椅子,你旁边的桌子上有一杯
美味的饮料,也许还有小吃(我可以推荐一些黑巧克力饼干吗?),你的
大脑准备好吸收大量关于现代网络开发的知识,因为这就是节目的全部内
容,窗帘即将拉开!

在本书中,我们将构建两个完整的应用程序,它们将以实际的方式演示我
们将在此过程中讨论的所有概念。这不仅仅是简单的、人为的代码,而是
两个功能强大且有用的完整应用程序(甚至很有趣,因为其中一个是游
戏,它将为您提供一种全新的编码方式)。当我们这样做时,您将深入了
解它们的想法,它们的设计和架构,因此您可以全面了解构建这两个应用
程序所涉及的内容。你甚至会在这里和那里得到一些关于我遇到的问题以
及我如何解决这些问题的笔记,这些事情几乎肯定会帮助你在你继续进入
自己的项目时实现你的目标。

首先,我们将看看服务器端最常见的(虽然不是唯一的,正如您将了解的
那样!)的范围。请记住,我们在这里谈论的是“全栈”开发,这意味着您将
学习编码客户端以及它们使用的服务器代码,以形成一个有凝聚力的整体
应用程序。在本章中,我们将首先介绍两个非常流行的服务器开发工具:
Node.js和NPM。

JavaScript运行时和构建(大部分)服务器
Ryan nodejs的创建者。Ryan于2009年在欧洲JSConf上首次展示了Node,
并很快被公认为潜在的游戏规则改变者,他的演讲获得了起立鼓掌(我认
为Ryan通常也是一位出色的演讲者)。

Node 是一个主要(但不完全)运行服务器端代码的平台,具有高性能,能
够轻松处理大型请求负载。它基于当今地球上使用最广泛的语言:
JavaScript。它很容易上手和理解,但它为开发人员带来了巨大的力量,这
在很大程度上要归功于其异步和事件驱动的编程模型。在 Node 中,您所
做的几乎所有事情都是非阻塞的,这意味着代码不会阻止其他请求线程的
处理。大多数类型的 I/O 是阻塞发挥作用最多的地方,在 Node 中都是异
步的,无论是网络调用、文件系统调用还是数据库调用。这一点,再加上
为了执行代码,Node使用谷歌流行且高度调优的V8 JavaScript引擎,与
Chrome浏览器的引擎相同,使其性能非常高,能够处理大量的请求负载
(假设你作为开发人员当然不会搞砸事情!)。

还值得注意的是,尽管听起来很奇怪,但Node是单线程的。乍一看,这似
乎是一个性能瓶颈,但实际上,这是一个净好处,因为它避免了上下文切
换。但是,这有点用词不当,因为更正确的说法是 Node 是事件驱动的,
并且是具有后台工作者的单线程。当你发出某种类型的 I/O 请求时,Node
通常会为此生成一个新线程。但是,当它完成工作时,单个事件驱动的线
程会继续执行您的代码。所有这些都通过事件队列机制进行管理,以便在
响应返回时,这些 I/O 操作的回调将触发,并返回到该单个线程上。所有
这些都意味着线程之间没有(或至少最少)上下文切换,而且单个线程永
远不会闲置(当然,除非实际上没有工作要做),所以你最终会得到我提
到的净积极的好处。

请注意,在后面的章节中,您将看到node并非特定于等式的服务器端,事
实上,您并不总是使用 node 构建应用程序;有时,您可以使用它在您自己
的开发计算机上安装和执行用于各种目的的工具。

作为 Node 开发人员,这些技术细节都不是特别重要,但它产生的性能使
得如此多的重要参与者和网站都以某种方式采用 Node 也就不足为奇了。
这些不是我们正在谈论的小公司,我们谈论的是你无疑知道的名字,包括
DuckDuckGo,eBay,LinkedIn,Microsoft,Netflix,PayPal,沃尔玛和雅
虎,仅举几个例子。这些是需要顶级性能的大型企业,而Node可以实现这
一承诺(再次警告,作为开发人员,您不要把事情搞砸,因为这总是可能
的)。

Node 是一流的运行时环境,这意味着您可以执行诸如与本地文件系统交
互、访问关系数据库、调用远程系统等操作。过去,您必须使用“适当的”运
行时(例如 Java 或 .Net)来完成所有这些操作;JavaScript不是这个领域的
参与者。对于 Node,这不再是真的。它不仅可以在性能上竞争,还可以在
为开发人员提供的功能方面竞争。如果你能想到它,你很可能可以用 Node
做到这一点,而 JavaScript 并不总是如此。
需要明确的是,Node本身并不是一个服务器。你不能只是启动 Node 并从
Web 浏览器向它发出 HTTP 请求。默认情况下,它不会执行任何操作来响
应您的请求。不,要将 Node 用作服务器,您必须编写一些(如您所见,
简单明了)代码,然后在 Node “运行时”上运行。是的,你可以有效地编写
自己的Web服务器和应用程序服务器,ftp等服务器。作为开发人员,这是
一件非常奇怪的事情——我们通常会对这样的事情应用“不要重新发明轮
子”的口头禅,并从数百个现有选项中取出一个。另外,编写这样的服务器
听起来(可能实际上是)对大多数开发人员来说都是令人生畏的,这是有
充分理由的!可以肯定的是,如果您尝试用许多其他语言从头开始编写
Web服务器,那绝对是这样,特别是如果您希望它不仅仅提供静态内容文
件。

但请记住,充当服务器只是 Node 作为javaScript 运行时,只有当您作为开


发人员向它提供所需的代码时,它才能提供此功能!事实上,现在许多开
发人员工具和其他类型的应用程序都使用 Node 作为运行时。node真的到
处都是!

请注意,正如你将看到的,react,Webpack和typeScript,三件事是本书的
主要焦点(docker是简要提及),使用node来运行和/或安装(好吧,如果
我们准确的话,npM被用来安装它们,但我们稍后会谈到npM)。这些是工
具,而不是服务器,这是重点:Node的用处远不止创建服务器!

Node允许您在客户端和服务器上使用相同的语言和知识,这在以前很难完
成。事实上,除了Java和一些Microsoft技术(如果你好奇的话,请参阅
Blazor项目,它试图用C#做同样的事情),在Node出现之前,从来没有真
正有机会这样做。这是一个非常有吸引力的机会。

Node的另一个关键方面是项目的驱动设计目标,即将其核心功能保持在绝
对最低限度,并通过API(以JavaScript模块的形式)提供扩展功能,您可
以根据需要进行选择。Node尽可能地避开你,只允许你在需要时引入你真
正需要的复杂性。Node 附带了广泛的此类模块库,但每个模块都必须导入
到您的代码中,然后您可以根据需要引入数千个其他模块,随着本书的进
展,您将看到其中一些模块。

除此之外,获取、安装和运行 Node 都是微不足道的练习,无论您的操作


系统偏好如何。没有复杂的安装,需要管理各种依赖项,也没有大量的配
置文件需要处理,然后才能启动服务器并处理请求。这是一个五分钟的练
习,具体取决于您的互联网连接速度和打字速度!也没有使用Node所需的
工具。事实上,一个简单的文本编辑器就足够了,用最简单的术语来说
(虽然这并不是说你以后不会想要一个支持 Node 的强大 IDE,但至少对于
本书,除了记事本或一些等效的文本编辑器之外,我不会假设任何其他东
西)。

请注意,如果您不是 JavaScript 专家,请不要担心,我们不会太花哨。即


使我们进入应用程序,我也会有意识地让事情尽可能简单。虽然你应该有
一些JavaScript的经验,但你不需要是Brendan eich或Doug Crockford(但
如果你没有typeScript的经验,那很好;我们稍后会从头开始)。

安装node
首先,只需记住一个地址:
http://nodejs.org

下载node如图:

通常,我会告诉您安装可用的最新版本,但在这种情况下,最好选择长期
支持 (LTS) 版本,因为它们往往更稳定。
jack@jack:~$ node
Welcome to Node.js v20.5.1.
Type ".help" for more information.
> console.log("hello world")
hello world

更有用的:执行 JavaScript 源文件


vim test.js
let a = 5
let b = 3
let c = a * b
console.log(`${a} * ${b} = ${c}`)

执行test.js
node test.js

Node的包管理器NPM
NPM,代表Node Package Manager,是一个与Node一起安装的配套应用程
序(尽管它是单独开发的,可以按照与Node不同的时间表进行更新)。有
了它,您可以从中央仓库(或私有存储库,如果有的话)下载可重用的
JavaScript 模块(以及它们可能需要的任何支持内容)。您可以在以下位置
找到的中央存储库
https://www.npmjs.com/

您可以通过网络浏览器访问它并查看所有可用的软件包,这使得找到您需
要的东西变得容易。

使用 NPM 很简单:它只是从命令提示符运行的另一个命令,就像 Node 一


样。例如,假设您创建一个名为 MyFirstNodeProject 的目录。在其中,执
行以下命令:
mkdir MyFirstNodeProject
cd MyFirstNodeProject
npm install express
注意 大多数 npM 命令也有较短的形式。例如,您可以键入 i 而不是键入
install,它将执行相同的操作。

如果你这样做,你会发现已经创建了一个叫做node-modules的目录,里面
会有很多......好吧,很多东西你通常不需要太担心!简而言之,不过,构成
Express 模块的所有代码(现在无关紧要,但它是一个 JavaScript 模块,或
者如果你愿意的话,可以打包,我们将在 MailBag 应用程序中使用它,但是
我们将在适当的时候进入该应用程序,在此之前我们还有很多内容要介
绍,所以现在只需说它是我们将使用前六章中讨论的技术构建的两个应用
程序之一),再加上Express本身所依赖的任何模块(以及它们可能依赖的
任何模块, 等等)。NPM 负责为您获取所有这些依赖项。您还会注意到已
经创建了一个名为 package-lock.json 的文件,出于我们在这里的目的,您
无需担心这一点,除了知道不要删除它,因为 NPM 需要它来完成它的工
作。

当您像这样使用 install 命令时,您命名的模块将安装在当前目录中,这称


为本地缓存或项目缓存。您还可以通过向命令添加参数来将模块安装到所
谓的全局缓存中:
npm install -g express

现在,Express 将安装在当前目录之外的位置,并由所有 Node 项目共享


(或者,更准确地说,它将可供所有项目使用,因为,当然,除非您告诉
它,否则项目不会使用全局安装的模块)。大多数情况下,您需要在项目
缓存中安装依赖项,以便不同的项目可以使用与其他项目不同的给定模块
版本

更多 NPM 命令
除了安装之外,还有许多其他 NPM 命令,但您可能大多数时候只会使用子
集。例如,要了解项目中安装了哪些模块,可以发出以下命令:
npm ls

就像在 *nix 系统上一样,ls 是 list 的缩写,这就是它的作用:列出已安装


的模块。您将看到的是一个文本树,其中显示了模块,然后是它们所依赖
的模块。换句话说,显示的可能不仅仅是您显式安装的模块
提示 我可以给出的一个非常有用的提示是,如果您只想查看顶级模块,无论是在全局缓存还
是本地缓存中,都可以将 --depth=0 添加到 ls 命令中。

如果要查看全局缓存中安装了什么,可以执行
npm -g ls

更新模块
npm update express

只需提供要更新的模块的名称,NPM 就会处理它,更新到最新的可用版
本。如果您不提供软件包名称,则 NPM 将尽职尽责地更新所有软件包。是
的,您可以在其上放置 -g 以针对全局缓存。

当然,您也可以卸载软件包:
npm uninstall express

这几个命令可能代表了与 NPM 交互所需的大部分内容。我建议您参考


NPM 文档以获取其他命令(请注意,只需键入 npm 并在命令提示符下按
Enter 就会显示可用命令的列表,然后您可以键入 npm help 以获取有关每
个命令的信息)。

初始化新的 NPM/node项目
现在,在所有这些中,我确实跳过了一个步骤,这显然是可选的,但实际
上是典型的,那就是初始化一个新项目。对于大多数 Node/NPM 项目,您
还将在项目的根目录中拥有一个名为 package.json 的文件。此文件是项目
清单文件,它向 NPM(和 Node,至少间接)提供有关项目执行某些操作
所需的元数据信息。它会告诉 NPM 如果还没有安装什么模块,它会告诉它
们要安装什么(这使得将项目交给另一个开发人员非常容易!它还将包含
项目的名称和版本、其主入口点以及许多其他信息(其中大部分是可选
的,但我们将在下一章中详细介绍)。

虽然您可以手动编写此文件,甚至可以完全没有它,但拥有它是一个好主
意,最好让 NPM 为您创建它,您可以通过执行以下命令来执行此操作:
npm init
或者
npm init -y

如果您正在继续操作,请确保您从中运行此目录为空(删除node_modules
和package-lock.json(如果存在),这两者都将在后面描述)。这将触发一
个交互式过程,引导您完成 package.json 文件的创建

这将引导您完成一个交互式的分步过程,您可以在其中输入与您的项目相
关的任何信息(如果有)。您只需在每个选项上按 Enter 即可使用默认值
(或空白值,以适用者为准),也可以输入适合您的值。不过,出于我们
在这里的目的,您确实可以并且应该简单地在过程中的每个提示符上按
Enter 键。

添加依赖关系
现在,假设您想将我提到的 Express 包添加到此项目中。有两种选择。首
先,您可以自己编辑package.json,添加以下元素:
"dependencies": {
"express": "^4.16.1"
}

但是,这样做不会有任何影响。模块未安装,为此,您现在必须发出一个命
令:
npm install

NPM 现在(应该提到使用 Node 作为运行时,因为 NPM 只是一个在 Node


上运行的 JavaScript 应用程序)从中央存储库获取 Express 包,将确定它
需要的所有依赖项,并将所有这些依赖项下载并安装在当前目录下的
node_modules 目录中。所有这些模块现在都在项目缓存中(应该注意的
是,不是全局缓存)并可供您使用

另一种方式是使用npm安装模块

npm install express --save,项目运行时需要的包

npm install express --save-dev 开发时候需要的包


注意 您也可以将 --save 替换为 --save-dev。这会导致将 devDependencies 条目
添加到 package.json 中。不同之处在于,devDependencies 是你只需要在开发过程中
需要的模块,但你的项目代码本身并不依赖于这些模块。正如你稍后将看到的,两个很好的例
子是typeScript和Webpack。此外,卸载依赖项时,--save 和 --save-dev 也可用于
从 package.json 中删除依赖项。

这一切很重要的原因是,现在,假设你想把这个项目交给别人。您通常不
希望向他们提供项目所需的所有依赖项、node_modules的所有内容,如果
没有其他原因,该目录可以迅速增长到很大。相反,他们可以使用
package.json 文件重新创建它,只需执行以下操作:
npm install

这将导致 NPM 读取 package.json 文件并自动安装所有依赖项!

package.json文件内某些符号的语义
最重要的是,波浪号 (~)、插入符号 (^) 和星号 (*) 字符具有特殊
含义。

您可能会在 package.json 中看到的版本,以 Express 为例:

“express” : “1.2.3” – NPM 将仅获取此特定版本。


“express”: “~1.2.3” – NPM 将获取最新的补丁版本。(因此,~1.2.3 将找到最新
的 1.2.x 版本,但不会找到 1.3.x 或低于 1.2.x 的任何版本。
“express”: “^1.2.3” – NPM 将获取最新的次要版本。(因此,^1.2.3 将找到最新
的 1.x.x 版本)
“express”: “*” – NPM将获取可用的最新版本。(还有一个显式的最新值执行相同的操
作。

注 意 使 用 npm install 命 令 时 , 可 以 在 软 件 包 名 称 后 添 加
@major.minor.patch,以使用前面文本中描述的所有 Semver 规则指定要安
装的版本。

第一个node web服务器
既然您对Node和NPM有了一些了解,至少在最基本的方面,让我们写一些
实际代码,除了前面显示的简单示例之外,也就是说,并使用Node运行
它。

server.js
require("http").createServer((request, response) => {
response.end("Hello World!");
}).listen(3000);

node server.js

在package.json

添加
"start": "node src/server.js"

npm start

浏览器打开:

显然,这是一个简单的例子,但它应该足够好地理解基本思想。但是,在
代码级别,这个简单示例中究竟发生了什么?碰巧的是,相当多,其中大
部分是 Node 工作方式的关键。

第一个概念是导入模块的想法。在示例代码中,http 是一个模块。这是
Node 开箱即用的核心 Node 模块之一,因此,它直接编译到 Node 二进制
文件中。因此,您不会在它的 Node 安装目录中找到单独的 JavaScript 文
件。所有 Node 核心模块都是如此,您可以在 Node 站点上的 Node 文档中
找到所有这些模块。

注意 我们将在下一章中介绍一些更常用的模块。
您也可以通过将其他.js文件添加到项目中并 require 它们来创建自己的模
块。这涉及到更多,讨论范围和导出等问题,我们将及时讨论所有这些问
题。但是现在,我想提一下,至少以防您真的对 Node 完全陌生,以便如
果您想跳到前面,您可以在 Node 文档中找到适当的部分来描述这一点。

require() 函数返回一个对象,该对象本质上是模块提供的 API。在本例


中的 http 中,createServer()此方法创建一个 Web 服务器实例并返回对
该实例的引用。

如前所述,createServer() 方法返回对 Web 服务器实例的引用,该实例


本身包含方法 listen()。该方法接受服务器应侦听的端口号,以及(可
选)要侦听的主机名/IP 地址。在此示例中,指定了标准 HTTP 端口 80,
默 认 情 况 下 , 如 果 未 指 定 IP 地 址 , 则 使 用 本 地 计 算 机 环 回 地 址
127.0.0.1,如此处的情况。一旦你调用了这个方法,服务器将开始监听请
求(即,假设没有其他东西已经在你的系统上使用该端口!),对于每个
传入的请求,它将调用传递给createServer()的匿名函数。

这个回调函数(回调函数是 Node 提供非阻塞功能的一种机制,其他是


Promise 和 async/await)接收两个参数,inRequest 和 inResponse,它们
分别是表示 HTTP 请求和响应的对象。在这个简单的示例中,这个回调函
数所做的只是在响应对象上调用 end() 方法,传递要发回的响应。默认
情况下,将自动添加 HTTP 200 响应代码标头,因此这将完成对给定请求
的处理。

稍后需要为 MailBag 应用程序编写服务器!但是,当我们进入该应用程序


时,我们将使用更强大的功能(如前所述,Express),但这可以让您对它
需要什么有一个基本的了解

奖金示例
让我们把这个 Web 服务器代码更进一步,以提供更多的 NPM 优点,只是
为了使用到目前为止讨论的几乎所有内容。

首先,让我们向项目添加一个依赖项。我们将使用命名不是非常有创意但
非常准确的请求模块,它将为我们的服务器提供一个基本的 HTTP 客户
端,供它用于进行远程调用:
npm install request --save

server_time.js
require("http").createServer((inRequest, inResponse) => {
const requestModule = require("request");
requestModule(
"https://www.baidu.com",
function (inErr, inResp, inBody) {
inResponse.end(
`Hello from my first Node Web server: ${inBody}`
);
}
);
}).listen(3000);

我们现在要做的是首先导入请求模块并为其命名 requestModule(只是为了
帮助消除它与传递给回调函数的 inRequest 对象的歧义)。此模块的 API
很简单:将 URL 传递给构造函数,加上一个回调,然后将调用该 URL,并
且当对该调用的响应返回时,将执行提供的回调。我们得到的是百度网页
数据,然后将其写入返回到浏览器的响应中。

总结
在本章中,我们研究了 Node 和 NPM,并讨论了它们使用的基础知识。但
是,因为 Node 和 NPM 在概念上非常简单,所以总的来说,这些基础知识
是编写实际应用程序所需的全部内容。您现在知道如何执行 JavaScript 代
码,如何创建 NPM 项目以及如何添加依赖项。您了解全局缓存和本地(项
目)缓存之间的区别,甚至知道如何编写基本的Web服务器!

在下一章中,我们将继续更详细地研究这两个工具,使用它们进行一些稍
微更高级的东西,以扩展我们将在本书后面构建两个应用程序的基础。
第二章,高级node和npm
NPM:更多关于package.json
在上一章中,您学习了如何使用 NPM 初始化项目,它会生成一个
package.json 文件。我当时说它的大部分内容都是可选的,这绝对是
真的,但让我们谈谈该文件中可用的内容,讨论每个可用的键(记住
它只是一个 JSON 文件,这意味着它正在定义一个 JavaScript 对象,
它有键或属性)

name 项目名称!name 元素的值不得超过 214 个字符,不能以点或


下划线开头,不能有大写字母,并且必须是 URL 安全的。

author 作者,由具有三个潜在属性的对象定义:名称、电子邮件和
URL(其中名称是必需的,电子邮件和 URL 都是可选的)。

bin – 某些包需要安装可执行文件才能完成其工作并添加到路径中。

browser – 某些模块用于浏览器,而不是在 Node 中使用

bugs– 如果您的项目有问题跟踪器,则可以使用 bugs 元素引用它。


this 的值是一个具有两个属性(url 和 email)的对象,您可以指定其
中一个或两个

bundledDependencies – 某些项目需要在本地或通过单个下载保留
NPM 包。对于这些,此元素允许您指定一个包名称数组,这些名称将
在发布包时与包捆绑在一起。

config – 如果在使用包时需要在环境中提供参数,则 config 元素可能


会解决问题。在这里,您可以指定一个类似于 “config” : { “port” :
“8888” } 的值,然后在代码中可以引用 npm_package_ config_port
作为环境变量来配置值。
contributors – 贡献者元素就像作者元素一样,只是这是一组帮助项目
的人。

cpu – 如果您的代码仅用于在某些系统架构上运行,则可以使用 cpu


元素将其指定为字符串数组。

dependencies 依赖关系 – 您在上一章中看到了依赖关系元素,但我还


要提到,除了指定包名称和要从 NPM 仓库中提取的版本(可选)之
外,您还可以指定要下载的压缩包的 URL 或 Git/GitHub URL 或本地
文件系统路径。

description – 描述包的自由格式字符串。

devDependencies – 同样,我在上一章中提到过的一个,它与依赖项
相同,但它命名了仅在开发过程中需要的包。

directories – 此元素允许您描述包的结构、库组件二进制内容的位
置、手册页、Markdown 文档、示例和测试。有关此内容的详细信
息,请参阅 Common JS 包规范。

engines – 此元素允许您指定包使用的 Node 版本。您还可以使用此元


素来定义 NPM 的哪个版本能够正确安装包。

files – – 将包安装为依赖项时,NPM 需要知道要包含哪些文件。默认


情况下,它将假定所有内容,但是如果您希望或需要指定,则files元
素将允许您执行此操作。它的工作方式很像 .gitignore 文件,但反过
来:此元素中列出的任何内容都将包含在内,而不是被忽略。

homepage – 如果您的项目有一个网站,则可以使用此元素指定其主
页的 URL。

keywords – 关键字元素是任意字符串数组,可用于帮助人们找到您的
包。

icense – 许可证元素的值是发布包时使用的许可证。
man – 使用此元素,您可以指定单个文件或文件名数组,以便 Linux
man 程序为您的软件包显示。

main – 这 是 包 的 主 要 入 口 点 。 例 如 , 如 果 您 的 软 件 包 名 为
super_duper_cool_package,则用户希望在安装后能够执行 require
(“super_duper_cool_package”)。若要允许此操作,main 元素必须
指向导出包的主导出对象的文件。

optionalDependencies – 如果您的包具有依赖项并且 NPM 无法安装它


们,则它将使您的软件包安装失败。但是,如果您想指定某些依赖项
可 以 丢 失 , 并 且 NPM 无 论 如 何 都 应 该 继 续 安 装 , 那 么
optionalDependencies 是您可以列出它们的地方。

os – 就像 cpu 一样,如果您的软件包仅适用于某些操作系统,那么您
可以在此元素中拥有一个字符串数组来命名它运行的字符串。

peerDependencies – 有时,一个包将充当其他包的插件,因此您需要
一种方法来定义您的软件包与哪些其他软件包兼容。
peerDependencies 元素允许您执行此操作。

private – 如果您想确保不会意外发布您的包,请将 private 设置为


false,NPM 将拒绝发布它(下一节将发布更多内容)。

publishConfig – 此元素是一个对象,它定义了将包发布到 NPM 注册


表时发挥作用的许多元数据片段。这包括标签等内容。这可能会涉及
相当多的问题,除了下一节中的几句话之外,我们不会(在大多数情
况下)担心本书中的任何内容,因此,如果您需要,我将把这个问题
留给 NPM 文档。

repository – 如果您想指定包代码所在的位置,无论是 GitHub 还是其


他东西,无论是公共的还是私有的,存储库元素就是您执行此操作的
位置。

scripts – 如上一章所述,scripts 元素允许您指定命令字典,这些命令


可以在包生命周期的不同点运行,用于各种目的。像publishConfig一
样,这可能会有点复杂,所以我遵从NPM文档以获取详细信息。

version – 这是模块的版本,它必须使用 SemVer,如第 1 章中所述。


名称和版本值一起构成了包的唯一“坐标”,该标识符假定是完全唯一
的。如果你打算发布你的包,那么名称和版本是package.json中最重
要的元素(如果你不发布它,那么它们就不那么重要了,但为了你自
己的理智,你可能应该让它们有意义!

你知道,我说过几次,我会在一些事情上服从 NPM 文档,但所有这


些事情都是如此!这并不是详细介绍每个选项的参考指南;它只是对元
素的调查,所以你有一个粗略的了解什么是可用的。如果您需要使用
这些值,至少对于那些不简单的单一值,那么您需要访问
docs.npmjs.com 的 NPM 文档。有一个部分专门介绍package.json的
内容,其中介绍了您可能需要或想要的每一个细节。

NPM:其他命令
虽然您已经看到了基本的 NPM 命令,但让我们谈谈您可能发现自己
需要不时使用的更多命令。与上一节一样,这不是一个深入的参考指
南,也不是每个可用 NPM 命令的列表。但是,在上一章中显示的内
容和本节的内容之间,我相信您将在大部分时间接触到大约 95% 的
命令(随着我们在后面的章节中的进展,可能会再显示一两个命
令)。

审核包安全性
可悲的现实是,有时,您使用的软件包会被发现存在安全漏洞,就像
您使用的任何其他软件一样。但是,意识到这一点,NPM 团队构建了
一个有用的命令来处理这个问题:
npm audit
运 行 此 命 令 将 扫 描 您 的 package.json 文 件 ( 如 果 使 用 -g 或 全 局
包),并将依赖项列表提交到默认 NPM 仓库,请求报告其中的任何
已知漏洞。此报告还将包含有关如何修正的信息。但是,如果您想要
快速答案,请执行以下命令:
npm audit fix

这将导致 NPM 使用最新的可用软件包更新任何易受攻击的软件包,


尚未报告漏洞的版本。如果要查看详细的审核报告,请执行
npm audit --json

或者,如果您更喜欢纯文本
npm audit --readable

最后,如果你想看看npm审计修复会做什么,但没有真正做到

它,你可以使用
npm audit fix --dry-run

重复数据删除和修剪
你经常看到的关于NPM和Node的抱怨之一是node_modules目录的大
小可能会迅速膨胀。幸运的是,您很少需要深入研究它,但这仍然是
磁盘空间的问题,虽然现在磁盘空间很便宜,但浪费仍然不时髦!

NPM 提供了两个命令来处理这种情况,首先是
npm dedup

dedup 命令搜索 node_modules 中的包树,并寻找可以在树中向上移


动并在依赖项之间共享包的机会,从而减少冗余并节省空间。软件包
树是在您安装软件包时构建的,当 NPM 安装软件包时,它取决于,
依此类推。有时,包会有共同的依赖关系,但作为一个树,分支
(read:包)大多是独立的。此命令尝试重新组织这些分支以使其更
高效。第二个命令是这样的:
npm prune

此命令将检查已安装的软件包并查找可能不再需要的任何软件包。这
通常发生在卸载软件包时,尤其是当您在某个时候执行了重复数据删
除时。任何未在父包的依赖项列表中列出的包都被视为“无关紧要”,
因此可能会被修剪。

注意 在常规操作中,只要你安装东西,修剪就会自动运行,所以你不
需要手动运行它,但有时,俗话说,便便会发生,所以无论如何了解
它都是很好的。

不通过浏览器查找/搜索包
通过 Web 浏览器浏览中央 NPM 注册表以查找感兴趣的包很容易,但
这不是您唯一的选择。NPM 本身提供了搜索功能,如图 2-1 所示。
npm search express --registry https://registry.npmjs.com/

更新软件包
npm update

更新所有包

是的,就是这样!NPM 将关闭并将所有软件包更新到最新版本,尊重
您的 SemVer 设置。当然,您也可以在其中粘贴 -g 以更新全局包。

发布/取消发布包
首先注册:
Another random document with
no related content on Scribd:
XIV

SUURI ONNETTOMUUS.

Bideskuty oli kiihoittunut niin kovasti keskustellessaan varakkaan


vuokralaisensa kanssa, että kului hetkinen, ennenkuin hän sai
takaisin tavallisen sydämellisen hyväntuulisuutensa ja voi pakottaa
ajatuksensa tavalliseen joustavuuteensa. Tunne, jota hän ei olisi
osannut selittää, oli estänyt hänet kertomasta vierailleen
keskustelunsa yksityiskohtia ja saamasta lievennystä vihalleen
kuuntelemalla heidän vihaisia moitteitaan tuota tunkeilevaa ja
hävytöntä talonpoikaa kohtaan.

Mutta Bideskuty ei ollut sittenkään oikein tyytyväinen itseensä.


Hän häpesi hieman anteeksiantamatonta kiivauttaan tuota miestä
kohtaan, jota hänen omaksi edukseen olisi pitänyt kohdella
sovinnollisesti ja voittaa hänet lempiaatteensa puolelle. Hän tiesi
talonpoikien kunnioittavan Keményn Andrásta rajattomasti, ja
huolimatta vastahakoisuudestaan oli hänen pakko myöntää, että hän
hyvin ymmärsi tuon nuoren kauniin talonpojan ilahduttavan
vaikutuksen. Varmasti oli hän käyttäytynyt tyhmästi solvatessaan ja
lyödessään tuota miestä niin, että hänestä oli tullut hänen katkerin
vihamiehensä sen sijaan, että hänen olisi pitänyt koettaa taivuttaa
hänet liittolaisekseen. Hän ei katunut kumminkaan ollenkaan sitä,
ettei hän ollut myynyt myllyään Andrákselle, sillä hän oli aivan
varma, etteivät talonpojan vaikutteet tahtoessaan ostaa sen olleet
niin jalot kuin hän oli tahtonut uskotella. Mutta nyt, kun hän tiesi
rahojen, joiden tarpeessa hän aina oli, tulevan tuon talonpojan
kukkarosta, oli hän hyvin pahoillaan, ettei hän ollut kohdellut
Andrásta ystävällisesti taivuttaakseen hänet vähentämään tuota
suunnatonta korkoa, jonka hänen välittäjänsä, tuo verenimijä
Rosenstein, oli vaatinut. Tehtyään velkojastaan leppymättömän
vihollisen oli Bideskuty näkevinään kaikenlaisia vihollisuuksia, joihin
hänen tulevaisuudessa oli alistuttava, aavistaen samalla kukkaron
nauhojen pysyvän lujasti kiinni seuraavalla kerralla, kun hän jälleen
halusi lainata rahaa.

Suurimman osan illasta istui Bideskuty huoneessaan erillään


vieraistaan vaitiollen ja selvästi huonolla tuulella, ja koetti ilahduttaa
myrtynyttä mieltään sovittavilla savupilvillä, joita hän tupruutti
kirsikkapuisesta piipustaan. Ilonka oli vielä liiaksi lapsi
ymmärtääkseen tuota peloittavaa kohtausta, jonka hänen nopea
tulonsa oli keskeyttänyt. Hän ei aavistanut ollenkaan, että juuri
hänen oma tiedoton kauneutensa oli torjunut isää kohti suunnatun
mahdollisesti kuolettavan lyönnin ja estänyt, ettei sen suuntaajan
tarvinnut sitä ikäänsä katua. Hän oli huomannut ainoastaan pitkän
hartiakkaan talonpojan, joka oli selvästi suututtanut isän hyvin
kovasti ja joka oli katsonut häneen niin kummallisesti, ettei hän
voinut sitä ymmärtää eikä millään tavoin selittääkään. Mutta kaiken
tämän oli hän jo unohtanut silloin kun illan varjot olivat viilentäneet
puutarhan, ja kuten äitinsä kotiripityksen edellisenä iltana, karkoitti
hän mielestään nytkin jokaisen vastenmielisen tunteen
huvitellakseen nykyisyyden suomista iloista niin paljon kuin suinkin.
Hän ja kaikki hänen nuoremmat vieraansa olivat keksineet illaksi
aivan uuden huvituksen. Kaikki pantiin niin mullin-mallin, että
Bideskuty’n seinät kajahtelivat naurusta, vapisivat perustuksillaan ja
Attilan ankarannäköinen kuvapatsas horjui alustallaan. Ja tuo joukko
oli todellakin kirjava, joka tunkeili leveillä portailla ja vanhan
rakennuksen suurissa suojissa. Kauniita hymyileviä kasvoja loisti
miespuvuista ja parrakkaat naamat näyttivät vastustamattoman
hullunkurisilta naispäähineissään. Oli määrätty, että kaikkien tyttöjen
oli pukeuduttava miehiksi ja miesten verhouduttava sellaisiin
naisvaatteihin kuin he vain saivat käsiinsä.

Tarkasteltiin romuhuone, johon monien sukupolvien aikana oli


koottu liian vanhanaikaisiksi muuttuneita pukuja, ja suurista
tammiarkuista löydettiin suunnattomat määrät tämän vuosisadan
alussa käytettyjä pitkäliivisiä vaatteita, kauniita hopeakirjokankaita ja
isoäidin aikuisia poimuteltuja hameita. Isoisän messinkinappiset takit
korkeine kauluksineen ja kekomaisine lakkeineen ja isoisän
komeasti kirjailtu luumunvärinen silkkinuttu satiinihousuineen ja
punakantaisine kenkineen oli järjestetty säilöön väkevän tupakan
väliin, ettei koi niitä turmelisi.

Ja nauraen pukeutuivat kujeilevat nuoret näihin menneitten


aikojen muistoihin. Ilonka oli vallannut isänsä kansallispuvun:
sinivuorisen silkkiattilan [Attila = sotilaskuosinen pitkätakki]
jalokivisolkineen, mustan samettivaipan tummine kauluksineen ja
jalokivinappeineen, harmaat unkarilaiset polvihousut ja suuren
käyrän miekan raskaine jalokivillä koristettuine kahvoilleen, vöineen
ja tuppineen. Hän näytti hurmaavalta kallellaan olevine lakkineen,
johon oli kiinnitetty jalokivisoljella pitkä haikaran sulka. Milloinkaan ei
varmaankaan oltu nähty niin mielenkiintoista unkarilaista ylimystä.
Sitä vastoin hänen toverinsa, Madáchin Feri, jota tunteellinen
rakkaus tuohon kauniiseen tyttöön ei kumminkaan estänyt
kujeilemasta ja hulluttelemasta, näytti vastustamattoman
hullunkuriselta kreivitär Irman kansallispuvussa —
kultapäärmeisessä tiaranmuotoisessa päähineessään, joka oli
sidottu hänen niskaansa raskaalla nauharuusukkeella ja pitkillä
nauhoilla, ahtaissa liiveissään, joiden jalokivihakaset eivät ylettyneet
kiinni eivätkä niin ollen voineet estää musliinipuseron pehmoisia
laskoksia näkymästä, ja pöyhkeilevissä hihoissaan, joista hänen
ruskeat käsivartensa näkyivät. Valkoisen satiinihameen laajat
laskokset ja tuo luonteenomainen kultapäärmeinen esiliina riippuivat
pehmeästi hieman polvien alapuolelle voimatta piilottaa suuria
husaarisaappaihin pistettyjä jalkoja. Hänen suuret tummat viiksensä
lisäsivät vielä hänen ylimyksellisen pukunsa häpeällistä vaikutusta.

Entä sitten tuo punaposkinen ja kirkassilmäinen Kantassyn


Mariska? Hän oli pukeutunut tasankojen talonpojaksi, ja
lumivalkoinen pellavapaita ja leveät housut sopivat hänelle hyvin.
Pyöreine, rosmariinin oksalla koristeltuine, kallellaan olevine
lakkineen ja leveän messinkiheloilla ja -soljilla koristetun vyönsä
taskuihin pistettyine käsineen matki hän rahvaan miehen käyntiä
vastustamattoman viehkeästi. Unkarilaiseksi tytöksi pukeutunut
Bartocz'in Feri oli häneen verrattuna hyvin ruma. Hänen liivinsä eivät
tahtoneet pysyä paikoillaan ja nuo monet hänen karvaiseen
kaulaansa kiedotut kirjavat helminauhat näyttivät surullisilta. Hänellä
oli yllään monta eriväristä pumpulihametta, jotka hän oli koettanut
järjestää niin luonteenomaisesti kuin suinkin, mutta joita hän ei
kävellessään osannut heiluttaa niinkuin kauniit unkarilaiset
talonpoikaistytöt, kun ne haluavat komeilla pukunsa väkirikkaudella.

Siellä oli mahdollisimman komeasti puettuja, puuteroituja, sadan


vuoden vanhoihin pukuihin pukeutuneita kavaljeereja
satiinitakkineen ja polvihousuineen, päärmättyine poimuröyhelöineen
ja kolmikulmaisine hattuineen. Silkkisukkiin verhotut kauniit pohkeet
näyttivät hurmaavilta punakantaisiin messinkisolkisiin kenkiin
pistettyine pienine jalkoineen, mutta heidän kirjopuseroihin ja
poimutettuihin hameisiin pukeutuneet naisensa olivat kaikkea muuta
kuin Ludvig viidennentoista hovin suloisten kaunottarien näköisiä.
Watteau'n aikuiset rumat paimentytöt näyttivät hyvin
onnistumattomilta verrattuina noihin mitä suloisimpiin paimeniin, joita
taiteilija joskus on maalannut kankaalleen; ja suuripartaiset useihin
hameihin pukeutuneet mustalaistytöt joutuivat aivan unhotuksiin
hurmaavien maalauksellisiin ryysyihin pukeutuneitten mustalaisten
rinnalla.

Géza Vecsery, tuo meluava maaherra, oli pukeutunut valkoiseen


tarlatanikankaiseen hameeseen, joka kai kerran oli kuulunut jollekin
Taglionin holhokille, aikoina, jolloin tanssi vielä laskettiin kuuluvaksi
hienoihin taiteihin. Punainen kureliivi, hulmuavat ihokkaat ja hameet
näyttivät hänen ruman vartalonsa ympärillä hirmuisen hullunkurisilta,
ja hän herättikin mitä suurinta huomiota, kun hän nuoralla tanssivan
elefantin tavoin tuli ujosti huoneeseen.

Illallinen oli meluisampi ja iloisempi kuin mikään Bideskuty’ssa


ennen syöty ateria. Palvelijain ja palvelijattarien oli ollut pakko
seurata illan mullin-mallinlakia, ja harmaahapsinen tulipunaisiin
liiveihin ja punaiseen hameeseen pukeutunut vanha Jánko kaateli
vakavasti viiniä laseihin, toisten palvelijain, joilla kaikilla oli
luonteenomaiset unkarilaiset vahatut viikset, yhtyessä leikkiin
iloisenvärisissä hameissaan ja kansallisvärisissä nauhoissaan. Tytöt
muodostivat hurmaavan palvelijajoukon pitkine takkeineen, jotka
olivat liian suuret heidän solakoille vartaloilleen, ja kaunispiirteisine
jalkoineen, joihin oli vedetty nuo luonteenomaiset unkarilaiset
polvihousut.

Milloinkaan ei oltu tasangolla tanssittu niin tulista csárdásta kuin


sinä iltana illallisen jälkeen Bideskuty’n suuressa lämpiössä.
Miellyttäviä kavaljeereja oli hauska katsella, kun he tanssivat
csárdásta pienillä jaloillaan ja löivät kantapäitään yhteen niin
kevyesti kuin niiden liikkeitä eivät hameet milloinkaan olisi estäneet.
Mutta nuorukaiset taasen, ollen tottumattomat satiinihameittensa ja
hopeakirjovaatteittensa estäviin laskoksiin, onnistuivat sekoittamaan
tanssiin niin paljon kummallisia liikkeitä, että he olivat aivan
vastustamattomat. Vanhempi väki, joka ei ollut yhtynyt tuohon
hullunkuriseen naamioitukseen, nauroi aivan kuollakseen nuorien
lähettiläiksi ja husaareiksi pukeutuneitten neitosten virnottaville
naamoille ja veitikkamaiselle kiemailulle.

Mustalaiset eivät tarvinneet käskyä vaihtaakseen tanssin hitaat


liikkeet vilkkaampaan csárdákseen, jossa ei kukaan saanut levähtää
eikä kuhnailla, eivätkä he kaivanneet kehoitushuutoja jännittääkseen
laihojen käsivarsiensa voimaa. Joskus oli heidän pakko nauraa niin,
ettei heidän soitostaan tahtonut tulla mitään. Kerrankin sotkeutui
muudan veitikkamainen keimailija tehdessään komeaa pyöräystä
niin toivottomasti satiinihameensa laskoksiin, että hän pyörähti
harvinaisen hullunkurisesti lattialle pitkäkseen. Géza Vecsery taasen,
tuo jokaisen valtakunnassa olevan mustalaissoittokunnan tunnettu
suosija, komeili aina tämän tästä niin taiteellisilla hypyillä, että ne
päättyivät aina johonkin onnettomuuteen.

Kukaan ei huomannut tämän meluavan ilon kestäessä, kun pitkä


csárdás alkoi jo loppua, että yhä vieläkin kummallisissa
naisvaatteissa oleva Jánko hiipi huoneeseen ja kuiskasi kalpein
kasvoin muutamia sanoja isäntänsä korvaan. Eikä kukaan noista
vilkkaista ja ajattelemattomista huvittelijoista huomannut sitäkään,
että isäntä sen jälkeen nousi ja poistui palvelijan seurassa näyttäen
vieläkin kalpeammalta.

Noin parikymmentä minuuttia myöhemmin loppui csárdás niin


nopeasti hurjin pyörähdyksin ja käännöksin kuin muinaisten aikojen
juomingit. Miehet huusivat ja tytöt koettivat hehkuvin poskin ja
loistavin silmin muuttaa lopun vielä meluisammaksi. Sitten poistuivat
kaikki kuumissaan ja huohottaen soittokunnan läheisyydestä talon
viileämpiin osiin, muodostaen mennessään meluavan ja nauravan
joukon. Naiset kuivasivat hyvin kömpelösti hikeä otsaltaan ja heidän
kavaljeerinsa löyhyttelivät viuhkoillaan hyvin naisellisesti.

Muutamat menivät ruokasaliin, ja heidän pelästyneet huutonsa


ilmaisivat kaikille näille iloisille naamioitetuille tuon peloittavan
onnettomuuden, joka tänäkin ilon hetkenä tuotti surua ja vaikeuksia
heidän vieraanvaraiselle isännälleen.

Lämpiön ikkunoista näkyvää taivasta valaisivat synkät liekit, jotka


itään päin vyöryvä musta savu melkein kokonaan peitti. Tiheiden
akasioiden oksien välistä vilahteli kumminkin tulta kuin jostakin
kaukaisesta suuresta sulatusuunista.

Sinne tänne syöksyvien ihmisten huudot täyttivät ilman, hevoset


hirnuivat pelosta ja paimenten huudot kuulostivat omituisilta ja
peloittavilta, kun he läimäyttelivät ruoskillaan ajaessaan eläimiä pois
vaaran läheisyydestä. Lampaitten surullinen määkyntä, kun ne
seurasivat peräkkäin sokeassa avuttomuudessaan johtajaansa, joka
ohjasi pelästyneitä tovereitaan suoraan suurimpaan vaaranpaikkaan,
sekoittui paimenien kirouksiin ja koirien haukuntaan, kun ne koettivat
koota tuota pelästynyttä laumaa yhteen.
Jokaisesta tallista ja ulkohuoneesta ilmestyi työmiehiä, palvelijoita
ja talonpoikia, jotka juoksivat kiihtyneinä akasiakujannetta pitkin
tasangolle, palvelijattarien kokoutuessa pelästyneinä yhteen
joukkoon ja kuiskaillessa säikähtyneinä toisilleen. Tuskin olivat
ylimykselliset huvittelijat todenneet tapahtuneen peloittavan
onnettomuuden, kun suuret liekit nousivat rätisten ilmaan noin parin
kilometrin päässä olevalta pellolta, ja vasemmalla ja suoraan edessä
näytti hehkuva hiillos muuttavan koko maiseman suunnattomaksi
sulatusuuniksi. Hetkisen katsoivat he kaikki vaitiollen tuota
näytelmää, mutta sitten kuului heidän joukostaan pelästyneitä
kuiskauksia tulipalosta.

Vapisten painautuivat nuo iloiset, haaveellisesti naamioitetut


huvittelijat toisiinsa, ja komeat hovikavaljeerit ja kirjavasti puetut
keikarit seisoivat kalpein kasvoin, uskaltamatta puhua ääneen tuosta
peloittavasta onnettomuudesta, joka oli muuttanut huvihuoneen
surun ja pelon asunnoksi. Talossa vallitsi hirmuinen pakokauhu.
Miehet unhottaen hullunkuriset pukunsa syöksyivät leveitä portaita
suureen eteiseen ja sitten akasiakujaan. Toiset hyökkäsivät talleihin,
ja pysähtymättä hakemaan satuloita ja suitsia hyppäsivät he
hevosten selkään ratsastaen laukkaa pihan poikki tielle niin nopeasti
kuin vain synnynnäiset hevosmiehet kykenevät. Ja tänä kamalana
yönä, jota tuon hehkuvan hiilloksen synkkä tuli valaisi, näytti tuo
ratsasjoukkue jonkunlaiselta eriskummaisten noitien muodostamalta
keskiöiseltä kulkueelta, joka oli matkalla kyöpeliin. Muutamat miehet
olivat riisuneet yltään hankalat hameet, jotka estivät heidän
liikkeitään, ja muutamat taasen olivat nostaneet hameensa ylös,
koska he eivät kiireissään olleet voineet aukaista kaikkia hankalia
hakasia. Heidän ratsastaessaan hurjaa vauhtia liehuivat nuo satiini-
ja hopeakirjohameet tuulessa kuin keijukaisten siivet, jotka näkyivät
selvästi tuon synkän valon sattuessa niihin. Koreine korvallisille
valuneine päähineineen, parrakkaille kasvoille valuneille
nauharuusuineen ja paljaine ruskeine pöyhkeilevistä musliini- tahi
pellavahihoista näkyville käsivarsineen näyttivät he hyvin
eriskummallisilta. Jos tuollaisia henkilöitä olisi ollut jossakin
haaveellisessa kuvaelmassa, olisivat katsojat varmasti nauraneet
itsensä kuoliaaksi, mutta nyt lisäsivät ne vain satakertaisesti
suurimpain hullutusten aikana sattuneen onnettomuuden
aiheuttamaa pelkoa.

Sekä nuoret että vanhat naiset olivat kukin siepanneet jonkun


saatavissa olevan huivin tahi viitan, ja kiiruhtaneet peloissaan kolmi-
tahi nelihenkisin joukoin tietä pitkin palavaa tasankoa kohti. Kreivitär
Irma ja Ilonka olivat painautuneet toisiinsa ja kävelivät lohdutusta
etsien edellä. Tuo kaunis nuori tyttö, unhottaen miehiset vaatteensa
tämän suuren onnettomuuden herpaistessa hänen ajatuksensa, ei
voinut käsittää siitä muuta kuin seuraukset, lapsi kun hän vielä oli,
mutta hänen äitinsä moitti ääneti kohtaloa, joka oli uskaltanut laskea
raskaan kätensä hänen ylimyksellisille hartioilleen.

Tasangon reunalta katsottuna näytti tulipalo hirveän kaamealta ja


suurenmoiselta. Vehnä, joka oli koottu aumoihin puitavaksi ja
jauhettavaksi, ja sekin, jota ei vielä oltu leikattukaan, maissipellot,
heinät ja olet joutuivat helposti liekkien uhriksi, ja tuli levisikin
senvuoksi muutamissa minuuteissa hirveän nopeasti. Kun tuo
eriskummaisten ilveilijäin muodostama ratsasjoukkue ilmestyi
paikalle, oli koko kenttä niin kauas kuin vain voitiin nähdä yhtenä
ainoana suurena kiehuvana tulimerenä, josta kohoavat synkät
punaiset ja keltaiset liekit näkyivät selvästi tummaa taivasta vasten.
Peloittavana, salaperäisenä ja suurenmoisena muodosti se kuin
elävän liekkiverhon, joka vinkuen ja räiskähdellen hävitti levitessään
oikealle ja vasemmalle kaiken armottomasti ja välittämättä mistään
esteistä. Ja sieltä täältä tulista taustaa vasten näkyvät tummat
ratsastajat syöksyivät sinne tänne peloissaan kuin kääpiöt, jotka ovat
joutuneet äkkiä vastakkain jonkun pelkoaherättävän jättiläisen
kanssa.

Ilma kajahteli pelon ja tuskan huudoista. Hevosten pakokauhua,


kun ne ajettiin uhatuista talleista kaukaista pustaa kohti, joka ollen
kuiva ja hedelmätön oli ainoa varma turvapaikka ja ainoa este tuolle
nopeasti eläytyvälle viholliselle, oli yhtä surkea katsella kuin
kuunnella härkien surullista ammumista, säikähtyneitten lampaitten
määkyntää, miesten huutoja ja karjaisuja, ja naisten vaikeroimista ja
itkua. Mutta kovemmin vielä vinkuivat ja räiskähtelivät liekit, kun ne
hyökkäsivät jonkun uuden vehnäpellon tahi kaukaisen katoksen
kimppuun, jonka kuivat seinät paukkuivat palaessaan. Vihollinen
eteni taipumattomasi. Ei kuulunut minkäänlaisia peloittavia
luhistumisia, ei nopeita äänekkäitä syttymisiä eikä räjähdyksiä, sillä
tasankojen tulipalo hävittää varmasti, nopeasti ja hiljaa.

Jälleen syttyi uusi maissipelto palamaan, ja jokainen tähkä, kun


liekit tarttuivat siihen, sinkautteli säkeniä kuin kultaisia kastepisaroita.
Kun joku olkisuova syttyi, paloi se nopeasti loppuun tuossa kuivassa
ilmassa savuamatta ollenkaan, mutta auttoi kumminkin tulen
leviämistä. Ja nuo säikähtäneet hevosraukat, jotka eivät
ymmärtäneet, miksi suojaiset tallit nyt suljettiin heiltä, eivätkä
käsittäneet, miksi tuo omituinen synkkä ja kuuma tuli oli sytytetty,
syöksyivät eteenpäin huohottaen ja korskahdellen peloittavassa
ympyrässä, ja hyökkäsivät alituisesti suljettuja tallien ovia vastaan.
Paimenet ja tallirengit työskentelivät sydämensä pohjasta.
Taipumattomin tarmoin koettivat he pitää laumojaan koossa toivoen
saavansa ne ulottumaan ulkopuolelle, ennenkuin joku lentävä kipinä
sytyttää ensimmäisten tallien olkikatot.
Silloin näytti melkein varmalta, ettei noita kauempana olevia
rakennuksia voida pelastaa. Bideskuty, joka tähän asti oli jaellut
käskyjään hyvin tyynesti kaikille palvelijoilleen ja työmiehilleen
käskien pelastaa kaikki hevoset ensimmäiseksi, alkoi todeta ensin
hämmästyen ja sitten säikähtäen, ettei paikalle ilmestynyt ketään
muita estämään tämän suuren onnettomuuden aiheuttamia pahimpia
seurauksia.

Tulipalo näkyi varmasti peninkulmien päähän, mutta vaikka


Bideskuty oli lähettänyt miehiä joka suunnalle hakemaan apua, ei
kumminkaan Arokszállaksesta eikä Gyöngyösiin vievän tien varrella
olevista kaukaisemmista kylistä saapunut ainoatakaan sanantuojaa
eikä auttajaa.

Tuon miehen eristys tuntui pelottavalta, kun ajatellaan, että hänen


oli pakko avutonna ja yksinään katsella häviötä, joka nopeasti tuli
yhä suuremmaksi. Ja kun hän synkissä mietteissä käveli
edestakaisin, alkoi hänelle vähitellen selvitä tuo kauhistuttava totuus,
ettei tämä hänen vuodentulonsa säälimätön hävittäminen, joka
luultavasti köyhdyttäisi hänet kokonaan, ollutkaan Jumalan
määräämä rangaistus, joka olisi voinut kohdata häntä yhtä
jumalallisin oikeuksin kuin jotakin hänen naapurimaankin, vaan
jonkun yllyttävän konnan harkittu kostonhimoinen teko. Ja kiroillen
mumisi Bideskuty’n kreivi hänen nimensä, jota hän luuli
verivihollisekseen ja jota hän tyhmässä ylpeydessään oli vain
muutamia tunteja sitten niin syvästi loukannut.

Bideskuty ei tuntenut ihmisluonnetta ollenkaan. Hänen huoleton


elämänsä ja suunnaton sukuylpeytensä estivät häntä tutkimasta
naapuriensa luonteitten ja tunteitten avonaista kirjaa, joka on
kaikkien sitä haluavien lukijain saatavissa. Hänelle oli Keményn
András, olipa hän sitten rikas tahi köyhä, sivistynyt tahi sivistymätön,
aina vain tuo sama alhaissäätyinen talonpoika ja noiden orjien
jälkeläinen, jotka olivat olleet hänen omien esi-isiensä omaisuutta.
Hänestä olivat tällaiset alhaiset teot, joista hän nyt syytti Andrásta,
alhaisen suvun välttämättömiä ilmaisukeinoja. Hänen mielestään
eivät muut voineet olla jaloja kuin ne, jotka polveutuivat vanhoista
kuuluisista suvuista. Seisoessaan siinä yksinään, lähetettyään sanan
kaikille suunnille, että läheisyydessä asuvat talonpojat tulisivat
auttamaan häntä ja suojelemaan hänen hevosiaan ja rakennuksiaan,
koska pellot näyttivät auttamattomasti tuhoutuvan, kiihoitti hän
mielensä hillittömään raivoon kaikkia alhaissäätyisiä konnia kohtaan,
jotka uskaltavat kohottaa kätensä heidän herraansa vastaan.

Hänen vaimonsa ja tyttärensä koettivat turhaan rauhoittaa häntä.


Hän oli kuin joku häkkiin joutunut villipeto, eikä hän kiinnittänyt
huomiota ollenkaan vieraihinsa, jotka olivat kokoutuneet hänen
ympärilleen ollen innokkaita auttamaan, kun he vain olisivat saaneet
selville, missä tuota apua olisi parhaiten tarvittu. Hän ei halunnut
kuunnella muuta kuin omaa raivoaan, eikä puhua kenellekään, vaan
ainoastaan kiroilla luulemaansa vihollista. Ja naamioitujen
hullunkurinen ratsasjoukkue kokoutui siihen hänen ympärilleen
haavellisiin ryhmiin, kuten taisteluun valmis sotajoukko, joka on vielä
järjestymätön ja johtajaa vailla. Naiset unhottivat miespukimensa ja
lisäsivät yleistä sekasortoa itkullaan, pelollaan, levottomilla
kysymyksillään ja äänekkäillä vaikeroivilla rukouksillaan.

»Herra kreivi», sanoi joku äkkiä aivan Bideskuty’n vieressä,


»meidän on järjestettävä niin pian kuin suinkin vesiketju lähimmmältä
kaivolta tuonne talleihin. Jokainen lentävä kipinä voi sytyttää ne nyt,
eivätkä niissä olevat hevosraukat pääse pustalle tulen vuoksi. Ne on
pelastettava mihin hintaan hyvänsä».
Keményn András oli saapunut siihen jalorotuisella tammallaan,
jonka vapisevaa kaulaa hän tyynesti taputteli puhuessaan.

»Olisin tullut tänne jo ennemmin», lisäsi hän, »ellei tuli olisi


katkaissut Kisfaluunkin johtavaa tietä».

Kuullessaan tuon äänen pyörähti Bideskuty kuin kauan häkissä


ollut villipeto, joka lopultakin pääsee saalinsa kimppuun. Hänen
huulensa vapisivat suonenvedon tapaisesti hänen tapaillessaan
sanoja ja hänen raivon kalvistuttamat kasvonsa näyttivät melkein
vihaisilta synkän tulen valaistessa niitä. Mutta talonpoika mykistytti
sanat hänen suuhunsa viittaamalla tyynesti talleihin.

»Tehtyämme sen voimme uudistaa riitamme», sanoi hän. »Nyt on


teidän vain käskettävä kaikkia halukkaita seuraamaan minua».

Ja iloisten sanojen rohkaisema tamma läksi jälleen nopeasti


laukkaamaan sinne, jossa tuli levisi nopeimmin. Kukaan ei kaivannut
toista käskyä, ja kun András läksi ratsastamaan, seurasi koko
eriskummainen ratsasjoukkue häntä iloisesti huutaen.

Bideskuty katsoi heidän jälkeensä hämmästyen ja synkistyen, ja


tarkasteli vihaisin ilmein aivan sanatonna tuota voimakasta,
jalorotuisella tammallaan täyttä laukkaa ratsastavaa miestä, jonka
rohkaisevat huudot kaikuivat kovemmin kuin pelästyneitten ihmisten
ja eläinten karjahtelut ja säikähtyneitten laumojen pakokauhun
aiheuttama meteli; ja vaistomaisesti Bideskuty’kin tunsi tuon
rauhoittavan vaikutuksen, joka Andráksesta säteili jokaiseen
ihmiseen, joka hänet tunsi. Hän lopetti mumisevat kirouksensa, kun
toivonsäde rupesi valaisemaan hänen sydäntään. Hänen onnistui
suudella rohkaisevasti vaimoaan ja tytärtään, ja kuunnella tyynesti
niiden vieraiden lohdutuksia, jotka olivat joko liian vanhoja tahi liian
hitaita auttamaan.

Hän katseli innokkaasti Andráksen johtamia sammuttajia, jotka


näkyivät selvästi taivasta vasten. Hän näki heidän kiipeävän tallien
olkikatoille ja muodostavan vesiketjun tikapuita pitkin maahan ja
sitten rakennusten seinien vieritse ensimmäiselle kaivolle.
Sangollinen vettä sangollisen jälkeen kulki kädestä käteen ja
kaadettiin kuivalle katolle, etteivät lentävät kipinät sitä sytyttäisi.
Epäselvästi kuuli hän heidän kiihtyneet huutonsa, kun he vuorottain
tekivät saman jokaiselle rakennukselle, juosten tikapuita ylös ja alas,
ja näyttäen hyvin kummallisilta leveine musliinihihoineen ja liehuvine
nauharuusuineen noissa puoleksi miehisissä ja puoleksi naisellisissa
puvuissaan. He näyttivät tekevän työnsä hyvin tuon miehen johdolla,
joka kaukaa katsovasta Bideskuty’sta näytti olevan kaikkialla yhtä
aikaa, jota hän sydämessään oli kiroillut ja luullut verivihollisekseen,
ja jota hän rohkeasti syytti tämän raukkamaisen teon
toimeenpanijaksi.

»Kuka tuo mies on, Gyuri»? kysyi kreivi Kantássy, joka myöskin oli
katsellut talonpoikaa jonkun aikaa ja ihaillut aito unkarilaisen tapaan
tuota hyvän hevosen selässä olevaa mainiota ratsastajaa.

»Keményn András, tuo rikas maanviljelijä Kisfalusta».

»Näkyy olevan rohkea ja tarmokas mies, Gyuri. Olen varma, että


hän ja nuoret ystävämme pelastavat nuo tallit ja niissä olevat
hevoset, ja pysähdyttävät sitäpaitsi tehokkaasti liekkien etenemisen
tuohon suuntaan».

»Luuletko kenenkään voivan pelastaa päärakennusta?» kysyi


kreivitär peloissaan.
Kantássy katsoi vakavasti sinnepäin. Tilanne näytti todellakin
toivottomalta. Kuiva tasanko oli tehokkaasti estänyt tulen leviämisen
etelään ja itään päin, mutta pohjoisessa ja lännessä ei näyttänyt
olevan mitään, joka olisi voinut estää tulen leviämistä niinkin kauaksi
kuin Bideskuty’n asuinrakennuksiin. Se muodosti jo suuren
puoliympyrän, joka näytti joka hetki olevan sulkeutumaisillaan
onnettoman kreivin viimeisenkin omaisuuden ympärille.

Oli selvä, että tarvittiin paljon uhrautuvaisia miehiä täydentämään


viimeistä merkityksellistä pelastustyötä, asuinrakennusten ja
suurempien tallien suojelemiseksi tulelta.

»En voi ymmärtää», sanoi vanha Palotay, »missä nuo raa'at,


toimettomat ja laiskat talonpojat viipyvät. Näyttää aivan siltä», lisäsi
hän kuiskaten, ettei Bideskuty kuulisi, »kuin he olisivat päättäneet
keskenään, etteivät he auta millään tavoin.»

Mutta Bideskuty kuuli sen kumminkin.

»He ovat suunnitelleet tämän keskenään saattaakseen minut


vararikkoon», sanoi hän toivottomasti. »Taistelu on aivan hyödytöntä,
sillä koska meitä on näin vähän, emme voi tehdä mitään».

»Jos haluat, ratsastan Arokszállakseen», sanoi kreivi Kantássy,


»katsomaan, voinko saada muutamia toimettomia mukaani»?

»Se on aivan hyödytöntä», vastasi Bideskuty, »sillä sieltä ei lähde


ketään. Olen lähettänyt hakemaan apua joka suunnalta. Näyttää siltä
kuin maa olisi niellyt jokaisen lähistöllä asuvan talonpojan, koska he
eivät tule».
»Tuolla tulee tuo rikas talonpoikasi takaisin tänne. Kysy häneltä,
eikö hän voisi hankkia apua».

»En halua kysyä häneltä mitään», sanoi Bideskuty töykeästi.


»Mieluummin katselen, että kaikki palaa, kuin teen sen».

Hänen ystävänsä eivät ennättäneet vastata, sillä seuraavassa


silmänräpäyksessä ratsasti András heidän ohitseen huutaen
mennessään:

»Tarvitsemme enemmän miehiä, kreivi! Menen Arokszállakseen


hakemaan apua. Sillä aikaa on teidän korkeutenne toimittava niin,
että kaikki viikatteet, sirpit ja lapiot viedään noille pelloille tuolla.
Meidän on koetettava saada maissi leikatuksi, sillä muuten palavat
asuinrakennukset».

Seuraavassa hetkessä oli hän jo hävinnyt näkyvistä.

Bideskuty ei sanonut mitään, vaan läksi kuuliaisesti uhattuja


rakennuksia kohti sattumalta läheisyydessä olevien ystäviensä ja
vaimonsa ja tyttärensä kanssa. Pieni Ilonka raukka oli ollut niin
peloissaan, ettei hän ollut voinut tehdä muuta kuin painautua äitiinsä
kiinni, samoin kuin pieni kananpoikanen piiloutuu emonsa siipien
alle. Mutta nyt, kun hänen oli pakko seurata muita, uskalsi hän
katsahtaa pelokkaasti tuohon mieheen, jonka nimen hän oli kuullut
niin usein tänä muistorikkaana päivänä.

»Hän on hyvä mies, äiti», sanoi hän painokkaasti kiitollisuuden


kyynelien vuotaessa hänen silmistään. »Olin vihoissani hänelle
tänään senvuoksi, että hän oli suututtanut isän, mutta annan sen
hänelle anteeksi nyt, sillä hän on hyvin hyvä».
»Ehkä hän koettaa hyvittää tekoaan jollakin tavoin, kultaseni»,
sanoi parantumattomasti ylpeä kreivitär. »Epäilemättä hän tietää,
että isä maksaa hänelle hyvin tästä, ja hänhän täyttää vain
velvollisuutensa. Isäsi on hänen herransa».

Bideskuty hymyili katkerasti. Hän yksinään ymmärsi vaimonsa


sanojen tietämättömän ivan.
XV

HYVITYS.

Sillä aikaa oli András melkein jo saapunut kylään. Hän tiesi yhtä
hyvin kuin kreivikin, että illan hävitys oli ihmisten eikä Jumalan
toimeenpanema, ja aavisti, että noissa taloissa asuvat taikauskoiset
säikähtyneet raukat olivat tehneet tuo raukkamaisen teon ja
aiheuttaneet rikollisessa hulluudessaan tuon peloittavan
onnettomuuden, jonka estämisestä he nyt äreästi ja uhmaavasti
kokonaan kieltäytyivät.

Kylä näytti ensin omituisesti autiolta. Ainoan valtatien oikealla ja


vasemmalla puolella olevat pienet olkikattoiset talot olivat pimeät ja
hylätyn näköiset, ja ravintolakin näytti tyhjältä, sillä sen
puoliavoimista ovista ei kuulunut ainoatakaan ääntä. András hyppäsi
hevosensa selästä ja talutti sitä tietä pitkin pappilaan päin, sillä hän
toivoi saavansa isä Ambrosiuksen avukseen taivuttamaan
vastahakoisia talonpoikia. Hän ihmetteli sisimmässään, mistä se
johtui, ettei hän ollut kohdannut tuota ystävällistä vanhaa pappia
matkalla tulipalopaikalle ristineen ja sakramentteineen rukoilemaan
Jumalaa lopettamaan oikeutetun tuomionsa toimeenpanon.
Seuraavassa silmänräpäyksessä sai hän kumminkin selityksen
siihen, sillä saavuttuaan pappilaan huomasi hän suuren miesjoukon
ympäröineen sen kirjaimellisesti kokonaan. Toiset istuivat ja toiset
seisoivat, toiset tupakoivat vaitiollen äreännäköisinä ja toiset
keskustelivat vilkkaasti katsoessaan taivaanrannalta näkyvää
loimua.

Oli melko pimeä, sillä katuvalaistus ei ollut vielä tullut käytäntöön


Unkarin tasangoilla olevissa kylissä. Senvuoksi voi Andráskin
ainoastaan epäselvästi erottaa tämän tyytymättömien joukon ja
ymmärtää heidän tarkoituksensa, joka oli koonnut heidät kaikki isä
Ambrosiuksen asunnon edustalle. Sillä vaikka hän ei voinut
nähdäkään vanhaa pappia, kuuli hän kumminkin hänen äänensä,
kun hän puhui nähtävästi jostakin pappilan ikkunasta vakavasti
huomauttaen, saarnaten, varoittaen, toruen ja silloin tällöin kiihkeästi
pyytäen saadakseen mennä rukoilemaan kreivin puolesta, joka oli
joutunut niin suureen hätään. Hän uhkasi kieltää jokaiselta
synninpäästön ja lupasi julistaa pannaan koko kylän, ellei hän saanut
mennä täyttämään papillista velvollisuuttaan.

Kaikki jatkoivat kumminkin äreästi tupakoimistaan kuuntelematta


tuota ystävällistä ääntä, joka aina ennen oli valanut henkistä lohtua
heidän mieliinsä. He pysyivät itsepäisesti kuuroina kaikille rukouksille
päättäen jatkaa rikollista hulluuttaan julman päämääränsä
saavuttamiseksi.

»Älkää puhuko heille enää mitään, isä», sanoi äkkiä muudan ääni
pimeydestä. »He eivät ansaitse, että teidän ystävälliset silmänne
katselevat heidän ilkeitä kasvojaan sekuntiakaan enää».

András astui tyynesti heidän joukkoonsa, ja hänen tavallisesti niin


iloiset silmänsä katsoivat nyt halveksivasti ja vihaisesti noihin
miehiin, jotka olivat vaistomaisesti kääntyneet tuntiessaan ystävänsä
äänen.

»András!» huudahtivat kaikki hämmästyneinä.

»Olkaa vaiti»! sanoi hän ratkaisevasti, »sillä nimeni on liian hyvä


teidän lausuttavaksenne. Se on vielä kunniallisen miehen nimi, joka
voi likautua konnien suussa».

Seurasi painostava hiljaisuus. Miehet katselivat hämmästyneinä


toisiinsa otaksuen suosikkinsa tulleen hulluksi, sillä he eivät olleet
milloinkaan kuulleet hänen puhuvan näin.

»Konna on ilkeä sana, nuori mies», sanoi vanha Vas Berczi


uhkaavasti lähestyessään Andrásta.

»Niin onkin, mies, mutta ei puoleksikaan niin ilkeä kuin tuo synkkä
ja murhaava teko, jonka teidän rikolliset kätenne ovat panneet
toimeen tänä iltana. Peräytykää heti»! lisäsi hän, kun pari
talonpoikaa lähimmästä ryhmästä aikoi lähestyä häntä. »Kiellän teitä
puhumasta minulle, lähestymästä minua ja laskemasta kättänne
Csillagin lautasille, sillä teidän saastainen kosketuksenne voi sen
tappaa».

»Hän on tullut hulluksi», kuiskailivat miehet toisilleen. »Mitä hän


mahtanee tarkoittaakaan»? kysyi joku sitten, mutta kaikki peräytyivät
eikä kukaan uskaltanut puhua hänelle sanaakaan. Muutamat
katselivat pelästyneinä ruskeita kouriaan, joiden kosketus Andráksen
sanojen mukaan oli saastainen ja tappava.

»András!» kuului isä Ambrosiuksen rukoileva ääni pimeästä,


»sinähän voit ennen vaikuttaa heihin. Puhu nyt heille, poikani, ja

You might also like