javascript - 在 cluster.on 上使用 babel 在 ES6 和 ES2016 之间的不同行为

标签 javascript ecmascript-6 ecmascript-2016

我正在尝试使用集群来利用拥有多核 CPU 的优势。使用代码:

var cluster = require('cluster');

if (cluster.isMaster) {
    for(var i = 0; i < 2; ++i) {
        cluster.fork();
    }
    cluster.on('exit', function (worker) {
        console.log('Worker ' + worker.process.pid + ' exitted.');
    });
} else {
    console.log('Worker ' + cluster.worker.process.pid);
    process.exit(0);
}

节点与输出完美配合

Worker 14058
Worker 14064
Worker 14058 exitted.
Worker 14064 exitted.

但是,当我尝试将 import 与 babel 一起使用时,我遇到了问题:

import *  as cluster from 'cluster'

if (cluster.isMaster) {
    for(let i = 0; i < 2; ++i) {
        cluster.fork();
    }
    cluster.on('exit', (worker) => console.log('Worker ' + worker.process.pid + ' exitted.'));
} else {
    console.log('Worker ' + cluster.worker.process.pid);
    process.exit(0);
}

节点的输出(在 babel 之后)是:

2.js:13
    cluster.on('exit', function (worker) {
            ^

TypeError: cluster.on is not a function
    at Object.<anonymous> (2.js:13:13)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:509:3
Worker 14140
Worker 14146

这看起来很奇怪。我正在使用node v6.4.0,babel 6.11.4 (babel-core 6.13.2).babelrc的内容是:

{
  "presets": ["es2016", "es2015"]
}

知道发生了什么吗?

最佳答案

好的,我找到原因了,引用:Difference between import X and import * as X in node.js (ES6 / Babel)?

重点是将 import * as cluster from 'cluster' 更改为 import cluster from 'cluster'

使用 import * as cluster from 'cluster',所有可导出的内容都被导出到名称为 cluster 的对象中,它具有以下结构:

{ domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  Worker: 
   { [Function: Worker]
     super_: 
      { [Function: EventEmitter]
        EventEmitter: [Circular],
        usingDomains: false,
        defaultMaxListeners: 10,
        init: [Function],
        listenerCount: [Function] } },
  isWorker: false,
  isMaster: true,
  workers: {},
  settings: {},
  schedulingPolicy: 2,
  SCHED_NONE: 1,
  SCHED_RR: 2,
  setupMaster: [Function],
  fork: [Function],
  disconnect: [Function],
  default: 
   EventEmitter {
     domain: null,
     _events: {},
     _eventsCount: 0,
     _maxListeners: undefined,
     Worker: { [Function: Worker] super_: [Object] },
     isWorker: false,
     isMaster: true,
     workers: {},
     settings: {},
     schedulingPolicy: 2,
     SCHED_NONE: 1,
     SCHED_RR: 2,
     setupMaster: [Function],
     fork: [Function],
     disconnect: [Function] } }

另一方面,当 import cluster from 'cluster' 时,cluster 对象是默认导出:

EventEmitter {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  Worker: 
   { [Function: Worker]
     super_: 
      { [Function: EventEmitter]
        EventEmitter: [Circular],
        usingDomains: false,
        defaultMaxListeners: 10,
        init: [Function],
        listenerCount: [Function] } },
  isWorker: false,
  isMaster: true,
  workers: {},
  settings: {},
  schedulingPolicy: 2,
  SCHED_NONE: 1,
  SCHED_RR: 2,
  setupMaster: [Function],
  fork: [Function],
  disconnect: [Function] }

关于javascript - 在 cluster.on 上使用 babel 在 ES6 和 ES2016 之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39094301/

相关文章:

javascript - 如何突出显示从当天起的每 7 天?

javascript - Function.prototype.toMethod() 是做什么的?

npm - 谁能解释一下 es7 反射元数据是什么?

javascript - 预期未定义等于 'computers'

javascript - RxJS - 如何映射/切换 Subject Observable 并为每个发射值添加平均计算?

javascript - 在angularjs中动态添加新表单

javascript - const vs var 和 window.name 属性

javascript - 在reduce函数中使用函数参数: Javascript

javascript - ES7 中执行字符串对象的对象合并的最快方法是什么?

javascript - IE 不支持 Array includes 或 String includes 方法