问题 Chrome版本61中的扩展ES6模块


这不是同一个问题 谷歌Chrome扩展开发中的ES6模块(意外令牌) 因为这已经过时并且已经回答了。

谷歌发布了一则新闻稿,声称Chrome支持ES6模块。我正在尝试从扩展中加载模块。我可以从普通页面加载模块,但不能从扩展名中加载。

这是html,这是扩展上下文中的页面:

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

当我打开页面时,我在控制台中看到以下错误消息:

无法加载模块脚本:服务器使用非JavaScript MIME类型“”进行响应。每个HTML规范对模块脚本强制执行严格的MIME类型检查。

有人有建议吗?这是一个应该报告给Chrome的错误吗?或者它还没有得到支持?我找不到任何简单的解释。


12507
2017-08-17 03:09


起源

它在Mac上。该文件在扩展中本地加载。该URL类似于chrome://extensionid/test/test.html - Josh
我认为它最终会成为chrome扩展的问题,他们可能需要关闭对本地资源的mime类型检查,并假设脚本资源的默认mime类型具有有效的js 1。说我想的还为时尚早。 - MinusFour
尚不支持,请参阅 crbug.com/738739 - wOxxOm
那就是@wOxxOm,谢谢!如果您将评论指定为答案,我会接受。 - Josh


答案:


正如用户wOxxOm在评论中提到的那样,请参阅 https://crbug.com/738739

9-18-17更新: 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中测试,模块现在正在运行。请注意,如果您需要在扩展的后台页面中加载模块,则无法通过manifest.json中的scripts属性执行此操作,而是将页面设置为background.html,并在脚本标记中指定类型模块,这将绕过明显的问题。


9
2017-08-28 20:55



不幸的是,那里报告了另一个错误...无论如何它很有趣,但让我认为es6模块将需要至少再转换一年的chrome扩展名:/ - YangombiUmpakati


这可能是加载本地文件的错误。 我设法为此创建了一个解决方法,但是你仍然会在控制台中出现错误,并且由于原因问题你不能使用其他import语句我猜:

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>

简而言之:您加载脚本内容,创建一个 Blob 正确的类型并从a加载它 ObjectURL


0
2017-09-13 16:24