我一直在思考这个问题很多天,我决定问专家。
浏览器将如何处理新的导入/导出语法?我的意思是:模块会被异步加载吗?仅引用我的主文件或入口文件和浏览器将延迟加载所需模块。
也许我错过或误解了这个新架构的一些东西?
非常感谢你!
问候。
我一直在思考这个问题很多天,我决定问专家。
浏览器将如何处理新的导入/导出语法?我的意思是:模块会被异步加载吗?仅引用我的主文件或入口文件和浏览器将延迟加载所需模块。
也许我错过或误解了这个新架构的一些东西?
非常感谢你!
问候。
现在这是标准化的,所有主要的现代浏览器都支持。
模块会被异步加载吗?
是的,有两种选择;详情如下。
仅引用我的主文件或入口文件和浏览器将延迟加载所需模块。
不是那么“懒惰”,但是是的。
要获得此行为,您可以使用以下命令指定您的脚本是一个模块type="module"
:
<script src="main.js" type="module"></script>
或用于内联脚本
<script type="module">
// ...module code here
</script>
这意味着脚本是根据 JavaScript 规范中的模块定义而不是脚本定义来解析和处理的,这意味着它可以具有导入(和导出)。
导入是相对于script的 URL(对于通过单独的资源加载的模块,如main.js
上述,就像 CSS)或相对于文档(对于如上述的内联模块)进行解析。
例如,如果我在我的文档中有这个http://example.com/index.html
:
<script src="./handy/stuff/nifty.js" type="module"></script>
...并nifty.js
包含
import Thingy from "./thingy.js";
...然后浏览器寻找http://example.com/handy/stuff/thingy.js
,而不是http://example.com/thingy.js
。同样,就像 CSS 导入一样。
请注意,./
on 该模块说明符是必需的,只是from "thingy.js"
不起作用。这是因为不允许使用裸说明符,因为它们最终可能具有特殊含义。(例如,在 Node.js 中,这是您指定内置模块和安装在node_modules
. 中的模块的方式。)模块说明符必须是完整的 URL,或以 、 或 开头的/
相对./
URL ../
。
我上面说过模块是异步加载的,有两个选项可用。规范中的这张图说得最好(有关最新副本,请参阅规范):
如您所见,对于type="module"
脚本,如果您没有在script
标签上放置任何特殊的标志属性,则所有模块的依赖关系都将被解析,然后脚本将在 HTML 解析完成后运行。如果包含该async
属性,它可能会在 HTML 解析完成之前更快地运行(例如,如果所有脚本都在缓存中)。(defer
对模块无效。)