Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.05.2022, 12:19
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

Автозагрузка криптов и стилей
Всем привет, в некоторых JS библиотеках есть такая фича, как подгрузка скриптов и стилей динамически. Это как бы не новость, но мне вот что интересно: стили в виде
<link rel="stylesheet" href="./assets/css/bootstrap.min.css">

попадают в DOM, в head, это нормально, и так оно реализовано у всех. Со скриптами тоже самое, но, у некоторых библиотек, например Tiny Mce, скрипты в DOM не подгружаются, если наблюдать по консоли в момент запуска плагина видно, как в head прописались стили, а скрипты нет, нигде в теле документа новые теги <script> не прописались. Плюс ко всему, мы их не увидим в web developer tools (information/View Javscript).
Но тем не менее, плагин работает, функции из "невидимо подгруженных" скриптов отрабатывают. Гугление дает только те коды, которые прописывают скрипты в head, а мне интересно как это реализовать без этого. Буду очень благодарен за любую информацию по вопросу!
Ответить с цитированием
  #2 (permalink)  
Старый 27.05.2022, 12:21
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Возможно скрипты подключают не в head...
Ответить с цитированием
  #3 (permalink)  
Старый 27.05.2022, 12:28
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

Сообщение от ksa
Возможно скрипты подключают не в head...
100% точно нигде не подключаются, если бы они подключились куда угодно в DOM, я бы их в том числе увидел в web developer tools
Ответить с цитированием
  #4 (permalink)  
Старый 27.05.2022, 12:57
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Volonter,
В DevTools, вкладке Network, всё видно.
Ответить с цитированием
  #5 (permalink)  
Старый 27.05.2022, 13:13
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

Сообщение от Rise Посмотреть сообщение
Volonter,
В DevTools, вкладке Network, всё видно.
Да, действительно есть, я само собой догадывался, что нельзя нигде не увидеть джаваскрипт, но как они делают, что это не добавляется в DOM то? Я вот чего понять не могу)) плагин запустил, в инспекторе "моргнуло" что стили прописались, а скриптов нет. Механизм подгрузки там асинхронный, но так или иначе все заканчивается банальным body.appendChild(), вот кусок кода библиотеки
const id = dom.uniqueId();
          elm = document.createElement('script');
          elm.id = id;
          elm.type = 'text/javascript';
          elm.src = Tools._addCacheSuffix(url);
          if (this.settings.referrerPolicy) {
            dom.setAttrib(elm, 'referrerpolicy', this.settings.referrerPolicy);
          }
          elm.onload = done;
          elm.onerror = error;
          (document.getElementsByTagName('head')[0] || document.body).appendChild(elm);
        });
Ответить с цитированием
  #6 (permalink)  
Старый 27.05.2022, 13:39
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Volonter
но как они делают, что это не добавляется в DOM то?
Всё добавляется, ты как-то неправильно DOM смотришь, смотри вкладку Elements.
Ответить с цитированием
  #7 (permalink)  
Старый 27.05.2022, 13:48
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

Сообщение от Rise Посмотреть сообщение
Всё добавляется, ты как-то неправильно DOM смотришь, смотри вкладку Elements.
а как еще - консоль- инспектор
вот ради прикола набросал на коленке,
class ScriptLoader {
    load(src) {
        const e = document.createElement('script');
        e.defer = true;
        e.src = src;
        document.body.appendChild(e);
    }
}
class Test {
    constructor(params) {
        this.params = typeof params === 'object' ? params : {};
        this.url = params.url;
    }

    init() {
        const scriptLoader = new ScriptLoader;
        scriptLoader.load(this.url + '/foo.js');
    }
}
let test = new Test({
            url: '/path/to/script',
        })
        test.init()

понятно что здесь ничего не загрузится, но на компе все сразу в консоли видно, что подгрузился скрипт.
Ответить с цитированием
  #8 (permalink)  
Старый 27.05.2022, 14:39
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Volonter,
Ну ты можешь элемент script удалить из DOM, как и любой другой элемент. Например, на событие load, которое вызывается, когда скрипт загружен и выполнен:
e.onload = function() {
    e.remove();
};

На работоспособность js это не повлияет.
Ответить с цитированием
  #9 (permalink)  
Старый 27.05.2022, 19:48
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 84

Сообщение от Rise
e.remove();
да, действительно, покопался основательно в их коде - так и есть, просто там remove() немного более завуалированно прописано. Тогда вопрос - нафига и зачем удалять?
Ответить с цитированием
  #10 (permalink)  
Старый 27.05.2022, 21:12
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Volonter,
Чтобы освободить память. Ведь разработчики библиотеки не могут знать масштабов твоего плагина, гипотетически ты может миллион раз будешь использовать ScriptLoader в своем приложении, таким образом получится миллион элементов скрипт, по сути отработанных и просто так висящих в DOM (в отличии от CSS). Поэтому кому-то надо их почистить.

Это скорее типичное поведение. Например, в jQuery, тоже есть некий загрузчик скриптов, в виде $.getScript('url.js'), он же $.ajax({ url: 'url.js', dataType: 'script' }), и реализация там вполне аналогичная.

Так что ничего криминального.

Последний раз редактировалось Rise, 27.05.2022 в 21:16.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переименовать название стилей в SVG перед вставкой в другой SVG Герасим Events/DOM/Window 9 09.06.2018 09:16
Два файла стилей в проекте sniffysko Angular.js 9 18.05.2018 09:50
Шаблон сброса стандартных стилей Olegich (X)HTML/CSS 14 13.09.2013 18:47
Динамическое применение стилей к элементу и их отмена Amphiluke Events/DOM/Window 10 26.11.2012 22:33
Изменение путей к таблицам стилей и скриптам в скрипете галереи lightbox 2.04 Flashton Элементы интерфейса 1 01.02.2010 10:10