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 реагирует, потому что сборка асинхронная и запаздывает относительно набора текста. Когда быстро набираешь – запоздание существенное, и просто проскакивало. Обычно то после ключа сразу двоеточие ставишь же.

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

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

Уф.

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. 1st, 2026 06:37 pm
Powered by Dreamwidth Studios