# Обзор RunJS

RunJS — это среда выполнения JavaScript в NocoBase, используемая в таких сценариях, как **JS-блоки**, **JS-поля** и **JS-действия**. Код выполняется в ограниченной песочнице, обеспечивая безопасный доступ к `ctx` (Context API), и обладает следующими возможностями:

- Асинхронность на верхнем уровне (Top-level `await`)
- Импорт внешних модулей
- Рендеринг внутри контейнеров
- Глобальные переменные

## Асинхронность на верхнем уровне (Top-level `await`)

RunJS поддерживает `await` на верхнем уровне, что избавляет от необходимости оборачивать код в IIFE.

**Не рекомендуется**

```jsx
async function test() {}
(async () => {
  await test();
})();
```

**Рекомендуется**

```js
async function test() {}
await test();
```

## Импорт внешних модулей

- Используйте `ctx.importAsync()` для ESM-модулей (рекомендуется)
- Используйте `ctx.requireAsync()` для UMD/AMD-модулей

## Рендеринг внутри контейнеров

Используйте `ctx.render()` для отрисовки контента в текущем контейнере (`ctx.element`). Поддерживаются следующие три формата:

### Рендеринг JSX

```jsx
ctx.render(<button>Button</button>);
```

### Рендеринг DOM-узлов

```js
const div = document.createElement('div');
div.innerHTML = 'Hello World';

ctx.render(div);
```

### Рендеринг HTML-строк

```js
ctx.render('<h1>Hello World</h1>');
```

## Глобальные переменные

- `window`
- `document`
- `navigator`
- `ctx`