SmooshGate के बारे में अक्सर पूछे जाने वाले सवाल

स्मूश क्या हुआ?!

JavaScript के लिए एक प्रपोज़ल Array.prototype.flatten नाम की भाषा सुविधा जल्द ही वेब-अनियमित है. Firefox Nightly में इस सुविधा की मदद से, कम से कम एक लोकप्रिय वेबसाइट की वजह से ऐसा हुआ तोड़ना है. यह देखते हुए कि समस्या वाला कोड, बड़े पैमाने पर मौजूद MooTools का हिस्सा है लाइब्रेरी है, तो हो सकता है कि और भी वेबसाइटों पर असर पड़ा हो. (हालांकि, MooTools का इस्तेमाल आम तौर पर 2018 में नई वेबसाइटों के लिए नहीं किया जाता. पहले यह बहुत लोकप्रिय होता था और जो अब भी कई प्रोडक्शन वेबसाइटों पर मौजूद है.)

प्रस्ताव के लेखक ने मज़ाक़ में flatten का नाम बदलकर smoosh करने का सुझाव दिया था साथ काम करने से जुड़ी समस्या से बचें. हर किसी को यह चुटकुला सुनाई नहीं दे रहा था, लेकिन कुछ लोगों को लोगों को गलत लगा कि नया नाम पहले से ही और मामला तेज़ी से आगे बढ़ा.

Array.prototype.flatten क्या करता है?

Array.prototype.flat को मूल रूप से Array.prototype.flatten के तौर पर सुझाया गया, अरे को तय depth तक बार-बार फ़्लैट करता है, जो डिफ़ॉल्ट सेटिंग 1 तक.

// Flatten one level:
const array = [1, [2, [3]]];
array.flat();
// → [1, 2, [3]]

// Flatten recursively until the array contains no more nested arrays:
array.flat(Infinity);
// → [1, 2, 3]

इसी प्रस्ताव में Array.prototype.flatMap शामिल है, जो यह है Array.prototype.map को छोड़कर, यह नतीजे को नए अरे में फ़्लैट कर देता है.

[2, 3, 4].flatMap((x) => [x, x * 2]);
// → [2, 4, 3, 6, 4, 8]

MooTools क्या कर रहा है, जिससे यह समस्या होती है?

MooTools अपने खुद के Array.prototype.flatten के गैर-मानक वर्शन के बारे में बताता है:

Array.prototype.flatten = /* non-standard implementation */;

MooTools का flatten लागू करना सुझाए गए स्टैंडर्ड से अलग है. हालांकि, इसमें कोई समस्या नहीं है! जब ब्राउज़र शिप किए जाते हैं मूल रूप से Array.prototype.flatten का इस्तेमाल करने पर, MooTools नेटिव की जगह ले लेता है लागू करना. इससे यह पक्का होता है कि कोड MooTools के व्यवहार पर निर्भर करते हैं यह इस बात पर ध्यान दिए बिना कि नेटिव flatten उपलब्ध है या नहीं, सभी के लिए सही तरीके से काम करता है. अब तक, बहुत बढ़िया!

माफ़ करें, इसके बाद कुछ और हो जाता है. MooTools को इसकी सभी Elements.prototype के लिए कस्टम अरे मेथड (जहां Elements एक MooTools के लिए खास एपीआई):

for (var key in Array.prototype) {
  Elements.prototype[key] = Array.prototype[key];
}

for-in, “गिनती की जा सकने वाली” प्रॉपर्टी के मुकाबले इटरेट होता है. इसमें यह शामिल नहीं है नेटिव मेथड, जैसे कि Array.prototype.sort का इस्तेमाल किया गया है. हालांकि, इसमें यह ज़रूर शामिल है नियमित तौर पर असाइन की गई प्रॉपर्टी, जैसे कि Array.prototype.foo = whatever. लेकिन — और यहां किकर दिया गया है — अगर आप किसी ऐसी प्रॉपर्टी को ओवरराइट करते हैं जिसकी गिनती न की जा सकती हो, उदाहरण के लिए Array.prototype.sort = whatever, गिनती नहीं की जा सकती.

फ़िलहाल, Array.prototype.flatten = mooToolsFlattenImplementation बना रहा है flatten प्रॉपर्टी की गिनती की जा सकती है, इसलिए इसे बाद में Elements में कॉपी किया जाता है. हालांकि, अगर ब्राउज़र में flatten का नेटिव वर्शन भेजा जाता है, तो उसे गिना जाता है. साथ ही, Elements में कॉपी नहीं किया गया. MooTools’ पर निर्भर कोई भी कोड Elements.prototype.flatten में अब काम नहीं हो रहा है.

हालांकि, ऐसा लग रहा है कि मूल Array.prototype.flatten को बदलकर संख्या वाली वैल्यू इस समस्या को ठीक कर देगी, लेकिन इससे समस्या और भी साथ काम नहीं करता. for-in पर भरोसा करने वाली हर वेबसाइट के लिए बार-बार कोई अरे (जो कि एक खराब तरीका है, लेकिन होता है) अचानक flatten प्रॉपर्टी के लिए एक अतिरिक्त लूप इटरेशन.

यहां सबसे बड़ी समस्या पहले से मौजूद ऑब्जेक्ट में बदलाव करने की है. बढ़ाया जा रहा है आजकल नेटिव प्रोटोटाइप को आम तौर पर गलत माना जाता है, क्योंकि अन्य लाइब्रेरी और तीसरे पक्ष के कोड के साथ अच्छी तरह से मेल नहीं खाता है. बदलाव न करें ऐसी चीज़ें जिन पर आपका मालिकाना हक नहीं है!

हम सिर्फ़ मौजूदा नाम ही क्यों नहीं रख देते और वेब को तोड़ क्यों नहीं देते?

साल 1996 में, सीएसएस के बड़े पैमाने पर होने और “HTML5” के लॉन्च होने से पहले स्पेस जैम की वेबसाइट लाइव हो गई. यह वेबसाइट आज भी काम करती है ठीक वैसा ही है जैसा 22 साल पहले हुआ था.

ऐसा कैसे हुआ? क्या कोई इतने सालों तक उस वेबसाइट को मैनेज करता था, क्या यह अपडेट हर बार ब्राउज़र वेंडर के ज़रिए नई सुविधा के शिप होने पर अपडेट होता है?

जैसा कि हम जानते हैं कि “वेब में छेड़छाड़ न करें”, डिज़ाइन का पहला सिद्धांत है और ऐसे किसी भी अन्य मानक के लिए HTML, CSS, JavaScript और ऐसे किसी भी अन्य मानक को वेब. अगर ब्राउज़र की कोई नई सुविधा भेजने की वजह से मौजूदा वेबसाइटें बंद हो जाती हैं तो यह सभी के लिए खराब है:

  • प्रभावित वेबसाइटों के विज़िटर को अचानक से टूटा हुआ उपयोगकर्ता अनुभव मिलता है;
  • वेबसाइट के मालिकों ने एक बढ़िया काम करने वाली वेबसाइट से शुरू करके जो काम न करती हो और उसमें कोई बदलाव न किया गया हो;
  • नई सुविधा भेजने वाले ब्राउज़र वेंडर की, बाज़ार में हिस्सेदारी की कमी की वजह से, उपयोगकर्ता “यह ब्राउज़र X में काम करता है” दिखाई देने के बाद ब्राउज़र स्विच करना;
  • साथ ही काम करने से जुड़ी समस्या की जानकारी मिलने पर, ब्राउज़र के अन्य वेंडर इसे. सुविधा की जानकारी हकीकत से मेल नहीं खाती (“काल्पनिक चीज़ों के अलावा कुछ नहीं”), जो मानक तय करने की प्रक्रिया के लिए सही नहीं है.

बिलकुल, पीछे मुड़कर देखें, MooTools ने गलत काम किया है — लेकिन इंटरनेट पर उन्हें सज़ा नहीं मिलती, बल्कि लोगों को सज़ा होती है. इन लोगों को नहीं पता कि मूर्ख टूल है. वैकल्पिक रूप से, हम कोई दूसरा समाधान ढूंढ सकते हैं और उपयोगकर्ता जारी रख सकते हैं वेब का इस्तेमाल करने के लिए. चुनाव करना आसान है.

क्या इसका मतलब यह है कि अमान्य एपीआई को वेब प्लैटफ़ॉर्म से कभी नहीं हटाया जा सकता?

यह कई बातों पर निर्भर करता है. बहुत कम मामलों में, खराब सुविधाओं को वेब से हटाया जा सकता है. सवाल-जवाब का काम भी क्या किसी सुविधा को हटाना मुमकिन है, यह समझना बहुत मुश्किल है. यह देखने के लिए बड़े स्तर पर टेलीमेट्री की ज़रूरत पड़ती है कि कितने वेब पेजों पर व्यवहार बदल गया है. हालांकि, जब यह सुविधा काफ़ी असुरक्षित है, तो या बहुत कम इस्तेमाल होता है, तो ऐसा किया जा सकता है.

<applet>, <keygen>, और showModalDialog() सभी हैं खराब एपीआई के उदाहरण जिन्हें वेब प्लैटफ़ॉर्म से हटा दिया गया है.

हम MooTools को सिर्फ़ क्यों ठीक नहीं करते?

MooTools को पैच करना ताकि वह पहले से मौजूद ऑब्जेक्ट का विस्तार न करे सुझाव. हालांकि, इससे आपकी समस्या हल नहीं होती. भले ही MooTools पैच किया गया वर्शन रिलीज़ करने के लिए, तो इसका इस्तेमाल करने वाली सभी मौजूदा वेबसाइटों को साथ काम करने की समस्या को हल करने के लिए अपडेट करें.

क्या लोग सिर्फ़ MooTools की अपनी कॉपी अपडेट नहीं कर सकते?

इस शानदार दुनिया में MooTools एक पैच और हर वेबसाइट को रिलीज़ किया जाता है. MooTools का इस्तेमाल करना अगले दिन जादुई तरीके से अपडेट हो जाएगा. समस्या हल हो गई, है न?!

माफ़ करें, यह जानकारी सही नहीं है. भले ही, कोई व्यक्ति उन चीज़ों को प्रभावित वेबसाइटों का पूरा सेट, इनके लिए संपर्क जानकारी खोजने का उनमें से हर एक और सभी वेबसाइट के मालिकों से संपर्क किया हो, और उन्हें अपडेट करने के लिए सहमत कर सकते हैं (इसका मतलब है कि Google, नहीं होगा, तो इस पूरी प्रक्रिया में सालों लग सकते हैं.

ध्यान रखें कि इनमें से कई वेबसाइटें पुरानी हैं और हो सकता है कि उनका रखरखाव न किया गया हो. भले ही, मेंटेनर आस-पास हो, लेकिन हो सकता है कि वह कुशल वेब डेवलपर हैं. हम उम्मीद नहीं कर सकते कि सभी लोग और वेब के साथ काम करने से जुड़ी समस्या की वजह से, अपनी आठ साल पुरानी वेबसाइट को बदल दिया.

TC39 प्रोसेस कैसे काम करती है?

TC39 एक ऐसी कमिटी है जो है ECMAScript स्टैंडर्ड के मुताबिक होना चाहिए.

#SmooshGate की वजह से कुछ लोगों को यह लगा कि “TC39, flatten का नाम बदलकर यह करना चाहता है smoosh” रखा, लेकिन यह एक मज़ाक़िया बातचीत थी. इसे बाहर लोगों में अच्छे से पेश नहीं किया जाता था. प्रस्ताव का नाम बदलने जैसे बड़े फ़ैसले सोच-समझकर नहीं लिए जाते और किसी एक व्यक्ति के काम करने के तरीके के बारे में न सोचें. GitHub टिप्पणी.

TC39, सुविधा से जुड़े प्रस्तावों के लिए साफ़ स्टेजिंग प्रोसेस पर काम करता है. ECMAScript प्रस्ताव और उनमें किए गए कोई भी बड़े बदलाव (इसमें तरीका भी शामिल है नाम बदलना) के बारे में TC39 मीटिंग के दौरान चर्चा की जाती है और इसे आधिकारिक तौर पर जुड़ने से पहले पूरी कमिटी का इस्तेमाल किया जा सकता है. ऐसे मामले में Array.prototype.flatten, प्रस्ताव पहले ही कई चरणों में भेजा जा चुका है समझौते के अलग-अलग चरणों तक, जो स्टेज 3 तक उपलब्ध हैं. इससे पता चलता है कि यह सुविधा, जो वेब ब्राउज़र में लागू किए जाने के लिए तैयार है. अतिरिक्त जानकारी के लिए यह आम बात है समस्याओं का सामना करना पड़ सकता है. इस मामले में, सबसे अहम इसे भेजने की कोशिश के बाद सुझाव मिला: सुविधा की मौजूदा स्थिति, वेब को तोड़ देता है. इस तरह की समस्याओं का अनुमान लगाना मुश्किल क्यों है ब्राउज़र से सुविधा शिप करने के बाद, TC39 प्रोसेस खत्म नहीं होती.

TC39 सभी की सहमति से काम करता है. इसका मतलब है कि कमिटी को किसी भी नए बदलाव. भले ही smoosh गंभीर सुझाव दिया गया हो, लेकिन ऐसा लगता है कि कोई कमिटी का सदस्य किसी सामान्य नाम के समर्थन में आपत्ति जताएगा, जैसे कि compact या chain.

flatten से smoosh के नाम में बदलाव (भले ही यह कोई चुटकुला न हो) इसकी चर्चा TC39 मीटिंग में कभी नहीं की गई. जैसे ही, TC39 का आधिकारिक रवैया यह विषय अभी अज्ञात है. कोई एक व्यक्ति इनकी ओर से बात नहीं कर सकता TC39 के सभी चरण पूरे करने होंगे.

TC39 मीटिंग में आम तौर पर, अलग-अलग तरह के लोग शामिल होते हैं बैकग्राउंड: कुछ लोगों के पास प्रोग्रामिंग भाषा को डिज़ाइन करने का सालों का अनुभव है, अन्य ब्राउज़र या JavaScript इंजन पर काम करते हैं और बढ़ती हुई संख्या में JavaScript डेवलपर समुदाय को दिखाने के लिए सहायक का इस्तेमाल किया जाता है.

आखिरकार, SmooshGate की समस्या को कैसे हल किया गया?

मई 2018 की TC39 मीटिंग के दौरान, #SmooshGate flatten का नाम बदलकर flat किया गया. इसे आधिकारिक तौर पर हल कर दिया गया था.

Array.prototype.flat और Array.prototype.flatMap को V8 v6.9 में शिप किया गया और Chrome 69.