我有一个项目,当在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,如果有帮助的话。
答案 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...
但是,我希望有更好的解决方案