Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Node.js更好地要求.extensions_Node.js_Reactjs_Mocha.js - Fatal编程技术网

使用Node.js更好地要求.extensions

使用Node.js更好地要求.extensions,node.js,reactjs,mocha.js,Node.js,Reactjs,Mocha.js,我正在测试一堆React JSX组件。它们都需要用React、Babel或其他什么工具进行传输,但是我们对存根需求有特殊的需求,所以我尝试用一个用Mocha运行的特殊编译器来覆盖requires。下面的解决方案运行良好,但您会注意到,我们使用require.extensions[]捕获所有.jsx文件。我关心的是require.extensions被锁定并且不推荐使用。有没有更好的办法 // Install the compiler. require.extensions['.jsx'] = f

我正在测试一堆React JSX组件。它们都需要用React、Babel或其他什么工具进行传输,但是我们对存根需求有特殊的需求,所以我尝试用一个用Mocha运行的特殊编译器来覆盖requires。下面的解决方案运行良好,但您会注意到,我们使用
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/Khan/react-components/blob/master/test/compiler.js
var fs=require('fs'),
react-tools=需要(“react-tools”);
//导出单个断开的组件的模块。
var reactStub='module.exports=require(“react”).createClass({render:function(){return null;}}});';
//是否应将此文件存根以供测试?
函数shouldStub(文件名){
如果(!global.reactModulesToub)返回false;
//检查文件名是否以任何存根路径结尾。
var stubs=global.reactModulesToub;
对于(变量i=0;i
还有一些指向simalar解决方案的链接

从这里可以找到解决方案:

我用来存根测试中的所有
.scss
调用

您将从文档中看到,当需要匹配的文件时,它将执行包含的字符串,并且非常强大,因为它还会传递原始源代码


希望这就是你想要的。

没有其他方法可以做到这一点,这就是每个人都是如何进行传输的(巴贝尔等)@uni_nake的答案——使用节点钩子——是可以的,因为它对您隐藏了这一点,但它本质上使用了相同的机制:查看它的代码表明它使用了模块。_扩展,但这与require.extensions相同,如我编写的一个测试所示:


所以最后的答案是——我假设节点上没有人会打破巴别塔,如果他们打破了,他们可能会为同样的问题给出另一个解决方案。我会毫不犹豫地使用它

API被弃用的原因有两个。首先,节点模块解析算法非常复杂,它必须查看指定的文件,如果它不存在,它将查找该文件以及
require.extensions
键中所有可能的扩展名,如果是目录,则查找package.json或index.js。哦,别忘了,如果一开始没有
/
,它会在node\u modules目录中查找,如果在
node\u modules
中找不到父目录,它会在父目录中查找。Ryan Dahl说,他对在中使其变得如此复杂感到遗憾,并在他的项目中使用了一种更简单的模块解析算法。第二,如果require.extensions中有更多的扩展名,它需要更多的文件系统调用,因为它必须匹配无扩展文件

第二个问题的解决方案是。我自己没有使用过它,但它抽象了require.extensions API,使其性能更高。

我认为您应该使用它

我认为将
require.extensions
用于
babel register
的PR替换为
pirates
会有所帮助


希望这就是您想要的。

从我们在github上的讨论中继续,请参阅关于这个确切问题的此线程-我的理解是,如果您想像上面那样直接加载传输的js,没有其他选择。希望我能从文档中得到纠正:)由于模块系统被锁定,这个功能可能永远不会消失。此外,上述文档链接不再有效。从我在代码
require中看到的情况来看,您可以将其替换为。扩展名在任何地方都不使用。仅限
模块。_扩展名
:<代码>require.extensions
可能只是一个引用,如果您给它一个新对象(而不是直接操作它),它将被忽略。