New metric: hiddenImages
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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'">
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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));
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user