הכלי Closure Compiler מאפשר לבחור מבין שלוש רמות של קומפילציה, החל מהסרה פשוטה של רווחים ותגובות ועד לשינויים משמעותיים בקוד.
WHITESPACE_ONLY
ברמת ההידור WHITESPACE_ONLY
התגובות מוסרות מהקוד, וגם מעברי שורה, רווחים מיותרים, סימני פיסוק מיותרים (כמו סוגריים ונקודה-פסיק) ורווחים לבנים אחרים. הפלט של JavaScript זהה מבחינת הפונקציונליות ל-JavaScript המקורי.
הידור של תכונות שפה ימשיך להתבצע אם מצב שפת הפלט המבוקש שונה ממצב שפת הקלט.
אפשר לעיין ב--language_in
וב--language_out
בקטע Flags and Options.
רמת הדחיסה הזו מספקת את הדחיסה הכי פחות טובה מבין שלוש הרמות.
SIMPLE_OPTIMIZATIONS
רמת הקומפילציה SIMPLE_OPTIMIZATIONS
מבצעת את אותה הסרה של רווחים לבנים והערות כמו WHITESPACE_ONLY
, אבל היא גם מבצעת אופטימיזציות בתוך ביטויים ופונקציות, כולל שינוי השם של משתנים מקומיים ופרמטרים של פונקציות לשמות קצרים יותר. שינוי השם של משתנים לשמות קצרים יותר מקטין את הקוד באופן משמעותי. מכיוון שהרמה SIMPLE_OPTIMIZATIONS
משנה את השם רק של סמלים מקומיים לפונקציות, היא לא מפריעה לאינטראקציה בין קוד ה-JavaScript שעבר קומפילציה לבין קוד JavaScript אחר.
קומפילציה עם SIMPLE_OPTIMIZATIONS
תמיד שומרת על הפונקציונליות של JavaScript שתקף מבחינת התחביר, בתנאי שהקוד לא ניגש למשתנים מקומיים באמצעות שמות של מחרוזות (למשל באמצעות הצהרות eval()
או באמצעות קריאה ל-toString בפונקציות).
SIMPLE_OPTIMIZATIONS
היא רמת הקומפילציה שמוגדרת כברירת מחדל.
ADVANCED_OPTIMIZATIONS
ADVANCED_OPTIMIZATIONS
ברמת הקומפילציה מתבצעים אותם שינויים כמו ברמה SIMPLE_OPTIMIZATIONS
, אבל נוספים מגוון שינויים גלובליים אגרסיביים יותר כדי להשיג את הדחיסה הגבוהה ביותר מבין שלוש הרמות. רמת ADVANCED_OPTIMIZATIONS
מאפשרת דחיסה של JavaScript הרבה מעבר למה שאפשר להשיג באמצעות כלים אחרים.
כדי להפעיל את הדחיסה הקיצונית הזו, ADVANCED_OPTIMIZATIONS
מניח הנחות חזקות לגבי הקוד שעבר קומפילציה. אם הקוד לא תואם להנחות האלה, ADVANCED_OPTIMIZATIONS
ייצור קוד שלא יפעל.
לדוגמה, קוד שעבר קומפילציה באמצעות ADVANCED_OPTIMIZATIONS
לא יכול לפעול עם קוד שלא עבר קומפילציה, אלא אם מבצעים פעולות מיוחדות כדי להבטיח יכולת פעולה הדדית. אם לא תסמנו פונקציות חיצוניות ומאפיינים שההפניה אליהם מופיעה בקוד, Closure Compiler ישנה את השמות של ההפניות בקוד באופן לא מתאים, וכך ייווצר חוסר התאמה בין השמות בקוד לבין השמות בקוד החיצוני.
כדי לקבל מידע נוסף על הכנת הקוד ל-ADVANCED_OPTIMIZATIONS
, אפשר לקרוא את המאמר Advanced Compilation and Externs.
הטרנספורמציות ADVANCED_OPTIMIZATIONS
כוללות:
- שינוי שם אגרסיבי יותר:
קומפילציה עם
SIMPLE_OPTIMIZATIONS
רק משנה את השם של פרמטרים ומשתנים בתוך פונקציות. ADVANCED_OPTIMIZATIONS
גם משנה את השם של משתנים גלובליים, שמות של פונקציות ומאפיינים. - הסרת קוד לא פעיל:
קומפילציה עם
ADVANCED_OPTIMIZATIONS
מסירה קוד שניתן להוכיח שהוא לא נגיש. האפשרות הזו שימושית במיוחד בשילוב עם ספריות גדולות. אם משתמשים רק בכמה פונקציות מקובץ גדול של ספרייה, הקומפיילר יכול להסיר מהפלט שלו את כל הפונקציות חוץ מאלה. - הוספה של קוד inline באופן גלובלי:
קומפילציה עם
ADVANCED_OPTIMIZATIONS
מחליפה חלק מהקריאות לפונקציות בגוף הפונקציה. השינוי הזה נקרא 'הטמעה'. הקומפיילר מבצע inline לפונקציות רק אם הוא קובע שהפעולה הזו בטוחה וחוסכת מקום. קומפילציה עםADVANCED_OPTIMIZATIONS
גם מבצעת החלפה של קבועים וחלק מהמשתנים, כשהקומפיילר קובע שאפשר לעשות זאת בצורה בטוחה.
איך מגדירים את רמת הקומפילציה
כדי להגדיר את רמת הקומפילציה באפליקציית Closure Compiler, צריך לכלול את התג --compilation_level
בשורת הפקודה עם ערך של WHITESPACE_ONLY
, SIMPLE
או ADVANCED
, כמו בפקודה הבאה:
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js