如何在 vert.x 中 运行 一个 node.js 应用程序?

How to run a node.js application in vert.x?

我是 vert.x 的新手,我想看看是否可以在 vert.x 中启动现有的 nodejs 应用程序。按照 http://vertx.io/blog/vert-x3-says-hello-to-npm-users/ 的说明,我使用 npm 安装了 vert.x。我可以 运行 一个简单的 hello-world 应用程序,但 运行 证明我们现有的应用程序有点具有挑战性。我发现的所有 vert.x 文档都在谈论编写新应用程序,而不是移植现有代码。

哦,相同的代码库需要在现有的 nodejs 系统上继续 运行ning。

我看到的问题是 vert.x 无法正确加载 nodejs 本机模块。例如,Vert.x 被这个 require:

噎住了
var fs = require("fs");

经过一番搜索,我找到了 vert.x 等价物:

var fs = require("vertx-js/file_system");

也许我们可以创建一个 shim/abstraction 层来包裹差异。我为文件系统 API 快速做了一个,它似乎加载正确。看起来编写一个完整的抽象层将是一项相当大的工作。但它似乎可以解决我们源代码中使用的 APIs 的兼容性问题。

真正麻烦的是如何拦截node_modules目录下的所有require语句。这些模块也将需要许多其他本机 APIs,例如文件系统。这似乎是其他人可能已经遇到并已经解决的问题。最好不要重新发明轮子。

我可以推出自己的解决方案。除非万不得已,否则我真的不想 sed/replace node_module 来源。我想到的唯一其他选择是创建一个抽象目录,然后将该目录名称插入 NODE_PATH 的开头。这个解决方案似乎可行,但正如我提到的,我是一个 vert.x 菜鸟,所以我无法预见这种方法存在哪些类型的陷阱。

vert.x 是否支持 运行ning nodejs 应用程序的填充层?

短版 TLDR:

You can't!

长版:

Vert.x 不是 Node.JS 替换或 运行 时间。尽管有很多相似之处和共同的设计选择,例如对 CommonJS 模块的支持和对 NPM 的支持,但本机库不存在。 Vert.x 中的所有 I/O 操作都是使用 Vert.x API 完成的,它们并不总是与节点计数器部分相关。

你还应该知道 JavaScript 语言版本也不一样,例如 Node 依赖于 V8 现在非常接近完全支持 ECMA2015ES6简而言之,Vert.x 作为 JVM 上的框架 运行ning 依赖于 Nashorn(来自 JDK 本身的 JavaScript 运行 时间)仍在 ES5.

在 Vert.x 中支持 NPM 的想法不是模仿 Node,而是允许使用它的许多模块(不依赖于 Node 原生模块)。出于这个原因,documentation 上有一个警告。不过估计不清楚。

有一些方法可以充分利用 NPM 和 Vert.x,一种选择是使用 100% ES6 并使用 Babel 等转译器转译回 ES5,这将 运行 使用 Node 和 Vert.x 都很好(直到你使用本机模块的那一刻)。

如果您必须使用 Node,假设您已经在 Node 上构建了一个应用程序并且端口不值得(就 resouces/time/etc 而言)那么我建议查看 tcp eventbus bridge.此桥将允许您现有的应用程序生成和使用现有 vert.x 应用程序集群的消息。