2012-08-22 20 views
29

विफल रहता है तो स्थानीय फॉलबैक मेरे रीढ़ की हड्डी में, मुझे प्रत्येक आवश्यक फ़ाइल के लिए फ़ॉलबैक प्रदान करने की आवश्यकता होती है, यदि सीडीएन उन्हें वितरित करता है।RequJS: यदि सीडीएन

मैं बहुत तरह require.onError अधिलेखन की कोशिश की है:

require.onError = function (err) { 
    if (err.requireType === 'timeout') { 
     var url = err.requireModules; 

     if (!!~url.indexOf("jquery/")) 
      console.warn("CDN timed out, falling back to local jQuery.js") 
      require(["libs/jquery"]); 
      return; 
     if (!!~url.indexOf("jqueryui/")) 
      console.warn("CDN timed out, falling back to local jQueryUI.js") 
      require(["libs/jqueryui"]); 
      return; 
     if (!!~url.indexOf("underscore")) 
      console.warn("CDN timed out, falling back to local underscore.js") 
      require(["libs/underscore"]); 
      return; 
     if (!!~url.indexOf("backbone")) 
      console.warn("CDN timed out, falling back to local backbone.js") 
      require(["libs/backbone"]); 
      return; 
    } 
} 

समस्या यह है कि इस अतुल्यकालिक रूप से वापस आने फ़ाइलें लोड होगा। मुझे इन फ़ाइलों को क्रम में लोड करने की आवश्यकता है, बस मूल आवश्यकता कथन की तरह, जहां मैं order! प्लगइन का उपयोग करता हूं।

ओवरराइड onError के साथ: जब सीडीएन लोड करने में विफल रहता है, तो फ़ॉलबैक लोड शुरू हो जाता है, लेकिन इसके लिए इंतजार नहीं किया जाता है। यह एक समस्या प्रस्तुत करता है क्योंकि स्क्रिप्ट को उनकी निर्भरताओं के आधार पर लोड करने का आदेश दिया जाता है। यहाँ मेरी मूल require बयान पर एक नज़र है, कि CDN पर निर्भर करता है:

require([ 
    "order!http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js", 
    "order!http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js", 
    "order!http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js", 
    "order!http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js", 
    "order!utils/date", 
    "order!core/core", 
    "order!core/errors", 
    "order!core/constants" 
], function() { 
    ... 
} 
+0

दोनों CDN के भयानक नहीं हैं, वे केवल ज्यादा से ज्यादा एक मिनट के बारे में एक खिड़की के लिए एक दिन में एक बार औसतन असफल, और स्वतंत्र हैं। भले ही, मुझे लगता है कि यह हल करने के लिए एक दिलचस्प समस्या है। उपयोगकर्ता अनुभव को संरक्षित करने के लिए, यदि आपके पास एक आदर्श सीडीएन है, तो भी फ़ॉलबैक होने के लिए हमेशा अच्छा होता है। क्या आप किसी अन्य सीडीएन का सुझाव दे सकते हैं? – Austin

+0

मैं समझता हूं कि आप कहां से आ रहे हैं, लेकिन मैं इस तरह की किसी भी चीज़ की खरीद करने की स्थिति में नहीं हूं, पर्याप्त प्रमाण प्रदान किए बिना कि मैंने वर्तमान प्रणाली को काम करने के लिए सबकुछ करने की कोशिश की है। इसके अलावा, मुझे किसी भी प्रोग्रामिंग की सराहना में दिलचस्पी है, और मैं यह विशेष समाधान कई लोगों के लिए उपयोगी साबित कर सकता हूं, क्योंकि कई डेवलपर्स (विशेष रूप से फ्रीलांसर) सीडीएन के लिए भुगतान का उपयोग नहीं करते हैं। – Austin

+1

सीडीएन अब असली सस्ता है ($ 2 से $ 3 प्रति माह) ... मैं AccuWebHosting.Com सीडीएन का उपयोग कर रहा हूं और कभी भी डाउनटाइम का अनुभव नहीं किया। खैर, यदि एक सर्वर सीडीएन में विफल रहता है, तो सामग्री को तुरंत निकटतम उपलब्ध पीओपी से वितरित किया जाता है ... और आमतौर पर एक अच्छी सीडीएन में 40 से 50 पीओपी होते हैं ... –

उत्तर

57

RequireJS किस संस्करण का उपयोग कर रहे हैं? ऐसा लगता है कि आप अपनी कॉन्फ़िगरेशन में पथ के रूप में jQuery के फ़ॉलबैक को कॉन्फ़िगर करना चाहते हैं, फिर jQuery को अन्य मॉड्यूल पर निर्भरता के रूप में सेट अप करें। आप उपयोग कर रहे हैं ~> 2.0, (untested) की तरह कुछ:

// in your requirejs config 
requirejs.config({ 
    //To get timely, correct error triggers in IE, force a define/shim exports 
    // check. 
    enforceDefine: true, 
    paths: { 
     jquery: [ 
      'http://somecdn.com/jquery.min', // your cdn 
      'lib/jquery' // your fallback 
     ], 
     jqueryui: "http://somecdn.com/jquery-ui.min.js" 
    }, 
    shim: { 
     jqueryui: ['jquery'] 
    } 
}); 

// then in your requires 
require([jquery, jqueryui, foo, bar], function($) { 
    // stuff 
}); 

वे इसे in the wiki कैसे करना है के बारे में बात करते हैं। यदि आप v2.x का उपयोग नहीं कर रहे हैं, तो यहां भी इसे संभालने का एक तरीका है।

यदि सभी मॉड्यूल अपनी निर्भरताओं को निर्दिष्ट करने के लिए कॉन्फ़िगर किए गए हैं, तो आपको order! निर्देशों के बारे में चिंता करने की आवश्यकता नहीं है।

+0

मुझे 2 मिनट तक पोस्ट पर मारो, लेकिन हाँ, यह वह जवाब है जिसके साथ मैं गया था। – Austin

+0

हाहा भी नहीं। मुझे लगता है कि यह लगभग 15 सेकंड था। – numbers1311407

+2

ऑप्टिमाइज़र चलाने के बाद यह कैसे प्रबंधित किया जाता है? क्या यह बहिष्कृत फ़ाइलों के लिए एचटीएमएल में स्क्रिप्ट टैग जोड़ता है? – sidonaldson

19

मुझे RequJS 2.x.x में प्रदान की गई समस्या का समाधान मिला है। इस समाधान की मांग थी, इसलिए बदले में, RequJS ने paths ऑब्जेक्ट को अपनी कॉन्फ़िगरेशन में जोड़ा। यह सीडीएन के लिए फॉलबैक कार्यक्षमता प्रदान करता है, क्या उन्हें असफल होना चाहिए।

यह भी ध्यान दिया जाना चाहिए कि order! प्लगइन को आवश्यक 2.0 में बहिष्कृत कर दिया गया है, इसलिए मुझे निर्भरताओं को परिभाषित करने के लिए shim ऑब्जेक्ट का उपयोग करने की भी आवश्यकता है। यह वास्तव में एक बहुत ही दिलचस्प विचार है।

यह मेरा नया require.config है:

require.config({ 
    urlArgs: "ts="+new Date().getTime(), // disable caching - remove in production 
    paths: { 
     jquery: [ 
      "http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min", 
      "libs/jquery" 
     ], 
     jqueryui: [ 
      "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min", 
      "libs/jqueryui" 
     ], 
     underscore: [ 
      "http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min", 
      "libs/underscore" 
     ], 
     backbone: [ 
      "http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min", 
      "libs/backbone" 
     ] 
    }, 
    shim: { 
     'jqueryui': ['jquery'], 
     'underscore': ['jquery'], 
     'backbone': ['underscore'], 
     'core/core': ['underscore'], 
     'core/errors': ['core/core'], 
     'core/constants': ['core/core'] 
    } 
});