ermouth: (Default)
[personal profile] ermouth

Я недавно писал об exotic bugs, связанных с определением типа объекта в JS. У меня внезапно выискался такой.

С некоторых недавних пор в CloudWall стал падать IDE, с двумя симптомами. Либо просто подвисает на секунду-две, потом в консоль выпадает, что стек исчерпан, и можно сохраниться. Либо наглухо виснет вкладка и отваливается консоль.

Довольно изредка, раз, может в неделю, но очень неприятно.

Я к снаряду несколько раз подходил, но стэктрэйсы меня уводили в никуда, то-есть понятно, что именно глючило, но я никак не мог взять в толк, как там на входе оказывается то, что оказывается.

А оказывалось там неожиданное.

При наборе кода в какой-то вкладке у меня в IDE делается в реальном времени пересбор всего приложения.

Так  вот, оказывалось, что в собранном и готовом к сериализации JS-объекте появлялась в точке набора текста HTML DOM коллекция как свойство, и на ней естественно падал сериализатор. На первый взгляд набор узлов причём совершенно левый, взятый со страницы.

Как именно при разборе текстового JS-кода, причём в тот момент, когда я набираю название ключа в объекте, может появляться HTML DOM, да со страницы, я с месяц не мог взять в толк.

Сначала я выяснил, что падало всё на наборе очень некоторых ключей – title, list и ещё нескольких. Это меня надолго двинуло в неверном направлении – я стал искать косяки в своём сборщике.

Ларчик открывался просто – но совсем с другой стороны. Оказывается:

  • в Хроме DOM-контролы с id, который можно закастить в название переменной, видны как глобальные переменные о_О, при этом они не являются свойствами объекта window. Скрытые такие глобальные переменные, зависимые от DOM-объектов на странице, охренеть.
  • С точки зрения ES6 конструкции типа {varName} – это валидный destructuring assignment shorthand property, который даёт на выходе объект {varName:varName}.

Ну то-есть у меня на странице где-то есть контрол с id=”title”. Когда я набираю {}, а потом внутри скобок начинаю писать ключи, на title сборщик считает объект валидным и собираемым, подставляет DOM-контрол, и сериализатор на нём валится. Чаще сразу вместе со вкладкой.

Валится сериализатор потому, что определяет DOM collection как массив, а это не массив.

Я на этот баг потратил часов 20, думаю, в сумме – потому что чаще всего просто вкладка закрывалась. Плюс совсем не каждый раз оно на title реагирует, потому что сборка асинхронная и запаздывает относительно набора текста. Когда быстро набираешь – запоздание существенное, и просто проскакивало. Обычно то после ключа сразу двоеточие ставишь же.

Потом я искал, где же я накосячил при сборке/проверке манифестов.

Просветление настигло только сегодня.

Уф.

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

ermouth: (Default)
ermouth

November 2021

S M T W T F S
 123456
78910111213
14151617181920
21 222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 2nd, 2026 03:38 am
Powered by Dreamwidth Studios