Подтвердить что ты не робот

Модули ES6 в расширениях в версии Chrome 61

Это не тот же вопрос, что Модули ES6 в Google Extension Development (неожиданный токен), поскольку они устарели и уже ответили.

Google выпустила пресс-релиз, в котором утверждается, что Chrome поддерживает модули ES6. Я пытаюсь загрузить модуль из внутреннего расширения. Я могу загрузить модуль с нормальной страницы, но не изнутри расширения.

Вот html, это страница в контексте расширения:

<script src="test.js" type="module"></script>

Когда я открываю страницу, в консоли появляется следующее сообщение об ошибке:

Не удалось загрузить модуль script: сервер ответил несимметричным MIME-типом "". Строгая проверка типа MIME применяется для скриптов модуля для спецификации HTML.

Есть ли у кого-нибудь советы? Это ошибка, о которой следует сообщить Chrome? Или это еще не поддерживается? Я не мог найти прямого объяснения.

4b9b3361

Ответ 1

Как пользователь wOxxOm, упомянутый в комментариях, см. https://crbug.com/738739.

9-18-17 update: https://bugs.chromium.org/p/chromium/issues/detail?id=769012 похоже, что он исправлен!

Обновление 10-19-17: https://bugs.chromium.org/p/chromium/issues/detail?id=728377#c18 сообщается как работающий в chrome 64 (в настоящее время канарейский)

11-13-17 обновление: окончательное обновление, тестирование в Chrome 63, теперь работают модули. Обратите внимание: если вам нужно загрузить модуль на фоновой странице расширения, вы не можете сделать это через свойство scripts в manifest.json, вместо этого установите страницу на background.html и укажите модуль типа в теге script, и это будет обойти проблему манифеста.

Ответ 2

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

window.addEventListener('load', function () {
    function appendModule(code) {
        let url = URL.createObjectURL(new Blob([code], { type: 'text/javascript' })); // create url from code

        let script = document.createElement('script');
        script.type = 'module';
        script.src = url;
        document.head.appendChild(script);
    }

    let scripts = document.querySelectorAll('script');
    console.log(scripts);
    for (let script of scripts) {
        script.parentElement.removeChild(script);
        if (script.getAttribute('type') !== 'module') continue; // found normal script
        if (script.getAttribute('src') !== null) {
            // load a file
            var request = new XMLHttpRequest();
            request.open('GET', script.getAttribute('src') + '?_=' + Date.now(), true);
            request.onload = function () {
                if (this.status >= 200 && this.status < 400) {
                    // file loaded
                    appendModule(this.response);
                } else {
                    // error loading file
                    console.error('Not able to load module:', script.getAttribute('src'));
                }
            };
            request.onerror = function () {
                // error loading file
                console.error('Not able to load module:', script.getAttribute('src'));
            };
            request.send();
        }
    }
});
    <script src="./script.js" type="module"></script>