Script
This page has not been translated into English yet. The Russian original is below.
Авторский JavaScript на странице сайта. Лист без вёрстки: элемент несёт один тег
<script>
. Тег встаёт в конец тела страницы, в порядке элементов в разметке; скрипты уровня сайта (
settings.scripts
) идут первыми.
Тип:
leaf
Только веб:
на Flutter-рендере элемент — no-op: приложение ничего не загружает и не выполняет, разметка остаётся общей для приложения и сайта.
Script src:"data/web/scripts/analytics.js" requiresConsent:"analytics"
Script src:"https://cdn.example.com/widget.js" defer:true requiresConsent:"marketing"
Параметры
| Параметр | Тип | Default | Описание |
|---|---|---|---|
src
|
string | — |
Адрес скрипта: файл проекта
полным путём от корня
(
data/web/scripts/…
) или внешний
https://
-адрес
|
async
|
bool | false |
Атрибут
async
|
defer
|
bool | false |
Атрибут
defer
|
id
|
string | — |
Атрибут
id
тега — для скриптов, которые ищут свой тег по имени
|
attrs
|
map | — |
Прочие атрибуты тега:
{mapOf("data-domain", "example.com")}
. Разрешены
data-*
,
type
(только
module
),
integrity
,
crossorigin
|
requiresConsent
|
"analytics"
|
"marketing"
|
— | Категория согласия: тег эмитируется инертным и активируется только после разрешения категории (см. Consent ) |
Доменный гейтинг
Авторские скрипты исполняются
на адресах самого сайта
: на адресе по слагу
<slug>.reeel.site
, который получает каждая публикация, и на подключённом домене — хосте из
domains
в
project.json
или хосте
settings.origin
.
reeel.site
— отдельный домен именно для этого: код автора на адресе сайта ничего не делит с платформенным
reeel.dev
.
Под корнем платформы (
*.app.reeel.dev
,
*.sys.reeel.dev
и
*.in.reeel.dev
, где сайты жили раньше, — эти адреса теперь ведут редиректом на
<slug>.reeel.site
) тег в HTML не эмитируется вовсе, а файлы из
data/web/
по прямому адресу отвечают 404.
localhost
на опубликованном сайте исключением не является.
Явно разрешают авторские вставки два места, где проект принадлежит тому, кто на него смотрит:
превью редактора
и
статический экспорт
(страницы уезжают с тегами, файлы
data/web/scripts/*.js
и
data/web/html/*.html
— рядом с ними).
Согласие
Скрипт с
requiresConsent
эмитируется инертным (
<script type="reeel/consent" data-consent="…" data-src="…">
); рантайм страницы активирует теги разрешённых категорий при загрузке и при изменении согласия
без перезагрузки
. Отзыв согласия уже выполненный скрипт не выгружает — отзыв действует со следующей загрузки (ограничение платформы).
Примеры
Скрипт после согласия
Script src:"https://cdn.example.com/pixel.js" requiresConsent:"marketing" id:pixel
На платформенном адресе страница уезжает без тега; на подключённом домене тег инертен, пока посетитель не разрешит
marketing
, — принятие запускает его без перезагрузки.
Метрику и Google Analytics так не подключают: счётчик объявляется в
`settings.analytics`
, сниппет печатает платформа, а цели уходят вызовом
analytics.goal("имя")
.
Свой файл проекта
Script src:"data/web/scripts/site.js" defer:true
Файл
data/web/scripts/site.js
синхронизируется с проектом и отдаётся по существующему механизму
/data/<path>
; объявлять его в манифесте не нужно.
Скрипт, который настраивается атрибутами
Script src:"https://plausible.io/js/script.js" defer:true
requiresConsent:"analytics" attrs:{mapOf("data-domain", "example.com")}
Имя вне списка (
onload
,
src
, другой
type
) — отказ: скрипт пропускается с предупреждением.
Скрипт на весь сайт
Одинаковый для всех страниц скрипт объявляется один раз — в
settings.scripts
конфигурации сайта, и выполняется раньше страничных
Script
. См.
project_json.md
.
Правила
-
MUST
Аналитика и маркетинг идут с
requiresConsentсоответствующей категории: тег — это то, что баннер обещает посетителю. Сторонний скрипт (src:"https://…") без метки — находка анализатораscript_without_consent; если страница без него не работает (оплата, капча), это пишется словом:requiresConsent:"necessary". -
MUST
src— полный путь от корня проекта (data/web/scripts/…), как уImage, либоhttps://…. Голое имя, путь вне каталога,.., ведущий/и иные схемы (javascript:,data:) отвергаются, а не чинятся : тег не должен указывать за пределы проекта. - MUST NOT Inline-скриптов в формате нет и не будет: каждый авторский скрипт — это файл, которым владеет проект, или URL, который назвал автор.
-
SHOULD
Скрипт, который работает в превью, работает и на опубликованном сайте — и на
<slug>.reeel.site, и на подключённом домене. Если нет, первым делом смотрите категорию согласия: гейтнутый тег ждёт ответа посетителя. -
MUST NOT
Не ставьте сторонний скрипт на страницу с
Session: токен живёт в хранилище браузера и доступен любому скрипту страницы. Виджету место в `HtmlEmbed isolate:true` .