我尝试在使用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进行透明可能是一种选择,但这似乎是一个令人头痛的问题,在我知道没有更好的选择之前我不应该走这条路。
有什么建议吗?
答案 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 不会有太大区别。