New metric: hiddenImages

This commit is contained in:
Gaël Métais
2015-09-18 18:51:41 +02:00
parent 46c2d8c49e
commit d32b9f78a4
6 changed files with 59 additions and 13 deletions
+4 -3
View File
@@ -244,8 +244,9 @@
margin-top: 0.5em; margin-top: 0.5em;
} }
.smallPreview { .smallPreview {
max-height: 1.6em; display: block;
max-width: 4em; max-height: 4em;
max-width: 8em;
border: 1px solid #000; border: 1px solid #000;
margin-top: 0.2em; margin: 1em auto 0.2em;
} }
+4 -3
View File
@@ -271,8 +271,9 @@
} }
.smallPreview { .smallPreview {
max-height: 1.6em; display: block;
max-width: 4em; max-height: 4em;
max-width: 8em;
border: 1px solid #000; border: 1px solid #000;
margin-top: 0.2em; margin: 1em auto 0.2em;
} }
+2 -2
View File
@@ -145,9 +145,9 @@
<file-and-line-button file="offender.file" line="offender.line" column="offender.column"></file-and-line-button> <file-and-line-button file="offender.file" line="offender.line" column="offender.column"></file-and-line-button>
</div> </div>
<div ng-if="policyName === 'lazyLoadableImagesBelowTheFold'"> <div ng-if="policyName === 'lazyLoadableImagesBelowTheFold' || policyName === 'hiddenImages'">
<url-link url="offender" max-length="100"></url-link>
<img ng-src="{{offender}}" class="smallPreview checker"></img> <img ng-src="{{offender}}" class="smallPreview checker"></img>
<url-link url="offender" max-length="100"></url-link>
</div> </div>
<div ng-if="policyName === 'notFound' || policyName === 'closedConnections' || policyName === 'multipleRequests' || policyName === 'cachingDisabled' || policyName === 'cachingNotSpecified'"> <div ng-if="policyName === 'notFound' || policyName === 'closedConnections' || policyName === 'multipleRequests' || policyName === 'cachingDisabled' || policyName === 'cachingNotSpecified'">
+10 -1
View File
@@ -959,13 +959,22 @@ var policies = {
}, },
"lazyLoadableImagesBelowTheFold": { "lazyLoadableImagesBelowTheFold": {
"tool": "phantomas", "tool": "phantomas",
"label": "Not lazyloaded images", "label": "Below the fold images",
"message": "<p>This is the number of images displayed below the fold that could be lazy-loaded. This is an excellent way to accelerate the loading time of an heavy page.</p><p>I recommend using <a href=\"https://github.com/vvo/lazyload\" target=\"_blank\">this lazyloader</a>.</p>", "message": "<p>This is the number of images displayed below the fold that could be lazy-loaded. This is an excellent way to accelerate the loading time of an heavy page.</p><p>I recommend using <a href=\"https://github.com/vvo/lazyload\" target=\"_blank\">this lazyloader</a>.</p>",
"isOkThreshold": 1, "isOkThreshold": 1,
"isBadThreshold": 12, "isBadThreshold": 12,
"isAbnormalThreshold": 30, "isAbnormalThreshold": 30,
"hasOffenders": true "hasOffenders": true
}, },
"hiddenImages": {
"tool": "phantomas",
"label": "Hidden images",
"message": "<p>List of all images that have a display:none property, or one of their parents. These images are loaded by the browser even if they're not visible. You might be able to find a way to lazy-load them, only when they get visible.</p><p>Trackers are an exception, you'd better hide them.</p>",
"isOkThreshold": 3,
"isBadThreshold": 12,
"isAbnormalThreshold": 30,
"hasOffenders": true
},
"cachingDisabled": { "cachingDisabled": {
"tool": "phantomas", "tool": "phantomas",
"label": "Caching disabled", "label": "Caching disabled",
+2 -1
View File
@@ -17,7 +17,8 @@
"notFound": 3, "notFound": 3,
"multipleRequests": 2, "multipleRequests": 2,
"smallRequests": 1, "smallRequests": 1,
"lazyLoadableImagesBelowTheFold": 2 "lazyLoadableImagesBelowTheFold": 2,
"hiddenImages": 1
} }
}, },
"domComplexity": { "domComplexity": {
@@ -3,21 +3,23 @@
*/ */
/* global document: true, Node: true, window: true */ /* global document: true, Node: true, window: true */
exports.version = '0.1.a'; exports.version = '1.0.a';
exports.module = function(phantomas) { exports.module = function(phantomas) {
'use strict'; 'use strict';
// total length of HTML of hidden elements (i.e. display: none) // total length of HTML of hidden elements (i.e. display: none)
phantomas.setMetric('hiddenContentSize'); // @desc the size of content of hidden elements on the page (with CSS display: none) @offenders phantomas.setMetric('hiddenContentSize'); // @desc the size of content of hidden elements on the page (with CSS display: none) @offenders
phantomas.setMetric('hiddenImages'); // @desc number of hidden images that can be lazy-loaded @offenders
// HTML size // HTML size
phantomas.on('report', function() { phantomas.on('report', function() {
phantomas.evaluate(function() { phantomas.evaluate(function() {
(function(phantomas) { (function(phantomas) {
phantomas.spyEnabled(false, 'checking the hiddenContentSize'); var runner = new phantomas.nodeRunner(),
lazyLoadableImages = {};
var runner = new phantomas.nodeRunner(); phantomas.spyEnabled(false, 'analyzing hidden content');
runner.walk(document.body, function(node, depth) { runner.walk(document.body, function(node, depth) {
switch (node.nodeType) { switch (node.nodeType) {
@@ -36,6 +38,29 @@ exports.module = function(phantomas) {
} }
} }
// count hidden images that can be lazy loaded (issue #524)
var images = [];
if (node.tagName === 'IMG') {
images = [node];
} else if (typeof node.querySelectorAll === 'function') {
images = node.querySelectorAll('img') || [];
}
for (var i = 0, len = images.length; i < len; i++) {
var src = images[i].src,
path;
if (src === '' || src.indexOf('data:image') === 0) continue;
if (!lazyLoadableImages[src]) {
path = phantomas.getDOMPath(images[i]);
lazyLoadableImages[src] = {
path: path
};
}
}
// don't run for child nodes as they're hidden as well // don't run for child nodes as they're hidden as well
return false; return false;
} }
@@ -43,6 +68,15 @@ exports.module = function(phantomas) {
} }
}); });
Object.keys(lazyLoadableImages).forEach(function(img) {
var entry = lazyLoadableImages[img];
phantomas.incrMetric('hiddenImages');
phantomas.addOffender('hiddenImages', img);
phantomas.log('hiddenImages: <%s> image (%s) is hidden and can be lazy-loaded', img, entry.path);
});
phantomas.spyEnabled(true); phantomas.spyEnabled(true);
}(window.__phantomas)); }(window.__phantomas));
}); });