2017-08-29 88 views
2

我不清楚为什么nomodule属性存在于支持ES6模块的新浏览器中。如果默认为text/javascript,脚本元素的HTML“nomodule”属性的用途是什么?

在HTML 5,type属性是可选的,defaults to text/javascript

类型属性给出的数据的脚本或格式的语言。如果该属性存在,则其值必须是有效的MIME类型。不得指定charset参数。如果该属性不存在,则使用默认值“text/javascript”。

它不会默认为<script type="module" src="module.js"></script>。此默认值是否更改?如果没有,为什么nomodule是必要的?我可以只使用<script src="bundle.js"></script>而不使用nomodule

回答

8

purpose of the nomodule attribute是使支持module scripts,忽略特定script元件新的浏览器:

nomodule属性是一个布尔属性,该属性阻止脚本在支持模块的脚本的用户代理正在执行。

该规范has a good example

这个例子展示了如何将现代用户代理模块的脚本,并为老年用户代理的经典脚本:

<script type="module" src="app.js"></script> 
<script nomodule src="classic-app-bundle.js"></script> 

在支持模块脚本的现代用户代理中,具有nomodule属性的script元素将b e将被忽略,并且script元素的类型为“module”将被提取并评估(作为模块脚本)。相反,较旧的用户代理将忽略script元素,其类型为“module”,因为这是他们的未知脚本类型 - 但它们在获取和评估其他script元素(作为经典脚本)时没有问题,因为它们不要实现nomodule属性。

所以这就是它的工作原理。

在HTML 5中,type属性是可选的,默认为text/javascript ...有没有这个默认改变了吗?

默认没有改变 - 它仍然是text/javascript。但type属性现在也可以具有值module,这意味着浏览器仍然会解析并将其作为text/javascript执行 - 但也可以具体为module script

如果不是,为什么nomodule有必要?

为了防止支持模块脚本的新浏览器执行只适用于不支持模块脚本的旧浏览器的脚本,这是必要的,如上例所示。

我可以只使用<script src="bundle.js"></script>而不使用nomodule吗?

是 - 如果bundle.js不使用模块。如果它使用模块,则需要在其上放置type=module(在这种情况下,旧的浏览器将忽略它,因为它们不识别typemodule值)。

相关问题