簡體   English   中英

使用 Node.js 使用 require.extensions 的更好方法

[英]Better way to require.extensions with Node.js

我正在測試一堆 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

沒有其他方法可以做到這一點,這就是每個人進行轉譯(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,如果他們這樣做,他們可能會為同一問題提供另一種解決方案。 我會毫不猶豫地使用它!

API 已被棄用有兩個原因。 一,節點模塊解析算法非常復雜,它必須查看指定的文件,如果它不存在,它會在require.extensions的鍵中查找該文件和所有可能的擴展名,如果它是一個目錄,尋找 package.json 或 index.js。 哦,不要忘了,如果沒有./開頭,它會在node_modules目錄,看着父目錄,如果它不能在找到node_modules Ryan Dahl 說他很遺憾在 JsConf 2018 的演講中把它弄得如此復雜,並在他的deno項目中使用了更簡單的模塊解析算法。 第二,如果 require.extensions 中有更多擴展名,則需要更多的文件系統調用,因為它必須匹配無擴展名的文件。

第二個問題的解決方案是require-extension 我自己沒有使用過它,但它抽象了 require.extensions API 並使其性能更高。

我使用node-hook在我的測試中存根所有.scss調用。

您將從文檔中看到,當需要匹配文件時,它將執行包含字符串,並且非常強大,因為它還向您傳遞原始源代碼。

希望這就是你要找的。

我認為你應該使用pirates

我認為將babel-register使用的require.extensions替換為pirates時的 PR 會有所幫助。

https://github.com/babel/babel/pull/3670/files#diff-75a0292ed78043766c2d5564edd84ad2L85-L93

希望這就是你要找的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM