Opened 13 years ago
Last modified 7 months ago
#9936 new enhancement
CSS and JS files should be versioned — at Version 7
Reported by: | Owned by: | Remy Blank | |
---|---|---|---|
Priority: | high | Milestone: | next-major-releases |
Component: | web frontend | Version: | 0.12.1 |
Severity: | normal | Keywords: | htdocs css js |
Cc: | peter.westwood@…, osimons, Jun Omae, leho@…, trac-tickets@…, xin20111119nix@…, massimo.b@… | Branch: | |
Release Notes: |
chrome: Appended the Trac version to internal CSS and JS URLs to ensure the browser cache gets cleared on upgrade. |
||
API Changes: | |||
Internal Changes: |
Description
When we recently upgraded a trac install a number of users has strange behaviour on the Custom Query page.
It turned out that this was due to JS caching.
Ideally Trac should use version numbering on the CSS and JS uris so that the cache is busted on upgrades.
Change History (8)
comment:1 by , 13 years ago
Milestone: | 0.12.2 → 0.13 |
---|
follow-up: 3 comment:2 by , 13 years ago
You just need to increment a query string argument and that should be enough.
In WordPress we use a scheme based on the date the file changes so as to work for people who have installs which follow development closely.
Adding the version number would still be great though :-)
comment:3 by , 13 years ago
Replying to anonymous:
In WordPress we use a scheme based on the date the file changes so as to work for people who have installs which follow development closely.
I thought about this, too, but it might not work when using trac-admin $ENV deploy
and having the web server serve static content, as Trac doesn't know where those files are.
follow-up: 6 comment:4 by , 13 years ago
Would it not suffice to include an ETAG with a given resource? This could be for example the MD5 hash of the resource data. Including this with the response will AFAIK reset the client cache for that url, replacing it by the new data?
See http://en.wikipedia.org/wiki/HTTP_ETag for more information on this.
I strongly vote against a …/trac.css?version=1…N approach…
comment:6 by , 13 years ago
Replying to Carsten Klein <carsten.klein@…>:
Would it not suffice to include an ETAG with a given resource?
We're talking about a general solution here, not just when Trac is serving those resources through the Chrome component.
by , 13 years ago
Attachment: | 9936-versioned-css-js-r10548.patch added |
---|
Version URLs for CSS and JS files.
comment:7 by , 13 years ago
Owner: | set to |
---|---|
Priority: | normal → high |
Release Notes: | modified (diff) |
9936-versioned-css-js-r10548.patch adds a query string to all CSS <link>
and JavaScript <SCRIPT>
URLs, of the form ?v={trac_version}
. The interesting part is in chrome.py
, the rest just transforms most <link>
and <script>
tags embedded in templates into the corresponding calls to add_stylesheet()
and add_script()
, respectively.
The interesting thing with using the Trac version in the query string is that:
- Users who install from a release package (source or binary) have a version
0.x.y
, and the query string change with every release. - Users who install from SVN have a version
0.x.ydev-r1234
, and therefore the query string also changes with every update, even of a single revision.
Both Firefox and Chrome correctly cache the files, and re-get them when the version changes. Opera and IE8 display correctly, but I haven't been able to check their caching behavior. I'm pretty confident that it works correctly, though, as WordPress uses the same scheme.
Feedback and testing welcome.
Yes, we have discussed that a few times. Is it necessary to actually change the file name part of the URLs to static content, or is it enough to append a query string? In the latter case, we could append a query argument to every URL to static content, with a value containing the Trac version, or the timestamp of the last upgrade, or something like that.
This is material for 0.13.