Apache Cordova混合应用程序中的ES6模块/导入会引发MIME类型错误

时间:2018-01-05 12:09:08

标签: javascript cordova google-chrome hybrid-mobile-app es6-modules

我尝试在使用Apache Cordova构建的混合移动应用中使用ES6模块。不幸的是,Cordova似乎在没有MIME类型的情况下为模块提供服务,这在WebView中引发了一个错误(在Chrome 63和64 beta中)。

具体来说,部署的应用程序(使用chrome remote debugger)会引发以下错误:

Failed to load module script: The server responded with a non-JavaScript MIME type of "". Strict MIME type checking is enforced for module scripts per HTML spec.

我使用的是沼泽标准ES6导入,目前Chrome的目标版本支持该导入。

<!--index.html-->
<script type="module">
    import App from "./app.js"
    import config from "./config.js"
    window.app = new App(config)
</script>

当预建资产通过网络服务器提供而不是通过Cordova部署时,一切正常。通过Babel进行透明可能是一种选择,但这似乎是一个令人头痛的问题,在我知道没有更好的选择之前我不应该走这条路。

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

文件系统提取的文件没有MIME类型,但由于安全性较高,ES6模块必须仅使用&#34; application / javascript&#34; MIME类型。

作为一种解决方法,您可以在应用中添加(就像我一样)Web服务器。例如,请参阅cordova-httpd

答案 1 :(得分:1)

我通过使用webpack将我的所有代码和资产编译到一个文件中来解决这个问题。这允许使用导入语法而没有Apache Cordova中的所有相关问题。它不如原生支持,但它对我来说是最好的解决方案。

答案 2 :(得分:0)

我通过仅删除cordova项目中所有 type =“ module” 出现的问题来解决了这个问题。

答案 3 :(得分:0)

Apache Cordova 应用程序可能不需要使用 ES6。由于应用程序将使用 file_url 加载脚本,它不理解“type=module”。在 Web 应用程序中,脚本是从服务器加载的,'type=module' 不会成为问题。

与 ES5 相比,ES6 生成的脚本会更小,因此从服务器加载较小的文件是有意义的。但是在 Cordova 应用程序中,文件是在内部访问的,因此使用 ES5 不会有太大区别。