cluster.on 上使用 babel 的 ES6 和 ES2016 之间的不同行为
Different behavior between ES6 and ES2016 using babel on cluster.on
我正在尝试使用集群来利用拥有多核 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
这看起来很奇怪。我正在使用节点 v6.4.0
,使用 babel 6.11.4 (babel-core 6.13.2)
,.babelrc
的内容是:
{
"presets": ["es2016", "es2015"]
}
知道发生了什么吗?
好的,我找到原因了,ref:
重点是把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] }
require('babel-core/register')({
presets: ['node6']
});
const app = require('./test.js');
app();
将您的代码保存在 test.js 中,看看神奇的东西
对我来说,我通过解构我从集群中需要的东西,一个一个地导入,它起作用了:
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`));
}
我正在尝试使用集群来利用拥有多核 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
这看起来很奇怪。我正在使用节点 v6.4.0
,使用 babel 6.11.4 (babel-core 6.13.2)
,.babelrc
的内容是:
{
"presets": ["es2016", "es2015"]
}
知道发生了什么吗?
好的,我找到原因了,ref:
重点是把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] }
require('babel-core/register')({
presets: ['node6']
});
const app = require('./test.js');
app();
将您的代码保存在 test.js 中,看看神奇的东西
对我来说,我通过解构我从集群中需要的东西,一个一个地导入,它起作用了:
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`));
}