首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于nodejs,共享依赖关系的本地模块的最佳设计实践是什么?

问对于nodejs,共享依赖关系的本地模块的最佳设计实践是什么?
EN

Software Engineering用户
提问于 2012-06-14 09:43:54
回答 2查看 1K关注 0票数 1

假设情况下,我有3个节点模块,它们都是本机的,A、B和C。

  • A是一个实用程序模块,它通过节点接口向javascript公开多个函数,此外,它还声明/定义了一组丰富的本机结构和函数。
  • B是一个依赖于A中数据结构和源的模块,它向javascript公开一些函数,并声明/定义本机结构和函数
  • C是一个依赖于A& B中的数据结构和源的模块,它解释了javascript的一些功能,并声明/定义了本机结构和函数。

到目前为止,当设置这些模块时,我有一个预装脚本来安装其他相关的包含,但是为了访问所有其他模块的源代码,链接到它的共享库对象(*.node)的最佳方法是什么?

对于本机模块是否有其他最佳实践(例如在构建单个模块之前从其他模块安装所有源)?回复

EN

回答 2

Software Engineering用户

发布于 2012-06-25 22:58:04

基本上有两种方法可以做到这一点。哪一个适合你,取决于你想要完成什么。

  1. 案例1: A、B和C是松散相关的,也就是说,如果B可以在没有A和C的情况下使用。有A和/或C可用将扩展B的功能。
  2. 案例2: A、B和C是紧密相关的,A、B或C的某些部分依赖于A、B或C的存在,它们共同构成一个逻辑单元。

如果案例1符合您的项目的目的,那么您希望构建单独的节点模块,让最终用户拉入这些模块并随意使用它们。

如果案例2更适合,那么您希望将A、B和C编译成一个模块,例如ABC。您仍然可以根据A、B和C构造ABC模块的源代码(和导出的API)。

构建三个独立的模块并动态地将它们连接起来没有什么意义。事实上,在节点地导入(require'd)时,它们是动态链接的(通过节点)。静态地将它们连接在一起可能更有意义,总线本质上只是实现“解决方案2”(生成单个模块)的一种比较混乱的方式。

编辑:

如果A、B和C是未由您编写的三个模块,那么您将处理一个层次结构。正如你在你的假设中解释的那样,依赖的层次是:

代码语言:javascript
复制
B --requires--> A
C --requires--> B
C --requires--> A

因此,A可以是B的“所有者”,B可以是C的所有者。如果您的作者是C,那么在JavaScript中提供一个面向用户的API,其中您可以require这三个模块。将A、B和C编译为单独的模块,并让它们“活在”复合模块中。文件系统结构可以如下所示:

代码语言:javascript
复制
foo/          # Your compound module
foo/index.js  # require('./_A'), require('./_B'), require('./_C')
foo/_A.node
foo/_B.node
foo/_C.node

由于_C.node中的代码需要实现某些符号(即来自A和B的依赖符号),因此需要按顺序加载模块。

请注意,我还没有测试过这一点,但理论上来说,这应该是可行的。

票数 1
EN

Software Engineering用户

发布于 2012-06-27 14:12:30

在rsms的提示下,我想分享我现在正在使用的体系结构,这个架构最初是应答/共享的在这里堆叠溢出。

创建其他节点模块可以依赖的通用本机源代码包的最佳方法是什么?

...I确实有一个构建可重用库的答案,witlinh本机节点模块。

我对所有独立的本机节点模块使用git子模块,并为每个wscript或binding.gyp文件添加了一个条件预处理器定义,以指定是否生成共享对象.node模块。

此外,我将使用这个新包来帮助调试或重写代码部分(我不能花太多时间调试几个远程库)。

在wscript或binding.gyp中

代码语言:javascript
复制
  flags = ['-D_NAME_NODE_MODULE', '-O3', '-Wall', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE', '-msse2']

然后在初始化文件中

代码语言:javascript
复制
#ifdef _NAME_NODE_MODULE

extern "C" {
  static void init(Handle<Object> target) {
    HandleScope scope;
    NODE_SET_METHOD(target, "someFunction", someFunction);
  }

  NODE_MODULE(moduleName, init);
}

#endif

这样,节点本机模块只能在设置标志时添加到节点本机模块。否则,它可以正常地链接到(就像在另一个节点模块中)。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/152871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档