Django 靜態資源管理利器:django-pipeline

django-pipeline 是一個 Django 下很是方便的靜態資源管理 app,尤爲是 1.2 版本以後,利用 django-staticfiles 的collectstatic 命令,在開發、部署環境下切換很是方便。css

寫 codinn.com 代碼的時候,靜態資源管理方面遇到了一些煩人的事情:python

  1. 爲了加速頁面加載速度,瀏覽器會緩存靜態文件,靜態資源更新後,瀏覽器極可能從緩存提取過時的靜態文件
  2. 本身寫的 CSS/JS 要手工 minify,很是麻煩
  3. 零碎的 CSS/JS 小文件太多
  4. CSS/JS minified 以後,開發環境下調試起來很不方便

django-pipeline 經過靜態資源版本化、自動 minify、分組合並 CSS/JS 文件、兼容 django-staticfiles URL 規則以及collectstatic 命令。django

slimit / jsmin

圖個省心,我一般使用 jsmin/cssmin 這兩個 Python minifier:瀏覽器

PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.jsmin.JSMinCompressor'
PIPELINE_CSS_COMPRESSOR = 'pipeline.compressors.cssmin.CssminCompressor'

 緩存

可是 jsmin 年久失修,實際使用結論是:jsmin 是有 bug 的,jQuery 開發庫用 jsmin minify 後被破壞,壓根沒法正常工做。可是 jQuery 官方 minify 以後的 JS 文件再用 jsmin minify 以後卻沒有問題。app

雖然有規避方案,但始終對 jsmin 不放心,索性改用 slimit,暫時還沒發現 JS 被破壞的問題。python2.7

django-pipeline 未提供對 slimit 的支持,不過 pipeline 的擴展性還不錯,寫一個 slimit 擴展也是分鐘的事情:post

from __future__ import absolute_import編碼

from pipeline.compilers import CompilerBase調試

class SlimItCompiler(CompilerBase):
    """
JS compressor based on the Python library slimit
(http://pypi.python.org/pypi/slimit/).
"""
    def compress_js(self, js):
        from slimit import minify
        return minify(js)

 

將以上代碼保存成 slimit 文件,扔在項目中的某個包目錄下便可,再修改 settings

PIPELINE_JS_COMPRESSOR = 'lib.slimit.SlimItCompiler'

UnicodeDecodeError: 'ascii' codec can't decode byte 問題

啓用 django-pipeline 後,執行 manage.py collectstatic 若是碰到下面的錯誤提示:

File ".../ENV/local/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 226, in post_process
    content = pattern.sub(converter, content)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)

八成是由於 CSS 文件中含有中文或其它非拉丁文字。我在使用 @font-face 圖標文字時碰到了這個問題,這是 django staticfiles 包的一個 bug,解決方法是修改 /django/contrib/staticfiles/storage.py 文件,把出錯的那行代碼:

content = original_file.read()

替換成:

content = original_file.read().decode('utf-8')

用這個方法的前提是:你的 CSS 文件必須保證 utf-8 編碼,不然依然會出錯。

PS,給 Django 項目提交了一個 bug 報告:https://code.djangoproject.com/ticket/18430

參考連接:

相關文章
相關標籤/搜索