2015-03-05 5 views
14

के साथ एक्सटेंशन मैं प्रतिक्रिया जेएसएक्स घटकों का एक समूह का परीक्षण कर रहा हूं। उन्हें सभी को प्रतिक्रिया, या बेबेल या जो भी हो, के साथ पारदर्शी होने की आवश्यकता है, लेकिन हमारे पास आवश्यकताओं को रोकने के लिए विशेष आवश्यकताएं हैं, इसलिए मैं मोचा के साथ चलने वाले विशेष कंपाइलर के साथ ओवरराइड करने की कोशिश कर रहा हूं। नीचे दिया गया समाधान अच्छी तरह से काम करता है, लेकिन आप देखेंगे कि हम सभी .jsx फ़ाइलों को कैप्चर करने के लिए require.extensions [] का उपयोग कर रहे हैं। मुझे क्या चिंता है कि आवश्यकता है। एक्सटेंशन लॉक और बहिष्कृत है। क्या ऐसा करने का कोई बेहतर तरीका है?आवश्यकता के लिए बेहतर तरीका। Node.js

// Install the compiler. 
require.extensions['.jsx'] = function(module, filename) { 
    return module._compile(transform(filename), filename); 
}; 

यहाँ संदर्भ के लिए पूरे transpiler है:

// 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); 
}; 

और कुछ लिंक समाधान simalar करने के लिए ...

एक समाधान यहाँ से अलग किया जा सकता है: https://github.com/danvk/mocha-react

+1

गीथब पर हमारी चर्चा के बाद, इस सटीक मुद्दे के बारे में इस धागे को देखें - https://groups.google.com/forum/#!searchin/nodejs/require.extensions/nodejs/QsOEWvptQpA/G6xYTm52N60J यह मेरी समझ है यदि आप ऊपर की तरह लाइन में सीधे पारदर्शी जेएस लोड करना चाहते हैं तो कोई दूसरा विकल्प नहीं है। उम्मीद है कि मुझे सही किया जाएगा :) –

+0

दस्तावेज़ों से: "चूंकि मॉड्यूल सिस्टम लॉक है, यह सुविधा शायद कभी नहीं चली जाएगी"। साथ ही, उपर्युक्त दस्तावेज लिंक अब मान्य नहीं है। आप इसे https://nodejs.org/api/modules.html#modules_require_extensions के साथ प्रतिस्थापित कर सकते हैं। –

उत्तर

0

मैं node-hook का उपयोग अपने परीक्षण में सभी .scss कॉल ठूंठ।

आप दस्तावेज़ों से देखेंगे कि जब एक मेल खाने वाली फ़ाइल की आवश्यकता होती है तो यह इसके बजाय युक्त स्ट्रिंग निष्पादित करेगा और वास्तव में काफी शक्तिशाली है क्योंकि यह आपको मूल स्रोत भी पास करता है।

आशा है कि आप जो खोज रहे हैं।

0

ऐसा करने का कोई और तरीका नहीं है, और इस तरह हर कोई ट्रांसपिलिंग (बेबेल, इत्यादि) करता है। @ uni_nake का उत्तर - नोड-हुक का उपयोग करने के लिए - यह ठीक है कि यह आपके से छिपाता है, लेकिन यह अनिवार्य रूप से उसी तंत्र का उपयोग करता है: इसके कोड में एक नज़र से पता चलता है कि यह मॉड्यूल._extensions का उपयोग करता है, लेकिन यह आवश्यकता के समान है। एक्सटेंशन , जैसा कि मैंने एक परीक्षण द्वारा दिखाया है: https://github.com/giltayar/playing/blob/1f04f6ddc1a0028974b403b4d1974afa872edba4/javascript/node/test/is-module-extensions-same-as-require-extensions.test.js

तो अंतिम उत्तर - मुझे लगता है कि नोड में कोई भी बेबेल तोड़ देगा, और यदि वे ऐसा करते हैं, तो वे शायद एक ही समस्या के लिए एक और समाधान देंगे। मैं इसका इस्तेमाल करने में संकोच नहीं करूंगा!

संबंधित मुद्दे