django-pipeline 是一個 Django 下很是方便的靜態資源管理 app,尤爲是 1.2 版本以後,利用 django-staticfiles
的collectstatic
命令,在開發、部署環境下切換很是方便。css
寫 codinn.com 代碼的時候,靜態資源管理方面遇到了一些煩人的事情:python
django-pipeline 經過靜態資源版本化、自動 minify、分組合並 CSS/JS 文件、兼容 django-staticfiles
URL 規則以及collectstatic
命令。django
圖個省心,我一般使用 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'
啓用 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