Shell in GNOME 3.12 has gained many performance optimizations, like the porting of Gjs to the latest SpiderMonkey engine, a better handling of thumbnails cache and others. The most important change towards to performance, starting from GNOME 3.12, is that Shell will be a single binary file. It is faster to load one file than many, because the kernel can read-ahead it, and you don’t need to load many inodes.

That made possible with #703440 and the ability of GJS to load JS from a GResource. Gnome-Shell-Extension-Prefs also turned into a binary.

Cossimo Cecchi. It would be nice for a gjs application to be able to bundle all of its JS files as a GResource, and having the launcher be an actual C executable. It turns out this is very easy to implement, thanks to the transparent support of resource:/// files inside GIO. The following patch ports the way imported files are loaded in gjs to GIO, which gives us free support for setting a resource:///foo/bar/application search-path on a GjsContext from the C launcher.

Shell is now a binary linked against Mutter, instead of being a Mutter plugin loaded as a module.

What Changes for Users

Normal users will just enjoy the benefits in performance. This change doesn’t only affect GNOME Shell, but it can be used to any GJS App.

Notice that

/usr/share/gnome-shell/js

has been removed, so you can’t hack Shell directly from there anymore.

For Extension Developers

For extension developers doesn’t change anything, apart that they need to get Shell from Sources and compile it, so they can read, debug and override code.

For GJS Application Developers

GNOME JavaScript Application developers that want to take advantage of the performance, they have to see how Gnome-Weather and Gnome-Shell-Extension-Prefs do it.

Giovanni Campagna (GNOME Dev) also updated GTK-JS-App and GTK-App-Generator tools to use the above technique. You can get them from gcampax Github