2 * Tools for inspecting page composition and performance.
16 * Calculate the byte size of a ResourceLoader module.
18 * @param {string} moduleName The name of the module
19 * @return {number|null} Module size in bytes or null
21 getModuleSize: function ( moduleName
) {
22 var module
= mw
.loader
.moduleRegistry
[ moduleName
],
25 if ( mw
.loader
.getState( moduleName
) !== 'ready' ) {
29 if ( !module
.style
&& !module
.script
) {
34 if ( module
.style
&& $.isArray( module
.style
.css
) ) {
35 $.each( module
.style
.css
, function ( i
, stylesheet
) {
36 payload
+= $.byteLength( stylesheet
);
41 if ( $.isFunction( module
.script
) ) {
42 payload
+= $.byteLength( module
.script
.toString() );
49 * Get a list of all loaded ResourceLoader modules.
51 * @return {Array} List of module names
53 getLoadedModules: function () {
54 return $.grep( mw
.loader
.getModuleNames(), function ( module
) {
55 return mw
.loader
.getState( module
) === 'ready';
60 * Print a breakdown of all loaded modules and their size in kilobytes
61 * to the debug console. Modules are ordered from largest to smallest.
63 inspectModules: function () {
64 var console
= window
.console
;
67 // Map each module to a descriptor object.
68 var modules
= $.map( inspect
.getLoadedModules(), function ( module
) {
71 size
: inspect
.getModuleSize( module
)
75 // Sort module descriptors by size, largest first.
76 modules
.sort( function ( a
, b
) {
77 return b
.size
- a
.size
;
80 // Convert size to human-readable string.
81 $.each( modules
, function ( i
, module
) {
82 module
.size
= module
.size
> 1024 ?
83 ( module
.size
/ 1024 ).toFixed( 2 ) + ' KB' :
84 ( module
.size
!== null ? module
.size
+ ' B' : null );
88 if ( console
.table
) {
89 console
.table( modules
);
91 $.each( modules
, function ( i
, module
) {
92 console
.log( [ module
.name
, module
.size
].join( '\t' ) );
100 mw
.inspect
= inspect
;
102 }( mediaWiki
, jQuery
) );