Различное поведение между ES6 и ES2016 с использованием babel на cluster.on

Я пытаюсь использовать кластер, чтобы использовать преимущества многоядерных процессоров. С кодом:

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

Это выглядит странно. Я использую узел v6.4.0, с babel 6.11.4 (babel-core 6.13.2), содержимое .babelrc:

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

Есть идеи, что случилось?


person xis    schedule 23.08.2016    source источник


Ответы (3)


Хорошо, я понял причину, ссылка: Разница между импортом X и импортом * as X в 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] }
person xis    schedule 23.08.2016

Сформировав меня, я импортировал один за другим, разрушив то, что мне нужно, из кластера, и это сработало:

import { fork, on, isMaster } from 'cluster';

потом

   if (isMaster) {
      console.log(`Forking ${numWorkers} workers`);
      const workers = [...Array(numWorkers)].map(_ => fork());

      on('online', worker => console.log(`Worker ${worker.process.pid} is online`));
}
person Dani    schedule 28.10.2020

require('babel-core/register')({
  presets: ['node6']
});

const app = require('./test.js');
app();

Сохраните свой код в test.js и посмотрите на волшебство

person evalsocket    schedule 16.03.2017
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person morten.c; 16.03.2017