Django Static Precompiler provides template tags to compile CoffeeScript, SASS / SCSS, LESS, and Babel. It works with both inline code and external files.
Add "static_precompiler" to INSTALLED_APPS setting.
Initialize DB:
- On Django < 1.7 run
syncdb
ormigrate static_precompiler
if you use South (1.0 is required). - On Django >= 1.7 run
migrate static_precompiler
.
- On Django < 1.7 run
Make sure that you have necessary compilers installed.
Optionally, you can specify the full path to compilers (see below).
In case you use Django’s staticfiles contrib app you have to add static-precompiler’s file finder to the
STATICFILES_FINDERS
setting, for example:STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', # other finders.. 'static_precompiler.finders.StaticPrecompilerFinder', )
Note that by default compiled files are saved into COMPILED
folder under your STATIC_ROOT
(or MEDIA_ROOT
if you have no STATIC_ROOT
in your settings).
You can change this folder with STATIC_PRECOMPILER_ROOT
and STATIC_PRECOMPILER_OUTPUT_DIR
settings.
Note that all relative URLs in your stylesheets are converted to absolute URLs using your STATIC_URL
setting.
{% compile %}
is a template tag that allows to compile any source file supported by compilers configured with
STATIC_PRECOMPILER_COMPILERS
settings.
{% load compile_static %} <script src="{{ STATIC_URL}}{% compile "path/to/script.coffee" %}"></script> <link rel="stylesheet" href="{{ STATIC_URL}}{% compile "path/to/styles1.less" %}" /> <link rel="stylesheet" href="{{ STATIC_URL}}{% compile "path/to/styles2.scss" %}" />
renders to:
<script src="/static/COMPILED/path/to/script.js"></script> <link rel="stylesheet" href="/static/COMPILED/path/to/styles1.css" /> <link rel="stylesheet" href="/static/COMPILED/path/to/styles2.css" />
Compiles everything between {% inlinecompile %}
and {% endinlinecompile %}
with compiler specified by name.
Compiler must be specified in STATIC_PRECOMPILER_COMPILERS
setting. Names for default compilers are:
coffeescript
babel
less
sass
scss
stylus
{% load compile_static %} <script type="text/javascript"> {% inlinecompile "coffeescript" %} console.log "Hello, World!" {% endinlinecompile %} </script>
renders to:
<script type="text/javascript"> (function() { console.log("Hello, World!"); }).call(this); </script>
STATIC_PRECOMPILER_COMPILERS
List of enabled compilers. You can modify it to enable your custom compilers. Default:
STATIC_PRECOMPILER_COMPILERS = ( 'static_precompiler.compilers.CoffeeScript', 'static_precompiler.compilers.Babel', 'static_precompiler.compilers.SASS', 'static_precompiler.compilers.SCSS', 'static_precompiler.compilers.LESS', 'static_precompiler.compilers.Stylus', )
You can specify compiler options using the following format:
STATIC_PRECOMPILER_COMPILERS = ( ('static_precompiler.compilers.CoffeeScript', {"executable": "/usr/bin/coffeescript"}), ('static_precompiler.compilers.SCSS', {"compass_enabled": True}), )
STATIC_PRECOMPILER_ROOT
- Controls the absolute file path that compiled files will be written to. Default:
STATIC_ROOT
. STATIC_PRECOMPILER_OUTPUT_DIR
- Controls the directory inside
STATIC_PRECOMPILER_ROOT
that compiled files will be written to. Default:"COMPILED"
. STATIC_PRECOMPILER_USE_CACHE
- Whether to use cache for inline compilation. Default:
True
. STATIC_PRECOMPILER_CACHE_TIMEOUT
- Cache timeout for inline styles (in seconds). Default: 30 days.
STATIC_PRECOMPILER_MTIME_DELAY
- Cache timeout for reading the modification time of source files (in seconds). Default: 10 seconds.
STATIC_PRECOMPILER_CACHE_NAME
- Name of the cache to be used. If not specified then the default django cache is used. Default:
None
. STATIC_PRECOMPILER_PREPEND_STATIC_URL
- Add
STATIC_URL
to the output of template tags. Default:False
STATIC_PRECOMPILER_DISABLE_AUTO_COMPILE
- Disable automatic compilation from template tags or
compile_static
utility function. Files are compiled only withcompilestatic
command (see below). Default::False
STATIC_PRECOMPILER_LIST_FILES
- Whether or not
static_precompiler.finders.StaticPrecompilerFinder
will list compiled files whencollectstatic
command is executed. Set toTrue
if you want compiled files to be found bycollectstatic
. Default::False
.
executable
- Path to CoffeeScript compiler executable. Default:
"coffee"
.
Example:
STATIC_PRECOMPILER_COMPILERS = ( ('static_precompiler.compilers.CoffeeScript', {"executable": "/usr/bin/coffee"}), )
executable
- Path to Babel compiler executable. Default:
"babel"
.
Example:
STATIC_PRECOMPILER_COMPILERS = ( ('static_precompiler.compilers.Babel', {"executable": "/usr/bin/babel"}), )
executable
- Path to SASS compiler executable. Default: "sass".
compass_enabled
- Boolean. Wheter to use compass or not. Compass must be installed in your system. Run "sass --compass" and if no error is shown it means that compass is installed.
Example:
STATIC_PRECOMPILER_COMPILERS = ( ('static_precompiler.compilers.SCSS', {"executable": "/usr/bin/sass", "compass_enabled": True}), )
executable
- Path to LESS compiler executable. Default:
"lessc"
.
Example:
STATIC_PRECOMPILER_COMPILERS = ( ('static_precompiler.less.LESS', {"executable": "/usr/bin/lessc"), )
executable
- Path to Stylus compiler executable. Default:
"stylus"
.
Example:
STATIC_PRECOMPILER_COMPILERS = ( ('static_precompiler.less.Stylus', {"executable": "/usr/bin/stylus"), )
If you want to use static_precompiler
in form media definitions, you can use the following approach:
from django import forms from static_precompiler.utils import compile_static class MyForm(forms.Form): @property def media(self): return forms.Media( css={"all": ( compile_static("styles/myform.scss"), )}, js=( compile_static("scripts/myform.coffee"), ) )
Django Static Precompiler includes a management command compilestatic
. If will scan your static files for source
files and compile all of them.
You can use this command in conjunction with STATIC_PRECOMPILER_DISABLE_AUTO_COMPILE
setting if you use custom
STATICFILES_STORAGE
such as S3 or some CDN. In that case you can should run compilestatic
every time when your
source files change and then run collectstatic
.
You can run compilestatic
in watch mode (--watch
option). In watch mode it will monitor the changes in your
source files and re-compile them on the fly. It can be handy if you use tools such as
LiveReload.
You should install Watchdog to use watch mode.
If you get [Errno 2] No such file or directory
make sure that you have the required compiler installed. For all
compilers you can specify the path to executable file using the executable
option, see examples above.
If you run migrate
and get ImportError: cannot import name migrations
then most likely you use Django < 1.7 and
South < 1.0. You should either upgrade to Django 1.7+ or use South 1.0.