Кроссбраузерные альтернативы для параметров модуля IMPORT ASSERT

В браузерах на базе Chrome я бы ИМПОРТировал таблицу стилей через: -

Мой компонент -

import sheet from '/Vanilla/ScrollGrid.css' assert {type: 'css'};

или вызов веб-страницы пользователя -

if (userStyles != undefined && userStyles != null) {
    if (typeof userStyles == "string") {
        let userStylesURL;
        try 
        {
            userStylesURL = new URL(userStyles, baseURL);
        } catch (err) {
            console.info(err.message);
        }
        if (userStylesURL != undefined) {
            userSheet = (userStylesURL.protocol == "http:" || "htps:")
        }
    }
}
if (userSheet)
{
    myCSSMod = await import(userStyles, { assert: {type: "css"}});
}

var x = new sg.ScrollGrid("myTable", dimCols, options, myCSSMod.default);

Тогда это позволит мне загружать таблицы стилей во время выполнения: -

Мой компонент ScrollGrid: -

    if (userStyles != undefined && userStyles != null) {
        if (userStyles.type == "text/css") {
            this.#shadowRoot.adoptedStyleSheets.push(userStyles);
        }
    }

Я могу легко заменить импорт модуля созданием динамического тега LINK: -

    let link = document.createElement('link');
    link.href = "./toggle.css";
    link.rel = "stylesheet";
    link.type = "text/css";
    this.shadowRoot.appendChild(link);

Теперь я хочу поддерживать Safari и Firefox, поэтому рассматриваю альтернативы.

Но мне нужна помощь/совет: «Как заменить метод IMPORT в моем веб-компоненте?»

Я пробовал использовать атрибут .SHEET из элемента LINK, но наткнулся на правило «должен быть изготовленный CSSStylesheet()», поэтому знаю только три варианта. (Примечание: я бы хотел, чтобы мой компонент продолжал поддерживать необязательный параметр StyleSheet в виде CSSStylesheet, а не строкового URL-адреса.)

  1. Попросите вызывающую страницу загрузить таблицу стилей с помощью FETCH или каким-либо другим способом в строку. Затем вызывающая сторона может вызвать конструктор CSSStylesheet(string) и передать мне результат. Это звучит привлекательно, поскольку позволяет жестко запрограммировать небольшие строки (с очень небольшим количеством правил), а также обрабатывать более крупные внешние файлы CSS.

  2. Измените мой параметр на строку URL-адреса и создайте элемент LINK во время выполнения в моем компоненте.

  3. Имейте «отключенный» тег STYLE, указывающий на внешний URL-адрес, а затем получите внутренний HTML в виде строки. Не знаю, заполняется ли внутренний HTML для отключенных тегов стиля или использование URL-адреса в теге стиля теперь устарело.

Веб-компонент -

    if (userStyles != undefined && userStyles != null) {
        if (userStyles.type == "text/css") {
            this.#shadowRoot.adoptedStyleSheets.push(userStyles);
        }
    }
    
    this.#shadowRoot.adoptedStyleSheets.push(sheet);

Есть еще варианты? Пожалуйста, не стесняйтесь озвучивать предпочтения.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы импортировать таблицу стилей, вы можете сделать это в теге стиля. @import url(https://urltostylesheet);

Ответ принят как подходящий

Спасибо @slothscript, но если я попробую: -

        let sheet = new CSSStyleSheet();
        sheet.replaceSync("@import url(http://localhost/styles.css);")

Я получил: -

Правила @import здесь не разрешены. См. https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418.

В любом случае, это слишком запутанно, поэтому, пока Safari не поддерживает синтаксис «Assert», я буду использовать экземпляр, чтобы проверить, является ли параметр URL-адресом, и в этом случае я добавлю элемент LINK, или CSSStyleSheet, и в этом случае я продолжу : -

this.#shadowRoot.adoptedStyleSheets.push(userStyles);

Для любопытных: я делаю это, потому что мне все еще нужен пирог инкапсуляции, но я даю вызывающему компоненту большую гибкость, чем это доступно с :slot и :part и -css-variables.

Другие вопросы по теме