如何判断哪个文件被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的手段,而不是猴子修补
- 更好地区分哪些文件实际上正在被转发,哪些文件没有修改就通过了巴贝尔