4m1*_*m1r 20 mocha.js node.js reactjs
我正在测试一堆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);
};
Run Code Online (Sandbox Code Playgroud)
以下是整个转录器供参考:
// 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);
};
Run Code Online (Sandbox Code Playgroud)
以及simalar解决方案的一些链接......
解决方案可以从这里分叉:https: //github.com/danvk/mocha-react
API 被弃用的原因有两个。一,节点模块解析算法非常复杂,它必须查看指定的文件,如果不存在,则查找该文件以及 的键中的所有可能的扩展名require.extensions,如果是目录,则查找package.json 或index.js。哦,别忘了,如果开头没有./,它会在node_modules目录中查找,如果在该目录中找不到,则查找父目录node_modules。Ryan Dahl 表示,他很遗憾在JsConf 2018 的演讲中将其弄得如此复杂,并在他的deno项目中使用了更简单的模块解析算法。第二,如果 require.extensions 中有更多扩展名,则需要更多文件系统调用,因为它必须匹配无扩展名文件。
第二个问题的解决方案是require-extension。我自己没有使用过它,但它抽象了 require.extensions API 并使其性能更高。
小智 5
没有其他方法可以做到这一点,这就是每个人进行转译的方式(babel 等)。@uni_nake 的答案 - 使用 node-hook - 是可以的,因为它向您隐藏了这一点,但它本质上使用相同的机制:查看它的代码显示它使用 Module._extensions,但这与 require.extensions 相同,如我编写的测试所示: https: //github.com/giltayar/playing/blob/1f04f6ddc1a0028974b403b4d1974afa872edba4/javascript/node/test/is-module-extensions-same-as-require-extensions.test.js
所以最终的答案 - 我假设 Node 中没有人会破坏 Babel,如果他们这样做,他们可能会为同一问题提供另一种解决方案。我会毫不犹豫地使用它!
| 归档时间: |
|
| 查看次数: |
5969 次 |
| 最近记录: |