gpt4 book ai didi

javascript - ArangoDB 的哪些部分是用 Node-GYP 完成的

转载 作者:行者123 更新时间:2023-11-30 10:01:18 26 4
gpt4 key购买 nike

我正在弄清楚 ArangoDB 的结构,以确定它是否可以成为我的长期解决方案。

我的一个重要问题是,哪些部分是由 node-gyp(或 Node-Addon)制作的 - 查询构建器如何将 JavaScript 生成的 AQL 查询转换为与原生查询一样快?

我知道我自己也可以更深入地研究代码,但我认为如果一些核心开发人员能够回答这个问题(或解释他们如何向 JavaScript 和 AQL 公开功能)会更快。

我觉得很多人负责分析ArangoDB很有意思。 (我们的工作不是相信营销用语和基准……我们必须了解它是如何运作的)。

我的主要目标是以 JavaScript 开发人员的身份看待 ArangoDB。

最佳答案

ArangoDB 不是由 node 或 gyp 组成的。但是ArangoDB使用谷歌的V8 JavaScript引擎来执行JavaScript代码,和node.js一样。

这意味着您可以在 ArangoDB 中运行用户定义的 JavaScript 代码,并且它会被 V8 即时编译为 native 代码。 ArangoDB 自己的一些模块也是用 JavaScript 编写的。几个第三方 JavaScript 模块,包括一些由 node.js 和 npm 使用或编写的模块,也与 ArangoDB 捆绑在一起。

关于与 node.js 和 npm 模块的兼容性:

来自 node.js 和 npm 的模块也可以在 ArangoDB 中工作,只要它们不依赖 node.js 内部结构或来自其他模块的代码。这意味着所有仅是 JavaScript 且不需要任何 Node 特定内容的模块都应该在 ArangoDB 中工作。 joi是一个很好的例子。依赖于 node.js 特定对象或 node.js 的 C++ 扩展的 node.js/npm 模块将无法在 ArangoDB 中工作。

ArangoDB 本身是用 C++ 编写的,它的一些模块是用 JavaScript 编写的。通过 V8 包装器对象和函数,用户定义的 JavaScript 代码和捆绑的 ArangoDB JavaScript 模块可以访问 ArangoDB 的内部结构。这些函数是 C++ 函数,它们通过告诉 V8 它们存在来暴露给 JavaScript。

这是一个示例:ArangoDB 公开了一个名为 db 的 JavaScript 对象.这个对象有一些预定义的功能,例如_collection(<name>) .当这个函数被调用时,这将是对 C++ 函数的有效调用,然后它可以处理它的 (JavaScript) 参数,在这种情况下应该是一个集合名称字符串。在 C++ 函数内部,将查找指定名称的集合。如果未找到,该函数将返回一个 JavaScript null目的。如果找到,该函数将返回一个集合对象,包装在所谓的 V8 外部 中。对于 JavaScript 代码,这看起来像一个常规对象,但这个对象又具有一些 C++ 绑定(bind)。

为了让所有这些工作正常,服务器将注册 db对象在 V8 上下文中开始,并为所有对象的方法注册包装函数。它将对其他对象和函数执行此操作,因此服务器内部有一个完整的 JavaScript API。

AQL ,ArangoDB 的查询语言,是用 C++ 编写的,将按原样执行。然而,一些 AQL 函数和运算符是在 JavaScript 中实现的。如果 AQL 查询使用此类函数或运算符,将生成查询特定的 JavaScript 片段,使用 V8 即时编译并执行。此外,AQL 查询可以使用用户定义的 JavaScript 函数进行计算。这些函数是常规的 JavaScript 函数,必须在命令中注册它们才能在查询中使用。这些函数的调用如上,生成并执行一段动态JavaScript代码来调用用户定义的函数。

最后,ArangoDB's Foxx framework用 JavaScript 编写,允许在 ArangoDB 服务器中定义 HTTP 路由。这些路由背后的 Action 是用户定义的,可以通过上述方式访问服务器内部和数据库数据。

关于javascript - ArangoDB 的哪些部分是用 Node-GYP 完成的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31534200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com