Ограничения и sandbox runtime

Кастомные виджеты работают в безопасной песочнице. Это даёт изоляцию, но накладывает правила.

Обязательная форма кода

  • единственная top-level функция: function Widget() { ... };
  • Widget() не принимает аргументы;
  • useParamsровно один вызов, только напрямую в Widget();
  • допускается var? нет, только const/let;
  • не разрешены JSX spread-атрибуты и onClick-атрибуты на DOM-элементах;
  • выражения компиляции ограничены по длине AST и по вложенности.

Проверки компилятора (валидация)

Ниже — основные ошибки, которые типично ловятся ещё до исполнения:

  • INVALID_PROGRAM_SHAPE — не одна функция Widget();
  • INVALID_WIDGET_PARAMETERSWidget с параметрами;
  • MULTIPLE_USE_PARAMSuseParams больше одного раза;
  • 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_000
  • maxCallDepth: 32
  • maxLoopIterations: 1_000
  • maxOutputNodes: 2_000
  • maxSteps: 50_000
  • maxStringLength: 1 MB

Также есть лимиты компилятора:

  • maxAstNodes: 5_000
  • maxNesting: 32
  • maxSourceLength: 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-событий, а не для тяжёлых вычислений.

Подход к тестированию виджета

Для новой версии:

  1. Компиляция без ошибок.
  2. Рендер на 2–3 размерных условиях блока.
  3. Переключение всех параметров и проверка, что зависимые ветки не крашатся.
  4. Проверка действий (type: "button") и editable-режимов.
  5. Проверка градиентов/цветов на цвет и stroke.