如何判断Babel 6正在编译哪些文件?

时间:2016-10-01 17:21:18

标签: javascript node.js babeljs cucumberjs babel-register

我有一个项目,当在Node 6.6项目中需要该模块时,使用babel-register动态地将ES6源转换为ES5。我已经阅读了babel-register hooks into Node's require函数,以便在您尝试加载文件时转换文件,但我并不总是清楚哪些文件会受到该更改的影响。

当我编写测试时,这个问题对我来说很多:只是我的生产代码被编译,或者测试代码是否也被编译?这让我想到了更一般的问题,这就是主题这篇文章:

如何判断Babel实际运行的时间以及正在编译哪些文件?

示例代码

让我们说我有这样的生产类,用ES6语法编写

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

和Babel配置为如此转换(.babelrc

{
  "presets": ["es2015"]
}

然后有一些测试代码

//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

Example code is available here,如果有帮助的话。

2 个答案:

答案 0 :(得分:1)

因此:

cucumberjs --compiler js:babel-core/register

...为您的测试和常规源代码调用babel。请记住,在节点中,导入JS的唯一方法是require,因此显然会始终调用babel-register。当然,babel的作用取决于它的配置,但很可能你有一个简单的配置,require所需的所有文件除了node_modules下的文件都将被编译。

答案 1 :(得分:0)

我对node_modules/babel-register/lib/node.js进行了一次黑客攻击,以便像这样进行日志记录

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;
    }
  }
  ...
}

然后报告测试和生产代码至少在某种程度上通过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...

但是,我希望有更好的解决方案

  • 通过某些插件和/或配置工作,而不是猴子修补
  • 更好地区分哪些文件实际被转换,以及哪些文件无需修改即可通过Babel