FAQ по типовым ошибкам кастомных виджетов
Ниже список часто встречающихся ошибок компиляции и выполнения виджетов.
Как читать код ошибки
- Большинство ошибок компиляции формируются в
widget-runtimeи возвращаются сразу при сохранении / предпросмотре. - Ошибки выполнения (
phase: EVALUATE) появляются только при рендере конкретного блока. - По коду ошибки можно быстро понять блокировку:
- compile — ошибка синтаксиса/валидации/ограничений языка,
- evaluate — ошибка во время исполнения IR.
1) Чаще всего видишь в редакторе: compile-ошибки
Шаблон проверки
- откройте сообщение ошибки в лог/панели ошибок виджета;
- скопируйте код/кусок строки из
Widget(); - исправьте причину из таблицы ниже;
- пересоберите / пересохраните.
| Код | Что означает | Как исправить |
|---|---|---|
PARSE_ERROR |
Невалидный JS/JSX | Проверьте скобки, запятые, синтаксис function Widget() { ... }. |
INVALID_PROGRAM_SHAPE |
Не ровно одна верхнеуровневая function Widget() |
Должна быть ровно одна функция Widget() без других top-level блоков. |
INVALID_WIDGET_PARAMETERS |
Widget() объявил аргументы |
Удалите параметры функции: function Widget(). |
MULTIPLE_USE_PARAMS |
useParams вызван >1 раза |
Оставьте только один useParams в Widget(). |
INVALID_USE_PARAMS |
Неправильный вызов useParams |
Первый аргумент только объект, максимум два аргумента; второй — массив строк. |
DUPLICATE_PARAMETER |
Параметр повторяется | Имена параметров в useParams уникальны. |
UNKNOWN_PARAMETER_FIELD |
Неподдерживаемое поле в параметре | Оставьте только допустимые поля (type, default, min, ... v1ParamName и т.д.). |
INVALID_PARAMETER_TYPE |
Неподдерживаемый type параметра |
Используйте типы из документации; список в разделе API и хуков. |
INVALID_PARAMETER_DEFINITION |
Неверное описание параметра | Параметр должен быть объектом с статическими полями. |
INVALID_PARAMETER_ACTION |
onClick не функция |
Для type: "button" onClick — только функция. |
DYNAMIC_PARAMETER_FIELD |
Значение поля нельзя посчитать статически | Поля параметра должны быть статическими литералами/выражениями. |
INVALID_PARAMETER_FIELD |
Динамическое поле в описании параметра | Аналогично: уберите переменные/вызовы из useParams. |
UNSUPPORTED_VAR |
Использован var |
Используйте const / let. |
UNSUPPORTED_STATEMENT |
Оператор/конструкция запрещена | Например, слишком сложные statement для песочницы; замените на поддерживаемые. |
UNSUPPORTED_EXPRESSION |
Выражение не поддерживается | Упростите выражение; используйте допустимые узлы языка v2. |
FORBIDDEN_IDENTIFIER |
Запрещённое имя глобала | Не используйте window, document, eval, fetch, Worker, localStorage, XMLHttpRequest и т.д. |
FORBIDDEN_CONSTRUCT |
Запрещённый синтаксис | Обычно new, this, import, некоторые выражения/операторы. |
FORBIDDEN_JSX_TAG |
Тег не из whitelist | Допустимые теги перечислены в разделе API; используйте их только. |
UNSUPPORTED_JSX_TAG / UNSUPPORTED_JSX_ATTRIBUTE |
JSX или атрибут не поддерживается | Замените тег/атрибут на разрешённый список. |
UNSUPPORTED_JSX_SPREAD |
Spread в JSX атрибутах/массивах | Не используйте {...props} и spread в JSX-атрибутах. |
FORBIDDEN_STYLE_PROPERTY |
Стили запрещённого свойства | Проверяйте allowlist style в разделе API. |
UNSUPPORTED_JSX_CHILD |
Неподдерживаемый дочерний узел JSX | Дочерние узлы должны быть допустимыми значениями (строка/число/массив/нодa/вызов). |
UNSUPPORTED_LITERAL |
Неверный литерал | Разрешены только string/number/boolean/null в этом контексте. |
INVALID_ASSIGNMENT_TARGET |
Крайний левый операнд присваивания некорректен | Присваивайте только локальным переменным/свойствам. |
UNSUPPORTED_ASSIGNMENT_OPERATOR / UNSUPPORTED_UPDATE_OPERATOR |
Недоступный оператор | Остаются базовые = += -= *= /= %=, а инкременты только ++/--. |
ANONYMOUS_FUNCTION_DECLARATION |
Локальная функция без имени | Называйте function declaration явно. |
INVALID_TRACKED_PROPERTIES |
Неверный второй аргумент useParams |
Только массив литералов строк. |
INVALID_INTRINSIC_SCOPE |
useParams/useBlockMemo/... вне Widget() |
Все intrinsics (useParams, useBlockMemo, useControlPoints, useStableId) только на верхнем уровне Widget(). |
INVALID_INTRINSIC_CALL |
Неверная сигнатура useStableId/useBlockMemo/... |
Проверьте число аргументов и типы: useStableId("id"), useBlockMemo(key, fn, deps), useControlPoints() без аргументов. |
SOURCE_LIMIT_EXCEEDED |
Код слишком длинный | Разбейте логику на более простой шаблон/уменьшите код. |
AST_LIMIT_EXCEEDED / NESTING_LIMIT_EXCEEDED |
Слишком сложный AST или вложенность | Упростите дерево условий/циклов и разносите логику в меньше вложенные блоки. |
2) Runtime-ошибки при рендере
| Код | Что означает | Что делать |
|---|---|---|
INVALID_PERSISTED_PROGRAM |
Блок содержит повреждённую сохранённую программу | Переcompile виджета из исходника; проверьте, что widgetProgram и jsx не повреждены. |
UNSUPPORTED_PROGRAM_VERSION |
Не совпадает версия схемы | Обновите runtime/пересоберите проектный пакет с актуальным движком. |
INVALID_SOURCE_HASH |
Неконсистентный хэш исходника/IR | Не редактируйте widgetProgram вручную; пересоберите через редактор. |
STEP_LIMIT_EXCEEDED |
Превышен бюджет шагов | Оптимизируйте вычисления, удалите тяжёлые циклы/бесконечные рекурсии. |
CALL_DEPTH_EXCEEDED |
Слишком глубокий стек вызовов | Проверьте рекурсивные/self-call цепочки, циклы по callback. |
LOOP_LIMIT_EXCEEDED |
Цикл выполнился слишком много раз | Ограничьте количество итераций, уберите зависимость от внешнего состояния без break. |
OUTPUT_LIMIT_EXCEEDED |
Слишком много выходных VNode | Уменьшите число узлов в рендере (например, path, polyline/circle вместо чрезмерного разбиения). |
ARRAY_LIMIT_EXCEEDED |
Массив стал слишком длинным / индекс за пределами | Ограничьте длины массивов в IR/данных. |
STRING_LIMIT_EXCEEDED |
Строка слишком длинная | Срежьте текстовые/динамические строки до приемлемого размера. |
UNSAFE_HOST_VALUE / CYCLIC_HOST_VALUE |
Неподходящий тип или цикл в данных | Не передавайте function/symbol/bigint, и избегайте циклических объектов. |
FORBIDDEN_MEMBER, FORBIDDEN_MEMBER_CALL |
Блокирован доступ к опасным/неразрешённым методам | Используйте только разрешённые методы, в т.ч. массивы только push, map (с callback виджета). |
NULL_MEMBER_ACCESS / INVALID_MEMBER_ACCESS / INVALID_MEMBER_ASSIGNMENT / INVALID_PROPERTY_KEY / INVALID_ARRAY_PROPERTY |
Неверный доступ к . / [] |
Проверяйте null и корректность индексов/типов объектов. |
CONST_ASSIGNMENT, TEMPORAL_DEAD_ZONE |
Изменение const/использование до инициализации |
Инициализируйте перед чтением, не меняйте const. |
NOT_CALLABLE, INVALID_CALLBACK, UNKNOWN_BINDING |
Вызов не того значения как функции | Проверьте, что вы вызываете только capability/function, а не plain-data/undefined. |
INVALID_PLATFORM_ELEMENT |
Неверный платформенный элемент/данные | Например, externalvideo только с поддерживаемым провайдером. |
URL_FORBIDDEN, STYLE_URL_FORBIDDEN |
Небезопасный URL | Проверьте протокол и политику isUrlAllowed (http/https/mailto + allowlist). |
INVALID_JSX_CHILD, FUNCTION_PROP_FORBIDDEN, INVALID_STYLE, SVG_REFERENCE_FORBIDDEN |
Неправильный JSX-вывод | Возвращайте корректные children/properties; не отдавайте функции в props. |
3) Что важно помнить
- Любые ошибки в
evaluateобычно связаны с данными/ограничениями, а не с «разметкой». - Если появляется новая кодовая ошибка, ищите её сначала в
widget-runtime— там источник правды для сообщений. - После фикса всегда делайте один прогон: save → render → resize → смена параметров → save.
4) Быстрый диагностический чек-лист
- Проверить версию языка и блок —
widgetLanguageVersion = 2. - Проверить
useParams:- один вызов,
- только статические поля,
- корректные типы.
- Проверить теги/атрибуты/
styleна allowlist. - Упростить тяжелые циклы/вычисления.
- Прогнать тестовый блок с изменением параметров и повторной компиляцией.