Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【红宝书第4版读书笔记】02-关于 <script> 标签 #8

Open
yuqingc opened this issue Sep 6, 2020 · 0 comments
Open

【红宝书第4版读书笔记】02-关于 <script> 标签 #8

yuqingc opened this issue Sep 6, 2020 · 0 comments
Labels
PJWD4 红宝书第4版读书笔记

Comments

@yuqingc
Copy link
Member

yuqingc commented Sep 6, 2020

<script> 标签

标签重要属性

<script> 标签的执行会阻塞页面其他资源的解析,默认情况下加载也会阻塞页面的解析,除非使用 asyncdefer

  • async:和页面同时加载(不阻塞页面),加载完成之后会立即执行,不保证页面渲染完成。只支持外部 script

  • defer:和页面同时加载,然后等待页面解析完成之后再执行。只支持外部 script

  • crossorigincrossorigin="anonymous" 不发送跨域 credential,crossorigin="use-credentials" 会发送

  • integrity:可以传入资源的加密的签名,以监测 JS 是否被恶意篡改。有些浏览器不支持

  • language:已经废弃,请使用 type

  • type:MIME type。text/javascripttext/ecmascript 已经废弃。现在一般是 application/javascriptapplication/ecmascript

    • 如果值是 module,则可以使用 ES6 Module
  • src:都懂
    image

解析

  • 如果 inline script 写在了外部 script 标签内,一般 inline script 会被忽略

  • 如果没有 asyncdefer,自上而下,写在前面的先执行

  • 如果同时有几个 defer,一般也是写在前面的先执行(HTML5 规定),但是不同浏览器有差异,所以还是要注意

  • 通过 src 下载的 JS 资源(GET 请求),不受浏览器 CORS 策略限制(JSONP 就是利用这个原理)

放在哪?

  • 过去,为了好看整齐,都统一放在 <head></head> 里面,但是 HTML 是从上而下加载的,如果 JS 内容很多,会阻塞 DOM 的解析,从而导致很长的白屏时间

  • 现在推荐放在 <body></body> 标签里面,</body> 之前,可以等 DOM 完全渲染之后再处理,提升用户体验

  • HTML5 的 defer 属性,就可以放在在 <head> 里面了

defer

  • HTML5 规定含有 defer 的 script 标签需要按顺序执行,但是有些浏览器并没有遵守

  • HTML5 规定含有 defer 的 script 需要在 DOMContentLoaded 事件触发之前执行,但是有些浏览器没有遵守

  • defer 会等到页面渲染完成之后执行脚本

async

  • defer 不同,async 不保证脚本的执行顺序

  • async 的脚本会在页面 load 事件之前执行,但是不保证与 DOMContentLoaded 事件触发的先后顺序

动态引入

let script = document.createElement('script');
script.src = 'gibberish.js';
document.head.appendChild(script);

<noscript> 标签

冷知识,如果浏览器不支持 JS(现在 应该没有这种浏览器了)或者禁用了 JS,则 <noscript></noscript> 内的内容就会渲染出来

<noscript>
  <p>你的浏览器无法使用 JavaScript</p>
</noscript>
@yuqingc yuqingc added the PJWD4 红宝书第4版读书笔记 label Sep 6, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
PJWD4 红宝书第4版读书笔记
Projects
None yet
Development

No branches or pull requests

1 participant