当前位置: 首页 > Web前端 > HTML

在浏览器中使用ES6模块函数导入导出

时间:2023-04-02 18:58:09 HTML

感谢英文原作者JakeArchibald分享了各浏览器对ES6模块导入导出的支持Safari10.1.Chrome61.Firefox54–dom.moduleScripts.enabled背后about:config.Edge中的设置16.浏览器中ES6导入导出的使用1.在显示声明type="module"脚本中添加type="module",这样浏览器就会把相关代码当作Treatitas一个ES6模块2.不能写“裸”路径如:直接写'utils.js'会报错,可以写绝对路径和相对路径,但是不能直接写文件名,即使是同级下的文件。同时添加'./name.js'文件名后缀。js必须存在,否则浏览器无法识别路径。3、如何使用nomodule关键字实现浏览器的向后兼容我是这样理解的。老浏览器不识别type="module"的js,所以不会执行type="module"的js代码(但还是会下载)。它也不识别nomodule关键字,所以会忽略nomodule,也就是正常执行带有nomodule标志的js。对于支持type="module"的浏览器,会自动不执行带有nomodule关键字的js。甚至不要下载它。所以向后兼容功能起作用了(你可以用不同的浏览器试试,马上就明白了)。唯一的问题是还有一类浏览器支持type="module"的ES6特性,但是不支持。没有模块关键字。也就是说,即使没有moduleflag,它仍然会下载并执行这个js。即使它执行了带有type="module"的js。这些浏览器有Firefox不支持nomodule(问题)。每晚在Firefox中修复!Edge不支持nomodule(问题)。已修复在Edge16中!Safari10.1不支持无模块。已在Safari11中修复!4.默认type="module"的加载方式默认使用延迟加载方式。关于defer和async:defer和async都是异步加载代码。但是,直到整个页面在内存中正常渲染(DOM结构完全生成,执行其他脚本)后才会执行defer。一旦async下载完成,渲染引擎就会中断渲染,执行完这段脚本后,渲染会继续进行。一句话,defer是“渲染后执行”,async是“下载后执行”。另外,如果有多个defer脚本,会按照它们在页面出现的先后顺序加载,而多个async脚本不能保证加载顺序。内联如果是传统脚本内联js,如果调用的js文件在后面,会报错。5.支持异步加载方法type="module"也可以使用async方法加载(包括它的inlineimport),相当于普通js使用async加载的方式浏览器问题Firefoxdoesn'tsupportasynconinlinemodulescripts(issue)6.Executeonlyonce浏览器问题Edge多次执行模块(issue)。已修复,但尚未发布(预计Edge17会随修复一起发布)。7.关于CORStype=“module”默认是不支持跨域的,这和传统的js或者图片是完全不同的。传统js或者图片默认支持跨域。如果你想让type="module"支持跨域。需要提供有效的CORS声明Access-Control-Allow-Origin:*浏览器问题Firefox无法加载演示页面(问题)。Edge加载没有CORS标头的模块脚本(问题)。已在Edge16!9中修复。Mime类型与传统的不同,必须向浏览器提供有效的javascriptMIME类型。否则,请求的模块javascript将不会执行浏览器问题Edge执行具有无效MIME类型的脚本(问题)。最后说一句,没想到还有什么小功能,仔细研究了这么多知识点。码文不易,大家点个赞就好了。请注明出处