Javascript 何时不使用“延迟”属性

Javascript 何时不使用“延迟”属性,javascript,performance,Javascript,Performance,我想我知道在从html页面引用外部脚本时如何使用“defer”属性。 我甚至认为我没有理由不使用它。但是在经历了一些意想不到的事情之后,我开始研究(即使在这里),我想我不能100%确定每次使用script标签时使用它是否安全 是否有一个不应该使用defer的已知用例列表?defer所做的唯一事情是在DOM完成解析时,但在触发DOMContentReady事件之前运行脚本 因此:如果您的代码不依赖于DOM(直接或间接通过访问文档属性,这些属性只能在DOM完成后才能确定),那么就没有理由推迟了。例如

我想我知道在从html页面引用外部脚本时如何使用“defer”属性。 我甚至认为我没有理由不使用它。但是在经历了一些意想不到的事情之后,我开始研究(即使在这里),我想我不能100%确定每次使用script标签时使用它是否安全

是否有一个不应该使用defer的已知用例列表?

defer所做的唯一事情是在DOM完成解析时,但在触发
DOMContentReady
事件之前运行脚本

因此:如果您的代码不依赖于DOM(直接或间接通过访问
文档
属性,这些属性只能在DOM完成后才能确定),那么就没有理由推迟
了。例如:添加新名称空间
ComplexNumbers
、具有
ComplexNumbers
对象类型和用于执行复数数学的关联实用程序函数的实用程序库没有理由等待DOM:它不需要延迟。对于自定义websocket库也是如此:即使您自己使用该库需要执行DOM更新,它也不依赖于DOM,也不需要延迟

但是对于试图访问与DOM相关的任何代码:您需要使用
defer
。是的:对于作为初始页面加载的一部分加载的任何脚本,您都应该有
defer
,如果您的工作做得正确,那么当这些脚本试图接触它们需要处理的DOM的各个部分时,它们都不会相互干扰

事实上,您应该同时使用
defer
*和*
async
,以免阻塞页面线程。例外情况是,如果您正在加载
type=“module”
脚本,在这种情况下,您无法选择延迟:默认情况下,它是延迟的。但它仍然需要
async