Created
March 9, 2017 11:16
-
-
Save skial/9959bb6cd72be24c0874366586ec23c9 to your computer and use it in GitHub Desktop.
haxe.io lighthouse results for 09-03-2017
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html lang="en" data-report-context="extension"><head> | |
<meta charset="utf-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"> | |
<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAADjklEQVR4AWI08P/HQEvAQrxSQKvlECfLFYXx75xCY2qmh89GbNvOMjb3v9jOOlxnFWxj206ebQ3b7q6q+z1rNagu8/zvPSZACAABpeUAA0miMgU7SA7JjCraFGwZwECOwvL75dWjsKgWBKtx0jvWo+vkBAFbACCkByMP6nMn48+AVgXB2fzSCwsv22/lMGlUhmJ0AE7BH8dyUUDbUEgN6RzJRSeaPxhdRYR0Inel+7Hd5lBiFpkMAxACc0394//9C4voFHDiAAGLpuOXebdfdHfctgwJKaZRLRKy6ItrSis6RBnVBgGtbHyKTEmJHQoEXoBCE5BCrDeA2ogMUIGDAKEBDEhUqwgMqBYDjW4DQzmuffVdqff42/ZQYYqVcMXGZsMPyCsH3lyJSetxvEaxAQXdjR1HjfwCdIS7lo2DZke26Qe+MXO12OWkGT0O6oE7vMGkMnkYw4aN1KQgMKExhXqswfiov4+a7MQ11XPnbr/5qpKlgACAAQj94Lu271bN9DUecQasIZlNzG72llRAAKJiAi+/BSHrSFjRvQhg3DEKEqJh08tsmLTx597+f6enr4cc2Zpk57pihfX24dW7RHcOLLUbJYhJSl0ErQCI9BVXH/XrO97QasuvQQSiECa0BrQCIIJp6X9T/r8QG6L71WYSqCoIIGo2BZDUBnS/D9EA9Nun1iYvbM0MFExIDQRoKFatc1Z6zrm5uWeObJotq0BGV9FuQBWq5a4Fw3PPz848rZHstZSuA5FWAFSMP2nOppOOGpl6qh9PCSg0IFyHKjSQyDNQHTru2t75NOEe0fsf246oAmFkI6vCdnWvbQFQFCKx8vCswV8TrDLiDLgH4Nr7RAtNsrC9d8sfk7b8ls4igdNy8CQKAISlsB0FjZfd3Lfp155tf8fKI4BxZZIj/oTdVEAIAcJFOCmzauHG71I7/rdreUAgAqpDP05fDARCAQQARwEIBQSVxq0FyaLvZZtevpHa8WHw8cft6cpxlq8eAJtIhnSbWDf951yx3y13OqUuu5qyGgkxCgGFh9cDihDGbTa6BqvT1lWmrav3bmt2ZMJ4mU6TGgIC4DBzcv/JqAau1WhzSt3x9Ixk/4Jk/8J4ZrrViFMA4W6A7+WK8xcVjvyrOmVD0FbAXokcT48r+xVqLKvuJYbmpNadnlp3mpufJHOe/GXktM+r09bT8kEdq9BRYAbGSgzP7ll82U71Mc+ZFooXgwAAAABJRU5ErkJggg=="> | |
<title>Lighthouse report: https://haxe.io/</title> | |
<style> | |
/** | |
* Copyright 2016 Google Inc. All rights reserved. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
* { | |
box-sizing: border-box; | |
} | |
span, div, p, section, header, h1, h2, li, ul { | |
margin: 0; | |
padding: 0; | |
line-height: inherit; | |
} | |
:root { | |
--text-font-family: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; | |
--text-color: #222; | |
--secondary-text-color: #606060; | |
--accent-color: #3879d9; | |
--poor-color: #e53935; /* md red 600 */ | |
--good-color: #43a047; /* md green 600 */ | |
--average-color: #ef6c00; /* md orange 800 */ | |
--warning-color: #757575; /* md grey 600 */ | |
--gutter-gap: 12px; | |
--gutter-width: 40px; | |
--body-font-size: 14px; | |
--body-line-height: 20px; | |
--subitem-font-size: 14px; | |
--subitem-line-height: 20px; | |
--subheading-font-size: 16px; | |
--subheading-line-height: 24px; | |
--subheading-color: inherit; | |
--heading-font-size: 24px; | |
--heading-line-height: 32px; | |
--subitem-indent: 16px; | |
--max-line-length: none; | |
--report-width: 1280px; | |
--report-menu-width: 280px; | |
--report-header-height: 58px; | |
} | |
:root[data-report-context="devtools"] { | |
--text-font-family: '.SFNSDisplay-Regular', 'Helvetica Neue', 'Lucida Grande', sans-serif; | |
--body-font-size: 13px; | |
--body-line-height: 17px; | |
--subitem-font-size: 14px; | |
--subitem-line-height: 18px; | |
--subheading-font-size: 16px; | |
--subheading-line-height: 20px; | |
--report-header-height: 0; | |
--heading-font-size: 20px; | |
--heading-line-height: 24px; | |
--max-line-length: calc(60 * var(--body-font-size)); | |
} | |
html { | |
font-family: var(--text-font-family); | |
font-size: var(--body-font-size); | |
line-height: 1; | |
margin: 0; | |
padding: 0; | |
} | |
html, body { | |
height: 100%; | |
} | |
/* When deep linking to a section, bump the heading down so it's not covered by the top nav. */ | |
:target.aggregations { | |
padding-top: calc(var(--report-header-height) + var(--heading-line-height)) !important; | |
} | |
a { | |
color: #15c; | |
} | |
body { | |
display: flex; | |
flex-direction: column; | |
align-items: stretch; | |
margin: 0; | |
background-color: #f5f5f5; | |
} | |
summary { | |
cursor: pointer; | |
display: block; /* Firefox compat */ | |
} | |
.report-error { | |
font-family: consolas, monospace; | |
} | |
.error-stack { | |
white-space: pre-wrap; | |
} | |
.error-results { | |
background-color: #dedede; | |
max-height: 600px; | |
overflow: auto; | |
border-radius: 2px; | |
} | |
.report { | |
width: 100%; | |
margin: 0 auto; | |
max-width: var(--report-width); | |
background-color: #fff; | |
box-shadow: 0 0 6px 0 rgba(0,0,0,0.26); | |
} | |
.report-body__icon { | |
width: 24px; | |
height: 24px; | |
border: none; | |
cursor: pointer; | |
flex: 0 0 auto; | |
background-repeat: no-repeat; | |
background-position: center center; | |
background-size: contain; | |
background-color: transparent; | |
margin-left: 8px; | |
opacity: 0.7; | |
} | |
.report-body__icon:hover { | |
opacity: 1; | |
} | |
.report__icon.share { | |
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/></svg>'); | |
display: none; | |
height: 20px; | |
} | |
.report__icon.print { | |
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/><path fill="none" d="M0 0h24v24H0z"/></svg>'); | |
} | |
.report__icon.copy { | |
background-image: url('data:image/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></svg>'); | |
} | |
.report__icon.open { | |
background-image: url('data:image/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z"/></svg>'); | |
} | |
.report__icon.download { | |
background-image: url('data:image/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/><path d="M0 0h24v24H0z" fill="none"/></svg>'); | |
} | |
#lhresults-dump { | |
display: none !important; | |
} | |
@keyframes rotate { | |
from { | |
transform: none; | |
} | |
to { | |
transform: rotate(360deg); | |
} | |
} | |
.score-container__overall-score { | |
color: #fff; | |
font-size: 92px; | |
font-weight: 100; | |
position: relative; | |
display: inline-block; | |
text-align: center; | |
min-width: 70px; | |
} | |
.score-container__overall-score::after { | |
content: 'Your score'; | |
position: absolute; | |
bottom: -4px; | |
font-size: 14px; | |
font-weight: 500; | |
text-align: center; | |
width: 100%; | |
left: 0; | |
opacity: 0.5; | |
} | |
.score-container__max-score { | |
color: #57a0a8; | |
font-size: 28px; | |
font-weight: 500; | |
} | |
.report-body { | |
position: relative; | |
} | |
.report-body__content { | |
margin-left: var(--report-menu-width); | |
position: relative; | |
} | |
.report-body__aggregations-container { | |
will-change: transform; | |
padding-top: var(--report-header-height); | |
} | |
.report-body__menu-container { | |
height: 100%; | |
width: 100%; | |
min-width: 230px; | |
max-width: var(--report-width); | |
position: fixed; | |
will-change: transform; | |
left: 50%; | |
transform: translateX(-50%); | |
top: 0; | |
pointer-events: none; | |
} | |
.menu { | |
width: var(--report-menu-width); | |
background-color: #fff; | |
height: 100%; | |
top: 0; | |
left: 0; | |
pointer-events: auto; | |
border-right: 1px solid #dfdfdf; | |
} | |
.menu__header { | |
background-color: #2238b3; | |
padding: 0 20px; | |
height: 115px; | |
line-height: 54px; | |
color: #fff; | |
font-family: var(--text-font-family); | |
font-size: 18px; | |
position: relative; | |
display: flex; | |
flex-direction: column; | |
align-self: center; | |
justify-content: center; | |
background: url(data:image/png;base64,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) no-repeat 150% 100%; | |
background-color: #2238b3; | |
background-size: 205px; | |
background-blend-mode: luminosity; | |
} | |
.menu__header::after { | |
content: ''; | |
display: block; | |
width: 90px; | |
height: 86px; | |
position: absolute; | |
bottom: 0; | |
right: 0; | |
background: url('data:image/svg+xml;utf-8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="86" height="86" viewBox="0 0 86 86"><title>Beta</title><defs><path id="b" d="M-11.704 13.144H125.58v30H-11.703z"/><filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="a"><feOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/><feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0" in="shadowBlurOuter1"/></filter><path id="d" d="M.4 16.972h119v28.4H.4z"/><text id="f" font-family="Arial-BoldMT, Arial" font-size="13" font-weight="700" fill="#FFF"><tspan x="37.556" y="34.556">BETA</tspan></text><filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="e"><feOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/><feGaussianBlur stdDeviation=".5" in="shadowOffsetOuter1" result="shadowBlurOuter1"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.140964674 0" in="shadowBlurOuter1"/></filter></defs><g fill="none" fill-rule="evenodd"><g mask="url(#mask-2)" transform="rotate(135 55.44 44.523)"><use fill="#000" filter="url(#a)" xlink:href="#b"/><use fill="#CF3A3C" xlink:href="#b"/></g><g mask="url(#mask-2)" transform="rotate(-45 95 36)" fill="white" class=""><use filter="url(#e)" xlink:href="#f"/><use xlink:href="#f"/></g><path d="M8.5-.5l88.204 88.204M8.5-39.5l88.204 88.204" stroke="#FFF" stroke-linecap="square" stroke-dasharray="1,2" opacity=".386" mask="url(#mask-2)" transform="translate(-3)" style=" transform: rotate(90deg) translateY(81px); transform-origin: bottom right; "/></g></svg>') top right no-repeat; | |
} | |
.menu__header-title { | |
font-family: var(--text-font-family); | |
font-weight: 300; | |
color: #fff; | |
margin: 0; | |
padding: 0; | |
line-height: 1.5; | |
} | |
.menu__header-version { | |
color: #aab3ed; | |
font-family: var(--text-font-family); | |
font-size: 14px; | |
line-height: 1.5; | |
} | |
.menu__report-tab { | |
padding: 3px 13px; | |
color: #777; | |
border-top: 1px solid #ebebeb; | |
display: flex; | |
flex-direction: column; | |
cursor: pointer; | |
text-decoration: none; | |
height: 55px; | |
} | |
.menu__report-tab:hover { | |
background-color: #448aff; | |
color: #fff; | |
} | |
.menu__report-tab__url { | |
font-size: 15px; | |
font-weight: 700; | |
text-overflow: ellipsis; | |
line-height: 30px; | |
white-space: nowrap; | |
overflow: hidden; | |
} | |
.menu__report-tab__time { | |
font-size: 11px; | |
line-height: 11px; | |
padding-left: 2px; | |
} | |
.menu__nav { | |
list-style-type: none; | |
margin: 0; | |
padding: 0; | |
} | |
.menu__nav-item { | |
height: 40px; | |
line-height: 40px; | |
border-top: 1px solid #ebebeb; | |
} | |
.menu__link { | |
padding: 0 20px; | |
text-decoration: none; | |
color: #767676; | |
display: flex; | |
} | |
.menu__report-tab + .menu__nav .menu__link { | |
padding-left: 35px; | |
} | |
.menu__link:hover { | |
background-color: #448aff; | |
color: #fff; | |
} | |
.menu__link-label { | |
flex: 1; | |
color: #49525f; | |
font-weight: 500; | |
overflow: hidden; | |
white-space: nowrap; | |
text-overflow: ellipsis; | |
} | |
.menu__link-score { | |
padding-left: 20px; | |
} | |
.report-body__metadata { | |
flex: 1 1 0; | |
white-space: nowrap; | |
padding-right: 10px; | |
overflow: hidden; | |
} | |
.report-body__buttons { | |
display: flex; | |
align-items: center; | |
flex-shrink: 0; | |
} | |
.report-body__url { | |
font-family: var(--text-font-family); | |
white-space: nowrap; | |
font-size: 13px; | |
font-weight: 400; | |
color: var(--secondary-text-color); | |
line-height: 20px; | |
overflow: hidden; | |
text-overflow: ellipsis; | |
} | |
.report-body__url a { | |
color: currentColor; | |
} | |
.report-body__breakdown { | |
flex: 1; | |
max-width: 100%; | |
} | |
.report-body__breakdown-item { | |
padding-bottom: 6px; | |
} | |
.report-body__breakdown-item:last-of-type { | |
border: none; | |
} | |
.report-body__header { | |
height: var(--report-header-height); | |
display: flex; | |
flex-direction: row; | |
align-items: center; | |
justify-content: flex-start; | |
border-bottom: 1px solid #ebebeb; | |
padding-right: 14px; | |
position: fixed; | |
width: calc(100vw - var(--report-menu-width)); | |
max-width: calc( var(--report-width) - var(--report-menu-width)); | |
z-index: 1; | |
will-change: transform; | |
background-color: #fafafa; | |
} | |
.report-body__more-toggle { | |
background-image: url('data:image/svg+xml;utf8,<svg fill="black" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z"/><path d="M0-.25h24v24H0z" fill="none"/></svg>'); | |
width: 24px; | |
height: 24px; | |
border: none; | |
flex: 0 0 auto; | |
background-repeat: no-repeat; | |
background-position: center center; | |
background-size: contain; | |
background-color: transparent; | |
margin: 0 8px 0 8px; | |
cursor: pointer; | |
transition: transform 150ms ease-in-out; | |
} | |
.report-body__header-container.expanded .report-body__more-toggle, | |
.aggregation details[open] .report-body__more-toggle { | |
transform: rotateZ(90deg); | |
} | |
.report-body__header-content { | |
padding: 10px 0 10px 42px; | |
top: 100%; | |
left: 0; | |
position: absolute; | |
width: 100%; | |
background-color: inherit; | |
clip: rect(0, calc( var(--report-width) - var(--report-menu-width)), 0, 0); | |
opacity: 0; | |
visibility: hidden; | |
transition: all 200ms cubic-bezier(0,0,0.2,1); | |
border-bottom: 1px solid #ebebeb; | |
} | |
.report-body__header-container.expanded .report-body__header-content { | |
clip: rect(0, calc( var(--report-width) - var(--report-menu-width)), 200px, 0); | |
opacity: 1; | |
visibility: visible; | |
} | |
.report-body__header-content .config-section { | |
padding: 15px 0 15px 0; | |
} | |
.report-body__header-content .config-section__title { | |
font-size: var(--subheading-font-size); | |
font-weight: 400; | |
line-height: var(--subheading-line-height); | |
color: var(--subheading-color); | |
} | |
.report-body__header-content .config-section__items { | |
margin-left: 30px; | |
margin-top: 15px; | |
} | |
.report-body__header-content .config-section__item { | |
margin-top: 5px; | |
} | |
.report-body__header-content .config-section__desc { | |
line-height: var(--subitem-line-height); | |
word-wrap: break-word; | |
} | |
.report-body__fixed-footer-container { | |
margin-left: var(--report-menu-width); | |
max-width: calc( var(--report-width) - var(--report-menu-width)); | |
width: calc(100vw - var(--report-menu-width)); | |
position: fixed; | |
bottom: 0; | |
z-index: 1; | |
} | |
.report-section__title { | |
-webkit-font-smoothing: antialiased; | |
font-family: var(--text-font-family); | |
font-size: 28px; | |
font-weight: 500; | |
color: #49525f; | |
display: flex; | |
margin: 0.4em 0 0.3em 0; | |
} | |
.report-section__title-main { | |
flex: 1; | |
} | |
.report-section__title-score-total { | |
font-weight: 500; | |
} | |
.report-section__title-score-max { | |
font-weight: 400; | |
font-size: 18px; | |
margin-left: -4px; | |
} | |
.report-section__subtitle { | |
-webkit-font-smoothing: antialiased; | |
font-family: var(--text-font-family); | |
font-size: 18px; | |
font-weight: 500; | |
color: #719ea8; | |
display: flex; | |
margin: 24px 0 16px 0; | |
} | |
.report-section__description { | |
color: #5f6875; | |
font-size: 16px; | |
margin: 0 0 1em 0; | |
line-height: 1.4; | |
max-width: 750px; | |
} | |
.report-section__description:empty { | |
margin: 0; | |
} | |
.report-section__aggregation-description { | |
font-style: italic; | |
color: #777; | |
font-size: 14px; | |
margin: 0.6em 0 0.8em 0; | |
line-height: 1.4; | |
max-width: 750px; | |
} | |
.report-section__label { | |
flex: 1; | |
} | |
.report-section__individual-results { | |
list-style-type: none; | |
padding: 0; | |
margin: 0; | |
} | |
.report-section__item { | |
padding-left: 32px; | |
background: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNXB4IiBoZWlnaHQ9IjVweCIgdmlld0JveD0iMCAwIDUgNSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxjaXJjbGUgaWQ9Ik92YWwtNzAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzY0NjQ2NCIgZmlsbC1ydWxlPSJldmVub2RkIiBjeD0iMi41IiBjeT0iMi41IiByPSIyLjUiPjwvY2lyY2xlPgo8L3N2Zz4K') 14px 8px no-repeat; | |
line-height: 24px; | |
} | |
.report-section__item-details { | |
display: flex; | |
} | |
.report-section__item-category { | |
font-weight: 700; | |
} | |
.report-section__item-extended-info { | |
font-size: 15px; | |
color: #555; | |
font-style: italic; | |
margin: 0 0 16px 24px; | |
max-width: 90%; | |
} | |
.report-section__item-extended-info:empty { | |
margin: 0; | |
} | |
.report-section__item-helptext { | |
font-size: 14px; | |
color: #999; | |
font-style: italic; | |
padding: 8px 0 16px 24px; | |
max-width: 90%; | |
} | |
.report-section__item-help-toggle { | |
color: currentColor; | |
border-radius: 50%; | |
width: 21px; | |
height: 21px; | |
display: inline-flex; | |
justify-content: center; | |
align-items: center; | |
cursor: pointer; | |
transition: all 0.2s cubic-bezier(0,0,0.3,1); | |
font-size: 90%; | |
font-weight: 600; | |
margin-left: 8px; | |
vertical-align: top; | |
opacity: 0.6; | |
box-shadow: 0 1px 2px rgba(0,0,0,0.5); | |
} | |
.report-section__item-help-toggle:hover { | |
opacity: 1; | |
box-shadow: 0 1px 2px rgba(0,0,0,0.7); | |
} | |
.report-section__item-raw-value { | |
color: #777; | |
} | |
.report-section__item-description { | |
flex: 1; | |
} | |
.footer { | |
margin-top: 40px; | |
margin-left: var(--report-menu-width); | |
height: 130px; | |
line-height: 90px; | |
text-align: center; | |
font-size: 12px; | |
border-top: 1px solid #ebebeb; | |
color: #767676; | |
} | |
.devtabs { | |
flex: 0 1 auto; | |
background: right 0 / auto 27px no-repeat url(tabs_right.png), | |
0 0 / auto 27px no-repeat url(tabs_left.png), | |
0 0 / auto 27px repeat-x url(tabs_center.png); | |
height: 27px; | |
} | |
.aggregations__header { | |
position: relative; | |
} | |
.aggregations__header > h2 { | |
font-size: var(--heading-font-size); | |
font-weight: 400; | |
line-height: var(--heading-line-height); | |
} | |
.aggregations { | |
padding: var(--heading-line-height); | |
padding-left: calc(var(--heading-line-height) + var(--gutter-width) + var(--gutter-gap)); | |
} | |
.aggregations:not(:first-child) { | |
border-top: 1px solid #ccc; | |
} | |
.aggregations__desc { | |
font-size: var(--body-font-size); | |
line-height: var(--body-line-height); | |
margin-top: calc(var(--body-line-height) / 2); | |
} | |
.section-result { | |
position: absolute; | |
top: 0; | |
left: calc((var(--gutter-width) + var(--gutter-gap)) * -1); | |
width: var(--gutter-width); | |
display: flex; | |
flex-direction: column; | |
align-items: flex-end; | |
} | |
.section-result__score { | |
display: flex; | |
flex-direction: column; | |
align-items: stretch; | |
background-color: #000; | |
color: #fff; | |
text-align: center; | |
padding: 4px 8px; | |
border-radius: 2px; | |
} | |
.section-result__points { | |
font-size: var(--heading-font-size); | |
} | |
.section-result__divider { | |
display: none; | |
} | |
.section-result__total { | |
font-size: var(--body-font-size); | |
margin-top: 2px; | |
border-top: 1px solid #fff; | |
padding-top: 4px; | |
} | |
.aggregation__header { | |
position: relative; | |
max-width: var(--max-line-length); | |
display: flex; | |
align-items: center; | |
cursor: pointer; | |
} | |
.aggregation__header .aggregation__header__score { | |
margin-top: 0; | |
position: absolute; | |
left: calc(-1 * var(--aggregation-icon-size) - var(--subitem-indent) / 2); | |
width: var(--aggregation-icon-size); | |
height: var(--aggregation-icon-size); | |
top: 2px; | |
} | |
.aggregation__header .aggregation__header__score::after { | |
background-size: 14px; | |
} | |
.aggregation__header > h2 { | |
font-size: var(--subheading-font-size); | |
font-weight: 400; | |
line-height: var(--subheading-line-height); | |
color: var(--subheading-color); | |
} | |
.aggregation { | |
--aggregation-icon-size: 20px; | |
margin-top: var(--subheading-line-height); | |
max-width: var(--max-line-length); | |
padding-left: calc(var(--aggregation-icon-size) + var(--subitem-indent) / 2); | |
} | |
.aggregation__details { | |
display: inline-block; | |
} | |
.aggregation__details > summary { | |
outline: none; | |
} | |
.aggregation__details > summary::-moz-list-bullet { | |
display: none; | |
} | |
.aggregation__details > summary::-webkit-details-marker { | |
display: none; | |
} | |
.aggregation__details > summary:focus header h2 { | |
outline: rgb(59, 153, 252) auto 5px; | |
} | |
.aggregation__desc { | |
font-size: var(--body-font-size); | |
/*font-style: italic;*/ | |
color: var(--secondary-text-color); | |
line-height: var(--body-line-height); | |
margin-top: calc(var(--body-line-height) / 2); | |
} | |
.subitems { | |
list-style-type: none; | |
margin-top: var(--subitem-line-height); | |
} | |
.subitem { | |
position: relative; | |
font-size: var(--subitem-font-size); | |
padding-left: calc(var(--subitem-indent) * 3); | |
margin-top: calc(var(--subitem-line-height) / 2); | |
} | |
.subitem strong { | |
font-weight: 700; | |
} | |
.subitem small { | |
font-size: var(--body-font-size); | |
} | |
.subitem__desc { | |
line-height: var(--subitem-line-height); | |
} | |
.subitem-result { | |
position: absolute; | |
top: 0; | |
left: 0; | |
width: var(--gutter-width); | |
display: flex; | |
flex-direction: column; | |
align-items: flex-end; | |
} | |
.subitem-result__good, .subitem-result__average, .subitem-result__poor, .subitem-result__unknown, .subitem-result__warning, .subitem-result__info { | |
position: relative; | |
display: block; | |
overflow: hidden; | |
margin-top: calc((var(--subitem-line-height) - 16px) / 2); | |
width: 16px; | |
height: 16px; | |
border-radius: 50%; | |
color: transparent; | |
background-color: #000; | |
} | |
.subitem-result__good::after, .subitem-result__average:after, .subitem-result__poor::after, .subitem-result__unknown::after, .subitem-result__warning::after, .subitem-result__info::after { | |
content: ''; | |
position: absolute; | |
left: 0; | |
right: 0; | |
top: 0; | |
bottom: 0; | |
background-color: #fff; | |
} | |
.subitem-result__good::after { | |
background: url('data:image/svg+xml;utf8,<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg"><title>good</title><path d="M9.17 2.33L4.5 7 2.83 5.33 1.5 6.66l3 3 6-6z" fill="white" fill-rule="evenodd"/></svg>') no-repeat 50% 50%; | |
background-size: 12px; | |
} | |
.subitem-result__average::after { | |
background: none; | |
content: "!"; | |
background-color: var(--average-color); | |
color: #fff; | |
display: flex; | |
justify-content: center; | |
align-items: center; | |
font-weight: 500; | |
font-size: 15px; | |
} | |
.subitem-result__poor::after { | |
background: url('data:image/svg+xml;utf8,<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg"><title>poor</title><path d="M8.33 2.33l1.33 1.33-2.335 2.335L9.66 8.33 8.33 9.66 5.995 7.325 3.66 9.66 2.33 8.33l2.335-2.335L2.33 3.66l1.33-1.33 2.335 2.335z" fill="white"/></svg>') no-repeat 50% 50%; | |
background-size: 12px; | |
} | |
.subitem-result__warning::after { | |
background: url('data:image/svg+xml;utf8,<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>warn</title><path d="M0 0h24v24H0z" fill="none"/><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z" fill="white"/></svg>') no-repeat 50% 50%; | |
background-size: 12px; | |
} | |
.subitem-result__info::after { | |
background: url('data:image/svg+xml;utf8,<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>info</title><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z" fill="white"/></svg>') no-repeat 50% 50%; | |
background-size: 12px; | |
} | |
.subitem-result__unknown::after { | |
background: url('data:image/svg+xml;utf8,<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg"><title>neutral</title><path d="M2 5h8v2H2z" fill="white" fill-rule="evenodd"/></svg>') no-repeat 50% 50%; | |
background-size: 12px; | |
} | |
.subitem-result__points { | |
margin-top: calc((var(--subitem-line-height) - var(--subitem-font-size) - 4px) / 2); | |
background-color: #000; | |
padding: 2px 4px; | |
color: #fff; | |
border-radius: 2px; | |
} | |
.subitem__details { | |
list-style-type: none; | |
margin: 0; | |
padding: 0; | |
margin-left: var(--subitem-indent); | |
} | |
.subitem__detail { | |
font-size: var(--body-font-size); | |
line-height: var(--body-line-height); | |
margin-top: calc(var(--body-line-height) / 2); | |
} | |
.subitem__help-toggle { | |
-webkit-appearance: none; | |
-moz-appearance: none; | |
width: 16px; | |
height: 16px; | |
border-radius: 50%; | |
border: 1px solid #ccc; | |
vertical-align: middle; | |
margin-left: 8px; | |
outline: none; | |
cursor: pointer; | |
} | |
.subitem__help-toggle + label { | |
position: relative; | |
display: inline-block; | |
height: 12px; | |
width: 12px; | |
left: -21px; | |
top: 2px; | |
pointer-events: none; | |
} | |
.subitem__help-toggle + label::after { | |
content: ''; | |
position: absolute; | |
left: 0; | |
right: 0; | |
top: 0; | |
bottom: 0; | |
height: 12px; | |
width: 12px; | |
display: inline-block; | |
background: url('data:image/svg+xml;utf8,<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg"><title>help</title><path d="M5.216 7.457c0-.237.011-.452.033-.645.021-.194.058-.372.11-.535a1.918 1.918 0 0 1 .55-.847 3.65 3.65 0 0 0 .545-.597c.133-.19.2-.398.2-.623 0-.28-.053-.485-.16-.616-.107-.13-.268-.196-.482-.196a.583.583 0 0 0-.457.207.834.834 0 0 0-.15.271c-.04.111-.062.244-.065.398H3.67c.003-.401.067-.745.19-1.032a1.96 1.96 0 0 1 .5-.707c.208-.185.455-.32.738-.406A3.13 3.13 0 0 1 6.012 2c.359 0 .682.046.968.137.287.091.53.227.729.406.2.18.352.401.457.667.105.265.158.571.158.919 0 .233-.03.44-.091.624-.061.182-.145.353-.252.51-.107.158-.233.311-.378.46-.145.149-.3.306-.465.47a2.084 2.084 0 0 0-.24.275c-.063.09-.115.183-.152.282a1.57 1.57 0 0 0-.084.323 2.966 2.966 0 0 0-.033.384H5.216zm-.202 1.634a.96.96 0 0 1 .067-.36.828.828 0 0 1 .19-.287.913.913 0 0 1 .291-.191.969.969 0 0 1 .376-.07c.138 0 .263.023.375.07.112.046.21.11.292.19.082.081.146.177.19.288a.96.96 0 0 1 .067.36.96.96 0 0 1-.067.36.828.828 0 0 1-.19.288.913.913 0 0 1-.292.191.969.969 0 0 1-.375.07.969.969 0 0 1-.376-.07.913.913 0 0 1-.291-.19.828.828 0 0 1-.19-.288.96.96 0 0 1-.067-.36z" fill="rgb(117,117,117)"/></svg>') no-repeat 50% 50%; | |
} | |
.subitem__help-toggle:hover { | |
border-color: var(--secondary-text-color); | |
} | |
.subitem__help-toggle:checked { | |
background-color: var(--accent-color); | |
border-color: var(--accent-color); | |
} | |
.subitem__help-toggle:checked + label::after { | |
content: ''; | |
background: url('data:image/svg+xml;utf8,<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg"><title>help</title><path d="M5.216 7.457c0-.237.011-.452.033-.645.021-.194.058-.372.11-.535a1.918 1.918 0 0 1 .55-.847 3.65 3.65 0 0 0 .545-.597c.133-.19.2-.398.2-.623 0-.28-.053-.485-.16-.616-.107-.13-.268-.196-.482-.196a.583.583 0 0 0-.457.207.834.834 0 0 0-.15.271c-.04.111-.062.244-.065.398H3.67c.003-.401.067-.745.19-1.032a1.96 1.96 0 0 1 .5-.707c.208-.185.455-.32.738-.406A3.13 3.13 0 0 1 6.012 2c.359 0 .682.046.968.137.287.091.53.227.729.406.2.18.352.401.457.667.105.265.158.571.158.919 0 .233-.03.44-.091.624-.061.182-.145.353-.252.51-.107.158-.233.311-.378.46-.145.149-.3.306-.465.47a2.084 2.084 0 0 0-.24.275c-.063.09-.115.183-.152.282a1.57 1.57 0 0 0-.084.323 2.966 2.966 0 0 0-.033.384H5.216zm-.202 1.634a.96.96 0 0 1 .067-.36.828.828 0 0 1 .19-.287.913.913 0 0 1 .291-.191.969.969 0 0 1 .376-.07c.138 0 .263.023.375.07.112.046.21.11.292.19.082.081.146.177.19.288a.96.96 0 0 1 .067.36.96.96 0 0 1-.067.36.828.828 0 0 1-.19.288.913.913 0 0 1-.292.191.969.969 0 0 1-.375.07.969.969 0 0 1-.376-.07.913.913 0 0 1-.291-.19.828.828 0 0 1-.19-.288.96.96 0 0 1-.067-.36z" fill="white"/></svg>') no-repeat 50% 50%; | |
background-size: contain; | |
border-radius: 50%; | |
background-color: var(--accent-color); | |
} | |
.subitem__help { | |
display: none; | |
font-size: var(--body-font-size); | |
line-height: var(--body-line-height); | |
margin-top: calc(var(--body-line-height) / 2); | |
margin-left: var(--subitem-indent); | |
} | |
.subitem__help-toggle:checked ~ .subitem__help { | |
display: block; | |
} | |
.subitem__debug { | |
font-size: var(--body-font-size); | |
line-height: var(--body-line-height); | |
margin-top: calc(var(--body-line-height) / 2); | |
margin-left: var(--subitem-indent); | |
color: var(--poor-color); | |
} | |
.score-good-bg { | |
background-color: var(--good-color); | |
} | |
.score-average-bg { | |
background-color: var(--average-color); | |
} | |
.score-poor-bg { | |
background-color: var(--poor-color); | |
} | |
.score-warning-bg { | |
background-color: var(--warning-color); | |
} | |
.export-section { | |
position: relative; | |
} | |
.export-button { | |
display: inline-flex; | |
background-color: #fff; | |
border: 1px solid #ccc; | |
box-sizing: border-box; | |
min-width: 5.14em; | |
padding: 0.7em 1.1em; | |
letter-spacing: 0.02em; | |
border-radius: 3px; | |
cursor: pointer; | |
color: var(--secondary-text-color); | |
outline: none; | |
font-weight: 500; | |
} | |
.export-dropdown { | |
position: absolute; | |
background-color: #fafafa; | |
border: 1px solid #ccc; | |
border-radius: 3px; | |
margin: 0; | |
padding: 8px 0; | |
cursor: pointer; | |
top: 36px; | |
right: 0; | |
z-index: 1; | |
box-shadow: 1px 1px 3px #ccc; | |
min-width: 125px; | |
list-style-type: none; | |
line-height: 1.5em; | |
clip: rect(0, 164px, 0, 0); | |
opacity: 0; | |
transition: all 200ms cubic-bezier(0,0,0.2,1); | |
} | |
.export-button:focus, | |
.export-button.active { | |
box-shadow: 1px 1px 3px #ccc; | |
} | |
.export-button.active + .export-dropdown { | |
opacity: 1; | |
clip: rect(0, 164px, 200px, 0); | |
} | |
.export-dropdown a { | |
display: block; | |
color: currentColor; | |
text-decoration: none; | |
white-space: nowrap; | |
padding: 0 12px; | |
line-height: 1.8; | |
} | |
.export-dropdown a:hover, | |
.export-dropdown a:focus { | |
background-color: #efefef; | |
outline: none; | |
} | |
.export-dropdown .report__icon { | |
background-repeat: no-repeat; | |
background-position: 8px 50%; | |
background-size: 18px; | |
text-indent: 18px; | |
} | |
/* copy icon needs slight adjustments to look great */ | |
.export-dropdown .report__icon.copy { | |
background-size: 16px; | |
background-position: 9px 50%; | |
} | |
.log-wrapper { | |
position: fixed; | |
top: 0; | |
display: flex; | |
align-content: center; | |
width: 100%; | |
pointer-events: none; | |
} | |
#log { | |
margin: 0 auto; | |
padding: 16px 32px; | |
border-bottom-left-radius: 5px; | |
border-bottom-right-radius: 5px; | |
background-color: rgba(0,0,0,0.6); | |
max-width: 500px; | |
line-height: 1.4; | |
color: #fff; /*#e53935;*/ | |
font-size: 16px; | |
transition: transform 300ms ease-in-out; | |
transform: translateY(-100%); | |
} | |
#log.show { | |
transform: translateY(0); | |
} | |
@media print { | |
body { | |
-webkit-print-color-adjust: exact; /* print background colors */ | |
} | |
.report { | |
box-shadow: none; | |
} | |
.report-body__header-container, | |
.report-body__menu-container { | |
display: none; | |
} | |
.report-body__content { | |
margin-left: 0; | |
} | |
.log-wrapper { | |
display: none; | |
} | |
} | |
@media screen and (max-width: 400px) { | |
.report-body__metadata { | |
margin-right: 8px; | |
max-width: 65%; | |
} | |
} | |
@media screen and (max-width: 767px) { | |
:root { | |
--subitem-indent: 8px; | |
--gutter-width: 16px; | |
} | |
.aggregations { | |
padding-right: 8px; | |
} | |
.report-body__menu-container { | |
display: none; | |
} | |
.report-body__content, | |
.report-body__fixed-footer-container { | |
margin-left: 0; | |
} | |
.report-body__header, | |
.report-body__fixed-footer-container { | |
width: 100%; | |
} | |
.report-body__header { | |
padding-right: 8px; | |
} | |
.export-dropdown { | |
right: 0; | |
left: initial; | |
} | |
.footer { | |
margin-top: 0; | |
margin-left: 0; | |
height: auto; | |
} | |
} | |
:root[data-report-context="devtools"] .report { | |
margin: 10px 10px; | |
padding: 10px; | |
box-shadow: none; | |
max-width: none; | |
width: auto; | |
} | |
:root[data-report-context="devtools"] .report-body__aggregations-container > section:first-child { | |
padding-top: calc(var(--heading-line-height) / 3); | |
} | |
:root[data-report-context="devtools"] .report-body__menu-container { | |
display: none; | |
} | |
:root[data-report-context="devtools"] .report-body__header-container { | |
display: none; | |
} | |
:root[data-report-context="devtools"] .report-body__content { | |
margin-left: 0; | |
} | |
:root[data-report-context="devtools"] .footer { | |
display: none; | |
} | |
:root[data-report-context="viewer"] .share { | |
display: initial; | |
} | |
/* app z-indexes */ | |
.log-wrapper { | |
z-index: 3; | |
} | |
.cards__container { | |
--padding: 16px; | |
display: flex; | |
flex-wrap: wrap; | |
} | |
.scorecard { | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
flex: 1 1 150px; | |
flex-direction: column; | |
padding: var(--padding); | |
padding-top: calc(33px + var(--padding)); | |
border-radius: 3px; | |
margin-right: var(--padding); | |
position: relative; | |
color: var(--secondary-text-color); | |
line-height: inherit; | |
border: 1px solid #ebebeb; | |
} | |
.scorecard-title { | |
font-size: var(--subitem-font-size); | |
line-height: var(--heading-line-height); | |
background-color: #eee; | |
position: absolute; | |
top: 0; | |
right: 0; | |
left: 0; | |
display: flex; | |
justify-content: center; | |
align-items: center; | |
border-bottom: 1px solid #ebebeb; | |
} | |
.scorecard-value { | |
font-size: 28px; | |
} | |
.scorecard-summary, | |
.scorecard-target { | |
margin-top: var(--padding); | |
} | |
.scorecard-target { | |
font-size: 12px; | |
font-style: italic; | |
} | |
.tree-marker { | |
width: 12px; | |
height: 26px; | |
display: block; | |
float: left; | |
background-position: top left; | |
} | |
.horiz-down { | |
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMjZweCIgdmlld0JveD0iMCAwIDE2IDI2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjcuMiAoMjgyNzYpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPmhvcml6LWRvd248L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iaG9yaXotZG93biIgZmlsbD0iI0Q4RDhEOCI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMTM4IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3LjAwMDAwMCwgMTMuMDAwMDAwKSByb3RhdGUoLTI3MC4wMDAwMDApIHRyYW5zbGF0ZSgtNy4wMDAwMDAsIC0xMy4wMDAwMDApICIgeD0iNiIgeT0iNCIgd2lkdGg9IjIiIGhlaWdodD0iMTgiPjwvcmVjdD4KICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0xMzkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDguMDAwMDAwLCAxOS4wMDAwMDApIHJvdGF0ZSgtMjcwLjAwMDAwMCkgdHJhbnNsYXRlKC04LjAwMDAwMCwgLTE5LjAwMDAwMCkgIiB4PSIxIiB5PSIxOCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjIiPjwvcmVjdD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg=='); | |
} | |
.right { | |
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMjZweCIgdmlld0JveD0iMCAwIDE2IDI2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjcuMiAoMjgyNzYpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPnJpZ2h0PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InJpZ2h0IiBmaWxsPSIjRDhEOEQ4Ij4KICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0xMzgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDguMDAwMDAwLCAxMy4wMDAwMDApIHJvdGF0ZSgtMjcwLjAwMDAwMCkgdHJhbnNsYXRlKC04LjAwMDAwMCwgLTEzLjAwMDAwMCkgIiB4PSI3IiB5PSI1IiB3aWR0aD0iMiIgaGVpZ2h0PSIxNiI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'); | |
} | |
.up-right { | |
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMjZweCIgdmlld0JveD0iMCAwIDE2IDI2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjcuMiAoMjgyNzYpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPnVwLXJpZ2h0PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InVwLXJpZ2h0IiBmaWxsPSIjRDhEOEQ4Ij4KICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0xMzgiIHg9IjciIHk9IjAiIHdpZHRoPSIyIiBoZWlnaHQ9IjE0Ij48L3JlY3Q+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMTM5IiB4PSI5IiB5PSIxMiIgd2lkdGg9IjciIGhlaWdodD0iMiI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'); | |
} | |
.vert-right { | |
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMjZweCIgdmlld0JveD0iMCAwIDE2IDI2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjcuMiAoMjgyNzYpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPnZlcnQtcmlnaHQ8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0idmVydC1yaWdodCIgZmlsbD0iI0Q4RDhEOCI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMTM4IiB4PSI3IiB5PSIwIiB3aWR0aD0iMiIgaGVpZ2h0PSIyNyI+PC9yZWN0PgogICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTEzOSIgeD0iOSIgeT0iMTIiIHdpZHRoPSI3IiBoZWlnaHQ9IjIiPjwvcmVjdD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg=='); | |
} | |
.vert { | |
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMjZweCIgdmlld0JveD0iMCAwIDE2IDI2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjcuMiAoMjgyNzYpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPnZlcnQ8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0idmVydCIgZmlsbD0iI0Q4RDhEOCI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMTM4IiB4PSI3IiB5PSIwIiB3aWR0aD0iMiIgaGVpZ2h0PSIyNiI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'); | |
} | |
.space { | |
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjcuMiAoMjgyNzYpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPmhvcml6LWRvd248L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iaG9yaXotZG93biI+PC9nPgogICAgPC9nPgo8L3N2Zz4='); | |
} | |
.cnc-tree { | |
font-size: 14px; | |
width: 100%; | |
overflow-x: auto; | |
} | |
.cnc-node { | |
height: 26px; | |
line-height: 26px; | |
white-space: nowrap; | |
} | |
.cnc-node__tree-value { | |
margin-left: 10px; | |
} | |
.cnc-node__chain-duration { | |
font-weight: 700; | |
} | |
.cnc-node__tree-hostname { | |
color: #767676; | |
} | |
.initial-nav { | |
color: #767676; | |
margin: 10px 0 0; | |
font-style: italic; | |
} | |
.table_list { | |
--image-preview: 24px; | |
margin-top: 8px; | |
border: 1px solid #ebebeb; | |
border-spacing: 0; | |
table-layout: fixed; | |
} | |
.table_list.multicolumn { | |
width: 100%; | |
} | |
.table_list th, | |
.table_list td { | |
overflow: auto; | |
} | |
.table_list th { | |
background-color: #eee; | |
padding: 12px 10px; | |
line-height: 1.2; | |
} | |
.table_list td { | |
padding: 10px; | |
} | |
.table_list th:first-of-type, | |
.table_list td:first-of-type { | |
white-space: nowrap; | |
} | |
.table_list tr:nth-child(even), | |
.table_list tr:hover { | |
background-color: #fafafa; | |
} | |
.table_list code, .table_list pre { | |
white-space: pre; | |
font-family: monospace; | |
display: block; | |
margin: 0; | |
overflow-x: auto; | |
} | |
.table_list em + code, .table_list em + pre { | |
margin-top: 10px; | |
} | |
.table_list .table-column { | |
text-align: right; | |
} | |
.table_list .table-column.table-column-pre, .table_list .table-column.table-column-code { | |
text-align: left; | |
} | |
.table_list .table-column.table-column-pre pre { | |
max-height: 150px; | |
} | |
.table_list .table-column.table-column-url { | |
text-align: left; | |
width: 250px; | |
white-space: nowrap; | |
} | |
.table-column-potential-savings em, .table-column-webp-savings em, .table-column-jpeg-savings em { | |
color: #767676; | |
font-style: normal; | |
padding-left: 10px; | |
} | |
.table-column-preview img { | |
height: var(--image-preview); | |
width: var(--image-preview); | |
object-fit: contain; | |
} | |
.table-column-preview { | |
width: calc(var(--image-preview) * 2); | |
} | |
.http-resource__protocol, | |
.http-resource__code { | |
color: var(--secondary-text-color); | |
} | |
.http-resource__code { | |
text-overflow: ellipsis; | |
overflow: hidden; | |
white-space: pre-line; | |
} | |
.ut-measure_listing-duration { | |
font-weight: 700; | |
} | |
/*# sourceURL=inline-styles.css */ | |
</style> | |
</head> | |
<body> | |
<div class="js-report report"> | |
<section class="report-body"> | |
<div class="report-body__content"> | |
<div class="report-body__menu-container"> | |
<div class="menu"> | |
<div class="menu__header"> | |
<h1 class="menu__header-title">Lighthouse</h1> | |
<div class="menu__header-version">Version: 1.6.0</div> | |
</div> | |
<ul class="menu__nav"> | |
<li class="menu__nav-item"> | |
<a class="menu__link" href="#progressive-web-app"> | |
Progressive Web App | |
</a> | |
</li> | |
<li class="menu__nav-item"> | |
<a class="menu__link" href="#best-practices"> | |
Best Practices | |
</a> | |
</li> | |
<li class="menu__nav-item"> | |
<a class="menu__link" href="#performance"> | |
Performance | |
</a> | |
</li> | |
<li class="menu__nav-item"> | |
<a class="menu__link" href="#fancier-stuff"> | |
Fancier stuff | |
</a> | |
</li> | |
</ul> </div> | |
</div> | |
<div class="report-body__header-container js-header-container"> | |
<div class="report-body__header"> | |
<button class="report-body__more-toggle js-header-toggle" title="See report's runtime settings"></button> | |
<div class="report-body__metadata"> | |
<div class="report-body__url">Results for: <a href="https://haxe.io/" target="_blank" rel="noopener">https://haxe.io/</a></div> | |
<div class="report-body__url">Generated on: 3/9/2017, 11:05:14 AM GMT</div> | |
</div> | |
<div class="report-body__buttons"> | |
<div class="export-section"> | |
<button class="export-button js-export active" title="Export report in different formats">Export...</button> | |
<ul class="export-dropdown"> | |
<li><a href="#" class="report__icon print" data-action="print">Print...</a></li> | |
<li><a href="#" class="report__icon copy" data-action="copy">Copy JSON</a></li> | |
<li><a href="#" class="report__icon download" data-action="save-html" data-context="extension">Save as HTML</a></li> | |
<li><a href="#" class="report__icon download" data-action="save-json" data-context="extension">Save as JSON</a></li> | |
<li><a href="#" class="report__icon open" data-action="open-viewer" data-context="extension">Open in Viewer</a></li> | |
</ul> | |
</div> | |
<button class="report__icon report-body__icon share js-share" title="Share report on GitHub"></button> | |
</div> | |
<div class="report-body__header-content"> | |
<section class="config-section"> | |
<h2 class="config-section__title">Runtime Environment</h2> | |
<ul class="config-section__items"> | |
<li class="config-section__item"> | |
<p class="config-section__desc"> | |
Device Emulation (Nexus 5X): | |
<strong> Enabled</strong> | |
</p> | |
</li> | |
<li class="config-section__item"> | |
<p class="config-section__desc"> | |
Network Throttling (150ms RTT, 1.6Mbps down, 0.7Mbps up): | |
<strong> Enabled</strong> | |
</p> | |
</li> | |
<li class="config-section__item"> | |
<p class="config-section__desc"> | |
CPU Throttling (5x slowdown): | |
<strong> Disabled</strong> | |
</p> | |
</li> | |
</ul> | |
</section> | |
</div> | |
</div> | |
</div> | |
<div class="report-body__aggregations-container"> | |
<section class="js-breakdown aggregations" id="progressive-web-app"> | |
<header class="aggregations__header"> | |
<h2>Progressive Web App</h2> | |
<p class="aggregations__desc">These audits validate the aspects of a Progressive Web App. They are a subset of the <a href="https://developers.google.com/web/progressive-web-apps/checklist" target="_blank" rel="noopener">PWA Checklist</a>.</p> | |
<div class="section-result"> | |
<span class="section-result__score score-good-bg"> | |
<span class="section-result__points">76</span> | |
<span class="section-result__divider">/</span> | |
<span class="section-result__total">100</span> | |
</span> | |
</div> | |
</header> | |
<div class="js-report-by-user-feature"> | |
<section class="aggregation" data-rating="poor" data-score="0"> | |
<details class="aggregation__details" open=""> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-poor-bg subitem-result__poor"></span> | |
<h2>App can load on offline/flaky connections</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<p class="aggregation__desc">Ensuring your web app can respond when the network connection is unavailable or flaky is critical to providing your users a good experience. This is achieved through use of a <a href="https://developers.google.com/web/fundamentals/primers/service-worker/" target="_blank" rel="noopener">Service Worker</a>.</p> | |
<ul class="subitems"> | |
<li class="subitem --show-help"> | |
<p class="subitem__desc"> | |
Registers a Service Worker | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. <a href="https://developers.google.com/web/tools/lighthouse/audits/registered-service-worker" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__poor score-poor-bg">Fail</span> | |
</div> </li> | |
<li class="subitem --show-help"> | |
<p class="subitem__desc"> | |
Responds with a 200 when offline | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
If you're building a Progressive Web App, consider using a service worker so that your app can work offline. <a href="https://developers.google.com/web/tools/lighthouse/audits/http-200-when-offline" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__poor score-poor-bg">Fail</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Page load performance is fast</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<p class="aggregation__desc">Users notice if sites and apps don't perform well. These top-level metrics capture the most important perceived performance concerns.</p> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
First meaningful paint<strong class="subitem__raw-value">: 896.0ms</strong> | |
<small>(target: 1,600ms)</small> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
First meaningful paint measures when the primary content of a page is visible. <a href="https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__points score-good-bg"> | |
100 | |
</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Perceptual Speed Index<strong class="subitem__raw-value">: 883</strong> | |
<small>(target: 1,250)</small> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Speed Index shows how quickly the contents of a page are visibly populated. <a href="https://developers.google.com/web/tools/lighthouse/audits/speed-index" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__points score-good-bg"> | |
100 | |
</span> | |
</div><ul class="subitem__details"> | |
<li class="subitem__detail">First Visual Change: <strong>867ms</strong></li> | |
<li class="subitem__detail">Last Visual Change: <strong>913ms</strong></li> | |
</ul> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Estimated Input Latency<strong class="subitem__raw-value">: 16ms</strong> | |
<small>(target: 50ms)</small> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The score above is an estimate of how long your app takes to respond to user input, in milliseconds. There is a 90% probability that a user encounters this amount of latency, or less. 10% of the time a user can expect additional latency. If your score is higher than Lighthouse's target score, users may perceive your app as laggy. <a href="https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__points score-good-bg"> | |
100 | |
</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Time To Interactive (alpha)<strong class="subitem__raw-value">: 901.6ms</strong> | |
<small>(target: 5,000ms)</small> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Time to Interactive identifies the time at which your app appears to be ready enough to interact with. <a href="https://developers.google.com/web/tools/lighthouse/audits/time-to-interactive" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__points score-good-bg"> | |
100 | |
</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Site is progressively enhanced</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<p class="aggregation__desc">Progressive enhancement means that everyone can access the basic content and functionality of a page in any browser, and those without certain browser features may receive a reduced but still functional experience.</p> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Contains some content when JavaScript is not available | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Your app should display some content when JavaScript is disabled, even if it's just a warning to the user that JavaScript is required to use the app. <a href="https://developers.google.com/web/tools/lighthouse/audits/no-js" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Network connection is secure</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<p class="aggregation__desc">Security is an important part of the web for both developers and users. Moving forward, Transport Layer Security (TLS) support will be required for many APIs.</p> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Uses HTTPS | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
All sites should be protected with HTTPS, even ones that don't handle sensitive data. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. <a href="https://developers.google.com/web/tools/lighthouse/audits/https" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Redirects HTTP traffic to HTTPS | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
If you've already set up HTTPS, make sure that you redirect all HTTP traffic to HTTPS. <a href="https://developers.google.com/web/tools/lighthouse/audits/http-redirects-to-https" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="0.8"> | |
<details class="aggregation__details" open=""> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>User can be prompted to Add to Homescreen</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<p class="aggregation__desc">While users can manually add your site to their homescreen in the browser menu, the <a href="https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android" target="_blank" rel="noopener">prompt (aka app install banner)</a> will proactively prompt the user to install the app if the below requirements are met and the user has visited your site at least twice (with at least five minutes between visits).</p> | |
<ul class="subitems"> | |
<li class="subitem --show-help"> | |
<p class="subitem__desc"> | |
Registers a Service Worker | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. <a href="https://developers.google.com/web/tools/lighthouse/audits/registered-service-worker" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__poor score-poor-bg">Fail</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest exists | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The web app manifest is the technology that enables users to add your web app to their homescreen. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-exists" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest contains <code>start_url</code> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Add a <code>start_url</code> to instruct the browser to launch a specific URL whenever your app is launched from a homescreen. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-start_url" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest contains icons at least 144px<strong class="subitem__raw-value">: found sizes: 144x144, 192x192</strong> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest contains <code>short_name</code> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The <code>short_name</code> property is a requirement for Add To Homescreen. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-short_name" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="average" data-score="0.6"> | |
<details class="aggregation__details" open=""> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-average-bg subitem-result__average"></span> | |
<h2>Installed web app will launch with custom splash screen</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<p class="aggregation__desc">A default splash screen will be constructed, but meeting these requirements guarantee a high-quality and customizable <a href="https://developers.google.com/web/updates/2015/10/splashscreen" target="_blank" rel="noopener">splash screen</a> the user sees between tapping the home screen icon and your app's first paint.</p> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest exists | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The web app manifest is the technology that enables users to add your web app to their homescreen. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-exists" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest contains <code>name</code> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The <code>name</code> property identifies your app and is required. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-name" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem --show-help"> | |
<p class="subitem__desc"> | |
Manifest contains <code>background_color</code> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
When your app launches from a user's homescreen, the browser uses <code>background_color</code> to paint the background of the browser while your app loads for a smooth transition experience. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-background_color" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__poor score-poor-bg">Fail</span> | |
</div> </li> | |
<li class="subitem --show-help"> | |
<p class="subitem__desc"> | |
Manifest contains <code>theme_color</code> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Add a <code>theme_color</code> to set the color of the browser's address bar. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-theme_color" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__poor score-poor-bg">Fail</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest contains icons at least 192px<strong class="subitem__raw-value">: found sizes: 192x192</strong> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
A 192px icon ensures that your app's icon displays well on the homescreens of the largest mobile devices. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-192px-icon" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="average" data-score="0.6666666666666666"> | |
<details class="aggregation__details" open=""> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-average-bg subitem-result__average"></span> | |
<h2>Address bar matches brand colors</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<p class="aggregation__desc">The browser address bar can be themed to match your site. A <code>theme-color</code> <a href="https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android" target="_blank" rel="noopener">meta tag</a> will upgrade the address bar when a user browses the site, and the <a href="https://developers.google.com/web/updates/2015/08/using-manifest-to-set-sitewide-theme-color" target="_blank" rel="noopener">manifest theme-color</a> will apply the same theme site-wide once it's been added to homescreen.</p> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest exists | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The web app manifest is the technology that enables users to add your web app to their homescreen. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-exists" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Has a <code><meta name="theme-color"></code> tag<strong class="subitem__raw-value">: #ffffff</strong> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem --show-help"> | |
<p class="subitem__desc"> | |
Manifest contains <code>theme_color</code> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Add a <code>theme_color</code> to set the color of the browser's address bar. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-theme_color" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__poor score-poor-bg">Fail</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Design is mobile-friendly</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<p class="aggregation__desc">Users increasingly experience your app on mobile devices, so it's important to ensure that the experience can adapt to smaller screens.</p> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Has a <code><meta name="viewport"></code> tag with <code>width</code> or <code>initial-scale</code> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Add a viewport meta tag to optimize your app for mobile screens. <a href="https://developers.google.com/web/tools/lighthouse/audits/has-viewport-meta-tag" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Content is sized correctly for the viewport | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
If the width of your app's content doesn't match the width of the viewport, your app might not be optimized for mobile screens. <a href="https://developers.google.com/web/tools/lighthouse/audits/content-sized-correctly-for-viewport" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
</div> | |
</section> | |
<section class="js-breakdown aggregations" id="best-practices"> | |
<header class="aggregations__header"> | |
<h2>Best Practices</h2> | |
<p class="aggregations__desc">We've compiled some recommendations for modernizing your web app and avoiding performance pitfalls. These audits do not affect your score but are worth a look.</p> | |
</header> | |
<div class="js-report-by-user-feature"> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Using modern offline features</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids Application Cache | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Application Cache has been <a href="https://html.spec.whatwg.org/multipage/browsers.html#offline" target="_blank" rel="noopener">deprecated</a> by <a href="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers" target="_blank" rel="noopener">Service Workers</a>. Consider implementing an offline solution using the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Cache" target="_blank" rel="noopener">Cache Storage API</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids WebSQL DB | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Web SQL is deprecated. Consider using IndexedDB instead. <a href="https://developers.google.com/web/tools/lighthouse/audits/web-sql" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Using modern protocols</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Uses HTTPS | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
All sites should be protected with HTTPS, even ones that don't handle sensitive data. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. <a href="https://developers.google.com/web/tools/lighthouse/audits/https" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Uses HTTP/2 for its own resources | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
HTTP/2 offers many benefits over HTTP/1.1, including binary headers, multiplexing, and server push. <a href="https://developers.google.com/web/tools/lighthouse/audits/http2" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> | |
</li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Using modern CSS features</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids old CSS flexbox | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The 2009 spec of Flexbox is deprecated and is 2.3x slower than the latest spec. <a href="https://developers.google.com/web/tools/lighthouse/audits/old-flexbox" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> | |
</li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Using modern JavaScript features</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Uses passive listeners to improve scrolling performance | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Consider marking your touch and wheel event listeners as <code>passive</code> to improve your page's scroll performance. <a href="https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem__debug"> | |
Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source. | |
</div> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids Mutation Events in its own scripts | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Mutation Events are deprecated and harm performance. Consider using Mutation Observers instead. <a href="https://developers.google.com/web/tools/lighthouse/audits/mutation-events" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem__debug"> | |
Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source. | |
</div> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> | |
</li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Avoiding APIs that harm the user experience</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids <code>document.write()</code> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
For users on slow connections, external scripts dynamically injected via <code>document.write()</code> can delay page load by tens of seconds. <a href="https://developers.google.com/web/tools/lighthouse/audits/document-write" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Opens external anchors using rel="noopener" | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Open new tabs using <code>rel="noopener"</code> to improve performance and prevent security vulnerabilities. <a href="https://developers.google.com/web/tools/lighthouse/audits/noopener" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids requesting the geolocation permission on page load | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to user gestures instead. <a href="https://developers.google.com/web/tools/lighthouse/audits/geolocation-on-load" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids requesting the notification permission on page load | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Users are mistrustful of or confused by sites that request to send notifications without context. Consider tying the request to user gestures instead. <a href="https://developers.google.com/web/tools/lighthouse/audits/notifications-on-load" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Avoiding deprecated APIs and browser interventions</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids deprecated APIs | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Deprecated APIs will eventually be removed from the browser. <a href="https://www.chromestatus.com/features#deprecated" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="0.875"> | |
<details class="aggregation__details" open=""> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Accessibility</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Element aria-* attributes are allowed for this role | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Each ARIA <code>role</code> supports a specific subset of <code>aria-*</code> attributes. Mismatching these invalidates the <code>aria-*</code> attributes. <a href="https://developers.google.com/web/tools/lighthouse/audits/aria-allowed-attributes" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Elements with ARIA roles have the required aria-* attributes | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Some ARIA roles have required attributes that describe the state of the element to screen readers. <a href="https://developers.google.com/web/tools/lighthouse/audits/required-aria-attributes" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Element aria-* attributes are valid and not misspelled or non-existent. | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid names. <a href="https://developers.google.com/web/tools/lighthouse/audits/valid-aria-attributes" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Element aria-* attributes have valid values | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid values. <a href="https://developers.google.com/web/tools/lighthouse/audits/valid-aria-values" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem --show-help"> | |
<p class="subitem__desc"> | |
Background and foreground colors have a sufficient contrast ratio | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Low-contrast text is difficult or impossible for many users to read. <a href="https://developers.google.com/web/tools/lighthouse/audits/contrast-ratio" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__poor score-poor-bg">Fail</span> | |
</div><details class="subitem__details"> | |
<summary class="subitem__detail">4 elements fail this test</summary> | |
<ul class="subitem__details"> | |
<li class="subitem__detail"><code>body > header > .tabs > ul > li:nth-of-type(2) > label</code></li> | |
<li class="subitem__detail"><code>body > header > .tabs > ul > li:nth-of-type(3) > label</code></li> | |
<li class="subitem__detail"><code>body > header > .tabs > ul > li:nth-of-type(4) > label</code></li> | |
<li class="subitem__detail"><code>body > header > .tabs > ul > li:nth-of-type(8) > label</code></li> | |
</ul> | |
</details> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Every image element has an alt attribute | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Screen reader users rely on <code>alt</code> text to provide descriptions of images. It's also used as fallback content when an image fails to load. <a href="https://developers.google.com/web/tools/lighthouse/audits/alt-attribute" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Every form element has a label | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Labels ensure that form controls are announced properly by assistive technologies, like screen readers. <a href="https://developers.google.com/web/tools/lighthouse/audits/form-labels" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
No element has a <code>tabindex</code> attribute greater than 0 | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
A value greater than 0 implies an explicit navigation ordering. Although technically valid, this often creates frustrating experiences for users who rely on assistive technologies. <a href="https://developers.google.com/web/tools/lighthouse/audits/tabindex" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>Other</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest's <code>short_name</code> won't be truncated when displayed on homescreen | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Make your app's <code>short_name</code> less than 12 characters to ensure that it's not truncated on homescreens. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-short_name-is-not-truncated" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Manifest's <code>display</code> property is set<strong class="subitem__raw-value">: standalone</strong> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Set the <code>display</code> property to specify how your app launches from the homescreen. <a href="https://developers.google.com/web/tools/lighthouse/audits/manifest-has-display-set" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</details></section> | |
</div> | |
</section> | |
<section class="js-breakdown aggregations" id="performance"> | |
<header class="aggregations__header"> | |
<h2>Performance</h2> | |
<p class="aggregations__desc">These encapsulate your app's performance.</p> | |
</header> | |
<div class="js-report-by-user-feature"> | |
<section class="aggregation" data-rating="good" data-score="0.7777777777777778"> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Unused CSS rules<strong class="subitem__raw-value">: Potential savings of 3 KB (~10ms)</strong> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Remove unused rules from stylesheets to reduce unnecessary bytes consumed by network activity. <a href="https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery" target="_blank" rel="noopener">Learn more</a> | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__info score-good-bg">Pass</span> | |
</div> | |
<details class="subitem__details"> | |
<summary class="subitem__detail">View details</summary> | |
<table class="table_list multicolumn"> | |
<thead> | |
<tr> | |
<th class="table-column table-column-url">URL</th> | |
<th class="table-column table-column-num-unused">Unused Rules</th> | |
<th class="table-column table-column-total-kb">Original</th> | |
<th class="table-column table-column-potential-savings">Potential Savings</th> | |
</tr> | |
</thead> | |
<tbody> | |
<tr> | |
<td class="table-column table-column-url">…css/haxe.io.css</td> | |
<td class="table-column table-column-num-unused">122</td> | |
<td class="table-column table-column-total-kb">3 KB</td> | |
<td class="table-column table-column-potential-savings">3 KB <em>86%</em></td> | |
</tr> | |
</tbody> | |
</table> | |
</details> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Unoptimized images | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Images should be optimized to save network bytes. The following images could have smaller file sizes when compressed with <a href="https://developers.google.com/speed/webp/" target="_blank" rel="noopener">WebP</a> or JPEG at 80 quality. <a href="https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/image-optimization" target="_blank" rel="noopener">Learn more about image optimization</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__info score-good-bg">Pass</span> | |
</div> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Oversized Images | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Image sizes served should be based on the device display size to save network bytes. Learn more about <a href="https://developers.google.com/web/fundamentals/design-and-ui/media/images" target="_blank" rel="noopener">responsive images</a> and <a href="https://developers.google.com/web/updates/2015/09/automating-resource-selection-with-client-hints" target="_blank" rel="noopener">client hints</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__info score-good-bg">Pass</span> | |
</div> | |
</li> | |
<li class="subitem --show-help"> | |
<p class="subitem__desc"> | |
Critical Request Chains<strong class="subitem__raw-value">: 5</strong> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
The Critical Request Chains below show you what resources are required for first render of this page. Improve page load by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources. <a href="https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__warning score-warning-bg">Fail</span> | |
</div> | |
<ul class="subitem__details"> | |
<li class="subitem__detail">Longest chain: <strong>797.2ms</strong> | |
over <strong>1</strong> requests, totalling <strong>10.29KB</strong></li> | |
<li class="subitem__detail"> | |
<details open=""> | |
<summary>View critical network waterfall</summary> | |
<div class="initial-nav">Initial navigation</div> | |
<div class="cnc-node" title="https://haxe.io/"> | |
<span class="cnc-node__tree-marker"> | |
<span class="tree-marker vert-right"></span> | |
<span class="tree-marker right"></span> | |
<span class="tree-marker horiz-down"></span> | |
</span> | |
<span class="cnc-node__tree-value"> | |
<span class="cnc-node__tree-file">/</span> | |
<span class="cnc-node__tree-hostname">(haxe.io)</span> | |
</span> | |
</div> | |
<div class="cnc-node" title="https://haxe.io/css/normalize.css"> | |
<span class="cnc-node__tree-marker"> | |
<span class="tree-marker vert"></span> | |
<span class="tree-marker space"></span> | |
<span class="tree-marker vert-right"></span> | |
<span class="tree-marker right"></span> | |
<span class="tree-marker right"></span> | |
</span> | |
<span class="cnc-node__tree-value"> | |
<span class="cnc-node__tree-file">…css/normalize.css</span> | |
<span class="cnc-node__tree-hostname">(haxe.io)</span> | |
- <span class="cnc-node__chain-duration">447.6ms</span>, | |
<span class="cnc-node__chain-duration">20.69KB</span> | |
</span> | |
</div> | |
<div class="cnc-node" title="https://haxe.io/css/normalize-opentype.css"> | |
<span class="cnc-node__tree-marker"> | |
<span class="tree-marker vert"></span> | |
<span class="tree-marker space"></span> | |
<span class="tree-marker vert-right"></span> | |
<span class="tree-marker right"></span> | |
<span class="tree-marker right"></span> | |
</span> | |
<span class="cnc-node__tree-value"> | |
<span class="cnc-node__tree-file">…css/normalize-opentype.css</span> | |
<span class="cnc-node__tree-hostname">(haxe.io)</span> | |
- <span class="cnc-node__chain-duration">469.2ms</span>, | |
<span class="cnc-node__chain-duration">20.17KB</span> | |
</span> | |
</div> | |
<div class="cnc-node" title="https://fonts.googleapis.com/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700"> | |
<span class="cnc-node__tree-marker"> | |
<span class="tree-marker vert"></span> | |
<span class="tree-marker space"></span> | |
<span class="tree-marker vert-right"></span> | |
<span class="tree-marker right"></span> | |
<span class="tree-marker right"></span> | |
</span> | |
<span class="cnc-node__tree-value"> | |
<span class="cnc-node__tree-file">/css</span> | |
<span class="cnc-node__tree-hostname">(fonts.googleapis.com)</span> | |
- <span class="cnc-node__chain-duration">476.6ms</span>, | |
<span class="cnc-node__chain-duration">20.92KB</span> | |
</span> | |
</div> | |
<div class="cnc-node" title="https://haxe.io/css/frontpage.css"> | |
<span class="cnc-node__tree-marker"> | |
<span class="tree-marker vert"></span> | |
<span class="tree-marker space"></span> | |
<span class="tree-marker vert-right"></span> | |
<span class="tree-marker right"></span> | |
<span class="tree-marker right"></span> | |
</span> | |
<span class="cnc-node__tree-value"> | |
<span class="cnc-node__tree-file">…css/frontpage.css</span> | |
<span class="cnc-node__tree-hostname">(haxe.io)</span> | |
- <span class="cnc-node__chain-duration">482.5ms</span>, | |
<span class="cnc-node__chain-duration">21.46KB</span> | |
</span> | |
</div> | |
<div class="cnc-node" title="https://haxe.io/css/haxe.io.css"> | |
<span class="cnc-node__tree-marker"> | |
<span class="tree-marker vert"></span> | |
<span class="tree-marker space"></span> | |
<span class="tree-marker up-right"></span> | |
<span class="tree-marker right"></span> | |
<span class="tree-marker right"></span> | |
</span> | |
<span class="cnc-node__tree-value"> | |
<span class="cnc-node__tree-file">…css/haxe.io.css</span> | |
<span class="cnc-node__tree-hostname">(haxe.io)</span> | |
- <span class="cnc-node__chain-duration">497ms</span>, | |
<span class="cnc-node__chain-duration">22.63KB</span> | |
</span> | |
</div> | |
<div class="cnc-node" title="https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2"> | |
<span class="cnc-node__tree-marker"> | |
<span class="tree-marker vert-right"></span> | |
<span class="tree-marker right"></span> | |
<span class="tree-marker right"></span> | |
</span> | |
<span class="cnc-node__tree-value"> | |
<span class="cnc-node__tree-file">…v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2</span> | |
<span class="cnc-node__tree-hostname">(fonts.gstatic.com)</span> | |
- <span class="cnc-node__chain-duration">761.6ms</span>, | |
<span class="cnc-node__chain-duration">5.75KB</span> | |
</span> | |
</div> | |
<div class="cnc-node" title="https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2"> | |
<span class="cnc-node__tree-marker"> | |
<span class="tree-marker up-right"></span> | |
<span class="tree-marker right"></span> | |
<span class="tree-marker right"></span> | |
</span> | |
<span class="cnc-node__tree-value"> | |
<span class="cnc-node__tree-file">…v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2</span> | |
<span class="cnc-node__tree-hostname">(fonts.gstatic.com)</span> | |
- <span class="cnc-node__chain-duration">797.2ms</span>, | |
<span class="cnc-node__chain-duration">10.29KB</span> | |
</span> | |
</div> | |
</details> | |
</li> | |
</ul> | |
</li> | |
<li class="subitem --show-help"> | |
<p class="subitem__desc"> | |
Render-blocking Stylesheets<strong class="subitem__raw-value">: 5 resources delayed first paint by 54ms</strong> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Link elements are blocking the first paint of your page. Consider inlining critical links and deferring non-critical ones. <a href="https://developers.google.com/web/tools/lighthouse/audits/blocking-resources" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__warning score-warning-bg">Fail</span> | |
</div> | |
<details class="subitem__details"> | |
<summary class="subitem__detail">View details</summary> | |
<table class="table_list multicolumn"> | |
<thead> | |
<tr> | |
<th class="table-column table-column-url">URL</th> | |
<th class="table-column table-column-total-kb">Size (KB)</th> | |
<th class="table-column table-column-total-ms">Delayed Paint By (ms)</th> | |
</tr> | |
</thead> | |
<tbody> | |
<tr> | |
<td class="table-column table-column-url">…css/normalize.css</td> | |
<td class="table-column table-column-total-kb">1 KB</td> | |
<td class="table-column table-column-total-ms">30ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">…css/frontpage.css</td> | |
<td class="table-column table-column-total-kb">2 KB</td> | |
<td class="table-column table-column-total-ms">32ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">…css/haxe.io.css</td> | |
<td class="table-column table-column-total-kb">3 KB</td> | |
<td class="table-column table-column-total-ms">35ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">…css/normalize-opentype.css</td> | |
<td class="table-column table-column-total-kb">1 KB</td> | |
<td class="table-column table-column-total-ms">35ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">/css</td> | |
<td class="table-column table-column-total-kb">1 KB</td> | |
<td class="table-column table-column-total-ms">54ms</td> | |
</tr> | |
</tbody> | |
</table> | |
</details> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Render-blocking scripts | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Script elements are blocking the first paint of your page. Consider inlining critical scripts and deferring non-critical ones. <a href="https://developers.google.com/web/tools/lighthouse/audits/blocking-resources" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__info score-good-bg">Pass</span> | |
</div> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids enormous network payloads<strong class="subitem__raw-value">: Total size was 56 KB</strong> | |
<small>(target: 1,600 KB)</small> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Network transfer size <a href="https://whatdoesmysitecost.com/" target="_blank" rel="noopener">costs users real dollars</a> and is <a href="http://httparchive.org/interesting.php#onLoad" target="_blank" rel="noopener">highly correlated</a> with long load times. Try to find ways to reduce the size of required files. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__points score-good-bg"> | |
100 | |
</span> | |
</div> | |
<details class="subitem__details"> | |
<summary class="subitem__detail">View details</summary> | |
<table class="table_list multicolumn"> | |
<thead> | |
<tr> | |
<th class="table-column table-column-url">URL</th> | |
<th class="table-column table-column-total-kb">Total Size</th> | |
<th class="table-column table-column-total-ms">Transfer Time</th> | |
</tr> | |
</thead> | |
<tbody> | |
<tr> | |
<td class="table-column table-column-url">/</td> | |
<td class="table-column table-column-total-kb">20 KB</td> | |
<td class="table-column table-column-total-ms">100ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">/analytics.js</td> | |
<td class="table-column table-column-total-kb">12 KB</td> | |
<td class="table-column table-column-total-ms">60ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">…v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2</td> | |
<td class="table-column table-column-total-kb">10 KB</td> | |
<td class="table-column table-column-total-ms">50ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">…v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2</td> | |
<td class="table-column table-column-total-kb">6 KB</td> | |
<td class="table-column table-column-total-ms">30ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">…css/haxe.io.css</td> | |
<td class="table-column table-column-total-kb">3 KB</td> | |
<td class="table-column table-column-total-ms">20ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">…css/frontpage.css</td> | |
<td class="table-column table-column-total-kb">2 KB</td> | |
<td class="table-column table-column-total-ms">10ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700</td> | |
<td class="table-column table-column-total-kb">1 KB</td> | |
<td class="table-column table-column-total-ms">10ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">…css/normalize.css</td> | |
<td class="table-column table-column-total-kb">1 KB</td> | |
<td class="table-column table-column-total-ms">10ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">…css/normalize-opentype.css</td> | |
<td class="table-column table-column-total-kb">1 KB</td> | |
<td class="table-column table-column-total-ms">0ms</td> | |
</tr> | |
<tr> | |
<td class="table-column table-column-url">/collect?v=…</td> | |
<td class="table-column table-column-total-kb">0 KB</td> | |
<td class="table-column table-column-total-ms">0ms</td> | |
</tr> | |
</tbody> | |
</table> | |
</details> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids an excessive DOM size<strong class="subitem__raw-value">: 905 nodes</strong> | |
<small>(target: 1,500 nodes)</small> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Browser engineers recommend pages contain fewer than ~1,500 DOM nodes. The sweet spot is a tree depth < 32 elements and fewer than 60 children/parent element. A large DOM can increase memory, cause longer <a href="https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations" target="_blank" rel="noopener">style calculations</a>, and produce costly <a href="https://developers.google.com/speed/articles/reflow" target="_blank" rel="noopener">layout reflows</a>. <a href="https://developers.google.com/web/fundamentals/performance/rendering/" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__points score-good-bg"> | |
100 | |
</span> | |
</div><details class="subitem__details"> | |
<summary class="subitem__detail">More information</summary> | |
<div class="cards__container"> | |
<div class="subitem__detail scorecard"> | |
<div class="scorecard-title">Total DOM Nodes</div> | |
<div class="scorecard-value">905</div> | |
<div class="scorecard-target">target: < 1,500 nodes</div> | |
</div> | |
<div class="subitem__detail scorecard" title="html./frontpage > | |
body > | |
footer.grid > | |
div.grid-1-1 > | |
div.logo > | |
div > | |
svg > | |
g > | |
g > | |
line"> | |
<div class="scorecard-title">DOM Depth</div> | |
<div class="scorecard-value">10</div> | |
<div class="scorecard-target">target: < 32</div> | |
</div> | |
<div class="subitem__detail scorecard" title="Element with most children: | |
ul"> | |
<div class="scorecard-title">Maximum Children</div> | |
<div class="scorecard-value">166</div> | |
<div class="scorecard-target">target: < 60 nodes</div> | |
</div> | |
</div> | |
</details> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
User Timing marks and measures<strong class="subitem__raw-value">: 0</strong> | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Consider instrumenting your app with the User Timing API to create custom, real-world measurements of key user experiences. <a href="https://developers.google.com/web/tools/lighthouse/audits/user-timing" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__info score-good-bg">Pass</span> | |
</div> </li> | |
</ul> | |
</section> | |
</div> | |
</section> | |
<section class="js-breakdown aggregations" id="fancier-stuff"> | |
<header class="aggregations__header"> | |
<h2>Fancier stuff</h2> | |
<p class="aggregations__desc">A list of newer features that you could be using in your app. These audits do not affect your score and are just suggestions.</p> | |
</header> | |
<div class="js-report-by-user-feature"> | |
<section class="aggregation" data-rating="good" data-score="1"> | |
<details class="aggregation__details"> | |
<summary> | |
<header class="aggregation__header"> | |
<span class="aggregation__header__score score-good-bg subitem-result__good"></span> | |
<h2>New JavaScript features</h2> | |
<div class="report-body__more-toggle" title="See audits"></div> | |
</header> | |
</summary> | |
<ul class="subitems"> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids <code>Date.now()</code> in its own scripts | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Consider using <code>performance.now()</code> from the User Timing API instead. It provides high-precision timestamps, independent of the system clock. <a href="https://developers.google.com/web/tools/lighthouse/audits/date-now" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> | |
</li> | |
<li class="subitem "> | |
<p class="subitem__desc"> | |
Avoids <code>console.time()</code> in its own scripts | |
<input type="checkbox" class="subitem__help-toggle" title="Toggle help text"> | |
<label class="subitem__help-toggle-label"></label> | |
<span class="subitem__help"> | |
Consider using <code>performance.mark()</code> and <code>performance.measure()</code> from the User Timing API instead. They provide high-precision timestamps, independent of the system clock, and are integrated in the Chrome DevTools Timeline. <a href="https://developers.google.com/web/tools/lighthouse/audits/console-time" target="_blank" rel="noopener">Learn more</a>. | |
</span> | |
</p> | |
<div class="subitem-result"> | |
<span class="subitem-result__good score-good-bg">Pass</span> | |
</div> | |
</li> | |
</ul> | |
</details></section> | |
</div> | |
</section> | |
</div> | |
</div> | |
<footer class="footer"> | |
Generated by <b>Lighthouse</b> 1.6.0 on 3/9/2017, 11:05:14 AM GMT | <a href="https://github.com/GoogleChrome/Lighthouse/issues" target="_blank" rel="noopener">File an issue</a> | |
</footer> | |
</section> | |
</div> | |
<div class="log-wrapper"> | |
<div id="log"></div> | |
</div> | |
<div id="lhresults-dump"> | |
{ | |
"lighthouseVersion": "1.6.0", | |
"generatedTime": "2017-03-09T11:05:14.849Z", | |
"initialUrl": "https://haxe.io/", | |
"url": "https://haxe.io/", | |
"audits": { | |
"is-on-https": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "is-on-https", | |
"category": "Security", | |
"description": "Uses HTTPS", | |
"helpText": "All sites should be protected with HTTPS, even ones that don't handle sensitive data. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/https)." | |
}, | |
"redirects-http": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "redirects-http", | |
"category": "Security", | |
"description": "Redirects HTTP traffic to HTTPS", | |
"helpText": "If you've already set up HTTPS, make sure that you redirect all HTTP traffic to HTTPS. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http-redirects-to-https)." | |
}, | |
"service-worker": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "service-worker", | |
"category": "Offline", | |
"description": "Registers a Service Worker", | |
"helpText": "The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/registered-service-worker)." | |
}, | |
"works-offline": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "works-offline", | |
"category": "Offline", | |
"description": "Responds with a 200 when offline", | |
"helpText": "If you're building a Progressive Web App, consider using a service worker so that your app can work offline. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http-200-when-offline)." | |
}, | |
"viewport": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "viewport", | |
"category": "Mobile Friendly", | |
"description": "Has a `<meta name=\"viewport\">` tag with `width` or `initial-scale`", | |
"helpText": "Add a viewport meta tag to optimize your app for mobile screens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/has-viewport-meta-tag)." | |
}, | |
"manifest-display": { | |
"score": true, | |
"displayValue": "standalone", | |
"rawValue": true, | |
"name": "manifest-display", | |
"category": "Manifest", | |
"description": "Manifest's `display` property is set", | |
"helpText": "Set the `display` property to specify how your app launches from the homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-has-display-set)." | |
}, | |
"without-javascript": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "without-javascript", | |
"category": "JavaScript", | |
"description": "Contains some content when JavaScript is not available", | |
"helpText": "Your app should display some content when JavaScript is disabled, even if it's just a warning to the user that JavaScript is required to use the app. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/no-js)." | |
}, | |
"first-meaningful-paint": { | |
"score": 100, | |
"displayValue": "896.0ms", | |
"rawValue": 896, | |
"optimalValue": "1,600ms", | |
"extendedInfo": { | |
"value": { | |
"timestamps": { | |
"navStart": 662414457357, | |
"fCP": 662415078293, | |
"fMP": 662415353311 | |
}, | |
"timings": { | |
"navStart": 0, | |
"fCP": 620.936, | |
"fMP": 895.954 | |
} | |
}, | |
"formatter": "null" | |
}, | |
"name": "first-meaningful-paint", | |
"category": "Performance", | |
"description": "First meaningful paint", | |
"helpText": "First meaningful paint measures when the primary content of a page is visible. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)." | |
}, | |
"speed-index-metric": { | |
"score": 100, | |
"displayValue": "883", | |
"rawValue": 883, | |
"optimalValue": "1,250", | |
"extendedInfo": { | |
"formatter": "speedline", | |
"value": { | |
"timings": { | |
"firstVisualChange": 867, | |
"visuallyComplete": 913, | |
"speedIndex": 874.9119600343704, | |
"perceptualSpeedIndex": 882.7260418713532 | |
}, | |
"timestamps": { | |
"firstVisualChange": 662415312045, | |
"visuallyComplete": 662415358045, | |
"speedIndex": 662415319956.96, | |
"perceptualSpeedIndex": 662415327771.0419 | |
}, | |
"frames": [ | |
{ | |
"timestamp": 662414445.045, | |
"progress": 0 | |
}, | |
{ | |
"timestamp": 662415312.52, | |
"progress": 69.25227031639898 | |
}, | |
{ | |
"timestamp": 662415359.001, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662415859.516, | |
"progress": 99.26337793919782 | |
}, | |
{ | |
"timestamp": 662415871.845, | |
"progress": 99.32838107699226 | |
}, | |
{ | |
"timestamp": 662415887.883, | |
"progress": 99.37044052020755 | |
}, | |
{ | |
"timestamp": 662415904.786, | |
"progress": 99.41163958259753 | |
}, | |
{ | |
"timestamp": 662415921.802, | |
"progress": 99.44426494138781 | |
}, | |
{ | |
"timestamp": 662415937.812, | |
"progress": 99.50221442709243 | |
}, | |
{ | |
"timestamp": 662415954.774, | |
"progress": 99.54729560799886 | |
}, | |
{ | |
"timestamp": 662415971.763, | |
"progress": 99.61158365792033 | |
}, | |
{ | |
"timestamp": 662415987.745, | |
"progress": 99.6519186141451 | |
}, | |
{ | |
"timestamp": 662416004.782, | |
"progress": 99.70265827063241 | |
}, | |
{ | |
"timestamp": 662416021.847, | |
"progress": 99.74877441201481 | |
}, | |
{ | |
"timestamp": 662416038.738, | |
"progress": 99.79764977622048 | |
}, | |
{ | |
"timestamp": 662416054.942, | |
"progress": 99.8537989283285 | |
}, | |
{ | |
"timestamp": 662416071.974, | |
"progress": 99.89971599441574 | |
}, | |
{ | |
"timestamp": 662416088.74, | |
"progress": 99.94375029166828 | |
}, | |
{ | |
"timestamp": 662416104.954, | |
"progress": 99.97189892330542 | |
}, | |
{ | |
"timestamp": 662416121.76, | |
"progress": 99.99436334314832 | |
}, | |
{ | |
"timestamp": 662416137.873, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662416155.571, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662416171.926, | |
"progress": 100 | |
} | |
] | |
} | |
}, | |
"name": "speed-index-metric", | |
"category": "Performance", | |
"description": "Perceptual Speed Index", | |
"helpText": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/speed-index)." | |
}, | |
"estimated-input-latency": { | |
"score": 100, | |
"displayValue": "16ms", | |
"rawValue": 16, | |
"optimalValue": "50ms", | |
"extendedInfo": { | |
"value": [ | |
{ | |
"percentile": 0.5, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.75, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.9, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.99, | |
"time": 25.064815040468716 | |
}, | |
{ | |
"percentile": 1, | |
"time": 34.90299999999888 | |
} | |
], | |
"formatter": "null" | |
}, | |
"name": "estimated-input-latency", | |
"category": "Performance", | |
"description": "Estimated Input Latency", | |
"helpText": "The score above is an estimate of how long your app takes to respond to user input, in milliseconds. There is a 90% probability that a user encounters this amount of latency, or less. 10% of the time a user can expect additional latency. If your score is higher than Lighthouse's target score, users may perceive your app as laggy. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)." | |
}, | |
"time-to-interactive": { | |
"score": 100, | |
"displayValue": "901.6ms", | |
"rawValue": 901.6, | |
"optimalValue": "5,000ms", | |
"extendedInfo": { | |
"value": { | |
"timings": { | |
"fMP": 896, | |
"visuallyReady": 901.644, | |
"timeToInteractive": 901.644 | |
}, | |
"timestamps": { | |
"fMP": 662415353311, | |
"visuallyReady": 662415359001, | |
"timeToInteractive": 662415359001 | |
}, | |
"expectedLatencyAtTTI": 16, | |
"foundLatencies": [ | |
{ | |
"estLatency": 16, | |
"startTime": "901.6" | |
} | |
] | |
}, | |
"formatter": "null" | |
}, | |
"name": "time-to-interactive", | |
"category": "Performance", | |
"description": "Time To Interactive (alpha)", | |
"helpText": "Time to Interactive identifies the time at which your app appears to be ready enough to interact with. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/time-to-interactive)." | |
}, | |
"user-timings": { | |
"score": true, | |
"displayValue": "0", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "userTimings", | |
"value": [] | |
}, | |
"informative": true, | |
"name": "user-timings", | |
"category": "Performance", | |
"description": "User Timing marks and measures", | |
"helpText": "Consider instrumenting your app with the User Timing API to create custom, real-world measurements of key user experiences. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/user-timing)." | |
}, | |
"critical-request-chains": { | |
"score": false, | |
"displayValue": "5", | |
"rawValue": false, | |
"optimalValue": 0, | |
"extendedInfo": { | |
"formatter": "criticalRequestChains", | |
"value": { | |
"31388.1": { | |
"request": { | |
"url": "https://haxe.io/", | |
"startTime": 662414.530793, | |
"endTime": 662414.777825, | |
"responseReceivedTime": 662414.684222, | |
"transferSize": 19989 | |
}, | |
"children": { | |
"31388.2": { | |
"request": { | |
"url": "https://haxe.io/css/normalize.css", | |
"startTime": 662414.785981, | |
"endTime": 662414.978426, | |
"responseReceivedTime": 662414.97747, | |
"transferSize": 1202 | |
}, | |
"children": {} | |
}, | |
"31388.5": { | |
"request": { | |
"url": "https://haxe.io/css/normalize-opentype.css", | |
"startTime": 662414.787022, | |
"endTime": 662415.000014, | |
"responseReceivedTime": 662414.999229, | |
"transferSize": 667 | |
}, | |
"children": {} | |
}, | |
"31388.6": { | |
"request": { | |
"url": "https://fonts.googleapis.com/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700", | |
"startTime": 662414.787329, | |
"endTime": 662415.007396, | |
"responseReceivedTime": 662415.006265, | |
"transferSize": 1436 | |
}, | |
"children": {} | |
}, | |
"31388.3": { | |
"request": { | |
"url": "https://haxe.io/css/frontpage.css", | |
"startTime": 662414.78641, | |
"endTime": 662415.013338, | |
"responseReceivedTime": 662414.985225, | |
"transferSize": 1982 | |
}, | |
"children": {} | |
}, | |
"31388.4": { | |
"request": { | |
"url": "https://haxe.io/css/haxe.io.css", | |
"startTime": 662414.786697, | |
"endTime": 662415.027827, | |
"responseReceivedTime": 662414.991879, | |
"transferSize": 3187 | |
}, | |
"children": {} | |
} | |
} | |
}, | |
"31388.33": { | |
"request": { | |
"url": "https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2", | |
"startTime": 662415.058078, | |
"endTime": 662415.292406, | |
"responseReceivedTime": 662415.228356, | |
"transferSize": 5883 | |
}, | |
"children": {} | |
}, | |
"31388.38": { | |
"request": { | |
"url": "https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2", | |
"startTime": 662415.036696, | |
"endTime": 662415.32801, | |
"responseReceivedTime": 662415.214558, | |
"transferSize": 10535 | |
}, | |
"children": {} | |
} | |
} | |
}, | |
"informative": true, | |
"name": "critical-request-chains", | |
"category": "Performance", | |
"description": "Critical Request Chains", | |
"helpText": "The Critical Request Chains below show you what resources are required for first render of this page. Improve page load by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)." | |
}, | |
"manifest-exists": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-exists", | |
"category": "Manifest", | |
"description": "Manifest exists", | |
"helpText": "The web app manifest is the technology that enables users to add your web app to their homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-exists)." | |
}, | |
"manifest-background-color": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "null" | |
}, | |
"name": "manifest-background-color", | |
"category": "Manifest", | |
"description": "Manifest contains `background_color`", | |
"helpText": "When your app launches from a user's homescreen, the browser uses `background_color` to paint the background of the browser while your app loads for a smooth transition experience. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-background_color)." | |
}, | |
"manifest-theme-color": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "manifest-theme-color", | |
"category": "Manifest", | |
"description": "Manifest contains `theme_color`", | |
"helpText": "Add a `theme_color` to set the color of the browser's address bar. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-theme_color)." | |
}, | |
"manifest-icons-min-192": { | |
"score": true, | |
"displayValue": "found sizes: 192x192", | |
"rawValue": true, | |
"name": "manifest-icons-min-192", | |
"category": "Manifest", | |
"description": "Manifest contains icons at least 192px", | |
"helpText": "A 192px icon ensures that your app's icon displays well on the homescreens of the largest mobile devices. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-192px-icon)." | |
}, | |
"manifest-icons-min-144": { | |
"score": true, | |
"displayValue": "found sizes: 144x144, 192x192", | |
"rawValue": true, | |
"name": "manifest-icons-min-144", | |
"category": "Manifest", | |
"description": "Manifest contains icons at least 144px" | |
}, | |
"manifest-name": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-name", | |
"category": "Manifest", | |
"description": "Manifest contains `name`", | |
"helpText": "The `name` property identifies your app and is required. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-name)." | |
}, | |
"manifest-short-name": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-short-name", | |
"category": "Manifest", | |
"description": "Manifest contains `short_name`", | |
"helpText": "The `short_name` property is a requirement for Add To Homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-short_name)." | |
}, | |
"manifest-short-name-length": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-short-name-length", | |
"category": "Manifest", | |
"description": "Manifest's `short_name` won't be truncated when displayed on homescreen", | |
"helpText": "Make your app's `short_name` less than 12 characters to ensure that it's not truncated on homescreens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-short_name-is-not-truncated)." | |
}, | |
"manifest-start-url": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-start-url", | |
"category": "Manifest", | |
"description": "Manifest contains `start_url`", | |
"helpText": "Add a `start_url` to instruct the browser to launch a specific URL whenever your app is launched from a homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-start_url)." | |
}, | |
"theme-color-meta": { | |
"score": true, | |
"displayValue": "#ffffff", | |
"rawValue": true, | |
"name": "theme-color-meta", | |
"category": "HTML", | |
"description": "Has a `<meta name=\"theme-color\">` tag" | |
}, | |
"content-width": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "content-width", | |
"category": "Mobile Friendly", | |
"description": "Content is sized correctly for the viewport", | |
"helpText": "If the width of your app's content doesn't match the width of the viewport, your app might not be optimized for mobile screens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/content-sized-correctly-for-viewport)." | |
}, | |
"deprecations": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "deprecations", | |
"category": "Deprecations", | |
"description": "Avoids deprecated APIs", | |
"helpText": "Deprecated APIs will eventually be removed from the browser. [Learn more](https://www.chromestatus.com/features#deprecated)." | |
}, | |
"aria-allowed-attr": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-allowed-attr", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes are allowed for this role", | |
"helpText": "Each ARIA `role` supports a specific subset of `aria-*` attributes. Mismatching these invalidates the `aria-*` attributes. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/aria-allowed-attributes)." | |
}, | |
"aria-required-attr": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-required-attr", | |
"category": "Accessibility", | |
"description": "Elements with ARIA roles have the required aria-* attributes", | |
"helpText": "Some ARIA roles have required attributes that describe the state of the element to screen readers. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/required-aria-attributes)." | |
}, | |
"aria-valid-attr-value": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-valid-attr-value", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes have valid values", | |
"helpText": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid values. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/valid-aria-values)." | |
}, | |
"aria-valid-attr": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-valid-attr", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes are valid and not misspelled or non-existent.", | |
"helpText": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid names. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/valid-aria-attributes)." | |
}, | |
"color-contrast": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "accessibility", | |
"value": { | |
"description": "Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds", | |
"help": "Elements must have sufficient color contrast", | |
"helpUrl": "https://dequeuniversity.com/rules/axe/2.1/color-contrast?application=axeAPI", | |
"id": "color-contrast", | |
"impact": "critical", | |
"nodes": [ | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"news\"><span class=\"long\">Weekly </span><span class=\"short\">Wkly </span>News</label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(2) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"articles\">Art<span class=\"short\">.</span><span class=\"long\">icles</span></label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(3) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"releases\">Rel<span class=\"short\">.</span><span class=\"long\">eases</span></label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(4) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"videos\">Vid<span class=\"long\">eo</span>s</label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(8) > label" | |
] | |
} | |
], | |
"tags": [ | |
"wcag2aa", | |
"wcag143" | |
] | |
} | |
}, | |
"name": "color-contrast", | |
"category": "Accessibility", | |
"description": "Background and foreground colors have a sufficient contrast ratio", | |
"helpText": "Low-contrast text is difficult or impossible for many users to read. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/contrast-ratio)." | |
}, | |
"image-alt": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "image-alt", | |
"category": "Accessibility", | |
"description": "Every image element has an alt attribute", | |
"helpText": "Screen reader users rely on `alt` text to provide descriptions of images. It's also used as fallback content when an image fails to load. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/alt-attribute)." | |
}, | |
"label": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "label", | |
"category": "Accessibility", | |
"description": "Every form element has a label", | |
"helpText": "Labels ensure that form controls are announced properly by assistive technologies, like screen readers. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/form-labels)." | |
}, | |
"tabindex": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "tabindex", | |
"category": "Accessibility", | |
"description": "No element has a `tabindex` attribute greater than 0", | |
"helpText": "A value greater than 0 implies an explicit navigation ordering. Although technically valid, this often creates frustrating experiences for users who rely on assistive technologies. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/tabindex)." | |
}, | |
"total-byte-weight": { | |
"score": 100, | |
"displayValue": "Total size was 56 KB", | |
"rawValue": 57375, | |
"optimalValue": "1,600 KB", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "/", | |
"totalBytes": 19989, | |
"totalKb": "20 KB", | |
"totalMs": "100ms" | |
}, | |
{ | |
"url": "/analytics.js", | |
"totalBytes": 12431, | |
"totalKb": "12 KB", | |
"totalMs": "60ms" | |
}, | |
{ | |
"url": "…v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2", | |
"totalBytes": 10535, | |
"totalKb": "10 KB", | |
"totalMs": "50ms" | |
}, | |
{ | |
"url": "…v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2", | |
"totalBytes": 5883, | |
"totalKb": "6 KB", | |
"totalMs": "30ms" | |
}, | |
{ | |
"url": "…css/haxe.io.css", | |
"totalBytes": 3187, | |
"totalKb": "3 KB", | |
"totalMs": "20ms" | |
}, | |
{ | |
"url": "…css/frontpage.css", | |
"totalBytes": 1982, | |
"totalKb": "2 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700", | |
"totalBytes": 1436, | |
"totalKb": "1 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "…css/normalize.css", | |
"totalBytes": 1202, | |
"totalKb": "1 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "…css/normalize-opentype.css", | |
"totalBytes": 667, | |
"totalKb": "1 KB", | |
"totalMs": "0ms" | |
}, | |
{ | |
"url": "/collect?v=…", | |
"totalBytes": 63, | |
"totalKb": "0 KB", | |
"totalMs": "0ms" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Total Size", | |
"totalMs": "Transfer Time" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "total-byte-weight", | |
"category": "Network", | |
"description": "Avoids enormous network payloads", | |
"helpText": "Network transfer size [costs users real dollars](https://whatdoesmysitecost.com/) and is [highly correlated](http://httparchive.org/interesting.php#onLoad) with long load times. Try to find ways to reduce the size of required files." | |
}, | |
"unused-css-rules": { | |
"score": true, | |
"displayValue": "Potential savings of 3 KB (~10ms)", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "…css/haxe.io.css", | |
"numUnused": 122, | |
"wastedBytes": 2738, | |
"wastedPercent": 85.91549295774648, | |
"totalBytes": 3187, | |
"wastedKb": "3 KB", | |
"wastedMs": "10ms", | |
"totalKb": "3 KB", | |
"totalMs": "20ms", | |
"potentialSavings": "3 KB _86%_" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"numUnused": "Unused Rules", | |
"totalKb": "Original", | |
"potentialSavings": "Potential Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "unused-css-rules", | |
"category": "CSS", | |
"description": "Unused CSS rules", | |
"helpText": "Remove unused rules from stylesheets to reduce unnecessary bytes consumed by network activity. [Learn more](https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery)" | |
}, | |
"uses-optimized-images": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"preview": "", | |
"url": "URL", | |
"totalKb": "Original", | |
"webpSavings": "WebP Savings", | |
"jpegSavings": "JPEG Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "uses-optimized-images", | |
"category": "Images", | |
"description": "Unoptimized images", | |
"helpText": "Images should be optimized to save network bytes. The following images could have smaller file sizes when compressed with [WebP](https://developers.google.com/speed/webp/) or JPEG at 80 quality. [Learn more about image optimization](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/image-optimization)." | |
}, | |
"uses-responsive-images": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"preview": "", | |
"url": "URL", | |
"totalKb": "Original", | |
"potentialSavings": "Potential Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "uses-responsive-images", | |
"category": "Images", | |
"description": "Oversized Images", | |
"helpText": "Image sizes served should be based on the device display size to save network bytes. Learn more about [responsive images](https://developers.google.com/web/fundamentals/design-and-ui/media/images) and [client hints](https://developers.google.com/web/updates/2015/09/automating-resource-selection-with-client-hints)." | |
}, | |
"appcache-manifest": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "appcache-manifest", | |
"category": "Offline", | |
"description": "Avoids Application Cache", | |
"helpText": "Application Cache has been [deprecated](https://html.spec.whatwg.org/multipage/browsers.html#offline) by [Service Workers](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers). Consider implementing an offline solution using the [Cache Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Cache)." | |
}, | |
"dom-size": { | |
"score": 100, | |
"displayValue": "905 nodes", | |
"rawValue": 905, | |
"optimalValue": "1,500 nodes", | |
"extendedInfo": { | |
"formatter": "card", | |
"value": [ | |
{ | |
"title": "Total DOM Nodes", | |
"value": "905", | |
"target": "< 1,500 nodes" | |
}, | |
{ | |
"title": "DOM Depth", | |
"value": "10", | |
"snippet": "html./frontpage >\n body >\n footer.grid >\n div.grid-1-1 >\n div.logo >\n div >\n svg >\n g >\n g >\n line", | |
"target": "< 32" | |
}, | |
{ | |
"title": "Maximum Children", | |
"value": "166", | |
"snippet": "Element with most children:\nul", | |
"target": "< 60 nodes" | |
} | |
] | |
}, | |
"name": "dom-size", | |
"category": "Performance", | |
"description": "Avoids an excessive DOM size", | |
"helpText": "Browser engineers recommend pages contain fewer than ~1,500 DOM nodes. The sweet spot is a tree depth < 32 elements and fewer than 60 children/parent element. A large DOM can increase memory, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/fundamentals/performance/rendering/)." | |
}, | |
"external-anchors-use-rel-noopener": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "external-anchors-use-rel-noopener", | |
"category": "Performance", | |
"description": "Opens external anchors using rel=\"noopener\"", | |
"helpText": "Open new tabs using `rel=\"noopener\"` to improve performance and prevent security vulnerabilities. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/noopener)." | |
}, | |
"geolocation-on-start": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "geolocation-on-start", | |
"category": "UX", | |
"description": "Avoids requesting the geolocation permission on page load", | |
"helpText": "Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to user gestures instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/geolocation-on-load)." | |
}, | |
"link-blocking-first-paint": { | |
"score": false, | |
"displayValue": "5 resources delayed first paint by 54ms", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "…css/normalize.css", | |
"totalKb": "1 KB", | |
"totalMs": "30ms" | |
}, | |
{ | |
"url": "…css/frontpage.css", | |
"totalKb": "2 KB", | |
"totalMs": "32ms" | |
}, | |
{ | |
"url": "…css/haxe.io.css", | |
"totalKb": "3 KB", | |
"totalMs": "35ms" | |
}, | |
{ | |
"url": "…css/normalize-opentype.css", | |
"totalKb": "1 KB", | |
"totalMs": "35ms" | |
}, | |
{ | |
"url": "/css", | |
"totalKb": "1 KB", | |
"totalMs": "54ms" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Size (KB)", | |
"totalMs": "Delayed Paint By (ms)" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "link-blocking-first-paint", | |
"category": "Performance", | |
"description": "Render-blocking Stylesheets", | |
"helpText": "Link elements are blocking the first paint of your page. Consider inlining critical links and deferring non-critical ones. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)." | |
}, | |
"no-console-time": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"isEval": "Eval'd?" | |
} | |
} | |
}, | |
"name": "no-console-time", | |
"category": "JavaScript", | |
"description": "Avoids `console.time()` in its own scripts", | |
"helpText": "Consider using `performance.mark()` and `performance.measure()` from the User Timing API instead. They provide high-precision timestamps, independent of the system clock, and are integrated in the Chrome DevTools Timeline. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/console-time)." | |
}, | |
"no-datenow": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"isEval": "Eval'd?" | |
} | |
} | |
}, | |
"name": "no-datenow", | |
"category": "JavaScript", | |
"description": "Avoids `Date.now()` in its own scripts", | |
"helpText": "Consider using `performance.now()` from the User Timing API instead. It provides high-precision timestamps, independent of the system clock. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/date-now)." | |
}, | |
"no-document-write": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "no-document-write", | |
"category": "Performance", | |
"description": "Avoids `document.write()`", | |
"helpText": "For users on slow connections, external scripts dynamically injected via `document.write()` can delay page load by tens of seconds. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/document-write)." | |
}, | |
"no-mutation-events": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"type": "Event", | |
"code": "Snippet" | |
} | |
} | |
}, | |
"name": "no-mutation-events", | |
"category": "JavaScript", | |
"description": "Avoids Mutation Events in its own scripts", | |
"helpText": "Mutation Events are deprecated and harm performance. Consider using Mutation Observers instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/mutation-events)." | |
}, | |
"no-old-flexbox": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"startLine": "Line in the stylesheet / <style>", | |
"location": "Column start/end", | |
"pre": "Snippet" | |
} | |
} | |
}, | |
"name": "no-old-flexbox", | |
"category": "CSS", | |
"description": "Avoids old CSS flexbox", | |
"helpText": "The 2009 spec of Flexbox is deprecated and is 2.3x slower than the latest spec. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/old-flexbox)." | |
}, | |
"no-websql": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "no-websql", | |
"category": "Offline", | |
"description": "Avoids WebSQL DB", | |
"helpText": "Web SQL is deprecated. Consider using IndexedDB instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/web-sql)." | |
}, | |
"notification-on-start": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "notification-on-start", | |
"category": "UX", | |
"description": "Avoids requesting the notification permission on page load", | |
"helpText": "Users are mistrustful of or confused by sites that request to send notifications without context. Consider tying the request to user gestures instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/notifications-on-load)." | |
}, | |
"script-blocking-first-paint": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Size (KB)", | |
"totalMs": "Delayed Paint By (ms)" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "script-blocking-first-paint", | |
"category": "Performance", | |
"description": "Render-blocking scripts", | |
"helpText": "Script elements are blocking the first paint of your page. Consider inlining critical scripts and deferring non-critical ones. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)." | |
}, | |
"uses-http2": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"protocol": "Protocol" | |
} | |
} | |
}, | |
"name": "uses-http2", | |
"category": "Performance", | |
"description": "Uses HTTP/2 for its own resources", | |
"helpText": "HTTP/2 offers many benefits over HTTP/1.1, including binary headers, multiplexing, and server push. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http2)." | |
}, | |
"uses-passive-event-listeners": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"type": "Type", | |
"pre": "Snippet" | |
} | |
} | |
}, | |
"name": "uses-passive-event-listeners", | |
"category": "JavaScript", | |
"description": "Uses passive listeners to improve scrolling performance", | |
"helpText": "Consider marking your touch and wheel event listeners as `passive` to improve your page's scroll performance. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners)." | |
} | |
}, | |
"runtimeConfig": { | |
"environment": [ | |
{ | |
"name": "Device Emulation", | |
"enabled": true, | |
"description": "Nexus 5X" | |
}, | |
{ | |
"name": "Network Throttling", | |
"enabled": true, | |
"description": "150ms RTT, 1.6Mbps down, 0.7Mbps up" | |
}, | |
{ | |
"name": "CPU Throttling", | |
"enabled": false, | |
"description": "5x slowdown" | |
} | |
], | |
"blockedUrlPatterns": [] | |
}, | |
"aggregations": [ | |
{ | |
"name": "Progressive Web App", | |
"description": "These audits validate the aspects of a Progressive Web App. They are a subset of the [PWA Checklist](https://developers.google.com/web/progressive-web-apps/checklist).", | |
"scored": true, | |
"total": 0.7583333333333333, | |
"categorizable": true, | |
"score": [ | |
{ | |
"overall": 0, | |
"name": "App can load on offline/flaky connections", | |
"description": "Ensuring your web app can respond when the network connection is unavailable or flaky is critical to providing your users a good experience. This is achieved through use of a [Service Worker](https://developers.google.com/web/fundamentals/primers/service-worker/).", | |
"subItems": [ | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "service-worker", | |
"category": "Offline", | |
"description": "Registers a Service Worker", | |
"helpText": "The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/registered-service-worker)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "works-offline", | |
"category": "Offline", | |
"description": "Responds with a 200 when offline", | |
"helpText": "If you're building a Progressive Web App, consider using a service worker so that your app can work offline. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http-200-when-offline)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Page load performance is fast", | |
"description": "Users notice if sites and apps don't perform well. These top-level metrics capture the most important perceived performance concerns.", | |
"subItems": [ | |
{ | |
"score": 100, | |
"displayValue": "896.0ms", | |
"rawValue": 896, | |
"optimalValue": "1,600ms", | |
"extendedInfo": { | |
"value": { | |
"timestamps": { | |
"navStart": 662414457357, | |
"fCP": 662415078293, | |
"fMP": 662415353311 | |
}, | |
"timings": { | |
"navStart": 0, | |
"fCP": 620.936, | |
"fMP": 895.954 | |
} | |
}, | |
"formatter": "null" | |
}, | |
"name": "first-meaningful-paint", | |
"category": "Performance", | |
"description": "First meaningful paint", | |
"helpText": "First meaningful paint measures when the primary content of a page is visible. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "883", | |
"rawValue": 883, | |
"optimalValue": "1,250", | |
"extendedInfo": { | |
"formatter": "speedline", | |
"value": { | |
"timings": { | |
"firstVisualChange": 867, | |
"visuallyComplete": 913, | |
"speedIndex": 874.9119600343704, | |
"perceptualSpeedIndex": 882.7260418713532 | |
}, | |
"timestamps": { | |
"firstVisualChange": 662415312045, | |
"visuallyComplete": 662415358045, | |
"speedIndex": 662415319956.96, | |
"perceptualSpeedIndex": 662415327771.0419 | |
}, | |
"frames": [ | |
{ | |
"timestamp": 662414445.045, | |
"progress": 0 | |
}, | |
{ | |
"timestamp": 662415312.52, | |
"progress": 69.25227031639898 | |
}, | |
{ | |
"timestamp": 662415359.001, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662415859.516, | |
"progress": 99.26337793919782 | |
}, | |
{ | |
"timestamp": 662415871.845, | |
"progress": 99.32838107699226 | |
}, | |
{ | |
"timestamp": 662415887.883, | |
"progress": 99.37044052020755 | |
}, | |
{ | |
"timestamp": 662415904.786, | |
"progress": 99.41163958259753 | |
}, | |
{ | |
"timestamp": 662415921.802, | |
"progress": 99.44426494138781 | |
}, | |
{ | |
"timestamp": 662415937.812, | |
"progress": 99.50221442709243 | |
}, | |
{ | |
"timestamp": 662415954.774, | |
"progress": 99.54729560799886 | |
}, | |
{ | |
"timestamp": 662415971.763, | |
"progress": 99.61158365792033 | |
}, | |
{ | |
"timestamp": 662415987.745, | |
"progress": 99.6519186141451 | |
}, | |
{ | |
"timestamp": 662416004.782, | |
"progress": 99.70265827063241 | |
}, | |
{ | |
"timestamp": 662416021.847, | |
"progress": 99.74877441201481 | |
}, | |
{ | |
"timestamp": 662416038.738, | |
"progress": 99.79764977622048 | |
}, | |
{ | |
"timestamp": 662416054.942, | |
"progress": 99.8537989283285 | |
}, | |
{ | |
"timestamp": 662416071.974, | |
"progress": 99.89971599441574 | |
}, | |
{ | |
"timestamp": 662416088.74, | |
"progress": 99.94375029166828 | |
}, | |
{ | |
"timestamp": 662416104.954, | |
"progress": 99.97189892330542 | |
}, | |
{ | |
"timestamp": 662416121.76, | |
"progress": 99.99436334314832 | |
}, | |
{ | |
"timestamp": 662416137.873, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662416155.571, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662416171.926, | |
"progress": 100 | |
} | |
] | |
} | |
}, | |
"name": "speed-index-metric", | |
"category": "Performance", | |
"description": "Perceptual Speed Index", | |
"helpText": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/speed-index)." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "16ms", | |
"rawValue": 16, | |
"optimalValue": "50ms", | |
"extendedInfo": { | |
"value": [ | |
{ | |
"percentile": 0.5, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.75, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.9, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.99, | |
"time": 25.064815040468716 | |
}, | |
{ | |
"percentile": 1, | |
"time": 34.90299999999888 | |
} | |
], | |
"formatter": "null" | |
}, | |
"name": "estimated-input-latency", | |
"category": "Performance", | |
"description": "Estimated Input Latency", | |
"helpText": "The score above is an estimate of how long your app takes to respond to user input, in milliseconds. There is a 90% probability that a user encounters this amount of latency, or less. 10% of the time a user can expect additional latency. If your score is higher than Lighthouse's target score, users may perceive your app as laggy. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "901.6ms", | |
"rawValue": 901.6, | |
"optimalValue": "5,000ms", | |
"extendedInfo": { | |
"value": { | |
"timings": { | |
"fMP": 896, | |
"visuallyReady": 901.644, | |
"timeToInteractive": 901.644 | |
}, | |
"timestamps": { | |
"fMP": 662415353311, | |
"visuallyReady": 662415359001, | |
"timeToInteractive": 662415359001 | |
}, | |
"expectedLatencyAtTTI": 16, | |
"foundLatencies": [ | |
{ | |
"estLatency": 16, | |
"startTime": "901.6" | |
} | |
] | |
}, | |
"formatter": "null" | |
}, | |
"name": "time-to-interactive", | |
"category": "Performance", | |
"description": "Time To Interactive (alpha)", | |
"helpText": "Time to Interactive identifies the time at which your app appears to be ready enough to interact with. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/time-to-interactive)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Site is progressively enhanced", | |
"description": "Progressive enhancement means that everyone can access the basic content and functionality of a page in any browser, and those without certain browser features may receive a reduced but still functional experience.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "without-javascript", | |
"category": "JavaScript", | |
"description": "Contains some content when JavaScript is not available", | |
"helpText": "Your app should display some content when JavaScript is disabled, even if it's just a warning to the user that JavaScript is required to use the app. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/no-js)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Network connection is secure", | |
"description": "Security is an important part of the web for both developers and users. Moving forward, Transport Layer Security (TLS) support will be required for many APIs.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "is-on-https", | |
"category": "Security", | |
"description": "Uses HTTPS", | |
"helpText": "All sites should be protected with HTTPS, even ones that don't handle sensitive data. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/https)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "redirects-http", | |
"category": "Security", | |
"description": "Redirects HTTP traffic to HTTPS", | |
"helpText": "If you've already set up HTTPS, make sure that you redirect all HTTP traffic to HTTPS. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http-redirects-to-https)." | |
} | |
] | |
}, | |
{ | |
"overall": 0.8, | |
"name": "User can be prompted to Add to Homescreen", | |
"description": "While users can manually add your site to their homescreen in the browser menu, the [prompt (aka app install banner)](https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android) will proactively prompt the user to install the app if the below requirements are met and the user has visited your site at least twice (with at least five minutes between visits).", | |
"subItems": [ | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "service-worker", | |
"category": "Offline", | |
"description": "Registers a Service Worker", | |
"helpText": "The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/registered-service-worker)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-exists", | |
"category": "Manifest", | |
"description": "Manifest exists", | |
"helpText": "The web app manifest is the technology that enables users to add your web app to their homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-exists)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-start-url", | |
"category": "Manifest", | |
"description": "Manifest contains `start_url`", | |
"helpText": "Add a `start_url` to instruct the browser to launch a specific URL whenever your app is launched from a homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-start_url)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "found sizes: 144x144, 192x192", | |
"rawValue": true, | |
"name": "manifest-icons-min-144", | |
"category": "Manifest", | |
"description": "Manifest contains icons at least 144px" | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-short-name", | |
"category": "Manifest", | |
"description": "Manifest contains `short_name`", | |
"helpText": "The `short_name` property is a requirement for Add To Homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-short_name)." | |
} | |
] | |
}, | |
{ | |
"overall": 0.6, | |
"name": "Installed web app will launch with custom splash screen", | |
"description": "A default splash screen will be constructed, but meeting these requirements guarantee a high-quality and customizable [splash screen](https://developers.google.com/web/updates/2015/10/splashscreen) the user sees between tapping the home screen icon and your app's first paint.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-exists", | |
"category": "Manifest", | |
"description": "Manifest exists", | |
"helpText": "The web app manifest is the technology that enables users to add your web app to their homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-exists)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-name", | |
"category": "Manifest", | |
"description": "Manifest contains `name`", | |
"helpText": "The `name` property identifies your app and is required. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-name)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "null" | |
}, | |
"name": "manifest-background-color", | |
"category": "Manifest", | |
"description": "Manifest contains `background_color`", | |
"helpText": "When your app launches from a user's homescreen, the browser uses `background_color` to paint the background of the browser while your app loads for a smooth transition experience. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-background_color)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "manifest-theme-color", | |
"category": "Manifest", | |
"description": "Manifest contains `theme_color`", | |
"helpText": "Add a `theme_color` to set the color of the browser's address bar. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-theme_color)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "found sizes: 192x192", | |
"rawValue": true, | |
"name": "manifest-icons-min-192", | |
"category": "Manifest", | |
"description": "Manifest contains icons at least 192px", | |
"helpText": "A 192px icon ensures that your app's icon displays well on the homescreens of the largest mobile devices. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-192px-icon)." | |
} | |
] | |
}, | |
{ | |
"overall": 0.6666666666666666, | |
"name": "Address bar matches brand colors", | |
"description": "The browser address bar can be themed to match your site. A `theme-color` [meta tag](https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android) will upgrade the address bar when a user browses the site, and the [manifest theme-color](https://developers.google.com/web/updates/2015/08/using-manifest-to-set-sitewide-theme-color) will apply the same theme site-wide once it's been added to homescreen.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-exists", | |
"category": "Manifest", | |
"description": "Manifest exists", | |
"helpText": "The web app manifest is the technology that enables users to add your web app to their homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-exists)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "#ffffff", | |
"rawValue": true, | |
"name": "theme-color-meta", | |
"category": "HTML", | |
"description": "Has a `<meta name=\"theme-color\">` tag" | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "manifest-theme-color", | |
"category": "Manifest", | |
"description": "Manifest contains `theme_color`", | |
"helpText": "Add a `theme_color` to set the color of the browser's address bar. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-theme_color)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Design is mobile-friendly", | |
"description": "Users increasingly experience your app on mobile devices, so it's important to ensure that the experience can adapt to smaller screens.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "viewport", | |
"category": "Mobile Friendly", | |
"description": "Has a `<meta name=\"viewport\">` tag with `width` or `initial-scale`", | |
"helpText": "Add a viewport meta tag to optimize your app for mobile screens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/has-viewport-meta-tag)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "content-width", | |
"category": "Mobile Friendly", | |
"description": "Content is sized correctly for the viewport", | |
"helpText": "If the width of your app's content doesn't match the width of the viewport, your app might not be optimized for mobile screens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/content-sized-correctly-for-viewport)." | |
} | |
] | |
} | |
] | |
}, | |
{ | |
"name": "Best Practices", | |
"description": "We've compiled some recommendations for modernizing your web app and avoiding performance pitfalls. These audits do not affect your score but are worth a look.", | |
"scored": false, | |
"total": null, | |
"categorizable": true, | |
"score": [ | |
{ | |
"overall": 1, | |
"name": "Using modern offline features", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "appcache-manifest", | |
"category": "Offline", | |
"description": "Avoids Application Cache", | |
"helpText": "Application Cache has been [deprecated](https://html.spec.whatwg.org/multipage/browsers.html#offline) by [Service Workers](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers). Consider implementing an offline solution using the [Cache Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Cache)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "no-websql", | |
"category": "Offline", | |
"description": "Avoids WebSQL DB", | |
"helpText": "Web SQL is deprecated. Consider using IndexedDB instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/web-sql)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Using modern protocols", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "is-on-https", | |
"category": "Security", | |
"description": "Uses HTTPS", | |
"helpText": "All sites should be protected with HTTPS, even ones that don't handle sensitive data. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/https)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"protocol": "Protocol" | |
} | |
} | |
}, | |
"name": "uses-http2", | |
"category": "Performance", | |
"description": "Uses HTTP/2 for its own resources", | |
"helpText": "HTTP/2 offers many benefits over HTTP/1.1, including binary headers, multiplexing, and server push. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http2)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Using modern CSS features", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"startLine": "Line in the stylesheet / <style>", | |
"location": "Column start/end", | |
"pre": "Snippet" | |
} | |
} | |
}, | |
"name": "no-old-flexbox", | |
"category": "CSS", | |
"description": "Avoids old CSS flexbox", | |
"helpText": "The 2009 spec of Flexbox is deprecated and is 2.3x slower than the latest spec. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/old-flexbox)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Using modern JavaScript features", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"type": "Type", | |
"pre": "Snippet" | |
} | |
} | |
}, | |
"name": "uses-passive-event-listeners", | |
"category": "JavaScript", | |
"description": "Uses passive listeners to improve scrolling performance", | |
"helpText": "Consider marking your touch and wheel event listeners as `passive` to improve your page's scroll performance. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"type": "Event", | |
"code": "Snippet" | |
} | |
} | |
}, | |
"name": "no-mutation-events", | |
"category": "JavaScript", | |
"description": "Avoids Mutation Events in its own scripts", | |
"helpText": "Mutation Events are deprecated and harm performance. Consider using Mutation Observers instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/mutation-events)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Avoiding APIs that harm the user experience", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "no-document-write", | |
"category": "Performance", | |
"description": "Avoids `document.write()`", | |
"helpText": "For users on slow connections, external scripts dynamically injected via `document.write()` can delay page load by tens of seconds. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/document-write)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "external-anchors-use-rel-noopener", | |
"category": "Performance", | |
"description": "Opens external anchors using rel=\"noopener\"", | |
"helpText": "Open new tabs using `rel=\"noopener\"` to improve performance and prevent security vulnerabilities. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/noopener)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "geolocation-on-start", | |
"category": "UX", | |
"description": "Avoids requesting the geolocation permission on page load", | |
"helpText": "Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to user gestures instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/geolocation-on-load)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "notification-on-start", | |
"category": "UX", | |
"description": "Avoids requesting the notification permission on page load", | |
"helpText": "Users are mistrustful of or confused by sites that request to send notifications without context. Consider tying the request to user gestures instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/notifications-on-load)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Avoiding deprecated APIs and browser interventions", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "deprecations", | |
"category": "Deprecations", | |
"description": "Avoids deprecated APIs", | |
"helpText": "Deprecated APIs will eventually be removed from the browser. [Learn more](https://www.chromestatus.com/features#deprecated)." | |
} | |
] | |
}, | |
{ | |
"overall": 0.875, | |
"name": "Accessibility", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-allowed-attr", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes are allowed for this role", | |
"helpText": "Each ARIA `role` supports a specific subset of `aria-*` attributes. Mismatching these invalidates the `aria-*` attributes. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/aria-allowed-attributes)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-required-attr", | |
"category": "Accessibility", | |
"description": "Elements with ARIA roles have the required aria-* attributes", | |
"helpText": "Some ARIA roles have required attributes that describe the state of the element to screen readers. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/required-aria-attributes)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-valid-attr", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes are valid and not misspelled or non-existent.", | |
"helpText": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid names. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/valid-aria-attributes)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-valid-attr-value", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes have valid values", | |
"helpText": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid values. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/valid-aria-values)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "accessibility", | |
"value": { | |
"description": "Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds", | |
"help": "Elements must have sufficient color contrast", | |
"helpUrl": "https://dequeuniversity.com/rules/axe/2.1/color-contrast?application=axeAPI", | |
"id": "color-contrast", | |
"impact": "critical", | |
"nodes": [ | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"news\"><span class=\"long\">Weekly </span><span class=\"short\">Wkly </span>News</label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(2) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"articles\">Art<span class=\"short\">.</span><span class=\"long\">icles</span></label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(3) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"releases\">Rel<span class=\"short\">.</span><span class=\"long\">eases</span></label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(4) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"videos\">Vid<span class=\"long\">eo</span>s</label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(8) > label" | |
] | |
} | |
], | |
"tags": [ | |
"wcag2aa", | |
"wcag143" | |
] | |
} | |
}, | |
"name": "color-contrast", | |
"category": "Accessibility", | |
"description": "Background and foreground colors have a sufficient contrast ratio", | |
"helpText": "Low-contrast text is difficult or impossible for many users to read. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/contrast-ratio)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "image-alt", | |
"category": "Accessibility", | |
"description": "Every image element has an alt attribute", | |
"helpText": "Screen reader users rely on `alt` text to provide descriptions of images. It's also used as fallback content when an image fails to load. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/alt-attribute)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "label", | |
"category": "Accessibility", | |
"description": "Every form element has a label", | |
"helpText": "Labels ensure that form controls are announced properly by assistive technologies, like screen readers. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/form-labels)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "tabindex", | |
"category": "Accessibility", | |
"description": "No element has a `tabindex` attribute greater than 0", | |
"helpText": "A value greater than 0 implies an explicit navigation ordering. Although technically valid, this often creates frustrating experiences for users who rely on assistive technologies. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/tabindex)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Other", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-short-name-length", | |
"category": "Manifest", | |
"description": "Manifest's `short_name` won't be truncated when displayed on homescreen", | |
"helpText": "Make your app's `short_name` less than 12 characters to ensure that it's not truncated on homescreens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-short_name-is-not-truncated)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "standalone", | |
"rawValue": true, | |
"name": "manifest-display", | |
"category": "Manifest", | |
"description": "Manifest's `display` property is set", | |
"helpText": "Set the `display` property to specify how your app launches from the homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-has-display-set)." | |
} | |
] | |
} | |
] | |
}, | |
{ | |
"name": "Performance", | |
"description": "These encapsulate your app's performance.", | |
"scored": false, | |
"total": null, | |
"categorizable": false, | |
"score": [ | |
{ | |
"overall": 0.7777777777777778, | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "Potential savings of 3 KB (~10ms)", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "…css/haxe.io.css", | |
"numUnused": 122, | |
"wastedBytes": 2738, | |
"wastedPercent": 85.91549295774648, | |
"totalBytes": 3187, | |
"wastedKb": "3 KB", | |
"wastedMs": "10ms", | |
"totalKb": "3 KB", | |
"totalMs": "20ms", | |
"potentialSavings": "3 KB _86%_" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"numUnused": "Unused Rules", | |
"totalKb": "Original", | |
"potentialSavings": "Potential Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "unused-css-rules", | |
"category": "CSS", | |
"description": "Unused CSS rules", | |
"helpText": "Remove unused rules from stylesheets to reduce unnecessary bytes consumed by network activity. [Learn more](https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery)" | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"preview": "", | |
"url": "URL", | |
"totalKb": "Original", | |
"webpSavings": "WebP Savings", | |
"jpegSavings": "JPEG Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "uses-optimized-images", | |
"category": "Images", | |
"description": "Unoptimized images", | |
"helpText": "Images should be optimized to save network bytes. The following images could have smaller file sizes when compressed with [WebP](https://developers.google.com/speed/webp/) or JPEG at 80 quality. [Learn more about image optimization](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/image-optimization)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"preview": "", | |
"url": "URL", | |
"totalKb": "Original", | |
"potentialSavings": "Potential Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "uses-responsive-images", | |
"category": "Images", | |
"description": "Oversized Images", | |
"helpText": "Image sizes served should be based on the device display size to save network bytes. Learn more about [responsive images](https://developers.google.com/web/fundamentals/design-and-ui/media/images) and [client hints](https://developers.google.com/web/updates/2015/09/automating-resource-selection-with-client-hints)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "5", | |
"rawValue": false, | |
"optimalValue": 0, | |
"extendedInfo": { | |
"formatter": "criticalRequestChains", | |
"value": { | |
"31388.1": { | |
"request": { | |
"url": "https://haxe.io/", | |
"startTime": 662414.530793, | |
"endTime": 662414.777825, | |
"responseReceivedTime": 662414.684222, | |
"transferSize": 19989 | |
}, | |
"children": { | |
"31388.2": { | |
"request": { | |
"url": "https://haxe.io/css/normalize.css", | |
"startTime": 662414.785981, | |
"endTime": 662414.978426, | |
"responseReceivedTime": 662414.97747, | |
"transferSize": 1202 | |
}, | |
"children": {} | |
}, | |
"31388.5": { | |
"request": { | |
"url": "https://haxe.io/css/normalize-opentype.css", | |
"startTime": 662414.787022, | |
"endTime": 662415.000014, | |
"responseReceivedTime": 662414.999229, | |
"transferSize": 667 | |
}, | |
"children": {} | |
}, | |
"31388.6": { | |
"request": { | |
"url": "https://fonts.googleapis.com/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700", | |
"startTime": 662414.787329, | |
"endTime": 662415.007396, | |
"responseReceivedTime": 662415.006265, | |
"transferSize": 1436 | |
}, | |
"children": {} | |
}, | |
"31388.3": { | |
"request": { | |
"url": "https://haxe.io/css/frontpage.css", | |
"startTime": 662414.78641, | |
"endTime": 662415.013338, | |
"responseReceivedTime": 662414.985225, | |
"transferSize": 1982 | |
}, | |
"children": {} | |
}, | |
"31388.4": { | |
"request": { | |
"url": "https://haxe.io/css/haxe.io.css", | |
"startTime": 662414.786697, | |
"endTime": 662415.027827, | |
"responseReceivedTime": 662414.991879, | |
"transferSize": 3187 | |
}, | |
"children": {} | |
} | |
} | |
}, | |
"31388.33": { | |
"request": { | |
"url": "https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2", | |
"startTime": 662415.058078, | |
"endTime": 662415.292406, | |
"responseReceivedTime": 662415.228356, | |
"transferSize": 5883 | |
}, | |
"children": {} | |
}, | |
"31388.38": { | |
"request": { | |
"url": "https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2", | |
"startTime": 662415.036696, | |
"endTime": 662415.32801, | |
"responseReceivedTime": 662415.214558, | |
"transferSize": 10535 | |
}, | |
"children": {} | |
} | |
} | |
}, | |
"informative": true, | |
"name": "critical-request-chains", | |
"category": "Performance", | |
"description": "Critical Request Chains", | |
"helpText": "The Critical Request Chains below show you what resources are required for first render of this page. Improve page load by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "5 resources delayed first paint by 54ms", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "…css/normalize.css", | |
"totalKb": "1 KB", | |
"totalMs": "30ms" | |
}, | |
{ | |
"url": "…css/frontpage.css", | |
"totalKb": "2 KB", | |
"totalMs": "32ms" | |
}, | |
{ | |
"url": "…css/haxe.io.css", | |
"totalKb": "3 KB", | |
"totalMs": "35ms" | |
}, | |
{ | |
"url": "…css/normalize-opentype.css", | |
"totalKb": "1 KB", | |
"totalMs": "35ms" | |
}, | |
{ | |
"url": "/css", | |
"totalKb": "1 KB", | |
"totalMs": "54ms" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Size (KB)", | |
"totalMs": "Delayed Paint By (ms)" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "link-blocking-first-paint", | |
"category": "Performance", | |
"description": "Render-blocking Stylesheets", | |
"helpText": "Link elements are blocking the first paint of your page. Consider inlining critical links and deferring non-critical ones. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Size (KB)", | |
"totalMs": "Delayed Paint By (ms)" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "script-blocking-first-paint", | |
"category": "Performance", | |
"description": "Render-blocking scripts", | |
"helpText": "Script elements are blocking the first paint of your page. Consider inlining critical scripts and deferring non-critical ones. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "Total size was 56 KB", | |
"rawValue": 57375, | |
"optimalValue": "1,600 KB", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "/", | |
"totalBytes": 19989, | |
"totalKb": "20 KB", | |
"totalMs": "100ms" | |
}, | |
{ | |
"url": "/analytics.js", | |
"totalBytes": 12431, | |
"totalKb": "12 KB", | |
"totalMs": "60ms" | |
}, | |
{ | |
"url": "…v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2", | |
"totalBytes": 10535, | |
"totalKb": "10 KB", | |
"totalMs": "50ms" | |
}, | |
{ | |
"url": "…v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2", | |
"totalBytes": 5883, | |
"totalKb": "6 KB", | |
"totalMs": "30ms" | |
}, | |
{ | |
"url": "…css/haxe.io.css", | |
"totalBytes": 3187, | |
"totalKb": "3 KB", | |
"totalMs": "20ms" | |
}, | |
{ | |
"url": "…css/frontpage.css", | |
"totalBytes": 1982, | |
"totalKb": "2 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700", | |
"totalBytes": 1436, | |
"totalKb": "1 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "…css/normalize.css", | |
"totalBytes": 1202, | |
"totalKb": "1 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "…css/normalize-opentype.css", | |
"totalBytes": 667, | |
"totalKb": "1 KB", | |
"totalMs": "0ms" | |
}, | |
{ | |
"url": "/collect?v=…", | |
"totalBytes": 63, | |
"totalKb": "0 KB", | |
"totalMs": "0ms" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Total Size", | |
"totalMs": "Transfer Time" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "total-byte-weight", | |
"category": "Network", | |
"description": "Avoids enormous network payloads", | |
"helpText": "Network transfer size [costs users real dollars](https://whatdoesmysitecost.com/) and is [highly correlated](http://httparchive.org/interesting.php#onLoad) with long load times. Try to find ways to reduce the size of required files." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "905 nodes", | |
"rawValue": 905, | |
"optimalValue": "1,500 nodes", | |
"extendedInfo": { | |
"formatter": "card", | |
"value": [ | |
{ | |
"title": "Total DOM Nodes", | |
"value": "905", | |
"target": "< 1,500 nodes" | |
}, | |
{ | |
"title": "DOM Depth", | |
"value": "10", | |
"snippet": "html./frontpage >\n body >\n footer.grid >\n div.grid-1-1 >\n div.logo >\n div >\n svg >\n g >\n g >\n line", | |
"target": "< 32" | |
}, | |
{ | |
"title": "Maximum Children", | |
"value": "166", | |
"snippet": "Element with most children:\nul", | |
"target": "< 60 nodes" | |
} | |
] | |
}, | |
"name": "dom-size", | |
"category": "Performance", | |
"description": "Avoids an excessive DOM size", | |
"helpText": "Browser engineers recommend pages contain fewer than ~1,500 DOM nodes. The sweet spot is a tree depth < 32 elements and fewer than 60 children/parent element. A large DOM can increase memory, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/fundamentals/performance/rendering/)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "0", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "userTimings", | |
"value": [] | |
}, | |
"informative": true, | |
"name": "user-timings", | |
"category": "Performance", | |
"description": "User Timing marks and measures", | |
"helpText": "Consider instrumenting your app with the User Timing API to create custom, real-world measurements of key user experiences. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/user-timing)." | |
} | |
] | |
} | |
] | |
}, | |
{ | |
"name": "Fancier stuff", | |
"description": "A list of newer features that you could be using in your app. These audits do not affect your score and are just suggestions.", | |
"scored": false, | |
"additional": true, | |
"total": null, | |
"categorizable": true, | |
"score": [ | |
{ | |
"overall": 1, | |
"name": "New JavaScript features", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"isEval": "Eval'd?" | |
} | |
} | |
}, | |
"name": "no-datenow", | |
"category": "JavaScript", | |
"description": "Avoids `Date.now()` in its own scripts", | |
"helpText": "Consider using `performance.now()` from the User Timing API instead. It provides high-precision timestamps, independent of the system clock. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/date-now)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"isEval": "Eval'd?" | |
} | |
} | |
}, | |
"name": "no-console-time", | |
"category": "JavaScript", | |
"description": "Avoids `console.time()` in its own scripts", | |
"helpText": "Consider using `performance.mark()` and `performance.measure()` from the User Timing API instead. They provide high-precision timestamps, independent of the system clock, and are integrated in the Chrome DevTools Timeline. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/console-time)." | |
} | |
] | |
} | |
] | |
} | |
] | |
} | |
</div> | |
<script> | |
window.lhresults = JSON.parse(document.querySelector('#lhresults-dump').textContent); | |
</script> | |
<script>/** | |
* @license | |
* Copyright 2016 Google Inc. All Rights Reserved. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
'use strict'; | |
/* eslint-disable no-console */ | |
/** | |
* Logs messages via a UI butter. | |
* @class | |
*/ | |
class Logger { | |
constructor(selector) { | |
this.el = document.querySelector(selector); | |
} | |
/** | |
* Shows a butter bar. | |
* @param {!string} msg The message to show. | |
* @param {boolean=} optAutoHide True to hide the message after a duration. | |
* Default is true. | |
*/ | |
log(msg, optAutoHide) { | |
const autoHide = typeof optAutoHide === 'undefined' ? true : optAutoHide; | |
clearTimeout(this._id); | |
this.el.textContent = msg; | |
this.el.classList.add('show'); | |
if (autoHide) { | |
this._id = setTimeout(_ => { | |
this.el.classList.remove('show'); | |
}, 7000); | |
} | |
} | |
warn(msg) { | |
this.log('Warning: ' + msg); | |
console.warn(msg); | |
} | |
error(msg) { | |
this.log(msg); | |
console.error(msg); | |
} | |
/** | |
* Explicitly hides the butter bar. | |
*/ | |
hide() { | |
clearTimeout(this._id); | |
this.el.classList.remove('show'); | |
} | |
} | |
if (typeof module !== 'undefined' && module.exports) { | |
module.exports = Logger; | |
} | |
/** | |
* @license | |
* Copyright 2017 Google Inc. All rights reserved. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
'use strict'; | |
/** | |
* Generate a filenamePrefix of hostname_YYYY-MM-DD_HH-MM-SS | |
* Date/time uses the local timezone, however Node has unreliable ICU | |
* support, so we must construct a YYYY-MM-DD date format manually. :/ | |
* @param {!Object} results | |
* @returns string | |
*/ | |
function getFilenamePrefix(results) { | |
// eslint-disable-next-line no-undef | |
const hostname = new (URLConstructor || URL)(results.url).hostname; | |
const date = (results.generatedTime && new Date(results.generatedTime)) || new Date(); | |
const timeStr = date.toLocaleTimeString('en-US', {hour12: false}); | |
const dateParts = date.toLocaleDateString('en-US', { | |
year: 'numeric', month: '2-digit', day: '2-digit' | |
}).split('/'); | |
dateParts.unshift(dateParts.pop()); | |
const dateStr = dateParts.join('-'); | |
const filenamePrefix = `${hostname}_${dateStr}_${timeStr}`; | |
// replace characters that are unfriendly to filenames | |
return filenamePrefix.replace(/[\/\?<>\\:\*\|":]/g, '-'); | |
} | |
let URLConstructor; | |
if (typeof module !== 'undefined' && module.exports) { | |
URLConstructor = require('./url-shim'); | |
module.exports = { | |
getFilenamePrefix | |
}; | |
} | |
/** | |
* @license | |
* Copyright 2016 Google Inc. All rights reserved. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
/* global ga, logger */ | |
'use strict'; | |
class LighthouseReport { | |
/** | |
* @param {Object=} lhresults Lighthouse JSON results. | |
*/ | |
constructor(lhresults) { | |
this.json = lhresults || null; | |
this._copyAttempt = false; | |
this.onCopy = this.onCopy.bind(this); | |
this.onExportButtonClick = this.onExportButtonClick.bind(this); | |
this.onExport = this.onExport.bind(this); | |
this.onKeyDown = this.onKeyDown.bind(this); | |
this._addEventListeners(); | |
} | |
_addEventListeners() { | |
this._setupExpandDetailsWhenPrinting(); | |
const headerContainer = document.querySelector('.js-header-container'); | |
if (headerContainer) { | |
const toggleButton = headerContainer.querySelector('.js-header-toggle'); | |
toggleButton.addEventListener('click', () => headerContainer.classList.toggle('expanded')); | |
} | |
this.exportButton = document.querySelector('.js-export'); | |
if (this.exportButton) { | |
this.exportButton.addEventListener('click', this.onExportButtonClick); | |
const dropdown = document.querySelector('.export-dropdown'); | |
dropdown.addEventListener('click', this.onExport); | |
document.addEventListener('copy', this.onCopy); | |
} | |
} | |
/** | |
* Handler copy events. | |
*/ | |
onCopy(e) { | |
// Only handle copy button presses (e.g. ignore the user copying page text). | |
if (this._copyAttempt) { | |
// We want to write our own data to the clipboard, not the user's text selection. | |
e.preventDefault(); | |
e.clipboardData.setData('text/plain', JSON.stringify(this.json, null, 2)); | |
logger.log('Report JSON copied to clipboard'); | |
} | |
this._copyAttempt = false; | |
} | |
/** | |
* Copies the report JSON to the clipboard (if supported by the browser). | |
*/ | |
onCopyButtonClick() { | |
if (window.ga) { | |
ga('send', 'event', 'report', 'copy'); | |
} | |
try { | |
if (document.queryCommandSupported('copy')) { | |
this._copyAttempt = true; | |
// Note: In Safari 10.0.1, execCommand('copy') returns true if there's | |
// a valid text selection on the page. See http://caniuse.com/#feat=clipboard. | |
const successful = document.execCommand('copy'); | |
if (!successful) { | |
this._copyAttempt = false; // Prevent event handler from seeing this as a copy attempt. | |
logger.warn('Your browser does not support copy to clipboard.'); | |
} | |
} | |
} catch (err) { | |
this._copyAttempt = false; | |
logger.log(err.message); | |
} | |
} | |
closeExportDropdown() { | |
this.exportButton.classList.remove('active'); | |
} | |
/** | |
* Click handler for export button. | |
*/ | |
onExportButtonClick(e) { | |
e.preventDefault(); | |
e.target.classList.toggle('active'); | |
document.addEventListener('keydown', this.onKeyDown); | |
} | |
/** | |
* Handler for "export as" button. | |
*/ | |
onExport(e) { | |
e.preventDefault(); | |
if (!e.target.dataset.action) { | |
return; | |
} | |
switch (e.target.dataset.action) { | |
case 'copy': | |
this.onCopyButtonClick(); | |
break; | |
case 'open-viewer': | |
this.sendJSONReport(); | |
break; | |
case 'print': | |
window.print(); | |
break; | |
case 'save-json': { | |
const jsonStr = JSON.stringify(this.json, null, 2); | |
this._saveFile(new Blob([jsonStr], {type: 'application/json'})); | |
break; | |
} | |
case 'save-html': { | |
let htmlStr = ''; | |
// Since Viewer generates its page HTML dynamically from report JSON, | |
// run the ReportGenerator. For everything else, the page's HTML is | |
// already the final product. | |
if (e.target.dataset.context !== 'viewer') { | |
htmlStr = document.documentElement.outerHTML; | |
} else { | |
const reportGenerator = new ReportGenerator(); | |
htmlStr = reportGenerator.generateHTML(this.json, 'cli'); | |
} | |
try { | |
this._saveFile(new Blob([htmlStr], {type: 'text/html'})); | |
} catch (err) { | |
logger.error('Could not export as HTML. ' + err.message); | |
} | |
break; | |
} | |
} | |
this.closeExportDropdown(); | |
document.removeEventListener('keydown', this.onKeyDown); | |
} | |
/** | |
* Keydown handler for the document. | |
*/ | |
onKeyDown(e) { | |
if (e.keyCode === 27) { // ESC | |
this.closeExportDropdown(); | |
} | |
} | |
/** | |
* Opens a new tab to the online viewer and sends the local page's JSON results | |
* to the online viewer using postMessage. | |
*/ | |
sendJSONReport() { | |
const VIEWER_ORIGIN = 'https://googlechrome.github.io'; | |
const VIEWER_URL = `${VIEWER_ORIGIN}/lighthouse/viewer/`; | |
// Chrome doesn't allow us to immediately postMessage to a popup right | |
// after it's created. Normally, we could also listen for the popup window's | |
// load event, however it is cross-domain and won't fire. Instead, listen | |
// for a message from the target app saying "I'm open". | |
window.addEventListener('message', function msgHandler(e) { | |
if (e.origin !== VIEWER_ORIGIN) { | |
return; | |
} | |
if (e.data.opened) { | |
popup.postMessage({lhresults: this.json}, VIEWER_ORIGIN); | |
window.removeEventListener('message', msgHandler); | |
} | |
}.bind(this)); | |
const popup = window.open(VIEWER_URL, '_blank'); | |
} | |
/** | |
* Sets up listeners to expand audit `<details>` when the user prints the page. | |
* Ideally, a print stylesheet could take care of this, but CSS has no way to | |
* open a `<details>` element. When the user closes the print dialog, all | |
* `<details>` are collapsed. | |
*/ | |
_setupExpandDetailsWhenPrinting() { | |
const details = Array.from(document.querySelectorAll('details')); | |
// FF and IE implement these old events. | |
if ('onbeforeprint' in window) { | |
window.addEventListener('beforeprint', _ => { | |
details.map(detail => detail.open = true); | |
}); | |
window.addEventListener('afterprint', _ => { | |
details.map(detail => detail.open = false); | |
}); | |
} else { | |
// Note: while FF has media listeners, it doesn't fire when matching 'print'. | |
window.matchMedia('print').addListener(mql => { | |
details.map(detail => detail.open = mql.matches); | |
}); | |
} | |
} | |
/** | |
* Downloads a file (blob) using a[download]. | |
* @param {Blob|File} blob The file to save. | |
*/ | |
_saveFile(blob) { | |
const filename = window.getFilenamePrefix({ | |
url: this.json.url, | |
generatedTime: this.json.generatedTime | |
}); | |
const ext = blob.type.match('json') ? '.json' : '.html'; | |
const a = document.createElement('a'); | |
a.download = `${filename}${ext}`; | |
a.href = URL.createObjectURL(blob); | |
document.body.appendChild(a); // Firefox requires anchor to be in the DOM. | |
a.click(); | |
// cleanup. | |
document.body.removeChild(a); | |
setTimeout(_ => URL.revokeObjectURL(a.href), 500); | |
} | |
} | |
// Exports for Node usage (Viewer browserifies). | |
let ReportGenerator; | |
if (typeof module !== 'undefined' && module.exports) { | |
module.exports = LighthouseReport; | |
ReportGenerator = require('../../../lighthouse-core/report/report-generator'); | |
window.getFilenamePrefix = require('../../../lighthouse-core/lib/file-namer').getFilenamePrefix; | |
} | |
</script> | |
<script> | |
// Init report. | |
window.addEventListener('DOMContentLoaded', _ => { | |
window.logger = new Logger('#log'); | |
new LighthouseReport(window.lhresults); | |
}); | |
</script></body></html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"lighthouseVersion": "1.6.0", | |
"generatedTime": "2017-03-09T11:05:14.849Z", | |
"initialUrl": "https://haxe.io/", | |
"url": "https://haxe.io/", | |
"audits": { | |
"is-on-https": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "is-on-https", | |
"category": "Security", | |
"description": "Uses HTTPS", | |
"helpText": "All sites should be protected with HTTPS, even ones that don't handle sensitive data. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/https)." | |
}, | |
"redirects-http": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "redirects-http", | |
"category": "Security", | |
"description": "Redirects HTTP traffic to HTTPS", | |
"helpText": "If you've already set up HTTPS, make sure that you redirect all HTTP traffic to HTTPS. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http-redirects-to-https)." | |
}, | |
"service-worker": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "service-worker", | |
"category": "Offline", | |
"description": "Registers a Service Worker", | |
"helpText": "The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/registered-service-worker)." | |
}, | |
"works-offline": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "works-offline", | |
"category": "Offline", | |
"description": "Responds with a 200 when offline", | |
"helpText": "If you're building a Progressive Web App, consider using a service worker so that your app can work offline. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http-200-when-offline)." | |
}, | |
"viewport": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "viewport", | |
"category": "Mobile Friendly", | |
"description": "Has a `<meta name=\"viewport\">` tag with `width` or `initial-scale`", | |
"helpText": "Add a viewport meta tag to optimize your app for mobile screens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/has-viewport-meta-tag)." | |
}, | |
"manifest-display": { | |
"score": true, | |
"displayValue": "standalone", | |
"rawValue": true, | |
"name": "manifest-display", | |
"category": "Manifest", | |
"description": "Manifest's `display` property is set", | |
"helpText": "Set the `display` property to specify how your app launches from the homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-has-display-set)." | |
}, | |
"without-javascript": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "without-javascript", | |
"category": "JavaScript", | |
"description": "Contains some content when JavaScript is not available", | |
"helpText": "Your app should display some content when JavaScript is disabled, even if it's just a warning to the user that JavaScript is required to use the app. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/no-js)." | |
}, | |
"first-meaningful-paint": { | |
"score": 100, | |
"displayValue": "896.0ms", | |
"rawValue": 896, | |
"optimalValue": "1,600ms", | |
"extendedInfo": { | |
"value": { | |
"timestamps": { | |
"navStart": 662414457357, | |
"fCP": 662415078293, | |
"fMP": 662415353311 | |
}, | |
"timings": { | |
"navStart": 0, | |
"fCP": 620.936, | |
"fMP": 895.954 | |
} | |
}, | |
"formatter": "null" | |
}, | |
"name": "first-meaningful-paint", | |
"category": "Performance", | |
"description": "First meaningful paint", | |
"helpText": "First meaningful paint measures when the primary content of a page is visible. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)." | |
}, | |
"speed-index-metric": { | |
"score": 100, | |
"displayValue": "883", | |
"rawValue": 883, | |
"optimalValue": "1,250", | |
"extendedInfo": { | |
"formatter": "speedline", | |
"value": { | |
"timings": { | |
"firstVisualChange": 867, | |
"visuallyComplete": 913, | |
"speedIndex": 874.9119600343704, | |
"perceptualSpeedIndex": 882.7260418713532 | |
}, | |
"timestamps": { | |
"firstVisualChange": 662415312045, | |
"visuallyComplete": 662415358045, | |
"speedIndex": 662415319956.96, | |
"perceptualSpeedIndex": 662415327771.0419 | |
}, | |
"frames": [ | |
{ | |
"timestamp": 662414445.045, | |
"progress": 0 | |
}, | |
{ | |
"timestamp": 662415312.52, | |
"progress": 69.25227031639898 | |
}, | |
{ | |
"timestamp": 662415359.001, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662415859.516, | |
"progress": 99.26337793919782 | |
}, | |
{ | |
"timestamp": 662415871.845, | |
"progress": 99.32838107699226 | |
}, | |
{ | |
"timestamp": 662415887.883, | |
"progress": 99.37044052020755 | |
}, | |
{ | |
"timestamp": 662415904.786, | |
"progress": 99.41163958259753 | |
}, | |
{ | |
"timestamp": 662415921.802, | |
"progress": 99.44426494138781 | |
}, | |
{ | |
"timestamp": 662415937.812, | |
"progress": 99.50221442709243 | |
}, | |
{ | |
"timestamp": 662415954.774, | |
"progress": 99.54729560799886 | |
}, | |
{ | |
"timestamp": 662415971.763, | |
"progress": 99.61158365792033 | |
}, | |
{ | |
"timestamp": 662415987.745, | |
"progress": 99.6519186141451 | |
}, | |
{ | |
"timestamp": 662416004.782, | |
"progress": 99.70265827063241 | |
}, | |
{ | |
"timestamp": 662416021.847, | |
"progress": 99.74877441201481 | |
}, | |
{ | |
"timestamp": 662416038.738, | |
"progress": 99.79764977622048 | |
}, | |
{ | |
"timestamp": 662416054.942, | |
"progress": 99.8537989283285 | |
}, | |
{ | |
"timestamp": 662416071.974, | |
"progress": 99.89971599441574 | |
}, | |
{ | |
"timestamp": 662416088.74, | |
"progress": 99.94375029166828 | |
}, | |
{ | |
"timestamp": 662416104.954, | |
"progress": 99.97189892330542 | |
}, | |
{ | |
"timestamp": 662416121.76, | |
"progress": 99.99436334314832 | |
}, | |
{ | |
"timestamp": 662416137.873, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662416155.571, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662416171.926, | |
"progress": 100 | |
} | |
] | |
} | |
}, | |
"name": "speed-index-metric", | |
"category": "Performance", | |
"description": "Perceptual Speed Index", | |
"helpText": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/speed-index)." | |
}, | |
"estimated-input-latency": { | |
"score": 100, | |
"displayValue": "16ms", | |
"rawValue": 16, | |
"optimalValue": "50ms", | |
"extendedInfo": { | |
"value": [ | |
{ | |
"percentile": 0.5, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.75, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.9, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.99, | |
"time": 25.064815040468716 | |
}, | |
{ | |
"percentile": 1, | |
"time": 34.90299999999888 | |
} | |
], | |
"formatter": "null" | |
}, | |
"name": "estimated-input-latency", | |
"category": "Performance", | |
"description": "Estimated Input Latency", | |
"helpText": "The score above is an estimate of how long your app takes to respond to user input, in milliseconds. There is a 90% probability that a user encounters this amount of latency, or less. 10% of the time a user can expect additional latency. If your score is higher than Lighthouse's target score, users may perceive your app as laggy. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)." | |
}, | |
"time-to-interactive": { | |
"score": 100, | |
"displayValue": "901.6ms", | |
"rawValue": 901.6, | |
"optimalValue": "5,000ms", | |
"extendedInfo": { | |
"value": { | |
"timings": { | |
"fMP": 896, | |
"visuallyReady": 901.644, | |
"timeToInteractive": 901.644 | |
}, | |
"timestamps": { | |
"fMP": 662415353311, | |
"visuallyReady": 662415359001, | |
"timeToInteractive": 662415359001 | |
}, | |
"expectedLatencyAtTTI": 16, | |
"foundLatencies": [ | |
{ | |
"estLatency": 16, | |
"startTime": "901.6" | |
} | |
] | |
}, | |
"formatter": "null" | |
}, | |
"name": "time-to-interactive", | |
"category": "Performance", | |
"description": "Time To Interactive (alpha)", | |
"helpText": "Time to Interactive identifies the time at which your app appears to be ready enough to interact with. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/time-to-interactive)." | |
}, | |
"user-timings": { | |
"score": true, | |
"displayValue": "0", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "userTimings", | |
"value": [] | |
}, | |
"informative": true, | |
"name": "user-timings", | |
"category": "Performance", | |
"description": "User Timing marks and measures", | |
"helpText": "Consider instrumenting your app with the User Timing API to create custom, real-world measurements of key user experiences. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/user-timing)." | |
}, | |
"critical-request-chains": { | |
"score": false, | |
"displayValue": "5", | |
"rawValue": false, | |
"optimalValue": 0, | |
"extendedInfo": { | |
"formatter": "criticalRequestChains", | |
"value": { | |
"31388.1": { | |
"request": { | |
"url": "https://haxe.io/", | |
"startTime": 662414.530793, | |
"endTime": 662414.777825, | |
"responseReceivedTime": 662414.684222, | |
"transferSize": 19989 | |
}, | |
"children": { | |
"31388.2": { | |
"request": { | |
"url": "https://haxe.io/css/normalize.css", | |
"startTime": 662414.785981, | |
"endTime": 662414.978426, | |
"responseReceivedTime": 662414.97747, | |
"transferSize": 1202 | |
}, | |
"children": {} | |
}, | |
"31388.5": { | |
"request": { | |
"url": "https://haxe.io/css/normalize-opentype.css", | |
"startTime": 662414.787022, | |
"endTime": 662415.000014, | |
"responseReceivedTime": 662414.999229, | |
"transferSize": 667 | |
}, | |
"children": {} | |
}, | |
"31388.6": { | |
"request": { | |
"url": "https://fonts.googleapis.com/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700", | |
"startTime": 662414.787329, | |
"endTime": 662415.007396, | |
"responseReceivedTime": 662415.006265, | |
"transferSize": 1436 | |
}, | |
"children": {} | |
}, | |
"31388.3": { | |
"request": { | |
"url": "https://haxe.io/css/frontpage.css", | |
"startTime": 662414.78641, | |
"endTime": 662415.013338, | |
"responseReceivedTime": 662414.985225, | |
"transferSize": 1982 | |
}, | |
"children": {} | |
}, | |
"31388.4": { | |
"request": { | |
"url": "https://haxe.io/css/haxe.io.css", | |
"startTime": 662414.786697, | |
"endTime": 662415.027827, | |
"responseReceivedTime": 662414.991879, | |
"transferSize": 3187 | |
}, | |
"children": {} | |
} | |
} | |
}, | |
"31388.33": { | |
"request": { | |
"url": "https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2", | |
"startTime": 662415.058078, | |
"endTime": 662415.292406, | |
"responseReceivedTime": 662415.228356, | |
"transferSize": 5883 | |
}, | |
"children": {} | |
}, | |
"31388.38": { | |
"request": { | |
"url": "https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2", | |
"startTime": 662415.036696, | |
"endTime": 662415.32801, | |
"responseReceivedTime": 662415.214558, | |
"transferSize": 10535 | |
}, | |
"children": {} | |
} | |
} | |
}, | |
"informative": true, | |
"name": "critical-request-chains", | |
"category": "Performance", | |
"description": "Critical Request Chains", | |
"helpText": "The Critical Request Chains below show you what resources are required for first render of this page. Improve page load by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)." | |
}, | |
"manifest-exists": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-exists", | |
"category": "Manifest", | |
"description": "Manifest exists", | |
"helpText": "The web app manifest is the technology that enables users to add your web app to their homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-exists)." | |
}, | |
"manifest-background-color": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "null" | |
}, | |
"name": "manifest-background-color", | |
"category": "Manifest", | |
"description": "Manifest contains `background_color`", | |
"helpText": "When your app launches from a user's homescreen, the browser uses `background_color` to paint the background of the browser while your app loads for a smooth transition experience. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-background_color)." | |
}, | |
"manifest-theme-color": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "manifest-theme-color", | |
"category": "Manifest", | |
"description": "Manifest contains `theme_color`", | |
"helpText": "Add a `theme_color` to set the color of the browser's address bar. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-theme_color)." | |
}, | |
"manifest-icons-min-192": { | |
"score": true, | |
"displayValue": "found sizes: 192x192", | |
"rawValue": true, | |
"name": "manifest-icons-min-192", | |
"category": "Manifest", | |
"description": "Manifest contains icons at least 192px", | |
"helpText": "A 192px icon ensures that your app's icon displays well on the homescreens of the largest mobile devices. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-192px-icon)." | |
}, | |
"manifest-icons-min-144": { | |
"score": true, | |
"displayValue": "found sizes: 144x144, 192x192", | |
"rawValue": true, | |
"name": "manifest-icons-min-144", | |
"category": "Manifest", | |
"description": "Manifest contains icons at least 144px" | |
}, | |
"manifest-name": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-name", | |
"category": "Manifest", | |
"description": "Manifest contains `name`", | |
"helpText": "The `name` property identifies your app and is required. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-name)." | |
}, | |
"manifest-short-name": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-short-name", | |
"category": "Manifest", | |
"description": "Manifest contains `short_name`", | |
"helpText": "The `short_name` property is a requirement for Add To Homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-short_name)." | |
}, | |
"manifest-short-name-length": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-short-name-length", | |
"category": "Manifest", | |
"description": "Manifest's `short_name` won't be truncated when displayed on homescreen", | |
"helpText": "Make your app's `short_name` less than 12 characters to ensure that it's not truncated on homescreens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-short_name-is-not-truncated)." | |
}, | |
"manifest-start-url": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-start-url", | |
"category": "Manifest", | |
"description": "Manifest contains `start_url`", | |
"helpText": "Add a `start_url` to instruct the browser to launch a specific URL whenever your app is launched from a homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-start_url)." | |
}, | |
"theme-color-meta": { | |
"score": true, | |
"displayValue": "#ffffff", | |
"rawValue": true, | |
"name": "theme-color-meta", | |
"category": "HTML", | |
"description": "Has a `<meta name=\"theme-color\">` tag" | |
}, | |
"content-width": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "content-width", | |
"category": "Mobile Friendly", | |
"description": "Content is sized correctly for the viewport", | |
"helpText": "If the width of your app's content doesn't match the width of the viewport, your app might not be optimized for mobile screens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/content-sized-correctly-for-viewport)." | |
}, | |
"deprecations": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "deprecations", | |
"category": "Deprecations", | |
"description": "Avoids deprecated APIs", | |
"helpText": "Deprecated APIs will eventually be removed from the browser. [Learn more](https://www.chromestatus.com/features#deprecated)." | |
}, | |
"aria-allowed-attr": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-allowed-attr", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes are allowed for this role", | |
"helpText": "Each ARIA `role` supports a specific subset of `aria-*` attributes. Mismatching these invalidates the `aria-*` attributes. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/aria-allowed-attributes)." | |
}, | |
"aria-required-attr": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-required-attr", | |
"category": "Accessibility", | |
"description": "Elements with ARIA roles have the required aria-* attributes", | |
"helpText": "Some ARIA roles have required attributes that describe the state of the element to screen readers. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/required-aria-attributes)." | |
}, | |
"aria-valid-attr-value": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-valid-attr-value", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes have valid values", | |
"helpText": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid values. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/valid-aria-values)." | |
}, | |
"aria-valid-attr": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-valid-attr", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes are valid and not misspelled or non-existent.", | |
"helpText": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid names. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/valid-aria-attributes)." | |
}, | |
"color-contrast": { | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "accessibility", | |
"value": { | |
"description": "Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds", | |
"help": "Elements must have sufficient color contrast", | |
"helpUrl": "https://dequeuniversity.com/rules/axe/2.1/color-contrast?application=axeAPI", | |
"id": "color-contrast", | |
"impact": "critical", | |
"nodes": [ | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"news\"><span class=\"long\">Weekly </span><span class=\"short\">Wkly </span>News</label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(2) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"articles\">Art<span class=\"short\">.</span><span class=\"long\">icles</span></label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(3) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"releases\">Rel<span class=\"short\">.</span><span class=\"long\">eases</span></label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(4) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"videos\">Vid<span class=\"long\">eo</span>s</label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(8) > label" | |
] | |
} | |
], | |
"tags": [ | |
"wcag2aa", | |
"wcag143" | |
] | |
} | |
}, | |
"name": "color-contrast", | |
"category": "Accessibility", | |
"description": "Background and foreground colors have a sufficient contrast ratio", | |
"helpText": "Low-contrast text is difficult or impossible for many users to read. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/contrast-ratio)." | |
}, | |
"image-alt": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "image-alt", | |
"category": "Accessibility", | |
"description": "Every image element has an alt attribute", | |
"helpText": "Screen reader users rely on `alt` text to provide descriptions of images. It's also used as fallback content when an image fails to load. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/alt-attribute)." | |
}, | |
"label": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "label", | |
"category": "Accessibility", | |
"description": "Every form element has a label", | |
"helpText": "Labels ensure that form controls are announced properly by assistive technologies, like screen readers. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/form-labels)." | |
}, | |
"tabindex": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "tabindex", | |
"category": "Accessibility", | |
"description": "No element has a `tabindex` attribute greater than 0", | |
"helpText": "A value greater than 0 implies an explicit navigation ordering. Although technically valid, this often creates frustrating experiences for users who rely on assistive technologies. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/tabindex)." | |
}, | |
"total-byte-weight": { | |
"score": 100, | |
"displayValue": "Total size was 56 KB", | |
"rawValue": 57375, | |
"optimalValue": "1,600 KB", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "/", | |
"totalBytes": 19989, | |
"totalKb": "20 KB", | |
"totalMs": "100ms" | |
}, | |
{ | |
"url": "/analytics.js", | |
"totalBytes": 12431, | |
"totalKb": "12 KB", | |
"totalMs": "60ms" | |
}, | |
{ | |
"url": "…v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2", | |
"totalBytes": 10535, | |
"totalKb": "10 KB", | |
"totalMs": "50ms" | |
}, | |
{ | |
"url": "…v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2", | |
"totalBytes": 5883, | |
"totalKb": "6 KB", | |
"totalMs": "30ms" | |
}, | |
{ | |
"url": "…css/haxe.io.css", | |
"totalBytes": 3187, | |
"totalKb": "3 KB", | |
"totalMs": "20ms" | |
}, | |
{ | |
"url": "…css/frontpage.css", | |
"totalBytes": 1982, | |
"totalKb": "2 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700", | |
"totalBytes": 1436, | |
"totalKb": "1 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "…css/normalize.css", | |
"totalBytes": 1202, | |
"totalKb": "1 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "…css/normalize-opentype.css", | |
"totalBytes": 667, | |
"totalKb": "1 KB", | |
"totalMs": "0ms" | |
}, | |
{ | |
"url": "/collect?v=…", | |
"totalBytes": 63, | |
"totalKb": "0 KB", | |
"totalMs": "0ms" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Total Size", | |
"totalMs": "Transfer Time" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "total-byte-weight", | |
"category": "Network", | |
"description": "Avoids enormous network payloads", | |
"helpText": "Network transfer size [costs users real dollars](https://whatdoesmysitecost.com/) and is [highly correlated](http://httparchive.org/interesting.php#onLoad) with long load times. Try to find ways to reduce the size of required files." | |
}, | |
"unused-css-rules": { | |
"score": true, | |
"displayValue": "Potential savings of 3 KB (~10ms)", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "…css/haxe.io.css", | |
"numUnused": 122, | |
"wastedBytes": 2738, | |
"wastedPercent": 85.91549295774648, | |
"totalBytes": 3187, | |
"wastedKb": "3 KB", | |
"wastedMs": "10ms", | |
"totalKb": "3 KB", | |
"totalMs": "20ms", | |
"potentialSavings": "3 KB _86%_" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"numUnused": "Unused Rules", | |
"totalKb": "Original", | |
"potentialSavings": "Potential Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "unused-css-rules", | |
"category": "CSS", | |
"description": "Unused CSS rules", | |
"helpText": "Remove unused rules from stylesheets to reduce unnecessary bytes consumed by network activity. [Learn more](https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery)" | |
}, | |
"uses-optimized-images": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"preview": "", | |
"url": "URL", | |
"totalKb": "Original", | |
"webpSavings": "WebP Savings", | |
"jpegSavings": "JPEG Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "uses-optimized-images", | |
"category": "Images", | |
"description": "Unoptimized images", | |
"helpText": "Images should be optimized to save network bytes. The following images could have smaller file sizes when compressed with [WebP](https://developers.google.com/speed/webp/) or JPEG at 80 quality. [Learn more about image optimization](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/image-optimization)." | |
}, | |
"uses-responsive-images": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"preview": "", | |
"url": "URL", | |
"totalKb": "Original", | |
"potentialSavings": "Potential Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "uses-responsive-images", | |
"category": "Images", | |
"description": "Oversized Images", | |
"helpText": "Image sizes served should be based on the device display size to save network bytes. Learn more about [responsive images](https://developers.google.com/web/fundamentals/design-and-ui/media/images) and [client hints](https://developers.google.com/web/updates/2015/09/automating-resource-selection-with-client-hints)." | |
}, | |
"appcache-manifest": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "appcache-manifest", | |
"category": "Offline", | |
"description": "Avoids Application Cache", | |
"helpText": "Application Cache has been [deprecated](https://html.spec.whatwg.org/multipage/browsers.html#offline) by [Service Workers](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers). Consider implementing an offline solution using the [Cache Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Cache)." | |
}, | |
"dom-size": { | |
"score": 100, | |
"displayValue": "905 nodes", | |
"rawValue": 905, | |
"optimalValue": "1,500 nodes", | |
"extendedInfo": { | |
"formatter": "card", | |
"value": [ | |
{ | |
"title": "Total DOM Nodes", | |
"value": "905", | |
"target": "< 1,500 nodes" | |
}, | |
{ | |
"title": "DOM Depth", | |
"value": "10", | |
"snippet": "html./frontpage >\n body >\n footer.grid >\n div.grid-1-1 >\n div.logo >\n div >\n svg >\n g >\n g >\n line", | |
"target": "< 32" | |
}, | |
{ | |
"title": "Maximum Children", | |
"value": "166", | |
"snippet": "Element with most children:\nul", | |
"target": "< 60 nodes" | |
} | |
] | |
}, | |
"name": "dom-size", | |
"category": "Performance", | |
"description": "Avoids an excessive DOM size", | |
"helpText": "Browser engineers recommend pages contain fewer than ~1,500 DOM nodes. The sweet spot is a tree depth < 32 elements and fewer than 60 children/parent element. A large DOM can increase memory, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/fundamentals/performance/rendering/)." | |
}, | |
"external-anchors-use-rel-noopener": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "external-anchors-use-rel-noopener", | |
"category": "Performance", | |
"description": "Opens external anchors using rel=\"noopener\"", | |
"helpText": "Open new tabs using `rel=\"noopener\"` to improve performance and prevent security vulnerabilities. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/noopener)." | |
}, | |
"geolocation-on-start": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "geolocation-on-start", | |
"category": "UX", | |
"description": "Avoids requesting the geolocation permission on page load", | |
"helpText": "Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to user gestures instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/geolocation-on-load)." | |
}, | |
"link-blocking-first-paint": { | |
"score": false, | |
"displayValue": "5 resources delayed first paint by 54ms", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "…css/normalize.css", | |
"totalKb": "1 KB", | |
"totalMs": "30ms" | |
}, | |
{ | |
"url": "…css/frontpage.css", | |
"totalKb": "2 KB", | |
"totalMs": "32ms" | |
}, | |
{ | |
"url": "…css/haxe.io.css", | |
"totalKb": "3 KB", | |
"totalMs": "35ms" | |
}, | |
{ | |
"url": "…css/normalize-opentype.css", | |
"totalKb": "1 KB", | |
"totalMs": "35ms" | |
}, | |
{ | |
"url": "/css", | |
"totalKb": "1 KB", | |
"totalMs": "54ms" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Size (KB)", | |
"totalMs": "Delayed Paint By (ms)" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "link-blocking-first-paint", | |
"category": "Performance", | |
"description": "Render-blocking Stylesheets", | |
"helpText": "Link elements are blocking the first paint of your page. Consider inlining critical links and deferring non-critical ones. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)." | |
}, | |
"no-console-time": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"isEval": "Eval'd?" | |
} | |
} | |
}, | |
"name": "no-console-time", | |
"category": "JavaScript", | |
"description": "Avoids `console.time()` in its own scripts", | |
"helpText": "Consider using `performance.mark()` and `performance.measure()` from the User Timing API instead. They provide high-precision timestamps, independent of the system clock, and are integrated in the Chrome DevTools Timeline. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/console-time)." | |
}, | |
"no-datenow": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"isEval": "Eval'd?" | |
} | |
} | |
}, | |
"name": "no-datenow", | |
"category": "JavaScript", | |
"description": "Avoids `Date.now()` in its own scripts", | |
"helpText": "Consider using `performance.now()` from the User Timing API instead. It provides high-precision timestamps, independent of the system clock. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/date-now)." | |
}, | |
"no-document-write": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "no-document-write", | |
"category": "Performance", | |
"description": "Avoids `document.write()`", | |
"helpText": "For users on slow connections, external scripts dynamically injected via `document.write()` can delay page load by tens of seconds. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/document-write)." | |
}, | |
"no-mutation-events": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"type": "Event", | |
"code": "Snippet" | |
} | |
} | |
}, | |
"name": "no-mutation-events", | |
"category": "JavaScript", | |
"description": "Avoids Mutation Events in its own scripts", | |
"helpText": "Mutation Events are deprecated and harm performance. Consider using Mutation Observers instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/mutation-events)." | |
}, | |
"no-old-flexbox": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"startLine": "Line in the stylesheet / <style>", | |
"location": "Column start/end", | |
"pre": "Snippet" | |
} | |
} | |
}, | |
"name": "no-old-flexbox", | |
"category": "CSS", | |
"description": "Avoids old CSS flexbox", | |
"helpText": "The 2009 spec of Flexbox is deprecated and is 2.3x slower than the latest spec. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/old-flexbox)." | |
}, | |
"no-websql": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "no-websql", | |
"category": "Offline", | |
"description": "Avoids WebSQL DB", | |
"helpText": "Web SQL is deprecated. Consider using IndexedDB instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/web-sql)." | |
}, | |
"notification-on-start": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "notification-on-start", | |
"category": "UX", | |
"description": "Avoids requesting the notification permission on page load", | |
"helpText": "Users are mistrustful of or confused by sites that request to send notifications without context. Consider tying the request to user gestures instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/notifications-on-load)." | |
}, | |
"script-blocking-first-paint": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Size (KB)", | |
"totalMs": "Delayed Paint By (ms)" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "script-blocking-first-paint", | |
"category": "Performance", | |
"description": "Render-blocking scripts", | |
"helpText": "Script elements are blocking the first paint of your page. Consider inlining critical scripts and deferring non-critical ones. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)." | |
}, | |
"uses-http2": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"protocol": "Protocol" | |
} | |
} | |
}, | |
"name": "uses-http2", | |
"category": "Performance", | |
"description": "Uses HTTP/2 for its own resources", | |
"helpText": "HTTP/2 offers many benefits over HTTP/1.1, including binary headers, multiplexing, and server push. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http2)." | |
}, | |
"uses-passive-event-listeners": { | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"type": "Type", | |
"pre": "Snippet" | |
} | |
} | |
}, | |
"name": "uses-passive-event-listeners", | |
"category": "JavaScript", | |
"description": "Uses passive listeners to improve scrolling performance", | |
"helpText": "Consider marking your touch and wheel event listeners as `passive` to improve your page's scroll performance. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners)." | |
} | |
}, | |
"runtimeConfig": { | |
"environment": [ | |
{ | |
"name": "Device Emulation", | |
"enabled": true, | |
"description": "Nexus 5X" | |
}, | |
{ | |
"name": "Network Throttling", | |
"enabled": true, | |
"description": "150ms RTT, 1.6Mbps down, 0.7Mbps up" | |
}, | |
{ | |
"name": "CPU Throttling", | |
"enabled": false, | |
"description": "5x slowdown" | |
} | |
], | |
"blockedUrlPatterns": [] | |
}, | |
"aggregations": [ | |
{ | |
"name": "Progressive Web App", | |
"description": "These audits validate the aspects of a Progressive Web App. They are a subset of the [PWA Checklist](https://developers.google.com/web/progressive-web-apps/checklist).", | |
"scored": true, | |
"total": 0.7583333333333333, | |
"categorizable": true, | |
"score": [ | |
{ | |
"overall": 0, | |
"name": "App can load on offline/flaky connections", | |
"description": "Ensuring your web app can respond when the network connection is unavailable or flaky is critical to providing your users a good experience. This is achieved through use of a [Service Worker](https://developers.google.com/web/fundamentals/primers/service-worker/).", | |
"subItems": [ | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "service-worker", | |
"category": "Offline", | |
"description": "Registers a Service Worker", | |
"helpText": "The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/registered-service-worker)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "works-offline", | |
"category": "Offline", | |
"description": "Responds with a 200 when offline", | |
"helpText": "If you're building a Progressive Web App, consider using a service worker so that your app can work offline. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http-200-when-offline)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Page load performance is fast", | |
"description": "Users notice if sites and apps don't perform well. These top-level metrics capture the most important perceived performance concerns.", | |
"subItems": [ | |
{ | |
"score": 100, | |
"displayValue": "896.0ms", | |
"rawValue": 896, | |
"optimalValue": "1,600ms", | |
"extendedInfo": { | |
"value": { | |
"timestamps": { | |
"navStart": 662414457357, | |
"fCP": 662415078293, | |
"fMP": 662415353311 | |
}, | |
"timings": { | |
"navStart": 0, | |
"fCP": 620.936, | |
"fMP": 895.954 | |
} | |
}, | |
"formatter": "null" | |
}, | |
"name": "first-meaningful-paint", | |
"category": "Performance", | |
"description": "First meaningful paint", | |
"helpText": "First meaningful paint measures when the primary content of a page is visible. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "883", | |
"rawValue": 883, | |
"optimalValue": "1,250", | |
"extendedInfo": { | |
"formatter": "speedline", | |
"value": { | |
"timings": { | |
"firstVisualChange": 867, | |
"visuallyComplete": 913, | |
"speedIndex": 874.9119600343704, | |
"perceptualSpeedIndex": 882.7260418713532 | |
}, | |
"timestamps": { | |
"firstVisualChange": 662415312045, | |
"visuallyComplete": 662415358045, | |
"speedIndex": 662415319956.96, | |
"perceptualSpeedIndex": 662415327771.0419 | |
}, | |
"frames": [ | |
{ | |
"timestamp": 662414445.045, | |
"progress": 0 | |
}, | |
{ | |
"timestamp": 662415312.52, | |
"progress": 69.25227031639898 | |
}, | |
{ | |
"timestamp": 662415359.001, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662415859.516, | |
"progress": 99.26337793919782 | |
}, | |
{ | |
"timestamp": 662415871.845, | |
"progress": 99.32838107699226 | |
}, | |
{ | |
"timestamp": 662415887.883, | |
"progress": 99.37044052020755 | |
}, | |
{ | |
"timestamp": 662415904.786, | |
"progress": 99.41163958259753 | |
}, | |
{ | |
"timestamp": 662415921.802, | |
"progress": 99.44426494138781 | |
}, | |
{ | |
"timestamp": 662415937.812, | |
"progress": 99.50221442709243 | |
}, | |
{ | |
"timestamp": 662415954.774, | |
"progress": 99.54729560799886 | |
}, | |
{ | |
"timestamp": 662415971.763, | |
"progress": 99.61158365792033 | |
}, | |
{ | |
"timestamp": 662415987.745, | |
"progress": 99.6519186141451 | |
}, | |
{ | |
"timestamp": 662416004.782, | |
"progress": 99.70265827063241 | |
}, | |
{ | |
"timestamp": 662416021.847, | |
"progress": 99.74877441201481 | |
}, | |
{ | |
"timestamp": 662416038.738, | |
"progress": 99.79764977622048 | |
}, | |
{ | |
"timestamp": 662416054.942, | |
"progress": 99.8537989283285 | |
}, | |
{ | |
"timestamp": 662416071.974, | |
"progress": 99.89971599441574 | |
}, | |
{ | |
"timestamp": 662416088.74, | |
"progress": 99.94375029166828 | |
}, | |
{ | |
"timestamp": 662416104.954, | |
"progress": 99.97189892330542 | |
}, | |
{ | |
"timestamp": 662416121.76, | |
"progress": 99.99436334314832 | |
}, | |
{ | |
"timestamp": 662416137.873, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662416155.571, | |
"progress": 100 | |
}, | |
{ | |
"timestamp": 662416171.926, | |
"progress": 100 | |
} | |
] | |
} | |
}, | |
"name": "speed-index-metric", | |
"category": "Performance", | |
"description": "Perceptual Speed Index", | |
"helpText": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/speed-index)." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "16ms", | |
"rawValue": 16, | |
"optimalValue": "50ms", | |
"extendedInfo": { | |
"value": [ | |
{ | |
"percentile": 0.5, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.75, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.9, | |
"time": 16 | |
}, | |
{ | |
"percentile": 0.99, | |
"time": 25.064815040468716 | |
}, | |
{ | |
"percentile": 1, | |
"time": 34.90299999999888 | |
} | |
], | |
"formatter": "null" | |
}, | |
"name": "estimated-input-latency", | |
"category": "Performance", | |
"description": "Estimated Input Latency", | |
"helpText": "The score above is an estimate of how long your app takes to respond to user input, in milliseconds. There is a 90% probability that a user encounters this amount of latency, or less. 10% of the time a user can expect additional latency. If your score is higher than Lighthouse's target score, users may perceive your app as laggy. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "901.6ms", | |
"rawValue": 901.6, | |
"optimalValue": "5,000ms", | |
"extendedInfo": { | |
"value": { | |
"timings": { | |
"fMP": 896, | |
"visuallyReady": 901.644, | |
"timeToInteractive": 901.644 | |
}, | |
"timestamps": { | |
"fMP": 662415353311, | |
"visuallyReady": 662415359001, | |
"timeToInteractive": 662415359001 | |
}, | |
"expectedLatencyAtTTI": 16, | |
"foundLatencies": [ | |
{ | |
"estLatency": 16, | |
"startTime": "901.6" | |
} | |
] | |
}, | |
"formatter": "null" | |
}, | |
"name": "time-to-interactive", | |
"category": "Performance", | |
"description": "Time To Interactive (alpha)", | |
"helpText": "Time to Interactive identifies the time at which your app appears to be ready enough to interact with. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/time-to-interactive)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Site is progressively enhanced", | |
"description": "Progressive enhancement means that everyone can access the basic content and functionality of a page in any browser, and those without certain browser features may receive a reduced but still functional experience.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "without-javascript", | |
"category": "JavaScript", | |
"description": "Contains some content when JavaScript is not available", | |
"helpText": "Your app should display some content when JavaScript is disabled, even if it's just a warning to the user that JavaScript is required to use the app. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/no-js)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Network connection is secure", | |
"description": "Security is an important part of the web for both developers and users. Moving forward, Transport Layer Security (TLS) support will be required for many APIs.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "is-on-https", | |
"category": "Security", | |
"description": "Uses HTTPS", | |
"helpText": "All sites should be protected with HTTPS, even ones that don't handle sensitive data. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/https)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "redirects-http", | |
"category": "Security", | |
"description": "Redirects HTTP traffic to HTTPS", | |
"helpText": "If you've already set up HTTPS, make sure that you redirect all HTTP traffic to HTTPS. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http-redirects-to-https)." | |
} | |
] | |
}, | |
{ | |
"overall": 0.8, | |
"name": "User can be prompted to Add to Homescreen", | |
"description": "While users can manually add your site to their homescreen in the browser menu, the [prompt (aka app install banner)](https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android) will proactively prompt the user to install the app if the below requirements are met and the user has visited your site at least twice (with at least five minutes between visits).", | |
"subItems": [ | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "service-worker", | |
"category": "Offline", | |
"description": "Registers a Service Worker", | |
"helpText": "The service worker is the technology that enables your app to use many Progressive Web App features, such as offline, add to homescreen, and push notifications. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/registered-service-worker)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-exists", | |
"category": "Manifest", | |
"description": "Manifest exists", | |
"helpText": "The web app manifest is the technology that enables users to add your web app to their homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-exists)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-start-url", | |
"category": "Manifest", | |
"description": "Manifest contains `start_url`", | |
"helpText": "Add a `start_url` to instruct the browser to launch a specific URL whenever your app is launched from a homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-start_url)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "found sizes: 144x144, 192x192", | |
"rawValue": true, | |
"name": "manifest-icons-min-144", | |
"category": "Manifest", | |
"description": "Manifest contains icons at least 144px" | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-short-name", | |
"category": "Manifest", | |
"description": "Manifest contains `short_name`", | |
"helpText": "The `short_name` property is a requirement for Add To Homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-short_name)." | |
} | |
] | |
}, | |
{ | |
"overall": 0.6, | |
"name": "Installed web app will launch with custom splash screen", | |
"description": "A default splash screen will be constructed, but meeting these requirements guarantee a high-quality and customizable [splash screen](https://developers.google.com/web/updates/2015/10/splashscreen) the user sees between tapping the home screen icon and your app's first paint.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-exists", | |
"category": "Manifest", | |
"description": "Manifest exists", | |
"helpText": "The web app manifest is the technology that enables users to add your web app to their homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-exists)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-name", | |
"category": "Manifest", | |
"description": "Manifest contains `name`", | |
"helpText": "The `name` property identifies your app and is required. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-name)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "null" | |
}, | |
"name": "manifest-background-color", | |
"category": "Manifest", | |
"description": "Manifest contains `background_color`", | |
"helpText": "When your app launches from a user's homescreen, the browser uses `background_color` to paint the background of the browser while your app loads for a smooth transition experience. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-background_color)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "manifest-theme-color", | |
"category": "Manifest", | |
"description": "Manifest contains `theme_color`", | |
"helpText": "Add a `theme_color` to set the color of the browser's address bar. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-theme_color)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "found sizes: 192x192", | |
"rawValue": true, | |
"name": "manifest-icons-min-192", | |
"category": "Manifest", | |
"description": "Manifest contains icons at least 192px", | |
"helpText": "A 192px icon ensures that your app's icon displays well on the homescreens of the largest mobile devices. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-192px-icon)." | |
} | |
] | |
}, | |
{ | |
"overall": 0.6666666666666666, | |
"name": "Address bar matches brand colors", | |
"description": "The browser address bar can be themed to match your site. A `theme-color` [meta tag](https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android) will upgrade the address bar when a user browses the site, and the [manifest theme-color](https://developers.google.com/web/updates/2015/08/using-manifest-to-set-sitewide-theme-color) will apply the same theme site-wide once it's been added to homescreen.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-exists", | |
"category": "Manifest", | |
"description": "Manifest exists", | |
"helpText": "The web app manifest is the technology that enables users to add your web app to their homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-exists)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "#ffffff", | |
"rawValue": true, | |
"name": "theme-color-meta", | |
"category": "HTML", | |
"description": "Has a `<meta name=\"theme-color\">` tag" | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"name": "manifest-theme-color", | |
"category": "Manifest", | |
"description": "Manifest contains `theme_color`", | |
"helpText": "Add a `theme_color` to set the color of the browser's address bar. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-contains-theme_color)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Design is mobile-friendly", | |
"description": "Users increasingly experience your app on mobile devices, so it's important to ensure that the experience can adapt to smaller screens.", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "viewport", | |
"category": "Mobile Friendly", | |
"description": "Has a `<meta name=\"viewport\">` tag with `width` or `initial-scale`", | |
"helpText": "Add a viewport meta tag to optimize your app for mobile screens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/has-viewport-meta-tag)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "content-width", | |
"category": "Mobile Friendly", | |
"description": "Content is sized correctly for the viewport", | |
"helpText": "If the width of your app's content doesn't match the width of the viewport, your app might not be optimized for mobile screens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/content-sized-correctly-for-viewport)." | |
} | |
] | |
} | |
] | |
}, | |
{ | |
"name": "Best Practices", | |
"description": "We've compiled some recommendations for modernizing your web app and avoiding performance pitfalls. These audits do not affect your score but are worth a look.", | |
"scored": false, | |
"total": null, | |
"categorizable": true, | |
"score": [ | |
{ | |
"overall": 1, | |
"name": "Using modern offline features", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "appcache-manifest", | |
"category": "Offline", | |
"description": "Avoids Application Cache", | |
"helpText": "Application Cache has been [deprecated](https://html.spec.whatwg.org/multipage/browsers.html#offline) by [Service Workers](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers). Consider implementing an offline solution using the [Cache Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Cache)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "", | |
"name": "no-websql", | |
"category": "Offline", | |
"description": "Avoids WebSQL DB", | |
"helpText": "Web SQL is deprecated. Consider using IndexedDB instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/web-sql)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Using modern protocols", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "is-on-https", | |
"category": "Security", | |
"description": "Uses HTTPS", | |
"helpText": "All sites should be protected with HTTPS, even ones that don't handle sensitive data. HTTPS prevents intruders from tampering with or passively listening in on the communications between your app and your users, and is a prerequisite for HTTP/2 and many new web platform APIs. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/https)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"protocol": "Protocol" | |
} | |
} | |
}, | |
"name": "uses-http2", | |
"category": "Performance", | |
"description": "Uses HTTP/2 for its own resources", | |
"helpText": "HTTP/2 offers many benefits over HTTP/1.1, including binary headers, multiplexing, and server push. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/http2)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Using modern CSS features", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"startLine": "Line in the stylesheet / <style>", | |
"location": "Column start/end", | |
"pre": "Snippet" | |
} | |
} | |
}, | |
"name": "no-old-flexbox", | |
"category": "CSS", | |
"description": "Avoids old CSS flexbox", | |
"helpText": "The 2009 spec of Flexbox is deprecated and is 2.3x slower than the latest spec. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/old-flexbox)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Using modern JavaScript features", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"type": "Type", | |
"pre": "Snippet" | |
} | |
} | |
}, | |
"name": "uses-passive-event-listeners", | |
"category": "JavaScript", | |
"description": "Uses passive listeners to improve scrolling performance", | |
"helpText": "Consider marking your touch and wheel event listeners as `passive` to improve your page's scroll performance. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"debugString": "Lighthouse was unable to determine the URL of some script executions. It's possible a Chrome extension or other eval'd code is the source.", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"type": "Event", | |
"code": "Snippet" | |
} | |
} | |
}, | |
"name": "no-mutation-events", | |
"category": "JavaScript", | |
"description": "Avoids Mutation Events in its own scripts", | |
"helpText": "Mutation Events are deprecated and harm performance. Consider using Mutation Observers instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/mutation-events)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Avoiding APIs that harm the user experience", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "no-document-write", | |
"category": "Performance", | |
"description": "Avoids `document.write()`", | |
"helpText": "For users on slow connections, external scripts dynamically injected via `document.write()` can delay page load by tens of seconds. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/document-write)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "external-anchors-use-rel-noopener", | |
"category": "Performance", | |
"description": "Opens external anchors using rel=\"noopener\"", | |
"helpText": "Open new tabs using `rel=\"noopener\"` to improve performance and prevent security vulnerabilities. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/noopener)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "geolocation-on-start", | |
"category": "UX", | |
"description": "Avoids requesting the geolocation permission on page load", | |
"helpText": "Users are mistrustful of or confused by sites that request their location without context. Consider tying the request to user gestures instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/geolocation-on-load)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "notification-on-start", | |
"category": "UX", | |
"description": "Avoids requesting the notification permission on page load", | |
"helpText": "Users are mistrustful of or confused by sites that request to send notifications without context. Consider tying the request to user gestures instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/notifications-on-load)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Avoiding deprecated APIs and browser interventions", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "urllist", | |
"value": [] | |
}, | |
"name": "deprecations", | |
"category": "Deprecations", | |
"description": "Avoids deprecated APIs", | |
"helpText": "Deprecated APIs will eventually be removed from the browser. [Learn more](https://www.chromestatus.com/features#deprecated)." | |
} | |
] | |
}, | |
{ | |
"overall": 0.875, | |
"name": "Accessibility", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-allowed-attr", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes are allowed for this role", | |
"helpText": "Each ARIA `role` supports a specific subset of `aria-*` attributes. Mismatching these invalidates the `aria-*` attributes. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/aria-allowed-attributes)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-required-attr", | |
"category": "Accessibility", | |
"description": "Elements with ARIA roles have the required aria-* attributes", | |
"helpText": "Some ARIA roles have required attributes that describe the state of the element to screen readers. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/required-aria-attributes)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-valid-attr", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes are valid and not misspelled or non-existent.", | |
"helpText": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid names. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/valid-aria-attributes)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "aria-valid-attr-value", | |
"category": "Accessibility", | |
"description": "Element aria-* attributes have valid values", | |
"helpText": "Assistive technologies, like screen readers, can't interpret ARIA attributes with invalid values. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/valid-aria-values)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "accessibility", | |
"value": { | |
"description": "Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds", | |
"help": "Elements must have sufficient color contrast", | |
"helpUrl": "https://dequeuniversity.com/rules/axe/2.1/color-contrast?application=axeAPI", | |
"id": "color-contrast", | |
"impact": "critical", | |
"nodes": [ | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"news\"><span class=\"long\">Weekly </span><span class=\"short\">Wkly </span>News</label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(2) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"articles\">Art<span class=\"short\">.</span><span class=\"long\">icles</span></label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(3) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"releases\">Rel<span class=\"short\">.</span><span class=\"long\">eases</span></label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(4) > label" | |
] | |
}, | |
{ | |
"all": [], | |
"any": [ | |
{ | |
"data": { | |
"bgColor": "#fffdf9", | |
"contrastRatio": "1.42", | |
"fgColor": "#d7d7d5", | |
"fontSize": "9.8pt", | |
"fontWeight": "normal" | |
}, | |
"id": "color-contrast", | |
"impact": "critical", | |
"message": "Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"relatedNodes": [ | |
{ | |
"html": "<body>", | |
"target": [ | |
"body" | |
] | |
} | |
] | |
} | |
], | |
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.42 (foreground color: #d7d7d5, background color: #fffdf9, font size: 9.8pt, font weight: normal)", | |
"html": "<label for=\"videos\">Vid<span class=\"long\">eo</span>s</label>", | |
"impact": "critical", | |
"none": [], | |
"target": [ | |
"body > header > .tabs > ul > li:nth-of-type(8) > label" | |
] | |
} | |
], | |
"tags": [ | |
"wcag2aa", | |
"wcag143" | |
] | |
} | |
}, | |
"name": "color-contrast", | |
"category": "Accessibility", | |
"description": "Background and foreground colors have a sufficient contrast ratio", | |
"helpText": "Low-contrast text is difficult or impossible for many users to read. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/contrast-ratio)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "image-alt", | |
"category": "Accessibility", | |
"description": "Every image element has an alt attribute", | |
"helpText": "Screen reader users rely on `alt` text to provide descriptions of images. It's also used as fallback content when an image fails to load. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/alt-attribute)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "label", | |
"category": "Accessibility", | |
"description": "Every form element has a label", | |
"helpText": "Labels ensure that form controls are announced properly by assistive technologies, like screen readers. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/form-labels)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "accessibility" | |
}, | |
"name": "tabindex", | |
"category": "Accessibility", | |
"description": "No element has a `tabindex` attribute greater than 0", | |
"helpText": "A value greater than 0 implies an explicit navigation ordering. Although technically valid, this often creates frustrating experiences for users who rely on assistive technologies. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/tabindex)." | |
} | |
] | |
}, | |
{ | |
"overall": 1, | |
"name": "Other", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"name": "manifest-short-name-length", | |
"category": "Manifest", | |
"description": "Manifest's `short_name` won't be truncated when displayed on homescreen", | |
"helpText": "Make your app's `short_name` less than 12 characters to ensure that it's not truncated on homescreens. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-short_name-is-not-truncated)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "standalone", | |
"rawValue": true, | |
"name": "manifest-display", | |
"category": "Manifest", | |
"description": "Manifest's `display` property is set", | |
"helpText": "Set the `display` property to specify how your app launches from the homescreen. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/manifest-has-display-set)." | |
} | |
] | |
} | |
] | |
}, | |
{ | |
"name": "Performance", | |
"description": "These encapsulate your app's performance.", | |
"scored": false, | |
"total": null, | |
"categorizable": false, | |
"score": [ | |
{ | |
"overall": 0.7777777777777778, | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "Potential savings of 3 KB (~10ms)", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "…css/haxe.io.css", | |
"numUnused": 122, | |
"wastedBytes": 2738, | |
"wastedPercent": 85.91549295774648, | |
"totalBytes": 3187, | |
"wastedKb": "3 KB", | |
"wastedMs": "10ms", | |
"totalKb": "3 KB", | |
"totalMs": "20ms", | |
"potentialSavings": "3 KB _86%_" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"numUnused": "Unused Rules", | |
"totalKb": "Original", | |
"potentialSavings": "Potential Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "unused-css-rules", | |
"category": "CSS", | |
"description": "Unused CSS rules", | |
"helpText": "Remove unused rules from stylesheets to reduce unnecessary bytes consumed by network activity. [Learn more](https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery)" | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"preview": "", | |
"url": "URL", | |
"totalKb": "Original", | |
"webpSavings": "WebP Savings", | |
"jpegSavings": "JPEG Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "uses-optimized-images", | |
"category": "Images", | |
"description": "Unoptimized images", | |
"helpText": "Images should be optimized to save network bytes. The following images could have smaller file sizes when compressed with [WebP](https://developers.google.com/speed/webp/) or JPEG at 80 quality. [Learn more about image optimization](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/image-optimization)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"preview": "", | |
"url": "URL", | |
"totalKb": "Original", | |
"potentialSavings": "Potential Savings" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "uses-responsive-images", | |
"category": "Images", | |
"description": "Oversized Images", | |
"helpText": "Image sizes served should be based on the device display size to save network bytes. Learn more about [responsive images](https://developers.google.com/web/fundamentals/design-and-ui/media/images) and [client hints](https://developers.google.com/web/updates/2015/09/automating-resource-selection-with-client-hints)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "5", | |
"rawValue": false, | |
"optimalValue": 0, | |
"extendedInfo": { | |
"formatter": "criticalRequestChains", | |
"value": { | |
"31388.1": { | |
"request": { | |
"url": "https://haxe.io/", | |
"startTime": 662414.530793, | |
"endTime": 662414.777825, | |
"responseReceivedTime": 662414.684222, | |
"transferSize": 19989 | |
}, | |
"children": { | |
"31388.2": { | |
"request": { | |
"url": "https://haxe.io/css/normalize.css", | |
"startTime": 662414.785981, | |
"endTime": 662414.978426, | |
"responseReceivedTime": 662414.97747, | |
"transferSize": 1202 | |
}, | |
"children": {} | |
}, | |
"31388.5": { | |
"request": { | |
"url": "https://haxe.io/css/normalize-opentype.css", | |
"startTime": 662414.787022, | |
"endTime": 662415.000014, | |
"responseReceivedTime": 662414.999229, | |
"transferSize": 667 | |
}, | |
"children": {} | |
}, | |
"31388.6": { | |
"request": { | |
"url": "https://fonts.googleapis.com/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700", | |
"startTime": 662414.787329, | |
"endTime": 662415.007396, | |
"responseReceivedTime": 662415.006265, | |
"transferSize": 1436 | |
}, | |
"children": {} | |
}, | |
"31388.3": { | |
"request": { | |
"url": "https://haxe.io/css/frontpage.css", | |
"startTime": 662414.78641, | |
"endTime": 662415.013338, | |
"responseReceivedTime": 662414.985225, | |
"transferSize": 1982 | |
}, | |
"children": {} | |
}, | |
"31388.4": { | |
"request": { | |
"url": "https://haxe.io/css/haxe.io.css", | |
"startTime": 662414.786697, | |
"endTime": 662415.027827, | |
"responseReceivedTime": 662414.991879, | |
"transferSize": 3187 | |
}, | |
"children": {} | |
} | |
} | |
}, | |
"31388.33": { | |
"request": { | |
"url": "https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2", | |
"startTime": 662415.058078, | |
"endTime": 662415.292406, | |
"responseReceivedTime": 662415.228356, | |
"transferSize": 5883 | |
}, | |
"children": {} | |
}, | |
"31388.38": { | |
"request": { | |
"url": "https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2", | |
"startTime": 662415.036696, | |
"endTime": 662415.32801, | |
"responseReceivedTime": 662415.214558, | |
"transferSize": 10535 | |
}, | |
"children": {} | |
} | |
} | |
}, | |
"informative": true, | |
"name": "critical-request-chains", | |
"category": "Performance", | |
"description": "Critical Request Chains", | |
"helpText": "The Critical Request Chains below show you what resources are required for first render of this page. Improve page load by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)." | |
}, | |
{ | |
"score": false, | |
"displayValue": "5 resources delayed first paint by 54ms", | |
"rawValue": false, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "…css/normalize.css", | |
"totalKb": "1 KB", | |
"totalMs": "30ms" | |
}, | |
{ | |
"url": "…css/frontpage.css", | |
"totalKb": "2 KB", | |
"totalMs": "32ms" | |
}, | |
{ | |
"url": "…css/haxe.io.css", | |
"totalKb": "3 KB", | |
"totalMs": "35ms" | |
}, | |
{ | |
"url": "…css/normalize-opentype.css", | |
"totalKb": "1 KB", | |
"totalMs": "35ms" | |
}, | |
{ | |
"url": "/css", | |
"totalKb": "1 KB", | |
"totalMs": "54ms" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Size (KB)", | |
"totalMs": "Delayed Paint By (ms)" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "link-blocking-first-paint", | |
"category": "Performance", | |
"description": "Render-blocking Stylesheets", | |
"helpText": "Link elements are blocking the first paint of your page. Consider inlining critical links and deferring non-critical ones. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Size (KB)", | |
"totalMs": "Delayed Paint By (ms)" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "script-blocking-first-paint", | |
"category": "Performance", | |
"description": "Render-blocking scripts", | |
"helpText": "Script elements are blocking the first paint of your page. Consider inlining critical scripts and deferring non-critical ones. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "Total size was 56 KB", | |
"rawValue": 57375, | |
"optimalValue": "1,600 KB", | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [ | |
{ | |
"url": "/", | |
"totalBytes": 19989, | |
"totalKb": "20 KB", | |
"totalMs": "100ms" | |
}, | |
{ | |
"url": "/analytics.js", | |
"totalBytes": 12431, | |
"totalKb": "12 KB", | |
"totalMs": "60ms" | |
}, | |
{ | |
"url": "…v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2", | |
"totalBytes": 10535, | |
"totalKb": "10 KB", | |
"totalMs": "50ms" | |
}, | |
{ | |
"url": "…v13/k3k702ZOKiLJc3WVjuplzBdwxCXfZpKo5kWAx_74bHs.woff2", | |
"totalBytes": 5883, | |
"totalKb": "6 KB", | |
"totalMs": "30ms" | |
}, | |
{ | |
"url": "…css/haxe.io.css", | |
"totalBytes": 3187, | |
"totalKb": "3 KB", | |
"totalMs": "20ms" | |
}, | |
{ | |
"url": "…css/frontpage.css", | |
"totalBytes": 1982, | |
"totalKb": "2 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "/css?family=Open+Sans:600,400,700,800|Gentium+Book+Basic:400,700", | |
"totalBytes": 1436, | |
"totalKb": "1 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "…css/normalize.css", | |
"totalBytes": 1202, | |
"totalKb": "1 KB", | |
"totalMs": "10ms" | |
}, | |
{ | |
"url": "…css/normalize-opentype.css", | |
"totalBytes": 667, | |
"totalKb": "1 KB", | |
"totalMs": "0ms" | |
}, | |
{ | |
"url": "/collect?v=…", | |
"totalBytes": 63, | |
"totalKb": "0 KB", | |
"totalMs": "0ms" | |
} | |
], | |
"tableHeadings": { | |
"url": "URL", | |
"totalKb": "Total Size", | |
"totalMs": "Transfer Time" | |
} | |
} | |
}, | |
"informative": true, | |
"name": "total-byte-weight", | |
"category": "Network", | |
"description": "Avoids enormous network payloads", | |
"helpText": "Network transfer size [costs users real dollars](https://whatdoesmysitecost.com/) and is [highly correlated](http://httparchive.org/interesting.php#onLoad) with long load times. Try to find ways to reduce the size of required files." | |
}, | |
{ | |
"score": 100, | |
"displayValue": "905 nodes", | |
"rawValue": 905, | |
"optimalValue": "1,500 nodes", | |
"extendedInfo": { | |
"formatter": "card", | |
"value": [ | |
{ | |
"title": "Total DOM Nodes", | |
"value": "905", | |
"target": "< 1,500 nodes" | |
}, | |
{ | |
"title": "DOM Depth", | |
"value": "10", | |
"snippet": "html./frontpage >\n body >\n footer.grid >\n div.grid-1-1 >\n div.logo >\n div >\n svg >\n g >\n g >\n line", | |
"target": "< 32" | |
}, | |
{ | |
"title": "Maximum Children", | |
"value": "166", | |
"snippet": "Element with most children:\nul", | |
"target": "< 60 nodes" | |
} | |
] | |
}, | |
"name": "dom-size", | |
"category": "Performance", | |
"description": "Avoids an excessive DOM size", | |
"helpText": "Browser engineers recommend pages contain fewer than ~1,500 DOM nodes. The sweet spot is a tree depth < 32 elements and fewer than 60 children/parent element. A large DOM can increase memory, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/fundamentals/performance/rendering/)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "0", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "userTimings", | |
"value": [] | |
}, | |
"informative": true, | |
"name": "user-timings", | |
"category": "Performance", | |
"description": "User Timing marks and measures", | |
"helpText": "Consider instrumenting your app with the User Timing API to create custom, real-world measurements of key user experiences. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/user-timing)." | |
} | |
] | |
} | |
] | |
}, | |
{ | |
"name": "Fancier stuff", | |
"description": "A list of newer features that you could be using in your app. These audits do not affect your score and are just suggestions.", | |
"scored": false, | |
"additional": true, | |
"total": null, | |
"categorizable": true, | |
"score": [ | |
{ | |
"overall": 1, | |
"name": "New JavaScript features", | |
"subItems": [ | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"isEval": "Eval'd?" | |
} | |
} | |
}, | |
"name": "no-datenow", | |
"category": "JavaScript", | |
"description": "Avoids `Date.now()` in its own scripts", | |
"helpText": "Consider using `performance.now()` from the User Timing API instead. It provides high-precision timestamps, independent of the system clock. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/date-now)." | |
}, | |
{ | |
"score": true, | |
"displayValue": "", | |
"rawValue": true, | |
"extendedInfo": { | |
"formatter": "table", | |
"value": { | |
"results": [], | |
"tableHeadings": { | |
"url": "URL", | |
"lineCol": "Line/Col", | |
"isEval": "Eval'd?" | |
} | |
} | |
}, | |
"name": "no-console-time", | |
"category": "JavaScript", | |
"description": "Avoids `console.time()` in its own scripts", | |
"helpText": "Consider using `performance.mark()` and `performance.measure()` from the User Timing API instead. They provide high-precision timestamps, independent of the system clock, and are integrated in the Chrome DevTools Timeline. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/console-time)." | |
} | |
] | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment