【发布时间】:2015-05-07 04:58:51
【问题描述】:
我正在测试一堆 React JSX 组件。它们都需要使用 React 或 Babel 或其他任何东西进行转译,但我们对存根要求有特殊需求,所以我尝试使用与 Mocha 一起运行的特殊编译器来覆盖要求。下面的解决方案运行良好,但您会注意到我们使用require.extensions[] 来捕获所有.jsx 文件。我担心的是 require.extensions 被锁定和弃用。有没有更好的方法来做到这一点?
// Install the compiler.
require.extensions['.jsx'] = function(module, filename) {
return module._compile(transform(filename), filename);
};
这是整个转译器供参考:
// Based on https://github.com/Khan/react-components/blob/master/test/compiler.js
var fs = require('fs'),
ReactTools = require('react-tools');
// A module that exports a single, stubbed-out React Component.
var reactStub = 'module.exports = require("react").createClass({render:function(){return null;}});';
// Should this file be stubbed out for testing?
function shouldStub(filename) {
if (!global.reactModulesToStub) return false;
// Check if the file name ends with any stub path.
var stubs = global.reactModulesToStub;
for (var i = 0; i < stubs.length; i++) {
if (filename.substr(-stubs[i].length) == stubs[i]) {
console.log('should stub', filename);
return true;
}
}
return false;
}
// Transform a file via JSX/Harmony or stubbing.
function transform(filename) {
if (shouldStub(filename)) {
delete require.cache[filename];
return reactStub;
} else {
var content = fs.readFileSync(filename, 'utf8');
return ReactTools.transform(content, {harmony: true});
}
}
// Install the compiler.
require.extensions['.jsx'] = function(module, filename) {
return module._compile(transform(filename), filename);
};
还有一些类似解决方案的链接...
- https://github.com/danvk/mocha-react/issues/1
- https://github.com/Automattic/jsx-require-extension
- https://www.npmjs.com/package/node-jsx
- https://github.com/olalonde/better-require
- http://mochajs.org/#usage
- http://nodejs.org/api/globals.html#globals_require_extensions
可以从这里派生一个解决方案: https://github.com/danvk/mocha-react
【问题讨论】:
-
继我们在 github 上的讨论之后,请参阅关于这个确切问题的线程 - groups.google.com/forum/#!searchin/nodejs/require.extensions/… 我的理解是,如果你想像你一样直接加载转译的 js,没有其他选择更多。希望我会得到纠正:)
-
来自文档:“由于模块系统被锁定,此功能可能永远不会消失”。此外,上述文档链接不再有效。您可以将其替换为nodejs.org/api/modules.html#modules_require_extensions。