在浏览器中使用ES6的模块功能 import 及 export
感谢英文原作者 Jake Archibald 的技术分享
各个浏览器对于ES6模块 import 、 export的支持情况
- Safari 10.1.
- Chrome 61.
- Firefox 54 – behind the dom.moduleScripts.enabled setting in about:config.
- Edge 16.
ES6 import 和 export 在浏览器当中的使用
1.显示声明type="module"
script 里面要加 type="module", 这样浏览器才会把相关的代码当作ES6的module 来对待
<script type="module">
import {addTextToBody} from './utils.js';
addTextToBody('Modules are pretty cool.');
</script>
2.不能写“裸”路径如:
<script type="module">
import {addTextToBody} from 'utils.js'; // error
addTextToBody('Modules are pretty cool.');
</script>
直接写 'utils.js' 会报错
你可以写绝对路径和相对路径, 但是不能直接写文件名,即使是同一层级下面的文件。也要加上 './name.js'
文件名后缀 .js 必须要有,不然浏览器无法识别路径。
3.如何向下兼容
使用 "nomodule" 关键字来实现浏览器的向下兼容
<script type="module" src="module.js"></script>
<script nomodule src="fallback.js"></script>
我是这样理解的,老的浏览器本身不会识别type="module" js,也就不会去有执行有type="module" 的js代码(但是还是会下载的哈)。
也不识别 nomodule 关键字,所以它会忽略nomodule,即正常执行这个有nomodule标识的js。
而支持type=“module”的浏览器,它会自动不去执行有nomodule关键字的js。甚至连下都不去下载。
所以向下兼容的功能就走通了(这个大家用不同的浏览器试试,立刻可以明白)
唯一的问题,还有一类浏览器,它支持 type="module" 的 ES6特性,但是它不支持nomodule关键字。也就是说,即使有nomodule标识,它还是会去下载并且执行这个js。即使它已经执行了 type=“module”的 js。
这些浏览器有
- Firefox doesn't support nomodule (issue). Fixed in Firefox nightly!
- Edge doesn't support nomodule (issue). Fixed in Edge 16!
- Safari 10.1 doesn't support nomodule. Fixed in Safari 11!
4.默认加载方式
type=“module”的加载方式默认使用 defer的加载方式。
关于defer 和 async :defer和async 都是异步加载代码。但是defer要等到整个页面在内存中正常渲染结束(DOM 结构完全生成,以及其他脚本执行完成),才会执行。 async一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再继续渲染。 一句话,defer是“渲染完再执行”,async是“下载完就执行”。另外,如果有多个defer脚本,会按照它们在页面出现的顺序加载,而多个async脚本是不能保证加载顺序的。
<!-- This script will execute after… -->
<script type="module" src="1.js"></script>
<!-- …this script… -->
<script src="2.js"></script>
<!-- …but before this script. -->
<script defer src="3.js"></script>
内联的 <script> 也是采用的 defer加载模式
<!-- This script will execute after… -->
<script type="module">
addTextToBody("Inline module executed");
</script>
<!-- …this script… -->
<script src="1.js"></script>
<!-- …and this script… -->
<script> //这里默认采用defer,避免歧义,建议手动加上
addTextToBody("Inline script executed");
</script>
<!-- …but before this script. -->
<script defer src="2.js"></script>
而如果是传统的script 内联js,调用的那个js文件在后面的话,会报错。
<!-- This script will throw error… -->
<script defer> //这里就算采用defer也会报错
addTextToBody("Inline module executed");
</script>
<script>
addTextToBody("Inline script executed");
</script>
5.支持async的加载方式
type="module" 也可以使用 async 的方式进行加载(包括其内联的 import),等同普通 js 采用 async 进行加载的方式
<script type="module" async></script>
Browser issues
Firefox doesn't support async on inline module scripts (issue)
6.只执行一次
<script type="module"> 只执行一次同ES6的加载机制,多次import 只会被当成一次import处理
<!-- 1.js 只会被加载执行一次-->
<script type="module" src="1.js"></script>
<script type="module" src="1.js"></script>
<script type="module">
import "./1.js";
</script>
<!-- 普通JS 也只会被加载一次,但是会被执行多次-->
<script src="2.js"></script>
<script src="2.js"></script>
Browser issues
Edge executes modules multiple times (issue). Fixed, but not yet shipped (expect Edge 17 to ship with the fix).
7.关于CORS
type="module" 默认不支持跨域,这一点儿与传统js或图片完全不一样。传统js或图片默认就是支持跨域的。如果你想 type="module" 支持跨域。需要在从服务器返回的header上显示的给予有效的 CORS声明
Access-Control-Allow-Origin: *
Browser issues
Firefox fails to load the demo page (issue).
Edge loads module scripts without CORS headers (issue). Fixed in Edge 16!
9.Mime-types
不同于传统的 <scripts>, <script type="module"> 必须向浏览器提供有效的 javascript MIME types。
不然请求到的模块javascript不会执行
Browser issues
Edge executes scripts with invalid MIME types (issue).
最后还想说
没想到任何一个小功能,仔细去研究都有这么多的知识点。码文不易,各位给个赞可好。
转载请注明出处在浏览器中使用ES6的模块功能 import 及 export的更多相关文章
- (转)关于ES6的 模块功能 Module 中export import的用法和注意之处
关于ES6的 模块功能 Module 中export import的用法和注意之处 export default 的用法 export default命令用于指定模块的默认输出.显然,一个模块只能有一 ...
- WebAssembly 浏览器中运行c/c++模块
今天,要给前端造点儿福利 浏览器中能调用javascript,曾经我们以为够用了,够强大了,但是事实上是完全不够 还好,mozilla的工程师提出了webassembly,目前是利用emsctript ...
- 浏览器中使用 ES6 import
html 中的 head 标签引入: <script src="test.js" type="module"></script> tes ...
- 非vue等框架中html 中使用es6的模块用法小结
以下是html中使用es6模块化引入的方法 一.html中的引入 <!DOCTYPE html> <html lang="en"> <head> ...
- ES6模块的import和export用法总结
ES6之前以前出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs前者主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步 ...
- ES6模块的import和export用法
ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步加载 ...
- ES6 模块导入import 导出export 和module.export
ES6中新增了模块的导入和导出功能 在实际过程中可以使用 import 和 export 对模块进行导入和导出操作,具体如下 1. 名字导入/导出 (导入名字必须与导出的一致,导入时需要用花括号) ...
- 关于ES6的 模块功能 Module 中export import的用法和注意之处
export default 的用法 export default命令用于指定模块的默认输出.显然,一个模块只能有一个默认输出,因此export deault命令只能使用一次.所以,import命令后 ...
- Python 中包/模块的 `import` 操作
版权声明:博客为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/10745292.html 用实例来说明 import 的作用吧. 创建 ...
随机推荐
- Oauth2 初步
搭建一个最简单的 Oauth2 认证服务 基于 Springboot2,在 pom.xml 中引入 Oauth2: 123456789101112 <dependency> <gro ...
- DateTimePicket jQuery 日期插件,开始时间和结束时间示例
需要引入的js文件: <input type="text" id="startTime" placeholder="开始时间"/> ...
- 提高线程数,解决redis超时问题
根据压测结果做出的修改历史: 第一步:只针对maxWorkerThreads.maxIoThreads和minWorkerThreads做了修改<processModel autoConfig= ...
- iOS 后台任务
首先开启后台任务 使用设置后台任务触发的时机 application.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIn ...
- 4)date中的Ymd格式问题
以下是详细的参数: format 字符 说明 返回值例子日 --- ---d 月份中的第几天,有前导零的 2 位数字 01 到 31D 星期中的第几天,文本表示,3 个字母 Mon 到 Sunj 月份 ...
- [Machine Learning] Andrew Ng on Coursera (Week 1)
Week 1 的内容主要有: 机器学习的定义 监督式学习和无监督式学习 线性回归和成本函数 梯度下降算法 线性代数回归 主要是了解一下机器学习的基本概念,重点是学习线性回归模型,以及对应的成本函数和梯 ...
- 对“深入理解 Java 内存模型(六)——final”的学习
转载自https://www.infoq.cn/article/java-memory-model-6/ 与前面介绍的锁和 volatile 相比较,对 final 域的读和写更像是普通的变量访问.对 ...
- SCI|EI|ISTP|万方|istic|NSTL|CASTD|CNKI|nlc|ethesys|CALIS|CETD|proquest|NDLTD|中国科学院学位论文检索系统|学位论文
BD AC D 三大检索指的是:SCI(科学引文索引 ).EI(工程索引 ).ISTP(科技会议录索引 ) 即Science Citation Index.Engineering Index.Conf ...
- linux 下安装及查看java的安装路径
一.Linux下安装JDK 1.下载文件 从官网下载合适版本如:jdk-8u191-linux-x64.tar.gz 2.安装文件 1.在 /usr/ 目录下创建 java文件夹mkdir /usr/ ...
- HDU-3579-Hello Kiki (利用拓展欧几里得求同余方程组)
设 ans 为满足前 n - 1个同余方程的解,lcm是前n - 1个同余方程模的最小公倍数,求前n个同余方程组的解的过程如下: ①设lcm * x + ans为前n个同余方程组的解,lcm * x ...