Merge pull request #1544 from umap-project/compress-static

feat: compress static in collectstatic post_process
This commit is contained in:
Yohan Boniface 2024-01-19 17:51:13 +01:00 committed by GitHub
commit 969b02e7a0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 76 additions and 71 deletions

View file

@ -24,21 +24,6 @@ The hosts that uMap expects.
Can be set through env var too: `ALLOWED_HOSTS=umap.mydomain.org,u.mydomain.org` Can be set through env var too: `ALLOWED_HOSTS=umap.mydomain.org,u.mydomain.org`
#### COMPRESS_ENABLED
#### COMPRESS_STORAGE
To activate the compression of the static files, you can set this flag to `True`.
You can then run the following command to compress the assets:
```bash
umap compress
```
Optionally add `COMPRESS_STORAGE = "compressor.storage.GzipCompressorFileStorage"`
and add `gzip_static on` directive to Nginx `/static` location, so Nginx will
serve pregenerated files instead of compressing them on the fly.
#### DEBUG #### DEBUG
Set it to `True` for easier debugging in case of error. Set it to `True` for easier debugging in case of error.

View file

@ -143,9 +143,8 @@ Here are the commands you'll need to run to create the tables, collect the stati
# Create the database tables # Create the database tables
umap migrate umap migrate
# Collect and compress static files # Collect static files
umap collectstatic umap collectstatic
umap compress
# Create a super user # Create a super user
umap createsuperuser umap createsuperuser
@ -167,5 +166,4 @@ Usually, for upgrading, you need those steps:
pip install umap-project --upgrade pip install umap-project --upgrade
umap migrate umap migrate
umap collectstatic umap collectstatic
umap compress
``` ```

View file

@ -37,6 +37,8 @@ dependencies = [
"Pillow==10.0.1", "Pillow==10.0.1",
"psycopg2==2.9.6", "psycopg2==2.9.6",
"requests==2.31.0", "requests==2.31.0",
"rcssmin==1.1.2",
"rjsmin==1.2.2",
"social-auth-core==4.4.2", "social-auth-core==4.4.2",
"social-auth-app-django==5.2.0", "social-auth-app-django==5.2.0",
] ]

View file

@ -169,7 +169,7 @@ STORAGES = {
"BACKEND": "django.core.files.storage.FileSystemStorage", "BACKEND": "django.core.files.storage.FileSystemStorage",
}, },
"staticfiles": { "staticfiles": {
"BACKEND": "umap.utils.UmapManifestStaticFilesStorage", "BACKEND": "umap.storage.UmapManifestStaticFilesStorage",
}, },
} }

71
umap/storage.py Normal file
View file

@ -0,0 +1,71 @@
from pathlib import Path
from django.conf import settings
from django.contrib.staticfiles.storage import ManifestStaticFilesStorage
from rcssmin import cssmin
from rjsmin import jsmin
class UmapManifestStaticFilesStorage(ManifestStaticFilesStorage):
support_js_module_import_aggregation = True
# We remove `;` at the end of all regexps to match our prettier config.
_js_module_import_aggregation_patterns = (
"*.js",
(
(
(
r"""(?P<matched>import(?s:(?P<import>[\s\{].*?))"""
r"""\s*from\s*['"](?P<url>[\.\/].*?)["']\s*)"""
),
'import%(import)s from "%(url)s"\n',
),
(
(
r"""(?P<matched>export(?s:(?P<exports>[\s\{].*?))"""
r"""\s*from\s*["'](?P<url>[\.\/].*?)["']\s*)"""
),
'export%(exports)s from "%(url)s"\n',
),
(
r"""(?P<matched>import\s*['"](?P<url>[\.\/].*?)["']\s*)""",
'import"%(url)s"\n',
),
(
r"""(?P<matched>import\(["'](?P<url>.*?)["']\))""",
"""import("%(url)s")""",
),
),
)
# https://github.com/django/django/blob/0fcee1676c7f14bb08e2cc662898dee56d9cf207↩
# /django/contrib/staticfiles/storage.py#L78C5-L105C6
patterns = (
(
"*.css",
(
r"""(?P<matched>url\(['"]{0,1}\s*(?P<url>.*?)["']{0,1}\))""",
(
r"""(?P<matched>@import\s*["']\s*(?P<url>.*?)["'])""",
"""@import url("%(url)s")""",
),
# Remove CSS source map rewriting
),
),
# Remove JS source map rewriting
)
def post_process(self, paths, **options):
collected = super().post_process(paths, **options)
for original_path, processed_path, processed in collected:
if processed_path.endswith(".js"):
path = Path(settings.STATIC_ROOT) / processed_path
initial = path.read_text()
minified = jsmin(initial)
path.write_text(minified)
if processed_path.endswith(".css"):
path = Path(settings.STATIC_ROOT) / processed_path
initial = path.read_text()
minified = cssmin(initial)
path.write_text(minified)
yield original_path, processed_path, True

View file

@ -24,7 +24,7 @@ def test_javascript_have_been_loaded(
): ):
settings.STORAGES["staticfiles"][ settings.STORAGES["staticfiles"][
"BACKEND" "BACKEND"
] = "umap.utils.UmapManifestStaticFilesStorage" ] = "umap.storage.UmapManifestStaticFilesStorage"
datalayer.settings["displayOnLoad"] = False datalayer.settings["displayOnLoad"] = False
datalayer.save() datalayer.save()
map.settings["properties"]["defaultView"] = "latest" map.settings["properties"]["defaultView"] = "latest"

View file

@ -2,7 +2,6 @@ import gzip
import os import os
from django.conf import settings from django.conf import settings
from django.contrib.staticfiles.storage import ManifestStaticFilesStorage
from django.urls import URLPattern, URLResolver, get_resolver from django.urls import URLPattern, URLResolver, get_resolver
@ -163,53 +162,3 @@ def merge_features(reference: list, latest: list, incoming: list):
merged.append(item) merged.append(item)
return merged return merged
class UmapManifestStaticFilesStorage(ManifestStaticFilesStorage):
support_js_module_import_aggregation = True
# We remove `;` at the end of all regexps to match our prettier config.
_js_module_import_aggregation_patterns = (
"*.js",
(
(
(
r"""(?P<matched>import(?s:(?P<import>[\s\{].*?))"""
r"""\s*from\s*['"](?P<url>[\.\/].*?)["']\s*)"""
),
'import%(import)s from "%(url)s"\n',
),
(
(
r"""(?P<matched>export(?s:(?P<exports>[\s\{].*?))"""
r"""\s*from\s*["'](?P<url>[\.\/].*?)["']\s*)"""
),
'export%(exports)s from "%(url)s"\n',
),
(
r"""(?P<matched>import\s*['"](?P<url>[\.\/].*?)["']\s*)""",
'import"%(url)s"\n',
),
(
r"""(?P<matched>import\(["'](?P<url>.*?)["']\))""",
"""import("%(url)s")""",
),
),
)
# https://github.com/django/django/blob/0fcee1676c7f14bb08e2cc662898dee56d9cf207↩
# /django/contrib/staticfiles/storage.py#L78C5-L105C6
patterns = (
(
"*.css",
(
r"""(?P<matched>url\(['"]{0,1}\s*(?P<url>.*?)["']{0,1}\))""",
(
r"""(?P<matched>@import\s*["']\s*(?P<url>.*?)["'])""",
"""@import url("%(url)s")""",
),
# Remove CSS source map rewriting
),
),
# Remove JS source map rewriting
)