मैं Node.js और ब्राउज़र के बीच कोड कैसे साझा कर सकता हूं?


242

मैं जावास्क्रिप्ट क्लाइंट (ब्राउज़र में रन) और एक Node.js सर्वर के साथ एक छोटा एप्लिकेशन बना रहा हूं, जो WebSocket का उपयोग करके संचार करता है।

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

मैं एन्कोडिंग और डिकोडिंग संदेशों और अन्य मिरर किए गए कार्यों को सुविधाजनक बनाने के लिए दोनों सिरों पर उपयोग किए जाने वाले तरीकों और कक्षाओं का एक सेट बनाना चाहता हूं। हालाँकि, Node.js / CommonJS पैकेजिंग सिस्टम मुझे उन जावास्क्रिप्ट फ़ाइलों को बनाने से रोकने के लिए लगता है जिनका उपयोग दोनों तरफ किया जा सकता है।

मैंने भी तंग OO मॉडल प्राप्त करने के लिए JS.Class का उपयोग करने की कोशिश की, लेकिन मैंने हार मान ली क्योंकि मैं यह नहीं बता पाया कि आवश्यकता के साथ काम करने के लिए प्रदान की गई जावास्क्रिप्ट फाइलें कैसे प्राप्त करें ()। क्या यहाँ कुछ याद आ रहा है?


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

जवाबों:


168

यदि आप एक मॉड्यूल लिखना चाहते हैं जिसका उपयोग क्लाइंट साइड और सर्वर साइड दोनों में किया जा सकता है, तो मेरे पास त्वरित और आसान विधि पर एक छोटा ब्लॉग पोस्ट है: Node.js और ब्राउज़र के लिए लेखन , अनिवार्य रूप से निम्नलिखित (जहां thisजैसा है window) :

(function(exports){

    // Your code goes here

   exports.test = function(){
        return 'hello world'
    };

})(typeof exports === 'undefined'? this['mymodule']={}: exports);

वैकल्पिक रूप से ग्राहक के पक्ष में Node.js API को लागू करने के उद्देश्य से कुछ परियोजनाएं हैं, जैसे कि मारक का जेमिनी

आपको DNode में भी रुचि हो सकती है , जो आपको एक जावास्क्रिप्ट फ़ंक्शन को उजागर करने देती है ताकि इसे एक साधारण JSON- आधारित नेटवर्क प्रोटोकॉल का उपयोग करके किसी अन्य मशीन से कॉल किया जा सके।


अति उत्कृष्ट। जानकारी के लिए धन्यवाद, Caolan।
साइमन गुफा

2
वास्तव में महान लेख Caolan। मैं इसे समझ गया, यह काम कर गया, अब मैं फिर से रोल कर रहा हूं। बहुत खुबस!
माइकल डौसमैन

2
मैं अपने स्वयं के प्रोजेक्ट में RequJs का उपयोग कर रहा हूं , जो मुझे क्लाइंट और सर्वर पर अपने मॉड्यूल साझा करने की अनुमति देगा। हम देखेंगे कि यह कैसे काम करता है।
कामरानिकस

5
@ कोलायन कि कड़ी मर चुकी है
कमल रेड्डी

5
जेमिनी लिंक मृत है।
बोरिसडाकुर

42

एपेली के पास यहाँ एक अच्छा समाधान है http://epeli.github.com/piler/ जो कि पुस्तकालय के बिना भी काम करता है, बस इसे शेयर नामक फाइल में रखें।

(function(exports){

  exports.test = function(){
       return 'This is a function from shared module';
  };

}(typeof exports === 'undefined' ? this.share = {} : exports));

सर्वर साइड पर सिर्फ उपयोग करें:

var share = require('./share.js');

share.test();

और क्लाइंट की तरफ सिर्फ js फाइल लोड करें और फिर उपयोग करें

share.test();

10
मुझे यह उत्तर स्वीकार किए गए की तुलना में बेहतर लगता है क्योंकि यह मेरे जैसे नए लोगों के लिए बेहतर समझा जाता है।
होवी

मेरे एक्सप्रेस फ़ोल्डर में स्थिर (सार्वजनिक) फ़ोल्डर के अलावा, मेरे पास 'साझा' नाम का एक फ़ोल्डर भी है, जो क्लाइंट से भी उपलब्ध है जैसे 'सार्वजनिक' फ़ोल्डर जैसे: app.use (express.static ('public')) ; app.use (express.static ( 'साझा')); और आपकी पोस्ट क्लाइंट और सर्वर के साथ फाइल साझा करने के मेरे विचार का विस्तार करती है। मुझे ठीक इसी की आवश्यकता थी। धन्यवाद!
मिलाएं

यह घोल + गिट उपटै == भयानक। धन्यवाद!
केविम्मिक

@broesch ES6 में यह कैसे काम करेगा? मैंने इसे एक नए प्रश्न के रूप में पूछा है , कुछ ईएस 6-विशिष्ट समस्याओं के साथ, लेकिन मैं यहाँ संपादित करने के लिए उतना ही खुश हूँ!
टेडस्कोवस्की

15

JQuery स्रोत कोड की जाँच करें जो इस काम को Node.js मॉड्यूल पैटर्न, AMD मॉड्यूल पैटर्न और ब्राउज़र में वैश्विक बनाता है:

(function(window){
    var jQuery = 'blah';

    if (typeof module === "object" && module && typeof module.exports === "object") {

        // Expose jQuery as module.exports in loaders that implement the Node
        // module pattern (including browserify). Do not create the global, since
        // the user will be storing it themselves locally, and globals are frowned
        // upon in the Node module world.
        module.exports = jQuery;
    }
    else {
        // Otherwise expose jQuery to the global object as usual
        window.jQuery = window.$ = jQuery;

        // Register as a named AMD module, since jQuery can be concatenated with other
        // files that may use define, but not via a proper concatenation script that
        // understands anonymous AMD modules. A named AMD is safest and most robust
        // way to register. Lowercase jquery is used because AMD module names are
        // derived from file names, and jQuery is normally delivered in a lowercase
        // file name. Do this after creating the global so that if an AMD module wants
        // to call noConflict to hide this version of jQuery, it will work.
        if (typeof define === "function" && define.amd) {
            define("jquery", [], function () { return jQuery; });
        }
    }
})(this)

यह सबसे अच्छी विधि है (जिसकी मुझे आवश्यकता थी)। यहाँ एक कार्यशील उदाहरण मैंने बनाया है: gist.github.com/drmikecrowe/4bf0938ea73bf704790f
माइक क्रॉ

13

यह न भूलें कि जावास्क्रिप्ट फ़ंक्शन का स्ट्रिंग प्रतिनिधित्व उस फ़ंक्शन के स्रोत कोड का प्रतिनिधित्व करता है। आप अपने कार्यों और निर्माणकर्ताओं को एक संक्षिप्त तरीके से लिख सकते हैं ताकि वे ग्राहक को भेजे जा सकें।

इसे करने का एक और तरीका है एक बिल्ड सिस्टम का उपयोग करना, अलग-अलग फ़ाइलों में कॉमन कोड डालना और फिर उन्हें सर्वर और क्लाइंट स्क्रिप्ट दोनों में शामिल करना। मैं उस सरल क्लाइंट / सर्वर गेम के लिए वेबस्केट्स के माध्यम से उपयोग कर रहा हूं जहां सर्वर और क्लाइंट दोनों अनिवार्य रूप से एक ही गेम लूप चलाते हैं और क्लाइंट हर सर्वर के साथ सिंक्रनाइज़ करता है ताकि यह सुनिश्चित हो सके कि किसी को धोखा नहीं है।

गेम के लिए मेरा बिल्ड सिस्टम एक सरल बैश स्क्रिप्ट है जो सी प्रीप्रोसेसर के माध्यम से फाइलों को चलाता है और फिर सेड के माध्यम से कुछ जंक कैप को पीछे छोड़ देता है, इसलिए मैं सभी सामान्य प्रीप्रोसेसर सामान जैसे #include, #define, #ifdef का उपयोग कर सकता हूं , आदि।


2
स्ट्रिंग के रूप में जावास्क्रिप्ट कार्य करना मेरे लिए कभी नहीं हुआ। पारितोषिक के लिए धन्यवाद।
साइमन गुफा

13

मैं Node.js के लिए EssentialJS एडॉप्टर देखने की सलाह दूंगा । समस्या यह है कि CommonJS मॉड्यूल पैटर्न Node.js डिफ़ॉल्ट रूप से उपयोग करता है अतुल्यकालिक नहीं है, जो वेब ब्राउज़र में लोडिंग को अवरुद्ध करता है। आवश्यकताएँ जेएमडी पैटर्न का उपयोग करता है, जो कि सर्वर और क्लाइंट दोनों के साथ अतुल्यकालिक और संगत है, जब तक आप r.jsएडेप्टर का उपयोग करते हैं ।



11

शायद यह पूरी तरह से सवाल के अनुरूप नहीं है, लेकिन मुझे लगा कि मैं इसे साझा करूंगा।

मैं सरल स्ट्रिंग उपयोगिता कार्यों के एक जोड़े को बनाना चाहता था, जो String.prototype पर घोषित किया गया था, नोड और ब्राउज़र दोनों के लिए उपलब्ध है। मैं बस यूटिलिटीज.जेएस (सबफ़ोल्डर में) नामक एक फ़ाइल में इन कार्यों को रखता हूं और अपने ब्राउज़र कोड में स्क्रिप्ट-टैग दोनों से इसे आसानी से संदर्भित कर सकता हूं और मेरी Node.js स्क्रिप्ट में आवश्यकता (.js एक्सटेंशन को छोड़ कर) का उपयोग कर सकता हूं। :

my_node_script.js

var utilities = require('./static/js/utilities')

my_browser_code.html

<script src="/static/js/utilities.js"></script>

मुझे उम्मीद है कि यह मेरे अलावा किसी और के लिए उपयोगी जानकारी है।


1
मुझे यह तरीका पसंद है, लेकिन मुझे लगता है कि मेरी स्टैटिक फाइलें काफी बढ़ गई हैं। एक समाधान जो मैंने पाया है वह मॉड्यूल को फिर से निर्यात करना है। उदाहरण के लिए, utilites.jsएक पंक्ति के साथ बनाएँ module.exports = require('./static/js/utilities');। इस तरह से आपको केवल एक ही पथ को अपडेट करने की आवश्यकता है यदि आप सामान को फेरबदल करते हैं।
टॉम माकिन

मुझे यह विचार पसंद है। बस रास्ते में एक नोट जो मुझे पता लगाने में थोड़ी देर लगा। मेरा प्रोजेक्ट के तहत फ़ोल्डर utilities.jsमें है shared। उपयोग करने require('/shared/utilities')से मुझे त्रुटि मिली Cannot find module '/shared/utilities'। मुझे require('./../../shared/utilities')इसे काम करने के लिए कुछ इस तरह से उपयोग करना होगा। तो, यह हमेशा वर्तमान फ़ोल्डर से जाता है और रूट करने के लिए फिर नीचे तक जाता है।
न्यूमैन

अब मैं देखता हूं कि साझा मॉड्यूल को कहां रखा जाए - स्टैटिक फ़ोल्डर में। जानकारी के लिए धन्यवाद!
मिलाएं

9

आप इस तरह के रूप में मॉड्यूल bundlers उपयोग का उपयोग करते हैं webpack एक ब्राउज़र में उपयोग के लिए JavaScript फ़ाइलों बंडल करने, तो आप बस एक ब्राउज़र में चल दृश्यपटल के लिए अपने Node.js मॉड्यूल का पुन: उपयोग कर सकते हैं। दूसरे शब्दों में, आपका Node.js मॉड्यूल Node.js और ब्राउज़र के बीच साझा किया जा सकता है।

उदाहरण के लिए, आपके पास निम्नलिखित कोड sum.js है:

सामान्य Node.js मॉड्यूल: sum.js

const sum = (a, b) => {
    return a + b
}

module.exports = sum

Node.js में मॉड्यूल का उपयोग करें

const sum = require('path-to-sum.js')
console.log('Sum of 2 and 5: ', sum(2, 5)) // Sum of 2 and 5:  7

इसे पुन: उपयोग में लायें

import sum from 'path-to-sum.js'
console.log('Sum of 2 and 5: ', sum(2, 5)) // Sum of 2 and 5:  7

4

सर्वर केवल क्लाइंट (ब्राउज़र) के लिए जावास्क्रिप्ट स्रोत फाइलें भेज सकता है, लेकिन चाल यह है कि ग्राहक को execकोड को स्टोर करने और मॉड्यूल के रूप में संग्रहीत करने से पहले एक मिनी "निर्यात" वातावरण प्रदान करना होगा ।

इस तरह के माहौल को बनाने का एक सरल तरीका एक बंद का उपयोग करना है। उदाहरण के लिए, मान लें कि आपका सर्वर HTTP के माध्यम से स्रोत फ़ाइलें प्रदान करता है जैसे http://example.com/js/foo.js। ब्राउज़र XMLHttpRequest के माध्यम से आवश्यक फ़ाइलों को लोड कर सकता है और कोड को लोड कर सकता है:

ajaxRequest({
  method: 'GET',
  url: 'http://example.com/js/foo.js',
  onSuccess: function(xhr) {
    var pre = '(function(){var exports={};'
      , post = ';return exports;})()';
    window.fooModule = eval(pre + xhr.responseText + post);
  }
});

कुंजी यह है कि क्लाइंट विदेशी कोड को तुरंत चलाने के लिए एक अनाम फ़ंक्शन में लपेट सकता है (एक क्लोजर) जो "एक्सपोर्ट" ऑब्जेक्ट बनाता है और इसे लौटाता है ताकि आप इसे वैश्विक नाम स्थान को प्रदूषित करने के बजाय जहां चाहें वहां असाइन कर सकें। इस उदाहरण में, इसे विंडो विशेषता को सौंपा गया है fooModuleजिसमें फ़ाइल द्वारा निर्यात किया गया कोड होगा foo.js


2
हर बार जब आप eval का उपयोग करते हैं तो आप एक सूक्ति को मार डालते हैं
Jacek Pietal

1
मैं उपयोग करूंगा window.fooModule = {}; (new Function('exports', xhr.responseText))(window.fooModule)
जिंजरप्लस प्लस

2

पिछले समाधानों में से कोई भी कॉमनजस मॉड्यूल सिस्टम को ब्राउज़र में नहीं लाता है।

के रूप में अन्य उत्तर में उल्लेख किया है, वहाँ संपत्ति की तरह प्रबंधक / बंडल समाधान कर रहे हैं Browserify या Piler और वहाँ की तरह आरपीसी समाधान कर रहे हैं dnode या nowjs

लेकिन मैं ब्राउज़र के लिए कॉमनजेएस (एक require()फ़ंक्शन और exports/ module.exportsऑब्जेक्ट्स, आदि सहित) का कार्यान्वयन नहीं पा सका । इसलिए मैंने अपना लिखा, केवल बाद में पता करने के लिए कि किसी और ने इसे मुझसे बेहतर लिखा था: https://github.com/weepy/brequire । इसे ब्रेक्वायर (ब्राउज़र की आवश्यकता के लिए संक्षिप्त) कहा जाता है।

लोकप्रियता को देखते हुए, परिसंपत्ति प्रबंधकों ने अधिकांश डेवलपर्स की जरूरतों को पूरा किया। हालाँकि, यदि आपको कॉमनजेएस के एक ब्राउज़र कार्यान्वयन की आवश्यकता है, तो ब्रेक्विरे शायद बिल फिट करेंगे।

2015 अपडेट: मैं अब ब्रेक्वायर का उपयोग नहीं करता (यह कुछ वर्षों में अपडेट नहीं किया गया है)। अगर मैं सिर्फ एक छोटा, खुला-स्रोत मॉड्यूल लिख रहा हूं और मैं चाहता हूं कि कोई भी आसानी से उपयोग करने में सक्षम हो, तो मैं काओलान के उत्तर (ऊपर) के समान एक पैटर्न का पालन करूंगा - मैंने इसके बारे में एक दो वर्षों में एक ब्लॉग पोस्ट लिखा था पहले।

हालांकि, अगर मैं निजी इस्तेमाल के लिए या एक समुदाय है (जैसे CommonJS पर मानकीकृत है के लिए मॉड्यूल लिख रहा हूँ एम्पसेंड समुदाय) तो मैं सिर्फ उन्हें CommonJS प्रारूप में लिख सकते हैं और इस्तेमाल करेंगे Browserify


1

now.js भी देखने लायक है। यह आपको क्लाइंट-साइड से सर्वर-साइड और सर्वर-साइड से क्लाइंट-साइड फ़ंक्शन को कॉल करने की अनुमति देता है


1
परियोजना बंद कर दी गई है - क्या आपको इसके लिए किसी अच्छे प्रतिस्थापन का पता है? groups.google.com/forum/#!msg/nowjs/FZXWZr22vn8/UzTMPD0tdVQJ
एंडरसन ग्रीन

केवल एक अन्य जिसे मैं जानता था वह पुल था और यह उसी लोगों द्वारा था, इसलिए भी छोड़ दिया गया। सॉकेट.आईओ का 0.9 संस्करण भी घटनाओं के लिए कॉलबैक का समर्थन करता है - हालांकि अब के शेयरिंग कोड की तरह कुछ भी नहीं है। हालांकि, यह काफी अच्छी तरह से काम करता है।
बालुपटन

इसमें शेयरज भी हैं, जो सक्रिय रूप से बनाए रखा प्रतीत होता है। sharejs.org
एंडरसन ग्रीन

1

यदि आप अपने ब्राउज़र को Node.js जैसी शैली में लिखना चाहते हैं, तो आप दोहरीकरण की कोशिश कर सकते हैं ।

कोई ब्राउज़र कोड संकलन नहीं है, इसलिए आप अपने एप्लिकेशन को सीमाओं के बिना लिख ​​सकते हैं।


1

अपने कोड को आवश्यकता अनुसार मॉड्यूल और अपने परीक्षणों को जैस्मिन परीक्षणों के रूप में लिखें ।

इस तरह से कोड को हर जगह आवश्यकता के साथ लोड किया जा सकता है और परीक्षण को चमेली-html और चमेली-नोड के साथ ब्राउज़र में चलाया जा सकता है कोड या परीक्षणों को संशोधित करने की आवश्यकता के बिना Node.js में ।

यहाँ एक कार्य उदाहरण है है।


1

मामले का उपयोग करें: Node.js और ब्राउज़र के बीच अपने ऐप कॉन्फ़िगरेशन को साझा करें (यह सिर्फ एक दृष्टांत है, शायद आपके ऐप के आधार पर सबसे अच्छा तरीका नहीं है)।

समस्या: आप उपयोग नहीं कर सकते window(Node.js में मौजूद नहीं है) और न हीglobal (ब्राउज़र में मौजूद नहीं है)।

उपाय:

  • फ़ाइल config.js:

    var config = {
      foo: 'bar'
    };
    if (typeof module === 'object') module.exports = config;
  • ब्राउज़र में (index.html):

    <script src="config.js"></script>
    <script src="myApp.js"></script>

    अब आप देव उपकरण खोल सकते हैं और वैश्विक चर का उपयोग कर सकते हैं config

  • Node.js (app.js) में:

    const config = require('./config');
    console.log(config.foo); // Prints 'bar'
  • बैबल या टाइपस्क्रिप्ट के साथ:

    import config from './config';
    console.log(config.foo); // Prints 'bar'

1
इसके लिए शुक्रिया।
मिक्रोसिस

फॉलोअप: मान लीजिए कि मेरे पास दो फाइलें हैं, जो server.js और client.js के बीच साझा की गई हैं: shared.jsऔर helpers.js- shared.jsसे कार्यों का उपयोग करता है helpers.js, इसलिए इसे const { helperFunc } = require('./helpers')सर्वर-साइड काम करने के लिए सबसे ऊपर की जरूरत है । समस्या क्लाइंट पर है, यह requireएक फ़ंक्शन नहीं होने के बारे में शिकायत करता है, लेकिन अगर मैं आवश्यकता रेखा को लपेटता हूं if (typeof module === 'object') { ... }, तो सर्वर कहता है कि हेल्परफ़नक () परिभाषित नहीं है (यदि कथन के बाहर)। किसी भी विचार यह दोनों पर काम करने के लिए?
मिक्रोसिस

अद्यतन: मुझे लगता है कि यह सबसे ऊपर रखकर काम कर रहा है shared.js: helperFunc = (typeof exports === 'undefined') ? helperFunc : require('./helpers').helperFunc;- दुर्भाग्य से प्रत्येक निर्यात समारोह के लिए एक लाइन की आवश्यकता होगी, लेकिन उम्मीद है कि यह एक अच्छा समाधान है?
माइक्रोसिस्ट सेप

1

मैंने एक साधारण मॉड्यूल लिखा , जिसे आयात किया जा सकता है (या तो नोड में आवश्यकता का उपयोग कर सकता है, या ब्राउज़र में स्क्रिप्ट टैग का उपयोग कर सकता है), जिसका उपयोग आप क्लाइंट और सर्वर दोनों से मॉड्यूल लोड करने के लिए कर सकते हैं।

उदाहरण उपयोग

1. मॉड्यूल को परिभाषित करना

log2.jsअपने स्थिर वेब फ़ाइल फ़ोल्डर के अंदर एक फ़ाइल में निम्नलिखित रखें :

let exports = {};

exports.log2 = function(x) {
    if ( (typeof stdlib) !== 'undefined' )
        return stdlib.math.log(x) / stdlib.math.log(2);

    return Math.log(x) / Math.log(2);
};

return exports;

इतना ही आसान!

2. मॉड्यूल का उपयोग करना

चूंकि यह एक द्विपक्षीय मॉड्यूल लोडर है, हम इसे दोनों पक्षों (क्लाइंट और सर्वर) से लोड कर सकते हैं। इसलिए, आप निम्न कार्य कर सकते हैं, लेकिन आपको दोनों को एक साथ करने की आवश्यकता नहीं है (एक विशेष क्रम में अकेले जाने दें):

  • नोड में

नोड में, यह सरल है:

var loader = require('./mloader.js');
loader.setRoot('./web');

var logModule = loader.importModuleSync('log2.js');
console.log(logModule.log2(4));

यह वापस आना चाहिए 2

यदि आपकी फ़ाइल नोड की वर्तमान निर्देशिका में नहीं है, तो loader.setRootअपने स्थिर वेब फ़ाइलों फ़ोल्डर (या जहां भी आपका मॉड्यूल है) के पथ के साथ कॉल करना सुनिश्चित करें ।

  • ब्राउज़र में:

सबसे पहले, वेब पेज को परिभाषित करें:

<html>
    <header>
        <meta charset="utf-8" />
        <title>Module Loader Availability Test</title>

        <script src="mloader.js"></script>
    </header>

    <body>
        <h1>Result</h1>
        <p id="result"><span style="color: #000088">Testing...</span></p>

        <script>
            let mod = loader.importModuleSync('./log2.js', 'log2');

            if ( mod.log2(8) === 3 && loader.importModuleSync('./log2.js', 'log2') === mod )
                document.getElementById('result').innerHTML = "Your browser supports bilateral modules!";

            else
                document.getElementById('result').innerHTML = "Your browser doesn't support bilateral modules.";
        </script>
    </body>
</html>

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

यदि सबकुछ ठीक हो जाता है, तो यह दिखाई देगा:

यहां छवि विवरण दर्ज करें


0

मैंने इसे लिखा है, यदि आप सभी वैरिएबल को वैश्विक दायरे में सेट करना चाहते हैं, तो इसका उपयोग करना सरल है:

(function(vars, global) {
    for (var i in vars) global[i] = vars[i];
})({
    abc: function() {
        ...
    },
    xyz: function() {
        ...
    }
}, typeof exports === "undefined" ? this : exports);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.