7

मैं फ़ायरफ़ॉक्स 4+ के लिए एक एक्सटेंशन लिख रहा हूं।सामग्री स्क्रिप्ट और एडन के बीच कोड कैसे साझा करें?

मेरे पास utils.js नाम की एक फ़ाइल में कुछ कोड है जो मैं एडन के main.js और page-mod की सामग्री स्क्रिप्ट से कॉल करना चाहता हूं।

क्या दोनों को utils.js से संदर्भित करना संभव है? यदि हां, तो कैसे?

संपादित करें: यहां तक ​​कि एक बेहतर समाधान होगा जो मुझे Google क्रोम एक्सटेंशन में एक ही कोड का उपयोग करने की इजाजत देता है।

उत्तर

0

चूंकि मुझे कोई मौजूदा समाधान नहीं मिला है, इसलिए अब मैं एक ही फ़ाइल को कई निर्देशिकाओं में कॉपी कर रहा हूं (बिल्ड/डीबग प्रक्रिया के हिस्से के रूप में)।

यह अब के लिए सबसे अच्छा काम करता प्रतीत होता है क्योंकि विशेष रूप से स्रोत कोड के अधिकांश भाग को विस्तार के Google क्रोम कार्यान्वयन में भी पुन: उपयोग किया जाता है।

var Utils = Utils || require('utils').Utils; 

इस तरह utils.js देखो के प्रासंगिक भागों:

function initUtils() { 
    var result = { 
     // ..define exported object... 
    }; 
    return result; 
}; 

// Chrome 
var Utils = initUtils(); 
var exports = exports || {}; 
// Firefox 
exports.Utils = Utils; 

utils.js फ़ायरफ़ॉक्स सामग्री लिपियों में और क्रोम में प्रयोग करने योग्य (दोनों कोई CommonJS है) मैं इसे इस तरह का आयात कर रहा हूँ करने के लिए

2

मैंने इसी समस्या में भाग लिया है। आपको लगता है कि एक स्पष्ट समाधान होगा। फ़ायरफ़ॉक्स के लिए मैं क्या कर रहा हूं (क्रोम के साथ काम नहीं किया है):

मेरे पास एक फ़ाइल lib/dbg.js है जिसमें मेरा मूल डीबग फ़ंक्शन शामिल है जिसे मैं हर जगह उपयोग करना चाहता हूं।

मेरी main.js में

प्रत्येक सामग्री स्क्रिप्ट मॉड्यूल में, मैं इस है:

contextMenu.Item({ 
... 
contentScript: export_internals(require('dbg')), 
contentScriptFile: my-actual-scripts.js 
... 

और फिर मुख्य में मैं एक समारोह है

function export_internals(module) { 
    var code = ''; 
    for (name in module) { 
     var val = module[name]; 
     if (val.constructor === String) 
      code += name + ' = "' + val + '";'; 
     else 
      code += val; 
    } 
    return code; 
} 
जो

मूल रूप से सिर्फ निर्यात गुण के माध्यम से चक्र (चर, फ़ंक्शंस इत्यादि) और मूल रूप से dbg मॉड्यूल के एक स्ट्रिंग संस्करण बनाने के लिए Function.toString() जैसी चीजों का उपयोग करता है और इसे एक इनलाइन सामग्री स्क्रिप्ट के रूप में पास करता है। यह समारोह शायद बेहद सामान्य नहीं है के रूप में मैं सिर्फ सरल कार्य करता है और तार (केवल दो डेटा प्रकार मैं आवश्यक) को संभालने के लिए लिखा था लेकिन सिद्धांत आसानी से भले ही आप अभी

contentScript: require('dbg').my_function.toString() 
की तरह कुछ करने के लिए थे लागू किया जाना चाहिए

यह स्पष्ट रूप से एक हैक का थोड़ा सा है लेकिन अब तक एक बहुत विश्वसनीय है। क्या आप इसी की तलाश में हैं?

1

मेरे समाधान

के लिए गया था
  1. सभी "तर्क" डाल (और मेरी "utils" मॉड्यूल) ऐड-ऑन कोड
  2. में सामग्री स्क्रिप्ट के रूप में संभव
  3. और जब भी सामग्री स्क्रिप्ट के रूप में सरल रखने सूचना की आवश्यकता है जिसके लिए यूटिल मॉड्यूल की आवश्यकता होगी मैं सामग्री स्क्रिप्ट (self.port.emit, self.on ...) और एडन कोड (worker.port.on ...) के बीच एसिंक्रोनस संचार प्रणाली का उपयोग करता हूं।)

समाधान ने मेरे एडन का बेहतर डिज़ाइन किया है। लेकिन मुझे नहीं पता कि एसिंक दृष्टिकोण आपकी स्थिति में काम करेगा या नहीं।

0

मोज़िला ऐड-ऑन एसडीके संदर्भ स्थल पर Implementing Reusable Modules सूचक के लिए धन्यवाद। मैं अब भी स्पष्ट नहीं हूं कि exports आमंत्रण कैसे करें। उनके उदाहरण में वे फ़ंक्शन और फ़ाइल के लिए समान नाम का उपयोग करते हैं। तो, exports.translate = translate; पंक्ति में translate फ़ंक्शन translate() पर संदर्भित करता है जबकि दाईं ओर वाला एक फ़ाइल translate.js फ़ाइल को संदर्भित करता है, या शायद इसके विपरीत?

ऊपर मैगोज़ 'उत्तर (जिसमें फ़ंक्शन नाम और फ़ाइल का नाम caSE sENSITiVITY के कारण भिन्न होता है) ऐसा लगता है कि मुझे केवल फ़ंक्शन नाम का दो बार उपयोग करना चाहिए और फ़ाइल नाम को अनदेखा करना चाहिए। क्या यह मामला है?

+0

लगता है यह है। https://builder.addons.mozilla.org/addon/1047822/latest/ – Lori

+0

कि लिंक अब टूट गया लगता है ... – bgmCoder

+0

शायद https://addons.mozilla.org/en-US/developers/docs/sdk/latest /dev-guide/tutorials/reusable-modules.html एक समकक्ष दस्तावेज़ है। शायद यह नहीं है। – Lori

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

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