MediaWiki Developers,

Over the past couple of months, Roan Kattouw and I (Trevor Parscal) have 
been working on a JavaScript and CSS delivery system called 
ResourceLoader. We're really excited about this technology, and hope 
others will be too.

This system has been proving itself to be able to seriously improve 
front-end performance. Just for starters, we're talking about taking the 
Vector skin from 35 requests @ 30kB gzipped to 1 request @ 9.4kB gzipped 
(see http://www.mediawiki.org/wiki/ResourceLoader/Benchmarks)

We are looking to make this the standard way to deliver Javascript, CSS, 
and small images in MediaWiki and on Wikimedia projects, and we're 
seeking your comments and help.

== Background ==

The goals of the project were to improve front-end performance, reduce 
the complexity of developing JavaScript libraries and user-interfaces, 
and get the ball rolling on a rewrite/refactoring of all JavaScript and 
CSS code in MediaWiki.

What's wrong with things as they are now?

* Too many individual requests are being made. All JavaScript, CSS and 
image resources are being loaded individually, which causes poor 
performance on the cluster and users experience the site as being slow.
* We are wasting too much bandwidth. We are sending JavaScript and CSS 
resources with large amounts of unneeded whitespace and comments.
* We are purging our caches too much. Many user interface changes 
require purging page caches to take effect and many assets are 
unnecessarily being purged from client machines due to the use of a 
single style version for all assets
* We are sending people code they don't even use. Lots of JavaScript is 
being sent to clients whose browsers will either crash when it arrives 
(BlackBerry comes to mind), just not use it at all (older versions of 
many browsers) while parsing it unnecessarily (this is slow on older 
browsers, especially IE 6) or isn't even being completely utilized 
(UsabilityInitiative's plugins.combined.min.js for instance)
* Internationalization in JavaScript is a mess. Developers are using 
many different ways -- most of which are not ideal -- to get their 
translated messages to the client.
* Right-to-left support in CSS is akward. Stylesheets for right-to-left 
must to be either hand-coded in a separate stylesheet, generated each 
time a change is made by running CSSJanus, or an extra style-sheet which 
contains a series of over-rides.
* There's more! These and other issues were captured in our requirements 
gathering process (see 
http://www.mediawiki.org/wiki/ResourceLoader/Requirements )

What does ResourceLoader do to solve this?

* Combines resources together. Multiple scripts, styles, messages to be 
delivered in a single request, either at initial page load or 
dynamically; in both cases resolving dependencies automatically.
* Allows minification of JavaScript and CSS.
* Dramatically reduces the number of requests for small images. Small 
images linked to from CSS code can be automatically in-lined as data 
URLs (when the developer marks it with a special comment), and it's done 
automatically as the file is served without requiring the developer to 
do such steps manually.
* Allows deployment changes to all pages for all users within minutes, 
without purging any HTML. ResourceLoader provides a short-expiry 
start-up script which then decides to continue loading more JavaScript 
or not, and if so has a complete manifest of all scripts and styles on 
the server and their most recent versions,  Also, this startup script 
will be able to be inlined using ESI (see 
http://en.wikipedia.org/wiki/Edge_Side_Includes ) when using Squid or 
Varnish, reducing requests and improving performance even further.
* Provides a standard way to deliver translated messages to the client, 
bundling them together with the code that uses them.
* Performs automatic left-to-right/right-to-left flipping for CSS files. 
In most cases the developer won't have to do anything before deploying.
* Does all kinds of other cool tricks, which should soon make everyone's 
lives better

What do you want from me?

* Help by porting existing code! While ResourceLoader and traditional 
methods of adding scripts to MediaWiki output can co-exist, the 
performance gains of ResourceLoader are directly related to the amount 
of software utilizing it. There's some more stuff in core that needs to 
be tweaked to utilize the ResourceLoader system, such as user scripts 
and site CSS. We also need extensions to start using it, especially 
those we are deploying on Wikimedia sites or thinking about deploying 
soon. Only basic documentation exists on how to port extensions, but 
much more will be written very shortly and we (Roan and I) be leading by 
example by porting the UsabilityInitiative extensions ourselves. If you 
need help, we're usually on IRC. (See 
http://www.mediawiki.org/wiki/ResourceLoader/Getting_Started )
* Help writing new code! While wikibits.js is now also known as the 
"mediawiki.legacy.wikibits" module, the functionality that it and 
basically all other existing MediaWiki JavaScript code provide is being 
deprecated, in favor of new modules which take  advantage of jQuery and 
can be written using a lot less code while eliminating the current 
dependence on a large number of globally accessible variables and 
functions (see 
http://www.mediawiki.org/wiki/ResourceLoader/JavaScript_Deprecations )
* Some patience and understanding... Please... While we are integrating 
into trunk, things might break unexpectedly. We're diligently tracking 
down issues and resolving them as fast as we can, but help in this 
regard is much needed and really appreciated. But most of all, we're 
sorry if something gets screwed up, and we're trying our best to make 
this integration smooth.
* Enthusiasm!

Documentation is coming online as fast as we can write it. There's a 
very detailed design specification document at 
http://www.mediawiki.org/wiki/ResourceLoader/Design_Specification and 
more information in general at 
http://www.mediawiki.org/wiki/ResourceLoader , where we will be adding 
more and more documentation as time goes on. If you can help with 
documentation, please feel free to edit boldly - just try not to modify 
the design specification unless you are also modifying the software :)

While this project has been bootstrapped by Roan and myself in a branch, 
we're really excited about bringing it to trunk and hope the community 
can start taking advantage of the new features right away.

Tracking bug for tracking things that ResourceLoader will fix: 
http://bugzilla.wikimedia.org/show_bug.cgi?id=24415

Bugzilla Component: 
https://bugzilla.wikimedia.org/buglist.cgi?query_format=advanced&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=VERIFIED&component=Resource%20Loader&resolution=---&product=MediaWiki

- Trevor (and Roan, who's committing the merge to SVN right now)

_______________________________________________
Wikitech-l mailing list
Wikitech-l@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/wikitech-l

Reply via email to