Как стать автором
Обновить

Комментарии 16

По поводу "безопасности" стоит глянуть эту статью. Но тут она и не нужна, ибо тот, кто имеет доступ к содержимому тега script, - тот и так может выполнить произвольный код.

Картинка про троллейбус из буханки

А почему нельзя сделать так?

<script defer src="https://mysite.github.io/script.js"></script>
<script>
  window.MyWidgetConfig = {
    color: "#fff",
    text: "Hello JS world!",
  }
</script>

Скажем, два одинаковых виджета на странице, каждый с другим конфигом.

(Я не защищаю решение в статье, просто, ну, очевидный ответ.)

Если виджет на странице может повторяться, это это решение тоже не годится. Потому что придется один и тот же скрипт подключать и исполнять дважды.

Для такой ситуации лучше явные конструкторы создавать.

Если с кешом не напортачить, то распарсенный скрипт может быть взят из кеша, так что надо будет лишь исполнить его ещё раз.

Тем не менее, все объекты создадутся второй копией и все сайд-эффекты произойдут дважды

Всё зависит от того сколько там общего кода, а сколько специфичного для места использования. Хотя, конечно, лучше всё же просто подключить скрипт, который просто зарегистрирует веб-компонент, а потом вставлять эти веб-кмпоненты куда и когда хочешь.

Можно конечно, но это не так прикольно

а я передаю параметры через атрибуты:


<script data-coolparameter="coolcmd">

Это также хорошая идея, но если параметров много это выглядит не очень...

А можно аттрибутами передать:
<script defer color="#fff" src="https://mysite.github.io/script.js"></script>
И получить:
document.currentScript.getAttribute('color')

НЛО прилетело и опубликовало эту надпись здесь

У инлайн-js - проблема с CSP, поэтому, на мой взгляд, из всех вариантов, JSON - самый перспективный. В атрибутах тегов, которые тут уже упомянули, не удобно работать со сложными конфигами, с объектами и массивами в значениях. Но, при этом, настройки лучше вынести в отдельный тег (не script). Это даст возможность связывать разные конфиги с разными экземплярами виджетов, если их в документе несколько.

Проще текстовыми функциями обкусить начальный return, а потом JSON.parse. sandbox — это стрелять микроскопом по воробьям.

Ну и как заметили выше — явный подход лучше магического.

Чтобы не было ошибок в VSCode - можно попробовать тип файла поставить JSX. Мне кажется так все же проще, чем городить кучу дополнительного кода.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории