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

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

我看到的问题是 vert.x 不会正确加载 nodejs native 模块。例如,Vert.x 在这个 require 上窒息:

var fs = require("fs");

经过一番搜索,我找到了 vert.x 等价物:
var fs = require("vertx-js/file_system");

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

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

我可以推出自己的解决方案。除了作为最后的手段,我真的不想 sed/replace node_module 源。我想到的唯一另一种选择是创建一个抽象目录,并在 NODE_PATH 的头部插入该目录名。这个解决方案似乎可行,但正如我所提到的,我是 vert.x 菜鸟,所以我无法预见这种方法存在哪些陷阱。

vert.x 是否支持用于运行 nodejs 应用程序的 shim 层?

最佳答案

短版 TLDR :



长版 :

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

另外你应该知道 JavaScript 语言版本也不一样,例如 Node 依赖于 V8,它现在非常接近完全支持 ECMA2015 或简称 ES6,Vert.x 作为在 JVM 上运行的框架依赖于 Nashorn( JDK 本身的 JavaScript 运行时),它仍然在 ES5 上。

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

有一些方法可以充分利用 NPM 和 Vert.x,一种选择是使用 100% ES6 并使用诸如 Babel 之类的转译器转译回 ES5,这将在 Node 和 Vert.x 上运行良好(直到现在您使用 native 模块)。

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

关于javascript - 如何在 vert.x 中运行 node.js 应用程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38106528/

10-10 15:38