Destructuring exotic bugs
May. 5th, 2016 07:21 amЯ недавно писал об exotic bugs, связанных с определением типа объекта в JS. У меня внезапно выискался такой.
С некоторых недавних пор в CloudWall стал падать IDE, с двумя симптомами. Либо просто подвисает на секунду-две, потом в консоль выпадает, что стек исчерпан, и можно сохраниться. Либо наглухо виснет вкладка и отваливается консоль.
Довольно изредка, раз, может в неделю, но очень неприятно.
Я к снаряду несколько раз подходил, но стэктрэйсы меня уводили в никуда, то-есть понятно, что именно глючило, но я никак не мог взять в толк, как там на входе оказывается то, что оказывается.
А оказывалось там неожиданное.
При наборе кода в какой-то вкладке у меня в IDE делается в реальном времени пересбор всего приложения.
Так вот, оказывалось, что в собранном и готовом к сериализации JS-объекте появлялась в точке набора текста HTML DOM коллекция как свойство, и на ней естественно падал сериализатор. На первый взгляд набор узлов причём совершенно левый, взятый со страницы.
Как именно при разборе текстового JS-кода, причём в тот момент, когда я набираю название ключа в объекте, может появляться HTML DOM, да со страницы, я с месяц не мог взять в толк.
Сначала я выяснил, что падало всё на наборе очень некоторых ключей – title, list и ещё нескольких. Это меня надолго двинуло в неверном направлении – я стал искать косяки в своём сборщике.
Ларчик открывался просто – но совсем с другой стороны. Оказывается:
- в Хроме DOM-контролы с id, который можно закастить в название переменной, видны как глобальные переменные о_О, при этом они не являются свойствами объекта window. Скрытые такие глобальные переменные, зависимые от DOM-объектов на странице, охренеть.
- С точки зрения ES6 конструкции типа {varName} – это валидный
destructuring assignmentshorthand property, который даёт на выходе объект {varName:varName}.
Ну то-есть у меня на странице где-то есть контрол с id=”title”. Когда я набираю {}, а потом внутри скобок начинаю писать ключи, на title сборщик считает объект валидным и собираемым, подставляет DOM-контрол, и сериализатор на нём валится. Чаще сразу вместе со вкладкой.
Валится сериализатор потому, что определяет DOM collection как массив, а это не массив.
Я на этот баг потратил часов 20, думаю, в сумме – потому что чаще всего просто вкладка закрывалась. Плюс совсем не каждый раз оно на title реагирует, потому что сборка асинхронная и запаздывает относительно набора текста. Когда быстро набираешь – запоздание существенное, и просто проскакивало. Обычно то после ключа сразу двоеточие ставишь же.
Потом я искал, где же я накосячил при сборке/проверке манифестов.
Просветление настигло только сегодня.
Уф.