合并两个或多个node.js要求模块进入一个名称空间

时间:2018-10-04 14:43:15

标签: node.js

Google Flatbuffers在(AMD?)模块中为每个所需的表创建一个。我将它们全部放在一个名为PNTCI的名称空间中。

现在,通过对PNTCI命名空间进行连续的包含,我正在做一些丑陋的操作,将名称空间合并在一起:

const telem = require('../messages/Telemetry_generated').PNTCI
const PNTCI = Object.assign(telem, require('../messages/header_generated').PNTCI)

再次的原因是,自动生成的require模块具有一种过时的格式,对于Header_genic.js来说,如下所示:

// automatically generated by the FlatBuffers compiler, do not modify

/**
 * @const
 * @namespace
 */
var PNTCI = PNTCI || {};

/**
 * Common header for all PNTCI message payloads
 *
 * @constructor
 */

文件的结尾看起来像这样:

/**
 * @param {flatbuffers.Builder} builder
 * @param {flatbuffers.Offset} offset
 */
PNTCI.Header.finishHeaderBuffer = function(builder, offset) {
  builder.finish(offset);
};

// Exports for Node.js and RequireJS
this.PNTCI = PNTCI;

以及Telemetry_genic.js

// automatically generated by the FlatBuffers compiler, do not modify

/**
 * @const
 * @namespace
 */
var PNTCI = PNTCI || {};

/**
 * @constructor
 */
PNTCI.PosVector = function() {
  /**
   * @type {flatbuffers.ByteBuffer}
   */
  this.bb = null;

,然后文件结尾看起来像这样:

PNTCI.Telemetry.finishTelemetryBuffer = function(builder, offset) {
  builder.finish(offset);
};

// Exports for Node.js and RequireJS
this.PNTCI = PNTCI;

1 个答案:

答案 0 :(得分:1)

Node.js并不习惯使用名称空间,因为模块本身充当名称空间,因此问题仅针对这些特定模块。

可以使用对象传播语法将其写得更短:

const PNTCI = {
  ...require('../messages/Telemetry_generated').PNTCI,
  ...require('../messages/header_generated').PNTCI
};

哪种语法糖适用于:

const PNTCI = Object.assign({},
  require('../messages/Telemetry_generated').PNTCI,
  require('../messages/header_generated').PNTCI
);

如果这些模块经常一起使用,则将它们重新导出为单个模块可能会有所帮助:

module.exports = {
  ...require('../messages/Telemetry_generated').PNTCI,
  ...require('../messages/header_generated').PNTCI
};

由于通常在Node中不需要名称空间,因此可能不需要在单个PNTCI变量下合并模块;模块可以分别导入到不同的变量中。如果仅在某些地方使用这些模块中的某些模块,则使应用程序更具模块化。