Чтобы исправить баг, требуется его воспроизвести, найти причину и понять логику проекта. Чтобы всё это сделать, требуется либо досконально понимать все процессы в приложении, либо быстро разбираться в коде.
Хороший юрист не знает все законы, он знает где их быстро подсмотреть. Хороший программист не знает принципы работы всех программ, он умеет быстро дебажить и разбираться в чужом коде.
Разбираться будем с Javascript в браузере, серверный Node.js не трогаем.
Из инструментов, которые нам понадобятся, это только Google Chrome. В нем полно инструментов и пока вы не меняете логику приложения, даже не понадобится ваш текстовый редактор или IDE. Разберем инструменты браузера для анализа страницы сайта.
Видео
Введение
Чтобы открыть инструменты, нажмите на странице F12, либо нажмите правую кнопку мыши на странице и там просмотр кода элемента, либо нажмите три точки у браузера, там Дополнительные инструменты, далее Инструменты разработчика.
После открытия инструментов, у вас появится примерно такая панель:
Рассмотрим все кнопки/вкладки:
- Курсор на квадратике - выбор HTML элемента на странице
- Отображение сайта под видом других устройств. Можно посмотреть как ваш сайт выглядит на планшете, смартфоне разных моделей.
- Elements - DOM структура текущей страницы
- Console - тут можно выполнять Javascript в контексте страницы
- Sources - все файлы, которые используются на странице
- Network - список интернет запросов
- Performance - анализ производительности страницы
- Memory - информация по потреблению памяти текущей страницей
- Security - информация о безопасности страницы (HTTPS, сертификаты SSL)
- Application - работа с данными страницы. (Cookie, Localstorage и другое)
- Lighthouse - тот же Google PageSpeed Insight, только в вашем браузере
- Network Conditions - настройки работы с сетью
- Вкладки установленных у вас расширений
Работа с DOM
DOM – это объектная модель документа, которую браузер создаёт в памяти компьютера на основании HTML-кода, полученного им от сервера. Если сказать по-простому, то HTML-код – это текст страницы, а DOM – это набор связанных объектов, созданных браузером при парсинге её текста.
Во вкладке Elements, выбрав какой-то элемент, вы увидите картину, как показано выше.
Выделенные области:
- Сам элемент
- Его стили в порядке приоритета, тут же указано из какого файла стили и с какой строки. Можно нажать на имя файла и перейти к объявлению стилей. Стили все редактируемые, можно в режиме онлайн добавлять, менять и удалять стили сразу видя как меняется элемент.
- Можно включить для элемента псевдоклассы (например, hover. Будет как будто над элементом всегда висит курсор). Можно добавлять другие стили с селектором.
- Вкладки со стилями, событиями JavaScript и свойствами элемента.
В области 4 есть очень полезная вкладка Event Listeners. Там показываются все события, которые будут обработаны на элементе
Скажем, есть у нас выбор языка на странице, при клике не него, открывается список. Надо понять как оно работает. Часто кнопки бывают не из 1 тега, а несколько. Придется смотреть события на всех тегах кнопки.
Событий часто бывает много, нужное скорее всего то, которое подходит по селектору. Есть события с объекта document, они тоже есть в этом списке.
Вот мы видим событие на селекторе .lang__selected - похоже, то что надо. Нажатием на имя файла переходим на вкладку Sources, о ней будет далее.
Если не можете понять, какой обработчик вам нужен, удаляйте по очереди обработчики кнопкой Remove и смотрите срабатывает ли нужное вам событие. Если событие срабатывать перестало - значит вы удалили то что надо, обновите страницу и перейдите к нужному функционалу.
Console
В консоли можно выполнять JavaScript так, как если бы он просто был на странице. В коде можно обращаться к переменным на странице, вызывать и создавать функции, добавлять события. Тут же показываются ошибки и логи страницы.
Консолью можно пользоваться даже тогда, когда страница остановлена через Breakpoint'ы.
Так же в консоли можно узнать где объявлена та или иная функция. Для этого введите имя функции без скобок в консоль и нажмите Enter.
Например, мы знаем что на странице есть функция initDropdown(), но не знаем где она объявлена. Вписываем имя в консоль, получаем часть кода функции и если нажать на первую строку, то можно перейти к файлу и строке с объявлением нужного элемента.
На картинке выше цифрами обозначены:
- Поле ввода команд
- Кнопка очистки вывода консоли
- Выбор контекста выполнения (можно например выбрать какой-то iframe на странице и работать в его контексте)
- Выражения для мониторинга. Можно вписать какую-то переменную и смотреть как меняется её значение.
- Выбор типов сообщений для показа в консоли
Sources
Вкладка для работы с файлами страницы.
Области на скриншоте:
- Все файлы, которые подключены на странице. Можно открывать и просматривать файлы.
- Область со списком открытых файлов и их просмотром. Нажатием на номер строки можно добавлять точку остановки скрипта (Breakpoint). Когда выполнение дойдет до точки, Js остановится и будет ждать нажатия кнопки Продолжить.
- Кнопка для форматирования кода. Очень удобно, если вы открываете минифицированный файл.
- Управление работой дебага. Приостановить выполнение Js, перейти на следующий шаг выполнения, пропускать все точки остановки...
- Данные контекста. Breakpoints - список всех точек остановки скриптов.
Ниже я вставил breakpoint на функцию открытия списка языков и нажал на кнопку на странице. Выполнение Javascript остановилось. Данные контекста заполнились (отображаются локальные переменные, стек вызова функции).
В момент остановки в консоли доступны переменные из текущего контекста. Например, можно вывести их содержание или изменить их. Чтобы найти место, откуда вызвана функция - смотрите Call Stack в области контекста. Чтобы понять, что будет вызвано, посмотрите код, найдите функции, которые вызовутся, введите их имена в консоли по очереди (без скобок), вам браузер покажет код функции и если нажать туда, то вы перейдете к объявлению функции, куда уже можно поставить дополнительные breakpoint'ы.
Network
Сразу всем советую выставить настройки как у меня (отметить Use large request rows, а остальное снять):
На картинку выше:
- Фильтрация запросов. (Fetch/XHR - это Fetch и XMLHttpRequest, которые используются для Ajax)
- Активация записи лога запросов
- Очистка списка
- Сохранять историю после перезагрузки страницы
- Отключать кеширование браузеров на время работы с инструментами разработчика
- Имитация типов соединений. Это на случай, если вам надо протестировать ваш сайт с медленным интернет соединением.
Открыв отдельный запрос вы увидите:
- Информацию по заголовкам браузера и сервера
- Ответ сервера
- Информация о том, какой скрипт создал запрос (очень удобно при работе с ajax)
- Время, затраченное на запрос.
В старых версиях данные, отправляемые в запросе (POST) показывались во вкладке Headers, под заголовками. В новых версиях появляется вкладка Payload.
Headers
Во вкладке Headers браузер показывает заголовки. Можно увидеть какие куки отправляются, какие устанавливаются. Какой код ответа сервера. По заголовкам можно понять, как сервер говорит кешировать контент.
Preview, Response
Preview, Response - две вкладки, которые показывают ответ сервера. Отличие в том, что первый вариант форматирует ответ.
Ответ может не показываться, если его не было, а так же если вы включили опцию сохранения запросов после перезагрузки страницы и перезагрузили её - лог останется, а вот ответы сотрутся, дабы не расходовать память компьютера.
Initiator
Вкладка помогает разобраться кто создает запрос. Я использую её только при работе с ajax.
Скажем, есть на странице форма, нам надо её доработать. Для этого первым делом надо понять как она работает.
Открываем вкладку Network, заполняем форму, отправляем. В списке появляется запрос, смотрим куда он отправлен и что в нем. Если запрос от яндекс метрики или гугл аналитики, смотреть его нет смысла, ищите другие запросы. Запрос можно определить по отправляемым данным (в новых версиях Chrome - это вкладка Payload)
На нужном запросе открываем вкладку Initiator. На картинке выше видим работу двух файлов - jquery.min.js и dev.min.js. В коде jquery вы ничего интересного не найдете, а вот dev.min.js в конкретном случае должен нести логику. нажимаем на файл. В файле сразу жмем кнопку Форматировать (кнопка описана в разделе Sources).
Вот и наш ajax запрос как на ладони:
Network conditions
Вкладка появилась в новых версиях браузера. Поэтому, если у вас кнопки нет - обновитесь.
Вкладка позволяет:
- Отключать использование кеширования браузером (пока открыты инструменты разработчика)
- Имитировать слабое интернет соединение
- Представляться другими браузерами
- Выбирать тип сжатия, с помощью которого будут обрабатываться ответы сервера.
User agent
Разберем как нам может пригодиться пункт User agent. Этот пункт позволяет сменить имя браузера в запросах к серверу. Имя браузера передается в заголовках, это можно увидеть открыв запрос на вкладке Network, там Request Headers.
Бывает такое, что сайт у нас выполняет разную логику в зависимости от браузера.
Разберем пример из моей статьи про закрытие индексации сайта поисковиками по User agent. Там, если в имени браузера содержится какая-то запрещенная строка, то сайт тебе не показывается.
Один из вариантов запрещенной строки - YandexBot
. Впишем это в имя браузера и попытаемся зайти на сайт - получим Forbidden, что говорит о том, что сервер нас не пускает. А если поставить галочку User browser default (Использовать браузер по умолчанию) - то доступ на сайт снова появляется.
Потренироваться
Чтобы знания, полученные на этой странице, не остались у вас только в теории, я создал страницу на которой вы можете применить знания на практике!