在ES6模块中处理process.on('uncaughtException')

时间:2018-02-27 15:27:58

标签: javascript module ecmascript-6

我在ES6模块中有一个奇怪的行为:

index.mjs

process.on('uncaughtException', err => {
  console.log('Oh no!');
  process.exit(1);
});

import mod from './module.mjs';

module.mjs

export default 'foo';
throw new Error('I am broken');

我希望在运行babel-node index.mjsnode --experimental-modules index.mjs时执行 uncaughtException 处理程序,但事实并非如此。这将返回:

throw new Error('I am broken');
^

Error: I am broken
    at Object.<anonymous> (mod.mjs:2:7)
    ...

使用好的旧CommonJS模块,它可以工作:

index.js

process.on('uncaughtException', err => {
  console.log('Oh no!');
  process.exit(1);
});

const mod = require('./module.js');

module.js

module.exports = 'foo';
throw new Error('I am broken');

node index.js返回:

Oh no!

这让我很困惑。这是设计,如果是这样, uncaughtException 处理程序如何与ES6模块一起使用?任何想法都赞赏!

1 个答案:

答案 0 :(得分:1)

静态解析ES6导入,并在模块中的任何代码运行之前加载(并执行)依赖项。使用CommonJS模块,只有在您调用require时才会发生。

如果一个模块破坏了加载它会抛出异常,那么依赖它的其他模块也不会运行。这几乎是设计上的。

但是,您可以使用dynamic imports并处理错误:

// index.mjs:
import('./module.mjs').then(mod => {
   …
}, err => {
  console.log('Oh no!');
  process.exit(1);
});