Make Django Great Again Part 3 Sass Compiler

Sass 是一種CSS 的進階寫法,具有巢狀迴圈、變數、運算、函數、可繼承(Mixins)的語法。但是本身卻無法直接被瀏覽器解讀,因此需要借助“編譯器” 轉換成CSS 才能使用。

簡單說一說為什麼2017 年應該拋棄CSS,而使用Sass(SCSS)、less 來編寫CSS代碼。

變數:

假想一個情境,你使用一種色調在多個不同的styling中etc:

button.main{

    color: #353535;

}

.container-wrapper{

    color:#353535;

}

可是如果你發現顏色似乎不怎麼搭配時,更改所有色調就要一個一個去調動。這時使用變數就能解救你手動更改所有色碼的厄運。

sass:

$brown: #353535

.main

   color: $brown

.container-wrapper

   color: $brown

更動色碼時,就更改 $brown 的色碼就一次過更改了兩個物件的顏色

其他進階用法請參考:

http://programmermagazine.github.io/201409/htm/focus2.html

http://sass-lang.com/guide

一開始接觸Sass 時,我使用ruby 本身的指令集在Django 開發時編譯Sass:

sass --watch /Users/theblackcat/style.scss:/Users/theblackcat/style.css

之後寫了一個bash script 幫我處理編譯的指令,可是用起來還有有種在鄉道開法拉利的感覺。

好不容易找到了Django 的sass 自動編譯器: sass-processor

pip install django-sass-processor==0.5.4

安裝以後更改 settings.py

SASS_PROCESSOR_AUTO_INCLUDE = False

SASS_PROCESSOR_INCLUDE_FILE_PATTERN = r’^.+\.scss$’

SASS_PRECISION = 8

SASS_OUTPUT_STYLE = ‘compact’

INSTALLED_APPS = (

   …

   ‘sass_processor’,

   …

)

SASS_PROCESSOR_INCLUDE_DIRS = [

   os.path.join(BASE_DIR, ‘extra-styles/scss’),

   os.path.join(BASE_DIR, ‘node_modules’),

]

STATICFILES_FINDERS = [

   ‘django.contrib.staticfiles.finders.FileSystemFinder’,

   ‘django.contrib.staticfiles.finders.AppDirectoriesFinder’,

   ‘sass_processor.finders.CssFinder’,

]

STATIC_ROOT = os.path.join(BASE_DIR, ‘extra-styles/’)

STATIC_URL = ‘/static/’

STATICFILES_DIRS = (

     os.path.join(BASE_DIR, ‘assets’),

)

並且在assets 中建立新的文件夾新增新文件夾:

mkdir /assets/extra-styles

在extra-styles中新增 scss 文件,用來放置任何sass、 scss 檔案。這裡要注意,如果你用sass 各式在SASS_PROCESSOR_INCLUDE_FILE_PATTERN 的 .scss 改成 .sass。以上參數都設置完畢後,就可以直接在 assets/extra-styles/scss 中存方自己的 sass/ scss 檔案。

當執行runserver 指令以後,這時在 base directory 會自動生成一個 extra-styles 文件夾,裡面就是編譯好的各種sass/ scss 檔案。

在Template 中讀取它們不再像一般使用 static tags 來讀取,而是要 load sass 套件的 tag來讀取編譯的檔案。

base.html

…

<link rel=”stylesheet” type=”text/css” href=”\{\% sass_src ‘extra-styles/scss/style.scss’ \%\}”>

…

這時只要執行開發指令:

python manage.py runserver

任何 sass/ scss 就會被自動編譯,搭配前一篇的 livereload 設置的話,開發時就可以省去重新刷新瀏覽器的功夫了。

如果你喜歡我的文章或side projects,可以捐贈我一杯大熱美(大杯美式咖啡)支持我。

Written on January 3, 2017