为什么使用 ES6 模块化的时候会有跨域问题?
代码如下:
<script src="./aaa.js" type="module"></script>
<script src="./bbb.js" type="module"></script>
<script src="./ccc.js" type="module"></script>
引入了三个js文件,内部使用了 ES6 的模块化语法,结果在chrome里报错了:
这里是使用了 file 协议,所以本地服务器打开文件(http协议)就不会报错了。但是我不太清楚为什么会出现跨域问题?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
咱们知道,script标签是自带跨域的功能的,这也就是为什么在某些场合会通过jsonp并结合script来请求资源。
其次,跨域导致的原因是协议、域名、端口号不同就会导致,而这里的协议通常是指http协议,https等协议。也就是说http, data, chrome, chrome-extension, https这些协议是支持跨域请求的,而file协议并不支持。
file协议:本地文件传输协议,主要的目的就是用于访问本地计算机中的文件,好比通过Windows的资源管理器中打开文件或者通过右键单击‘打开’一样。然后通过
file:///文件路径
这样的形式去访问。那么file协议和http协议有啥区别,浏览器通过file://访问文件和http://访问文件的区别:而当你在某盘符位置下直接打开一个网页(script标签中引入了某地的某个js文件),则在浏览器地址栏呈现如下:file:///D:/MyStudyProject/JSTopLevel/chapter-9/2%E5%AF%BB%E6%89%BE%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E5%B8%A6%E5%BC%95%E5%8F%B7%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.html,则会出现跨域问题。而http、https等协议支持跨域请求。所以解决办法就是通过搭建本地一个服务器去进行资源的问题来解决跨域问题。
ES6 使用模块的时候要在标签中声明
type="module"
,而这类使用了模块的script
是受限于同源策略的,默认会发起cors跨域请求,问题来了,这种请求要求request header
的origin
必须带有http
等类型,但是file
协议下,origin 是空的,也就是不符合这个要求,如果在这种情况下依然要发送请求,那就会报错了。启动serve服务是可以的,但是项目发布怎么办呢,在服务器也启动serve服务吗,但是我的web服务是用的Tomcat,两者之间会有冲突吗
要使用import,就需要指定script type=module,问题就来了,加上这个浏览器就会报跨域,什么玩意儿