PythonのDjangoフレームワークの静的リソースマネージャdjango-pipelineについて説明します

2693 ワード

django-pipelineはDjangoで非常に便利な静的リソース管理appであり、特に1.2バージョン以降、django-staticfilesのcollectstaticコマンドを利用して、開発、導入環境での切り替えが非常に便利である.
書くcomコードの時、静的資源管理の面でいくつかの煩わしいことに遭遇しました.
  • ページのロード速度を速めるため、ブラウザは静的ファイルをキャッシュし、静的リソースが更新すると、ブラウザはキャッシュから期限切れの静的ファイル
  • を抽出する可能性が高い.
  • 自分で書いたCSS/JSは手作業でminifyしなければならなくて、とても面倒です
  • こまごましたCSS/JSファイルが多すぎます
  • CSS/JS minified以降、開発環境でデバッグするのは不便です
  • django-pipelineは、静的リソースのバージョン化、自動minify、パケットマージCSS/JSファイル、互換django-staticfiles URLルール、collectstaticコマンドを使用します.slimit/jsmin
    図は安心して、私は通常jsmin/cssminのこの2つのPython minifierを使います:
       
    
     PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.jsmin.JSMinCompressor'
      PIPELINE_CSS_COMPRESSOR = 'pipeline.compressors.cssmin.CssminCompressor'
    

    しかし、jsminは長年修理されておらず、実際の使用結論は、jsminにはバグがあり、jQuery開発ライブラリはjsmin minifyで破壊され、根本的に正常に動作しない.ただしjQuery公式minify以降のJSファイルはjsmin minify以降は問題ありません.
    回避策はあるものの、あくまでもjsminに不安があり、いっそslimitに変更し、JSが破壊された問題はまだ発見されていない.
    django-pipelineはslimitのサポートを提供していませんが、pipelineの拡張性は悪くありません.slimit拡張を書くのも分です.
      
    
     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)
    

    8割はCSSファイルに中国語またはその他の非ラテン文字が含まれているためです.@font-faceアイコン文字を使用するときにこの問題に遭遇しました.これはdjango staticfilesパッケージのバグです.解決策は/django/contrib/staticfiles/storageを修正することです.pyファイル、エラーの行コードを:
       
    
    content = original_file.read()
    

    置換先:
      
    
     content = original_file.read().decode('utf-8')
    

    この方法を使用する前提は、CSSファイルがutf-8符号化を保証しなければならないことです.そうしないと、エラーが発生します.
    PSは、Djangoプロジェクトにバグレポートを提出しました.https://code.djangoproject.com/ticket/18430