将两个或多个 Node.js require 模块合并到一个命名空间中

Dr.*_*YSG 3 node.js

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

现在,我正在做一些丑陋且不直观的事情,通过对 PNTCI 命名空间进行连续包含,将命名空间合并在一起,如下所示:

const telem = require('../messages/Telemetry_generated').PNTCI
const PNTCI = Object.assign(telem, require('../messages/header_generated').PNTCI)
Run Code Online (Sandbox Code Playgroud)

另一个原因是自动生成的 require 模块具有老式格式,对于 Header_ generated.js 如下所示:

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

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

/**
 * Common header for all PNTCI message payloads
 *
 * @constructor
 */
Run Code Online (Sandbox Code Playgroud)

文件末尾如下所示:

/**
 * @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;
Run Code Online (Sandbox Code Playgroud)

对于 Telemetry_ generated.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;
Run Code Online (Sandbox Code Playgroud)

然后文件的末尾看起来像这样:

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

// Exports for Node.js and RequireJS
this.PNTCI = PNTCI;
Run Code Online (Sandbox Code Playgroud)

Est*_*ask 5

命名空间的使用对于 Node.js 来说并不惯用,因为模块本身充当命名空间,因此问题特定于这些特定模块。

可以使用对象扩展语法将其写得更短:

const PNTCI = {
  ...require('../messages/Telemetry_generated').PNTCI,
  ...require('../messages/header_generated').PNTCI
};
Run Code Online (Sandbox Code Playgroud)

这是语法糖:

const PNTCI = Object.assign({},
  require('../messages/Telemetry_generated').PNTCI,
  require('../messages/header_generated').PNTCI
);
Run Code Online (Sandbox Code Playgroud)

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

module.exports = {
  ...require('../messages/Telemetry_generated').PNTCI,
  ...require('../messages/header_generated').PNTCI
};
Run Code Online (Sandbox Code Playgroud)

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