本文目录导读:

Django 不会自动压缩静态资源。
Django 默认的开发服务器(runserver)和静态文件处理方式(django.contrib.staticfiles)只是负责收集和提供原始文件,不进行任何压缩或合并。
如果你希望实现自动化压缩(如 CSS/JS 压缩、添加版本号、合并文件),需要引入第三方工具或配置。
推荐的解决方案
使用 django-compressor(最常用)
这个库可以在模板中通过标签自动压缩 CSS/JS:
- 安装:
pip install django-compressor - 配置:在
settings.py中添加'compressor'到INSTALLED_APPS - 使用:在模板中用
{% compress css %}或{% compress js %}包裹资源
示例(模板):
{% load compress %}
{% compress css %}
<link rel="stylesheet" href="{% static 'css/style1.css' %}">
<link rel="stylesheet" href="{% static 'css/style2.css' %}">
{% endcompress %}
优点:支持合并文件、删除空白、压缩代码,并自动添加版本号(基于文件内容 hash)。
使用 django-pipeline
另一个成熟的静态文件打包工具,功能类似,但配置方式略有不同:
- 安装:
pip install django-pipeline - 配置:在
settings.py中定义打包规则 - 使用:在模板中引用打包后的文件组名
优点:支持 CSS/JS 压缩、合并,以及 LESS/Sass 预编译。
结合 Webpack/Vite 的前端构建方案(现代项目推荐)
如果项目使用了现代前端框架(如 Vue、React),更推荐在前端工具链中完成压缩:
- 使用 Webpack、Vite、Parcel 等工具进行构建
- 构建后输出
*.min.css和*.min.js文件 - Django 只负责收集构建后的成品文件
优点:压缩效果更好、支持 ES6+/TypeScript、更灵活。
纯手动或运维层面压缩
- 开发时:直接使用 CDN 上已压缩的库(如
jquery.min.js) - 部署时:用
collectstatic收集文件后,通过 Nginx 等 Web 服务器启用 gzip 压缩(这只传输时压缩,不改变文件本身)
为什么 Django 不内置这个功能?
Django 的设计哲学是 提供核心功能,但把非必需或可能有多种实现方式的功能留给社区,自动压缩涉及:
- 合并文件时的顺序依赖
- 不同压缩算法(如 UglifyJS、CSSO)
- 缓存失效与版本号管理
- 与前端构建工具的集成方式
因为这些需求在每个项目中差异很大,Django 官方认为不应该强制一种方案,而是让开发者根据实际情况选择最合适的工具。
| 场景 | 推荐方案 |
|---|---|
| 快速实现压缩(不改变开发流程) | django-compressor |
| 需要打包合并+压缩 | django-compressor 或 django-pipeline |
| 使用现代前端框架 | Webpack/Vite 构建+collectstatic |
| 只需要 gzip 传输压缩 | Nginx 配置 gzip |
一句话:Django 不会自动压缩,你必须通过 django-compressor、django-pipeline 或前端构建工具来实现。