[英]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 並使其性能更高。
我認為你應該使用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.