289 |
290 | #### Code
291 |
292 | `Code` tag define your program code
293 |
294 | function action() {
295 | // TODO
296 | return true;
297 | }
298 |
299 | If you want to add lines numbers use next construction:
300 |
301 |
302 | function action() {
303 | // TODO
304 | return true;
305 | }
306 |
307 |
308 | When neccessary emphasize that code is commented, you need to use span element with `comment` class;
309 | If you want to color part of code, wrap this part with `mark` to add yellow background and `mark` with `important` class to add red background;
310 |
311 | function action() {
312 |
315 |
316 | ### Elements
317 |
318 | …
319 |
320 | #### Cover
321 |
322 | `Cover` class on img attribute indicates that picture will be background for slide
323 |
324 |
325 |
326 |
327 |
328 | To stretch the picture in width or height, you need to set a `width` or `height` class respectively;
329 |
330 | Use both classes `width height`, if you want to stretch the picture in width and height
331 |
332 |
333 |
334 |
335 |
336 | Shortcut for `width`, `height`:
337 |
338 |
339 |
340 |
341 | To insert an image description, links to the author's site or other information use `figure` tag with `figcaption`
342 |
343 |
344 |
345 |
346 | © Yours Truly
347 |
348 |
349 |
350 | #### Shout
351 |
352 | There are slides, which need to be described in only a few words. Usually they display a call for action, define common themes, link to project or something else. To stylize this text, use the `shout` class.
353 |
354 |
357 |
358 | Add `grow` class to animate text from small to big size
359 |
360 |
361 | Growing Shout
362 |
363 |
364 | Or, on the contrary, for animate text size from big to small add `shrink` class.
365 |
366 |
367 | Shrinking Shout
368 |
369 |
370 | #### Place
371 |
372 | Use `place` class on img attribute give same effect as `cover` class - set background image
373 |
374 |
375 |
376 |
377 |
378 | If you want collocate picture at a certain side, you need to use `top` / `right` / `bottom` / `left` class as shown below
379 |
380 |
381 |
382 |
383 |
384 |
385 | You can also combine classes for location in corners:
386 |
387 |
388 |
389 |
390 |
391 |
392 | #### Notes
393 |
394 | When neccessary to add some notes for slide, you may use `footer` class, that hide your notes at all time and show them when you hover to slide:
395 |
396 |
397 | Retro meh brunch aesthetic.
398 |
401 |
402 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
17 |
18 | Docker для фронтендера
19 |
20 |
21 |
22 |
23 |
48 |
49 |
50 |
51 |
59 |
60 |
67 |
68 |
93 |
94 |
95 |
96 |
97 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | Требования: Docker
115 |
116 |
117 |
120 |
121 |
122 | 👨💻 О себе
123 |
124 |
125 |
126 | 👨 Алексей Авдеев (https://github.com/avdeev )
127 |
128 | 👔 Руковожу командой фронтенд-разработчиков
129 | 🏙️ Из Нижнего Новгорода, работаю в Москве
130 | 🌐 Neuron.Digital
131 | 👴 Программирую с 2002 года
132 |
133 |
134 |
135 |
136 |
137 |
138 |
141 |
142 |
143 | Поднимаем backend
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 | 😫 Без Docker
152 |
153 |
154 | $ brew update
155 | $ brew install mysql
156 | ...
157 | $ \curl -sSL https://get.rvm.io | bash
158 | ...
159 | $ rails s
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 | 👍 С Docker
177 |
178 |
179 | $ docker-compose up api
180 | ...
181 | Listening localhost:8080
182 |
183 |
184 |
185 |
186 | 👍 С Docker
187 |
188 |
189 |
190 |
191 |
192 | Автоматизируй
193 |
194 |
195 |
196 |
197 |
198 | Устойчивость ⚖
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 | 👍 С Docker
211 |
212 |
213 | $ docker rm --volumes api
214 |
215 |
216 |
217 | $ docker system prune --all
218 |
219 |
220 |
221 |
222 |
223 |
224 | Контролируем эксплуатацию
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 | 😫 Без Docker
233 |
234 |
235 | nvm use 10
236 | npm install
237 | npm run build
238 | Раздаём папку /dist веб-сервером
239 |
240 |
241 |
242 |
243 | 👍 С Docker
244 |
245 | Упаковано в Docker 📦
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
262 |
263 |
264 | KEEP CALM
265 | IT WORKS
266 | ON ALL MACHINES
267 |
268 |
269 |
270 |
271 | Пишите код для продакшна
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 | Безопасно собирайте, делитесь и запускайте любое приложение где угодно
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 | Установка
303 | Docker ⏬
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 | ♻ Установка Docker через Homebrew
317 |
318 |
319 | $ brew cask install docker
320 |
321 |
322 |
323 |
324 | Что входит в Docker Desktop
325 |
326 |
327 | Docker Engine
328 | Docker CLI client
329 | Docker Compose
330 | Docker Machine
331 | Kitematic
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 | Docker — это не только для
340 | админов
341 |
342 |
343 |
344 |
345 | Что-то для админов
346 |
347 |
348 | docker run
349 | docker build
350 | Dockerfile
351 | Image
352 | DockerHub
353 |
354 |
355 |
356 |
357 |
358 | Docker как NPM,
359 | но для Ops
360 |
361 |
362 |
363 |
364 | Знакомые понятия
365 |
366 |
367 | docker run 🔀 npm start
368 | docker build 🔀 npm run build
369 | Dockerfile 🔀 package.json
370 | Image 🔀 Package
371 | DockerHub 🔀 NPM Registry
372 |
373 |
374 |
375 |
376 | Знакомые понятия
377 |
378 |
379 | Проект начат как проприетарная разработка
380 | Используется для всего подряд
381 | Есть альтернативы, призванные заменить
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
396 |
397 |
398 |
399 |
405 |
406 |
407 |
408 | Hello World (1)
409 |
410 |
411 | $ docker run ubuntu:14.04 /bin/echo 'Hello world'
412 |
413 | Hello world
414 |
415 |
416 |
417 |
418 |
424 |
425 |
426 |
427 | Hello World (2)
428 |
429 |
430 | $ docker run hello-world
431 |
432 | Unable to find image 'hello-world:latest' locally
433 | latest: Pulling from library/hello-world
434 | ...
435 | Hello from Docker!
436 | This message shows that your installation appears...
437 | ...
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 | Немного
448 | рецептов
449 |
450 |
451 |
452 |
453 |
459 |
460 |
461 |
462 |
468 |
469 |
470 |
471 |
477 |
478 |
479 |
480 |
486 |
487 |
488 |
489 |
495 |
496 |
497 |
498 | Запускаем Lighthouse
499 |
500 |
501 |
502 | 😫 Без Docker
503 |
504 |
505 | Установить Google Chrome for Desktop.
506 | Установить текущую LTS-версию Node.
507 | $ npm install -g lighthouse
508 | $ lighthouse http://frontendconf.ru
509 |
510 |
511 |
512 |
513 |
519 |
520 |
521 |
522 | 👍 С Docker
523 |
524 |
525 | $ docker run \
526 | --rm \
527 | --name lighthouse \
528 | -it \
529 | --volume ~:/home/chrome/reports \
530 | --cap-add=SYS_ADMIN \
531 | femtopixel/google-lighthouse http://frontendconf.ru
532 |
533 |
534 |
535 |
538 |
539 |
540 | 👍 С Docker
541 |
542 |
543 | $ docker service scale frontend=10
544 |
545 | frontend scaled to 10
546 |
547 |
548 |
549 |
550 | Решение организационных вопросов
551 |
552 |
553 |
554 | Dockerfile
555 |
556 |
557 | LABEL maintainer="aad.jerry@gmail.com"
558 |
559 |
560 |
561 |
562 | docker inspect
563 |
564 |
565 | $ docker inspect NAME|ID
566 |
567 |
568 |
569 | "Labels": {
570 | "maintainer": "aad.jerry@gmail.com"
571 | }
572 |
573 |
574 |
575 |
576 |
577 | Выбираем
578 | технологию
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
593 |
594 |
595 |
596 | Dockerfile (1)
597 |
598 |
599 | FROM node:10-alpine as builder
600 | WORKDIR /app
601 | COPY package*.json ./
602 | RUN npm ci
603 | COPY vue.config.js babel.config.js ./
604 | COPY src src
605 | RUN npm run build
606 |
607 |
608 |
609 |
610 |
616 |
617 |
618 |
619 | Dockerfile (2)
620 |
621 |
622 | FROM nginx:1.13-alpine
623 | COPY nginx /etc/nginx/conf.d
624 | COPY --from=builder /app/dist/ /usr/share/nginx/html/
625 | EXPOSE 5000
626 |
627 |
628 |
629 |
630 | Запускаем контейнер
631 |
632 |
633 | docker build --tag my-app .
634 | docker run -p 5000:5000 --tag my-app
635 |
636 |
637 |
638 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
653 |
654 |
655 |
656 | Dockerfile для Node.js
657 |
658 |
659 | FROM node:10-alpine
660 | WORKDIR /app
661 | COPY package*.json ./
662 | RUN npm ci
663 | COPY . .
664 | EXPOSE 5000
665 | CMD ["node", "server.js"]
666 |
667 |
668 |
669 |
670 |
676 |
677 |
678 |
679 | Dockerfile для Python
680 |
681 |
682 | FROM python:3-alpine
683 | WORKDIR /usr/src/app
684 | COPY requirements.txt ./
685 | RUN pip install --no-cache-dir -r requirements.txt
686 | COPY . .
687 | EXPOSE 5000
688 | CMD ["python", "./your-daemon-or-script.py"]
689 |
690 |
691 |
692 |
695 |
696 |
697 | Универсальная абстракция
698 |
699 |
700 |
701 | Компонуемость
702 |
703 |
704 |
705 | 👍 С Docker (docker-compose.yml)
706 |
707 |
708 | services:
709 | api :
710 | build: ./api
711 | front :
712 | build: ./front
713 | reverse-proxy :
714 | image: abiosoft/caddy
715 | ports:
716 | - 80:80
717 | volumes:
718 | - ./Caddyfile:/etc/Caddyfile
719 |
720 |
721 |
722 |
723 | Запускаем связку контейнеров
724 |
725 |
726 | $ docker-compose up
727 |
728 |
729 |
730 |
733 |
734 |
735 | Виртуализируй
736 |
737 |
738 |
739 | 👏 Спасибо!
740 |
741 |
746 |
747 |
752 |
753 |
754 |
757 |
758 |
759 |
760 |
761 |
762 |
763 |
764 |
--------------------------------------------------------------------------------
/asciinema/lighthouse.cast:
--------------------------------------------------------------------------------
1 | {"version": 2, "width": 120, "height": 29, "timestamp": 1570627723, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}}
2 | [5.720577, "o", "Error: No available formula with the name \"qt@5.5\" \r\n"]
3 | [5.748275, "o", "\u001b[?1034hbash-3.2$ "]
4 | [7.74778, "o", "do"]
5 | [7.748105, "o", "cker run --rm --name lighthouse -it -v ~:"]
6 | [7.748164, "o", "/"]
7 | [7.748284, "o", "h"]
8 | [7.748451, "o", "ome/chrome/r"]
9 | [7.748608, "o", "eports "]
10 | [7.748826, "o", "--"]
11 | [7.748895, "o", "cap"]
12 | [7.748938, "o", "-a"]
13 | [7.751756, "o", "dd=SYS_ADMIN femtopixel/google-lighthou \rse http://frontendconf.ru"]
14 | [8.243061, "o", "\r\n"]
15 | [9.616665, "o", " \u001b[34;1mChromeLauncher \u001b[0mWaiting for browser. \u001b[34m+0ms\u001b[0m"]
16 | [9.617716, "o", "\r\n"]
17 | [9.619389, "o", " \u001b[34;1mChromeLauncher \u001b[0mWaiting for browser... \u001b[34m+2ms\u001b[0m"]
18 | [9.620159, "o", "\r\n"]
19 | [10.134066, "o", " \u001b[34;1mChromeLauncher \u001b[0mWaiting for browser..... \u001b[34m+517ms\u001b[0m\r\n"]
20 | [10.136484, "o", " \u001b[34;1mChromeLauncher \u001b[0mWaiting for browser.....\u001b[32m✓\u001b[0m \u001b[34m+2ms\u001b[0m"]
21 | [10.13672, "o", "\r\n"]
22 | [10.317457, "o", " \u001b[33;1mconfig:warn \u001b[0mIFrameElements gatherer requested, however no audit requires it. \u001b[33m+182ms\u001b[0m\r\n"]
23 | [10.329141, "o", " \u001b[34;1mstatus \u001b[0mConnecting to browser \u001b[34m+11ms\u001b[0m"]
24 | [10.329385, "o", "\r\n"]
25 | [10.356999, "o", " \u001b[34;1mstatus \u001b[0mResetting state with about:blank \u001b[34m+25ms\u001b[0m\r\n"]
26 | [10.419303, "o", " \u001b[34;1mstatus \u001b[0mBenchmarking machine \u001b[34m+64ms\u001b[0m\r\n"]
27 | [10.931353, "o", " \u001b[34;1mstatus \u001b[0mInitializing… \u001b[34m+512ms\u001b[0m\r\n"]
28 | [10.979693, "o", " \u001b[34;1mstatus \u001b[0mResetting state with about:blank \u001b[34m+50ms\u001b[0m\r\n"]
29 | [11.003461, "o", " \u001b[34;1mstatus \u001b[0mSetting up network for the pass trace \u001b[34m+22ms\u001b[0m"]
30 | [11.00393, "o", "\r\n"]
31 | [11.011455, "o", " \u001b[34;1mstatus \u001b[0mCleaning browser cache \u001b[34m+10ms\u001b[0m"]
32 | [11.011772, "o", "\r\n"]
33 | [11.025945, "o", " \u001b[34;1mstatus \u001b[0mBeginning devtoolsLog and trace \u001b[34m+13ms\u001b[0m"]
34 | [11.026445, "o", "\r\n"]
35 | [11.095286, "o", " \u001b[34;1mstatus \u001b[0mLoading page & waiting for onload CSSUsage, ViewportDimensions, RuntimeExceptions, ConsoleMessages, AnchorElements, ImageElements, LinkElements, MetaElements, ScriptElements, IFrameElements, AppCacheManifest, Doctype, DOMStats, OptimizedImages, PasswordInputsWithPreventedPaste, ResponseCompression, TagsBlockingFirstPaint, FontSize, EmbeddedContent, RobotsTxt, TapTargets, Accessibility \u001b[34m+71ms\u001b[0m"]
36 | [11.095603, "o", "\r\n"]
37 | [13.523168, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: CSSUsage \u001b[34m+2s\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: ViewportDimensions \u001b[34m+1ms\u001b[0m"]
38 | [13.523395, "o", "\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: RuntimeExceptions \u001b[34m+0ms\u001b[0m\r\n"]
39 | [13.524712, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: ConsoleMessages \u001b[34m+1ms\u001b[0m\r\n"]
40 | [13.526697, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: AnchorElements \u001b[34m+0ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: ImageElements \u001b[34m+1ms\u001b[0m\r\n"]
41 | [13.526886, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: LinkElements \u001b[34m+0ms\u001b[0m\r\n"]
42 | [13.528407, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: MetaElements \u001b[34m+1ms\u001b[0m\r\n"]
43 | [13.529949, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: ScriptElements \u001b[34m+1ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: IFrameElements \u001b[34m+0ms\u001b[0m\r\n"]
44 | [13.531913, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: AppCacheManifest \u001b[34m+2ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: Doctype \u001b[34m+1ms\u001b[0m\r\n"]
45 | [13.533416, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: DOMStats \u001b[34m+1ms\u001b[0m\r\n"]
46 | [13.536237, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: OptimizedImages \u001b[34m+1ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: PasswordInputsWithPreventedPaste \u001b[34m+1ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: ResponseCompression \u001b[34m+1ms\u001b[0m\r\n"]
47 | [13.537027, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: TagsBlockingFirstPaint \u001b[34m+0ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: FontSize \u001b[34m+0ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: EmbeddedContent \u001b[34m+0ms\u001b[0m\r\n"]
48 | [13.538912, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: RobotsTxt \u001b[34m+1ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: TapTargets \u001b[34m+0ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: Accessibility \u001b[34m+0ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering trace \u001b[34m+0ms\u001b[0m\r\n"]
49 | [13.665681, "o", " \u001b[34;1mstatus \u001b[0mGathering devtoolsLog & network records \u001b[34m+130ms\u001b[0m\r\n"]
50 | [13.691376, "o", " \u001b[34;1mstatus \u001b[0mGathering: CSSUsage \u001b[34m+26ms\u001b[0m"]
51 | [13.691659, "o", "\r\n"]
52 | [13.732742, "o", " \u001b[34;1mstatus \u001b[0mGathering: ViewportDimensions \u001b[34m+41ms\u001b[0m\r\n"]
53 | [13.740664, "o", " \u001b[34;1mstatus \u001b[0mGathering: RuntimeExceptions \u001b[34m+8ms\u001b[0m\r\n"]
54 | [13.743692, "o", " \u001b[34;1mstatus \u001b[0mGathering: ConsoleMessages \u001b[34m+3ms\u001b[0m\r\n"]
55 | [13.747602, "o", " \u001b[34;1mstatus \u001b[0mGathering: AnchorElements \u001b[34m+4ms\u001b[0m\r\n"]
56 | [13.760147, "o", " \u001b[34;1mstatus \u001b[0mGathering: ImageElements \u001b[34m+13ms\u001b[0m\r\n"]
57 | [13.863066, "o", " \u001b[34;1mstatus \u001b[0mGathering: LinkElements \u001b[34m+103ms\u001b[0m\r\n"]
58 | [13.869079, "o", " \u001b[34;1mstatus \u001b[0mGathering: MetaElements \u001b[34m+6ms\u001b[0m\r\n"]
59 | [13.874216, "o", " \u001b[34;1mstatus \u001b[0mGathering: ScriptElements \u001b[34m+5ms\u001b[0m\r\n"]
60 | [13.939692, "o", " \u001b[34;1mstatus \u001b[0mGathering: IFrameElements \u001b[34m+65ms\u001b[0m\r\n"]
61 | [13.953512, "o", " \u001b[34;1mstatus \u001b[0mGathering: AppCacheManifest \u001b[34m+10ms\u001b[0m\r\n"]
62 | [13.961046, "o", " \u001b[34;1mstatus \u001b[0mGathering: Doctype \u001b[34m+11ms\u001b[0m\r\n"]
63 | [13.966066, "o", " \u001b[34;1mstatus \u001b[0mGathering: DOMStats \u001b[34m+6ms\u001b[0m\r\n"]
64 | [13.980272, "o", " \u001b[34;1mstatus \u001b[0mGathering: OptimizedImages \u001b[34m+14ms\u001b[0m\r\n"]
65 | [14.609625, "o", " \u001b[34;1mstatus \u001b[0mGathering: PasswordInputsWithPreventedPaste \u001b[34m+630ms\u001b[0m\r\n"]
66 | [14.621947, "o", " \u001b[34;1mstatus \u001b[0mGathering: ResponseCompression \u001b[34m+12ms\u001b[0m\r\n"]
67 | [14.62959, "o", " \u001b[34;1mstatus \u001b[0mGathering: TagsBlockingFirstPaint \u001b[34m+8ms\u001b[0m\r\n"]
68 | [14.637234, "o", " \u001b[34;1mstatus \u001b[0mGathering: FontSize \u001b[34m+8ms\u001b[0m\r\n"]
69 | [14.729945, "o", " \u001b[34;1mstatus \u001b[0mGathering: EmbeddedContent \u001b[34m+92ms\u001b[0m\r\n"]
70 | [14.73733, "o", " \u001b[34;1mstatus \u001b[0mGathering: RobotsTxt \u001b[34m+7ms\u001b[0m\r\n"]
71 | [14.758843, "o", " \u001b[34;1mstatus \u001b[0mGathering: TapTargets \u001b[34m+22ms\u001b[0m\r\n"]
72 | [14.795569, "o", " \u001b[34;1mstatus \u001b[0mGathering: Accessibility \u001b[34m+37ms\u001b[0m\r\n"]
73 | [15.280865, "o", " \u001b[34;1mstatus \u001b[0mResetting state with about:blank \u001b[34m+485ms\u001b[0m\r\n"]
74 | [15.317146, "o", " \u001b[34;1mstatus \u001b[0mSetting up network for the pass trace \u001b[34m+36ms\u001b[0m\r\n"]
75 | [15.328048, "o", " \u001b[34;1mstatus \u001b[0mBeginning devtoolsLog and trace \u001b[34m+12ms\u001b[0m\r\n"]
76 | [15.328862, "o", " \u001b[34;1mstatus \u001b[0mLoading page & waiting for onload ServiceWorker, Offline, StartUrl \u001b[34m+0ms\u001b[0m\r\n"]
77 | [15.416614, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: ServiceWorker \u001b[34m+88ms\u001b[0m\r\n"]
78 | [15.4169, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: Offline \u001b[34m+0ms\u001b[0m\r\n"]
79 | [15.417502, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: StartUrl \u001b[34m+1ms\u001b[0m\r\n"]
80 | [15.418144, "o", " \u001b[34;1mstatus \u001b[0mGathering devtoolsLog & network records \u001b[34m+1ms\u001b[0m\r\n"]
81 | [15.428037, "o", " \u001b[34;1mstatus \u001b[0mGathering: ServiceWorker \u001b[34m+10ms\u001b[0m\r\n"]
82 | [15.43158, "o", " \u001b[34;1mstatus \u001b[0mGathering: Offline \u001b[34m+3ms\u001b[0m\r\n"]
83 | [15.435919, "o", " \u001b[34;1mstatus \u001b[0mGathering: StartUrl \u001b[34m+5ms\u001b[0m\r\n"]
84 | [15.441295, "o", " \u001b[34;1mstatus \u001b[0mResetting state with about:blank \u001b[34m+5ms\u001b[0m\r\n"]
85 | [15.51135, "o", " \u001b[34;1mstatus \u001b[0mSetting up network for the pass trace \u001b[34m+70ms\u001b[0m\r\n"]
86 | [15.520577, "o", " \u001b[34;1mstatus \u001b[0mBeginning devtoolsLog and trace \u001b[34m+9ms\u001b[0m\r\n"]
87 | [15.521409, "o", " \u001b[34;1mstatus \u001b[0mLoading page & waiting for onload HTTPRedirect, HTMLWithoutJavaScript \u001b[34m+1ms\u001b[0m\r\n"]
88 | [15.724532, "o", " \u001b[34;1mstatus \u001b[0mGathering in-page: HTTPRedirect \u001b[34m+203ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mGathering in-page: HTMLWithoutJavaScript \u001b[34m+1ms\u001b[0m\r\n"]
89 | [15.725494, "o", " \u001b[34;1mstatus \u001b[0mGathering devtoolsLog & network records \u001b[34m+0ms\u001b[0m\r\n"]
90 | [15.763098, "o", " \u001b[34;1mstatus \u001b[0mGathering: HTTPRedirect \u001b[34m+38ms\u001b[0m\r\n"]
91 | [15.792185, "o", " \u001b[34;1mstatus \u001b[0mGathering: HTMLWithoutJavaScript \u001b[34m+29ms\u001b[0m\r\n"]
92 | [15.804494, "o", " \u001b[34;1mstatus \u001b[0mDisconnecting from browser... \u001b[34m+12ms\u001b[0m\r\n"]
93 | [15.839211, "o", " \u001b[34;1mstatus \u001b[0mAnalyzing and running audits... \u001b[34m+32ms\u001b[0m\r\n"]
94 | [15.852269, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Uses HTTPS \u001b[34m+16ms\u001b[0m\r\n"]
95 | [15.860962, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Redirects HTTP traffic to HTTPS \u001b[34m+9ms\u001b[0m\r\n"]
96 | [15.862981, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Registers a service worker that controls page and `start_url` \u001b[34m+2ms\u001b[0m\r\n"]
97 | [15.865035, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Current page responds with a 200 when offline \u001b[34m+2ms\u001b[0m\r\n"]
98 | [15.867631, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Has a ` ` tag with `width` or `initial-scale` \u001b[34m+2ms\u001b[0m\r\n"]
99 | [15.872859, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Contains some content when JavaScript is not available \u001b[34m+6ms\u001b[0m\r\n"]
100 | [15.87493, "o", " \u001b[34;1mstatus \u001b[0mAuditing: First Contentful Paint \u001b[34m+2ms\u001b[0m\r\n"]
101 | [15.934522, "o", " \u001b[34;1mstatus \u001b[0mAuditing: First Meaningful Paint \u001b[34m+60ms\u001b[0m\r\n"]
102 | [15.949722, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Page load is fast enough on mobile networks \u001b[34m+15ms\u001b[0m\r\n"]
103 | [15.978856, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Speed Index \u001b[34m+29ms\u001b[0m\r\n"]
104 | [16.500007, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Screenshot Thumbnails \u001b[34m+522ms\u001b[0m\r\n"]
105 | [16.785558, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Final Screenshot \u001b[34m+285ms\u001b[0m\r\n"]
106 | [16.791968, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Estimated Input Latency \u001b[34m+6ms\u001b[0m\r\n"]
107 | [16.816738, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Total Blocking Time \u001b[34m+25ms\u001b[0m\r\n"]
108 | [16.832901, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Max Potential First Input Delay \u001b[34m+17ms\u001b[0m\r\n"]
109 | [16.872747, "o", " \u001b[34;1mstatus \u001b[0mAuditing: No browser errors logged to the console \u001b[34m+40ms\u001b[0m\r\n"]
110 | [16.875246, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Server response times are low (TTFB) \u001b[34m+2ms\u001b[0m\r\n"]
111 | [16.879691, "o", " \u001b[34;1mstatus \u001b[0mAuditing: First CPU Idle \u001b[34m+4ms\u001b[0m\r\n"]
112 | [16.888653, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Time to Interactive \u001b[34m+10ms\u001b[0m\r\n"]
113 | [16.890329, "o", " \u001b[34;1mstatus \u001b[0mAuditing: User Timing marks and measures \u001b[34m+1ms\u001b[0m\r\n"]
114 | [16.89316, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Minimize Critical Requests Depth \u001b[34m+3ms\u001b[0m\r\n"]
115 | [16.896031, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Avoid multiple page redirects \u001b[34m+3ms\u001b[0m\r\n"]
116 | [16.898164, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Web app manifest meets the installability requirements \u001b[34m+2ms\u001b[0m\r\n"]
117 | [16.900163, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Provides a valid `apple-touch-icon` \u001b[34m+2ms\u001b[0m\r\n"]
118 | [16.902777, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Configured for a custom splash screen \u001b[34m+2ms\u001b[0m\r\n"]
119 | [16.904775, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Sets a theme color for the address bar. \u001b[34m+2ms\u001b[0m\r\n"]
120 | [16.906767, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Content is sized correctly for the viewport \u001b[34m+2ms\u001b[0m\r\n"]
121 | [16.908575, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Displays images with correct aspect ratio \u001b[34m+2ms\u001b[0m\r\n"]
122 | [16.910613, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Avoids deprecated APIs \u001b[34m+3ms\u001b[0m\r\n"]
123 | [16.912745, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Minimizes main-thread work \u001b[34m+2ms\u001b[0m\r\n"]
124 | [16.940831, "o", " \u001b[34;1mstatus \u001b[0mAuditing: JavaScript execution time \u001b[34m+28ms\u001b[0m\r\n"]
125 | [16.946752, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Preload key requests \u001b[34m+5ms\u001b[0m\r\n"]
126 | [16.949829, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Preconnect to required origins \u001b[34m+4ms\u001b[0m\r\n"]
127 | [16.952905, "o", " \u001b[34;1mstatus \u001b[0mAuditing: All text remains visible during webfont loads \u001b[34m+3ms\u001b[0m\r\n"]
128 | [16.956259, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Diagnostics \u001b[34m+3ms\u001b[0m\r\n"]
129 | [16.958541, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Network Requests \u001b[34m+2ms\u001b[0m\r\n"]
130 | [16.96105, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Network Round Trip Times \u001b[34m+3ms\u001b[0m\r\n"]
131 | [16.963028, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Server Backend Latencies \u001b[34m+2ms\u001b[0m\r\n"]
132 | [16.964789, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Tasks \u001b[34m+2ms\u001b[0m\r\n"]
133 | [16.966075, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Metrics \u001b[34m+1ms\u001b[0m\r\n"]
134 | [16.968927, "o", " \u001b[34;1mstatus \u001b[0mAuditing: `start_url` responds with a 200 when offline \u001b[34m+3ms\u001b[0m\r\n"]
135 | [16.970864, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Performance budget \u001b[34m+2ms\u001b[0m\r\n"]
136 | [16.974942, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Keep request counts low and transfer sizes small \u001b[34m+4ms\u001b[0m\r\n"]
137 | [16.977619, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Third-Party usage \u001b[34m+2ms\u001b[0m\r\n"]
138 | [16.993599, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Site works cross-browser \u001b[34m+17ms\u001b[0m\r\n"]
139 | [16.995797, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Page transitions don't feel like they block on the network \u001b[34m+2ms\u001b[0m\r\n"]
140 | [16.997566, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Each page has a URL \u001b[34m+1ms\u001b[0m\r\n"]
141 | [16.999481, "o", " \u001b[34;1mstatus \u001b[0mAuditing: `[accesskey]` values are unique \u001b[34m+2ms\u001b[0m\r\n"]
142 | [17.003899, "o", " \u001b[34;1mstatus \u001b[0mAuditing: `[aria-*]` attributes match their roles \u001b[34m+5ms\u001b[0m\r\n"]
143 | [17.006333, "o", " \u001b[34;1mstatus \u001b[0mAuditing: `[role]`s have all required `[aria-*]` attributes \u001b[34m+2ms\u001b[0m\r\n"]
144 | [17.008291, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Elements with an ARIA `[role]` that require children to contain a specific `[role]` have all required children. \u001b[34m+2ms\u001b[0m\r\n"]
145 | [17.009684, "o", " \u001b[34;1mstatus \u001b[0mAuditing: `[role]`s are contained by their required parent element \u001b[34m+2ms\u001b[0m\r\n"]
146 | [17.011113, "o", " \u001b[34;1mstatus \u001b[0mAuditing: `[role]` values are valid \u001b[34m+1ms\u001b[0m\r\n"]
147 | [17.012576, "o", " \u001b[34;1mstatus \u001b[0mAuditing: `[aria-*]` attributes have valid values \u001b[34m+2ms\u001b[0m\r\n"]
148 | [17.014687, "o", " \u001b[34;1mstatus \u001b[0mAuditing: `[aria-*]` attributes are valid and not misspelled \u001b[34m+2ms\u001b[0m\r\n"]
149 | [17.01738, "o", " \u001b[34;1mstatus \u001b[0mAuditing: `` elements contain a `` element with `[kind=\"captions\"]` \u001b[34m+2ms\u001b[0m\r\n"]
150 | [17.019031, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Buttons have an accessible name \u001b[34m+2ms\u001b[0m\r\n"]
151 | [17.020805, "o", " \u001b[34;1mstatus \u001b[0mAuditing: The page contains a heading, skip link, or landmark region \u001b[34m+2ms\u001b[0m\r\n"]
152 | [17.026979, "o", " \u001b[34;1mstatus \u001b[0mAuditing: Background and foreground colors have a sufficient contrast ratio \u001b[34m+4ms\u001b[0m\r\n \u001b[34;1mstatus \u001b[0mAuditing: ``'s contain only properly-ordered `` and ` ` groups, `