Ограничения и sandbox runtime
Кастомные виджеты работают в безопасной песочнице. Это даёт изоляцию, но накладывает правила.
Обязательная форма кода
- единственная top-level функция:
function Widget() { ... }; Widget()не принимает аргументы;useParams— ровно один вызов, только напрямую вWidget();- допускается
var? нет, толькоconst/let; - не разрешены JSX spread-атрибуты и
onClick-атрибуты на DOM-элементах; - выражения компиляции ограничены по длине AST и по вложенности.
Проверки компилятора (валидация)
Ниже — основные ошибки, которые типично ловятся ещё до исполнения:
INVALID_PROGRAM_SHAPE— не одна функцияWidget();INVALID_WIDGET_PARAMETERS—Widgetс параметрами;MULTIPLE_USE_PARAMS—useParamsбольше одного раза;FORBIDDEN_VAR,UNSUPPORTED_STATEMENT— неподдерживаемые конструкции;UNSUPPORTED_JSX_TAG,FORBIDDEN_JSX_ATTRIBUTE,UNSUPPORTED_SPREAD— неразрешённый JSX;FORBIDDEN_IDENTIFIER— попытка обратиться к запрещённым глобалам;DYNAMIC_PARAMETER_FIELD,INVALID_PARAMETER_TYPE,INVALID_PARAMETER_FIELD;UNSUPPORTED_SPREADв массиве/вызове,UNSUPPORTED_UNARY/UNSUPPORTED_ASSIGNMENT_OPERATORи т.д.
Лимиты выполнения
По умолчанию:
maxArrayEntries: 4_000maxCallDepth: 32maxLoopIterations: 1_000maxOutputNodes: 2_000maxSteps: 50_000maxStringLength: 1 MB
Также есть лимиты компилятора:
maxAstNodes: 5_000maxNesting: 32maxSourceLength: 64 KB
Важные runtime-ограничения
- циклы поддерживаются, но
forс большим числом итераций упирается вLOOP_LIMIT_EXCEEDED; - поддерживаются только
update-операторы++/--, базовые арифметические и логические операции; - для
member-вызовов разрешены только безопасные случаи (.map,.pushс проверкой типа callback); forbidden: обращение кwindow,document,fetch,eval,Worker,WebSocket,XMLHttpRequestи т.д.;- URL для
href,src,poster, градиентов/styleпроходят через валидацию доменов.
Что делает render быстрее
- держите расчёты в
useBlockMemo; - не возвращайте большой массивы/объекты на каждом проходе без необходимости;
- используйте примитивные параметры вместо deeply nested объектов;
- обновляйте параметр через
buttonтолько для UI-событий, а не для тяжёлых вычислений.
Подход к тестированию виджета
Для новой версии:
- Компиляция без ошибок.
- Рендер на 2–3 размерных условиях блока.
- Переключение всех параметров и проверка, что зависимые ветки не крашатся.
- Проверка действий (
type: "button") и editable-режимов. - Проверка градиентов/цветов на цвет и stroke.