दस्तावेज़ीकरण
/

समस्या निवारण

/

आइडेंटिफ़ायर टकराव से बचना

आइडेंटिफ़ायर टकराव से बचना

जब कई VM-ऑब्फ़स्केटेड फ़ाइलें एक ही बंडल में पहुँचती हैं, तो वे एक ही टॉप-लेवल आइडेंटिफ़ायर डिक्लेयर कर सकती हैं और पार्स के समय पेज को क्रैश कर सकती हैं। यहाँ बताया गया है कि ऐसा क्यों होता है और इसे कैसे ठीक करें।

लक्षण

आपका बिल्ड ठीक चलता है, लेकिन ऐप शुरू होने से पहले ही ब्राउज़र पार्स के समय एरर फेंकता है:

टेक्स्ट

यह देखने के लिए कि एरर वाला नाम कितने चंक में डिक्लेयर है, उन फ़ाइलों को गिनें जिनमें उसका डिक्लेरेशन है:

टेक्स्ट

-l हर मेल खाने वाली फ़ाइल को एक बार सूचीबद्ध करता है और -w केवल पूरे शब्दों से मेल खाता है, इसलिए vmdX नहीं गिना जाता। var को छोड़ दिया गया है, क्योंकि var डिक्लेरेशन दोहराना अपने आप में एरर नहीं है। 1 से बड़े नतीजे का मतलब है कि नाम एक से ज़्यादा चंक में डिक्लेयर है। vmd को अपने एरर संदेश वाले नाम से बदलें।

आइडेंटिफ़ायर टकराव तभी मायने रखता है जब डिक्लेरेशन एक ही स्कोप में हों। अलग-अलग मॉड्यूल या क्लोज़र में दोहराया गया एक ही नाम टकराव का सबूत नहीं है; ऊपर दिखाई गई पार्स एरर है।

ऐसा क्यों होता है

VM प्रीसेट mangled-shuffled आइडेंटिफ़ायर-नाम जनरेटर का उपयोग करते हैं। यह एक छोटी वर्णमाला पर फेंटे हुए क्रम में चलता है, और VM ऑब्फ़स्केशन में नाम बदले गए हर ग्लोबल को vm प्रीफ़िक्स मिलता है (जो आपके सेट किए किसी भी identifiersPrefix के आगे जुड़ता है, इसलिए checkout_ vm_checkout_... बन जाता है)। फेंटा हुआ क्रम प्रति प्रोसेस कैश होता है, इसलिए एक ही प्रोसेस में, या एक ही निश्चित seed के साथ ऑब्फ़स्केट की गई फ़ाइलें उसी क्रम से नाम लेती हैं - हर फ़ाइल का पहला ग्लोबल एक ही नाम पाता है, दूसरा एक और साझा नाम, और इसी तरह आगे।

हर फ़ाइल स्वतंत्र रूप से ऑब्फ़स्केट होती है और जनरेटर हर फ़ाइल के लिए अपने क्रम की शुरुआत से दोबारा चलता है। जब दो फ़ाइलें एक ही स्कोप में पहुँचती हैं, तो नाम टकरा जाते हैं। दो टॉप-लेवल let vmd डिक्लेरेशन एक ही स्कोप में आ जाते हैं और पार्सर दूसरे को अस्वीकार कर देता है।

हर VM-ऑब्फ़स्केटेड फ़ाइल बिना सफ़िक्स वाला एक टॉप-लेवल रनटाइम नाम घोषित करती है, और टकराव के लिए इतना ही काफ़ी है। renameGlobals: true इसे और भी बदतर बना देता है: हर टॉप-लेवल डिक्लेरेशन एक छोटा vm* नाम बन जाता है, और रनटाइम के अपने नाम अपना अनोखा सफ़िक्स खो देते हैं।

समाधान

बेहतर है कि पहले बंडल करें, फिर बंडल को एक बार ऑब्फ़स्केट करें। अगर आप अलग-अलग ऑब्फ़स्केट करते ही हैं और स्क्रिप्ट्स एक ग्लोबल स्कोप साझा करती हैं, तो इनमें से कोई एक चुनें:

  • randomIdentifiersPrefix चालू करें (अनुशंसित)

    हर ऑब्फ़स्केशन रन को एक रैंडम प्रीफ़िक्स मिलता है, जो हर ग्लोबल आइडेंटिफ़ायर के आगे जोड़ा जाता है (VM ऑब्फ़स्केशन में यह डिफ़ॉल्ट vm प्रीफ़िक्स की जगह लेता है)। अलग-अलग फ़ाइलों के नाम अब एक नेमस्पेस साझा नहीं करते, इसलिए प्रीफ़िक्स को हाथ से तालमेल बिठाए बिना टकराव खत्म हो जाते हैं।

  • हर फ़ाइल के लिए अलग identifiersPrefix सेट करें

    हर फ़ाइल को ऑब्फ़स्केट करते समय हाथ से अलग प्रीफ़िक्स दें (उदाहरण के लिए एक के लिए identifiersPrefix: 'auth_', दूसरी के लिए checkout_)। यह कारगर है, लेकिन बहुत सारी फ़ाइलें होने पर इसमें गलती की गुंजाइश रहती है, इसलिए ऊपर वाला रैंडम विकल्प बेहतर है।

    JavaScript

  • identifierNamesGenerator को hexadecimal पर बदलें

    Hexadecimal नामों का कीस्पेस कहीं बड़ा होता है, इसलिए दो फ़ाइलों के एक ही आइडेंटिफ़ायर बनाने की संभावना बहुत कम होती है, लेकिन अनोखेपन की गारंटी नहीं है। समझौता: आइडेंटिफ़ायर mangled-shuffled आउटपुट से लंबे होते हैं, इसलिए बंडल थोड़ा बड़ा होता है।

  • मल्टी-फ़ाइल बैच UI इस्तेमाल करें, या अपना बंडलर प्लगइन जाँचें

    डैशबोर्ड एक ही मल्टी-फ़ाइल बैच के भीतर हर फ़ाइल के लिए अलग प्रीफ़िक्स जोड़ता है (पेड प्लान); अलग-अलग बैच की फ़ाइलें फिर भी टकरा सकती हैं। अगर आप बंडलर प्लगइन इस्तेमाल करते हैं, तो यह मानने के बजाय कि वह भी ऐसा ही करता है, उसका व्यवहार जाँचें। अगर आप javascript-obfuscator पैकेज या API को खुद कॉल करते हैं, तो प्रीफ़िक्स आपको खुद चालू करना होगा।

समाधान की पुष्टि करने के लिए, संयुक्त एप्लिकेशन को फिर से बिल्ड और लोड करें और पक्का करें कि SyntaxError चली गई है। पुराने एरर संदेश वाला नाम अब एक से ज़्यादा चंक में डिक्लेयर नहीं होना चाहिए; प्रीफ़िक्स हर जनरेट किए गए नाम को बदल देता है, इसलिए ऊपर वाला grep केवल उसी खास नाम के बारे में बताता है, नए नामों के बारे में नहीं।

संबंधित विकल्प

  • randomIdentifiersPrefix - हर बिल्ड के लिए रैंडम प्रीफ़िक्स (अनुशंसित)
  • identifiersPrefix - स्पष्ट प्रीफ़िक्स स्ट्रिंग
  • identifierNamesGenerator - नामों का स्वरूप (mangled, hexadecimal, …)