לעשות קומפילציה אוטומטית של קבצי SASS עם Grunt.js

סביבת עבודה מודרנית עם SASS ו-grunt שמקפל לקבצי CSS בכל שינוי.

במדריך שלי על SASS, הסברתי איך משתמשים בתוכנה חיצונית על מנת לעבוד עם קבצי SASS ולקמפל אותם לקבצי CSS מוכנים. בעוד שהתוכנה היא מצוינת ללימוד, להתנסות ראשונית ואף לפרויקטים קטנים, כדאי מסיבות רבות לעבוד עם Grunt או עם מקביליו בנוגע למעקב וקומפילציה אוטומטיים לקבצי SASS. מה זאת אומרת? אעדכן את קבצי ה-SASS בפרויקט שלי בשופי ובנחת, כאשר אשמור אחד מהם, grunt ידע לאסוף את כל קבצי ה-SASS, לקמפל וליצור מהם את קבצי ה-CSS המתאימים. בדרך אני יכול להוסיף עוד משימות כמו כיווץ, מיניפקציה או בדיקה סטטית של קוד ועוד שלל משימות כיפיות ושימושיות.

אם אתם לא מכירים את Grunt.js, כדאי להציץ במאמר ההסבר הראשוני על Grunt.js.

אז איך אני עושה את זה? אני משתמש בתוסף הרשמי של grunt ל-SASS ששימו הוא grunt contrib sass. התוסף הזה יסייע לי בקומפילציה. איך הוא עובד? ההתקנה היא פשוטה:

npm install grunt-contrib-sass 

נורא חשוב שיהיה לכם ruby + sass מותקנים על המחשב. במק/לינוקס זה די פשוט, זה אמור להיות פשוט גם בחלונות. אם יש לכם לינוקס, ההתקנה הולכת ככה:

sudo apt-get install ruby
sudo gem install sass

ועכשיו לכתיבת קובץ ה-grunt! האמת הוא שהמבנה שלו די פשוט! כל מה שצריך הוא להגדיר מה תיקית המוצא, אם אני רוצה להכנס לכל התיקיות שיש תחת תיקית המוצא (כלומר לעבוד ריקורסיבית מתיקית המוצא ומטה), איפה לשים את התוצאה המקומפלת ותחת איזו סיומת.

קודם כל, לא נשכח להגדיר ל-Grunt.js עם איזה מודול לעבוד, במקרה הזה grunt-contrib-sass. את זה אנו עושים עם loadNpmTasks בתחתית קובץ ה-grunt.

grunt.loadNpmTasks('grunt-contrib-sass');

עכשיו, כל מה שצריך לעשות זה להגדיר את המשימה. איך עושים את זה? ככה:

sass: {
    dist: {
      files: [{
        cwd: 'source-scss', //start in THIS direcory
        expand: true, //descent into directories 
        src: ['*.scss'], //patttern for files
        dest: 'public', //destination folder
        ext: '.css' //destination file extension
      }]
    }
  }

בגדול, פרמטר cwd הוא התיקיה שכוללת את כל קבצי ה-scss שלנו. אין בעיה שיהיו בה עוד תיקיות, אבל אז אנו חייבים להכניס את פרמטר expand שבו אנו קובעים שה-Grunt יעשה חיפוש בכל תת התיקיות של התיקיה שאנו מגדירים ב-cwd (במקרה הזה source-scc). בפרמטר src אנו מגדירים שהוא יעבוד על כל קבצי ה-scss. איפה קבצי ה-CSS המקומפלים יישפכו? לאן שאנו מגדירים אותם ב-dest. מה הסיומת שלהם? מה שנגדיר ב-ext.

קל ופשוט, לא? אם הכל תקין, כשנריץ grunt sass, זה מה שנקבל:

$ grunt sass Running "sass:dist" (sass) task Done, without errors.
$ grunt sass
Running "sass:dist" (sass) task
Done, without errors.

עכשיו אפשר לשלב את זה עם משימת grunt watch שעליה כבר כתבתי מאמר.

ראשית, לא נשכח להתקין את הרכיב שמאפשר ל-grunt להאזין לקבצים:

npm install grunt-contrib-watch

עכשיו, כל מה שנותר לנו לעשות זה לתת ל-grunt הוראה לכלול את המודול הזה וליצור משימת watch. הקובץ המלא נראה כך:

module.exports = function(grunt) {

    grunt.initConfig({

        sass: {
            dist: {
                files: [{
                    cwd: 'source-scss', //start in THIS direcory
                    expand: true, //descent into directories 
                    src: ['*.scss'], //patttern for files
                    dest: 'public', //destination folder
                    ext: '.css' //destination file extension
                }]
            }
        },


        watch: {
            scripts: {
                files: ['source-scss/*.scss'], //watching over scss files
                tasks: ['sass'], //running sass tasks
                options: {
                    spawn: false,
                },
            },
        }
    });

    grunt.loadNpmTasks('grunt-contrib-sass');
    grunt.loadNpmTasks('grunt-contrib-watch');

};

במשימת ה-watch, כל מה שצריך לעשות זה להגדיר אחרי איזה קבצים לעקוב. במקרה שלנו – אחרי קבצי ה-scss שאנו משנים. וכמובן להגדיר איזו משימה להריץ מיד לאחר השינוי – במקרה שלנו משימת sass.

על מנת להפעיל את זה, כל מה שצריך לעשות זה לכתוב grunt watch. הנה, ככה זה נראה ברגע שאני משנה קבצים:

$ grunt watch Running "watch" task Waiting... >> File "source-scss/mystyle.scss" changed.  Running "sass:dist" (sass) task  Running "watch" task Completed in 0.399s at Sat Aug 01 2015 13:14:50 GMT+0300 (IDT) - Waiting...
$ grunt watch
Running "watch" task
Waiting…
>> File "source-scss/mystyle.scss" changed.
Running "sass:dist" (sass) task
Running "watch" task
Completed in 0.399s at Sat Aug 01 2015 13:14:50 GMT+0300 (IDT) – Waiting…

כמובן שאפשר להריץ עוד משימות על ה-CSS שנוצר כתוצאה מהקימפול.

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

המנעו מהעלאת source control לשרת פומבי

לא תאמינו כמה אתרים מעלים את ה-source control שלהם לשרת. ככה תמצאו אותם וגם הסבר למה זה רעיון רע.

גלילה לראש העמוד