complexity वह एक dial है जो तय करता है कि engine कितनी सुरक्षा लागू करे। एक preset इस पर एक नामित बिंदु है: light का मान 5 है, hard का 12। light identifiers को rename करता है, syntax को दोबारा लिखता है और strings को encode करता है, बिना किसी संरचनात्मक layer के; medium और ऊपर, और सीधे सेट किए गए किसी भी मान के लिए, हर token को target की ओर ले जाया जाता है। बीच के या उससे आगे के मान के लिए complexity सीधे सेट करें — यह एक असीमित गैर-ऋणात्मक संख्या है।
संख्या के साथ क्या बढ़ता है
Complexity एक budget है, कोई schedule नहीं। "इस संख्या पर यह feature" जैसी कोई निश्चित सूची नहीं है। 0 से ऊपर, मान बढ़ने के साथ engine बड़ा budget खर्च करता है और हर build में तय करता है कि कौन-से transformations लागू हों — इसलिए एक ही complexity पर दो builds की संरचना अलग होती है, और किसी दिए गए स्तर पर कोई एक transformation निश्चित नहीं है। हर build का यही अंतर असली मकसद है: निश्चित संरचना एक fingerprint क्यों बन जाती, यह जानने के लिए देखें AfterPack कैसे काम करता है।
तीन चीज़ें निश्चित हैं:
complexity | क्या गारंटीड है |
|---|---|
0 (minify) | कोई obfuscation नहीं। Identifiers rename किए जाते हैं और code compress किया जाता है; नीचे का कुछ भी नहीं चलता। Engine 0.2.2 0 पर syntax को भी दोबारा लिखता था। |
> 0 | हर string literal जिसे engine फिर से लिख सकता है, एक runtime decoder से होकर जाता है — यही string floor है। |
≥ 7 (medium और ऊपर) | Encoded strings और integers एक साझा runtime value से keyed होते हैं, और object literals अलग-अलग आकारों में दोबारा बनाए जाते हैं। |
बाकी सब — control-flow reshaping, opaque predicates, integer-expression interpretation और अन्य — budget बढ़ने के साथ उसी से लिया जाता है, किसी एक रेखा पर चालू नहीं होता। inflation.max यह नहीं बदलता कि इनमें से कौन-से लागू हों: सेट न होने पर केवल target तय करता है, और जो build आपके सेट किए मान से आगे बढ़ती, वह विफल हो जाती है।
किसी transformation को बंद या चालू करना
आप किसी भी तरह के transformation को बंद कर सकते हैं। किसी को ज़बरदस्ती चालू नहीं कर सकते।
- बंद करना भरोसेमंद है।
transforms.<kind>.enabled = falseउस kind को किसी भी complexity पर हटा देता है। Engine 0.2.3 से,7और ऊपरscopeDeepenबंद करने से फ़ाइल का कोई हिस्सा अपने target से नीचे रह सकता है, और तब buildDIAG_TARGET_NOT_REACHEDके साथ fail होती है और lines का नाम बताती है। - चालू करना एक अनुमति है।
trueengine को एक kind इस्तेमाल करने देता है; फिर भी वह हर build में तय करता है कि complexity और budget को उसकी ज़रूरत है या नहीं। आपके द्वारा बढ़ाए गए region के बाहर,lightbuild जो kinds लागू करती है, वे केवल string encoding और, Pro पर,comparisonHardeningहैं।objectConstructionकेवल7(medium) और ऊपर दिखता है, और दो Pro kinds के लिए Pro build चाहिए। 0पर इनमें से कुछ भी लागू नहीं होता।minifyकोई transformation नहीं चलाता, इसलिए हरtransformsflag बेमानी है।
किसी transformation की संभावना बढ़ाने के लिए, कोई flag बदलने के बजाय complexity बढ़ाएँ।
आगे
- Presets: नामित स्तर और हर एक का तय किया size budget।
- Configuration: हर key,
transforms.<kind>.enabledflags समेत। - AfterPack कैसे काम करता है: transformations का set हर build में क्यों बदलता है।
- Directives: किसी एक region के लिए अलग complexity (Pro)।