如何判断哪个文件被Babel 6转发?

我有一个使用babel-register的项目,当在Node 6.6项目中需要该模块时,将ES6源代码dynamic地转换为ES5。 我已经阅读了babel-register钩子到Node的require函数中,以便在你尝试加载的时候传输一个文件,但是我并不总是清楚哪些文件会受到这个变化的影响。

当我编写testing的时候,这个问题对我来说有很大的帮助:只有我的生产代码能够被转译,或者testing代码是否被转译?这就引出了一个更一般的问题,这就是本文的主题:

我怎样才能知道何时Babel正在运行,哪些文件正在被转发?

示例代码

比方说,我有这样的生产类是用ES6语法编写的

 //src/greeter.js export default class Greeter { sayHello() { return 'Hello World'; } } 

而Babel被configuration为像这样( .babelrc

 { "presets": ["es2015"] } 

然后有一些testing代码

 //features/step_definitions/greeter_steps.js import Greeter from '../../src/greeter'; //Causes greeter.js to be transpiled import expect from 'expect'; var stepWrapper = function() { //Does Babel try to transpile this code too? this.Given(/^a greeter$/, function() { this.greeter = new Greeter(); }); this.When(/^I ask it for a general greeting$/, function() { this.greeting = this.greeter.sayHello(); }); this.Then(/^it should greet the entire world$/, function() { expect(this.greeting).toEqual('Hello World'); }); }; module.exports = stepWrapper; 

所有这些都在Node上运行

 cucumberjs --compiler js:babel-core/register 

示例代码在这里可用 ,如果这是有帮助的。

因为这个:

 cucumberjs --compiler js:babel-core/register 

… babel被调用您的testing和常规源代码。 请记住,在节点中,导入JS的唯一方法是通过require ,所以显然babel-register将始终被调用。 当然,babel的configuration取决于它的configuration,但很可能你有一个简单的configuration,除了node_modules下的所有需要​​的文件require将被转发。

我做了一个破解node_modules/babel-register/lib/node.js来做一些这样的日志logging

 function compile(filename) { var result = void 0; var opts = new _babelCore.OptionManager().init((0, _extend2.default)({ sourceRoot: _path2.default.dirname(filename) }, (0, _cloneDeep2.default)(transformOpts), { filename: filename })); var cacheKey = (0, _stringify2.default)(opts) + ":" + babel.version; var env = process.env.BABEL_ENV || process.env.NODE_ENV; console.log('[babel-register::compile] filename=' + filename + '\n'); //Added logging here if (env) cacheKey += ":" + env; if (cache) { var cached = cache[cacheKey]; if (cached && cached.mtime === mtime(filename)) { result = cached; } } ... } 

然后报告testing和生产代码至less在一定程度上通过了Babel

 $ npm t > cucumber-js-babel@1.0.0 test /Users/krull/git/sandbox/node/cucumber-js-babel > cucumberjs --compiler js:babel-core/register [babel-register::compile] filename=.../node/cucumber-js-babel/features/step_definitions/greeter_steps.js [babel-register::compile] filename=.../node/cucumber-js-babel/src/greeter.js ...test results... 

不过,我希望有一个更好的解决scheme

  • 通过一些插件和/或configuration的手段,而不是猴子修补
  • 更好地区分哪些文件实际上正在被转发,哪些文件没有修改就通过了巴贝尔