2014-07-03 17 views
5

मैं readingaboutes6 module loaders रहा हूं और मुझे समझ में नहीं आता कि यह कैसे काम करता है और मुझे उम्मीद है कि कोई मुझे प्रबुद्ध कर सकता है।es6 मॉड्यूल लोडिंग कैसे काम करता है

व्यावहारिक वर्कफ़्लो में लिंक के ऊपर है कि वे इस

System.import('app/app').then(function(app) { 
    // app is now the Module object with exports as getters 
}); 

उस के साथ कोई समस्या नहीं है की तरह एक उदाहरण है - मैं समझ गया। लेकिन फिर मुझे

var $ = require('jquery'); 

जैसी चीजें दिखाई देती हैं और वास्तव में उलझन में आती हैं। क्या होता है यदि इस कॉल के समय jquery को अभी तक ब्राउज़र में स्थानांतरित नहीं किया गया है? क्या धागा सिर्फ स्पिन करता है? क्या ब्राउज़र आपकी स्क्रिप्ट को पीछे के दृश्यों का विश्लेषण करता है और इसे Requbacks जैसे कॉलबैक में सुधारता है? क्या यह विन्यास योग्य है? क्या विशिष्ट सीमाएं हैं?

क्या कोई मुझे रैंड डाउन दे सकता है?

+1

दूसरी चीज़ जो आप देखते हैं वह "कॉमनजेएस मॉड्यूल लोडिंग" है, ईएस 6 afaik नहीं। यह वास्तव में [require.js के भीतर काम नहीं करता है) (http://requirejs.org/docs/api.html#cjsmodule) – Bergi

+0

@ बर्गि यह requ.js के भीतर ठीक काम करता है, जबकि मैं इसे पसंद नहीं करता मेरे वर्तमान प्रोजेक्ट के भीतर कुछ पेज हैं जो आमज शैली के साथ requjs का उपयोग करते हैं। Requjs सामान्य स्क्रिप्ट अभिव्यक्तियों के लिए आपकी स्क्रिप्ट स्कैन करता है और इसे एक एएमडी प्रारूप में फिर से लिखता है इसलिए यह अभी भी कॉलबैक का उपयोग कर रहा है। हालांकि, जब तक कि मैं गलत नहीं हूं, es6 प्रस्ताव कॉलबैक का उपयोग नहीं करता है - इसलिए मेरा भ्रम। –

+0

हां, और स्क्रिप्ट स्कैनिंग सभी सरल मामलों के लिए अच्छी तरह से काम नहीं करता है। क्या आप ईएस 6 प्रस्ताव के हिस्से को जोड़ सकते हैं जिसका मतलब है? 'System.import' स्पष्ट रूप से कॉलबैक का उपयोग करता है। – Bergi

उत्तर

4

ईएस 6 मॉड्यूल लोडर स्रोत लाएगा, निर्भरता निर्धारित करेगा, और मॉड्यूल को निष्पादित करने से पहले उन निर्भरताओं को लोड होने तक प्रतीक्षा करें। तो उस समय तक निष्पादन की आवश्यकता होती है, निर्भरता पहले से ही वहां पर बैठे हुए इंतजार कर रही है।

ईएस 6 मॉड्यूल लोडर के माध्यम से कॉमनजेएस लोड करते समय, हम स्रोत से आवश्यक बयानों को स्थिर रूप से पार्सिंग पर भरोसा करते हैं, और केवल उन लोगों को लोड करने के बाद स्रोत को निष्पादित करते हैं।

इस तरह हम गतिशील रूप से लोड ब्राउज़र में कॉमनजेएस का समर्थन कर सकते हैं। परिपत्र संदर्भों को नोड में संभाले जाने के तरीके के समान व्यवहार किया जाता है।

खाते की टिप्पणियों और आसपास के टोकन को ध्यान में रखते हुए, आवश्यक आवश्यकताओं को पार करने वाले नियमित अभिव्यक्ति वास्तव में बहुत विश्वसनीय और त्वरित हैं। SystemJS द्वारा उपयोग किए जाने वाले किसी के लिए https://github.com/systemjs/systemjs/blob/master/lib/extension-cjs.js#L10 देखें।

इस दृष्टिकोण के साथ एक शेष सीमा है और यह गतिशील और सशर्त कॉमनजेएस की आवश्यकता है जैसे if (condition) require('some' + 'name') ठीक से पता नहीं चला है। यह एक आवश्यक लागत है हालांकि सामान्य जेएस ब्राउज़र में पूरी तरह से असीमित मॉड्यूल प्रारूप के रूप में व्यवहार करने के लिए।

+1

इस प्रश्न को लिखने के कुछ समय बाद हमें [es6 मॉड्यूल पर यह शानदार लेख] मिला (http://www.2ality.com/2014/09/es6-modules-final.html)। यह आपके द्वारा जो कुछ भी कहा गया है (यानी रेगेक्स पार्सिंग, जिस तरह से परिपत्र निर्भरता कार्य करता है, और गतिशीलता की उपलब्धता की आवश्यकता होती है) में सीधे कुछ विपरीत है। ऐसा लगता है कि कम से कम मेरे कुछ भ्रम यह है कि मॉड्यूल और मॉड्यूल लोडर अलग-अलग चश्मा हैं जिनमें से केवल पूर्व पूर्ण है। –

+2

ES6 मॉड्यूल लोडर के मॉड्यूल की व्याख्या करने के दो तरीके हैं: 1. ES6 मॉड्यूल 2. विरासत मॉड्यूल प्रारूप हम "तत्काल" नामक हुक के माध्यम से ईएस 6 मॉड्यूल लोडर में विरासत मॉड्यूल प्रारूप में निर्माण कर सकते हैं। आप सही हैं - ईएस 6 मॉड्यूल लोडिंग में अपनी परिपत्र संदर्भ शैली भी है जो कि कॉमनजेएस से अलग है। लोडर में कॉमनजेएस समर्थन लिखते समय, यह पूर्ण कॉमनजेएस-शैली परिपत्र संदर्भ समर्थन की अनुमति दे सकता है। चश्मा के मामले में, मॉड्यूल लोडर क्लास व्यवहार स्वयं ES6 विनिर्देशन में है, एक अलग विनिर्देश सटीक पर्यावरण हुक है। – guybedford

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