一上来就从第二章讲起,是因为第一章讲的js历史发展,网上有很多。这是一个记录学习笔记的专栏,争取在Q4结束之前,能把整本书学完。像我这种学到后边忘记前边的人,还是烂笔头好用些。
本章学习内容
1.使用<script>标签
2.行内脚本与外部脚本的比较
3.文档模式对JavaScript有什么影响
4.确保JavaScript不可用时的用户体验
<script> 标签
常用的方法如下,一般情况下我会把script标签放到body的最后,解释器这样不会影响页面的渲染,也可以选择放在<head>标签中,但是多少都会影响页面的渲染,严重情况下会出现白屏。因项目而议吧。
注:浏览器解析到''标签才开始渲染
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" >
function sayHi (){
console.log('hi World~')
}
</script>
<script src="test.js"></script>
</body>
</html>
1.<script>标签属性
async:可选。表示立即下载该脚本,但不阻止其他脚本,只对脚本外部脚本有效。
<script src="test.js" acync="asyc" /> //表示该外部注入的js异步加载
charset:可选。指定src脚本的代码字符集
<script src="test.js" charset="utf-8" />
crossorigin:可选。配置相关请求的跨域设置。 服务器要允许跨站获取文件,即access-control-allow-origin: *
<script crossorigin='anonymous'src='https://xxxx.com/test.js' />
//anonymous——配置文件请求不需要设置凭据标志(token等等) 服务器返回需要加上Access-Control-Allow-Origin
<script crossorigin src='https://xxxx.com/test.js' />//设置一个空的值,如 `crossorigin` 或 `crossorigin=""`,和设置 `anonymous` 的效果一样。
<script crossorigin='use-credentials' src='https://xxxx.com/test.js' /> //use-credentials-需要设置凭据标志(token等等)
defer:可选。表示延迟到文档全部解析完成后在执行该脚本。只对外部脚本有效。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="test.js" defer></script> //当控制台打印出 ‘hi World’ 后执行这个脚本
</head>
<body>
<div id="app"></div>
<script type="text/javascript" >
function sayHi (){
console.log('hi World~')
};
sayHi()
</script>
</body>
</html>
integrity:可选。允许比对接收到的资源和指定的加密签名,验证子资源的完整性。如果接收到的资源签名不匹配,页面报错该脚本也不在执行。该属性可以确保内容分发网络不会提供恶意内容。
首先服务器需要开启内容安全策略,即 Content-Security-Policy
Content-Security-Policy: require-sri-for script;
//加载script时需要进行校验
<script src="https://www.xxxx.com/xxx.js"
integrity="sha384-9u9lzb/hr8e14GLHe5TEOrTiH3Qtw5DX2Zw9X/g7cqj81W2McEMx5CKOszxdb8jg" crossorigin="anonymous"></script>
//integrity的值为src文件进行base64编码的值,可网上搜索在线转换器即可
动态加载脚本
let script = document.createElement('script');
script.src = 'test.js';
script.async = false; //如果不设置async这种方式加载脚本会默认为异步加载,而且不是所有浏览器都支持async属性,如果需要用这种方式加载,可以明确设置async = false
document.head.appenChild(script)
行内代码与外部文件
外部文件的有点:
1.可维护性:js代码不必分散在各个角落,难以维护。
2.缓存:浏览器会根据特定的设置缓存所有外链的js文件,如果两个页面都用到同一文件,则该文件只会下载一次。
3.适应未来:通过把 JavaScript 放到外部文件中,就不必考虑用 XHTML 或前面提到的注释黑科技。 包含外部 JavaScript 文件的语法在 HTML 和 XHTML 中是一样的。 在配置浏览器请求外部文件时,要重点考虑的一点是它们会占用多少带宽。在 SPDY/HTTP2 中, 预请求的消耗已显著降低,以轻量、独立 JavaScript 组件形式向客户端送达脚本更具优势。 比如,第一个页面包含如下脚本:
<script src="mainA.js"></script>
<script src="component1.js"></script>
<script src="component2.js"></script>
<script src="component3.js"></script>
...
后续页面可能包含如下脚本:
<script src="mainB.js"></script>
<script src="component3.js"></script>
<script src="component4.js"></script>
<script src="component5.js"></script>
...
在初次请求时,如果浏览器支持 SPDY/HTTP2,就可以从同一个地方取得一批文件,并将它们逐个 放到浏览器缓存中。从浏览器角度看,通过 SPDY/HTTP2 获取所有这些独立的资源与获取一个大 JavaScript 文件的延迟差不多。 在第二个页面请求时,由于你已经把应用程序切割成了轻量可缓存的文件,第二个页面也依赖的某 些组件此时已经存在于浏览器缓存中了。 当然,这里假设浏览器支持 SPDY/HTTP2,只有比较新的浏览器才满足。如果你还想支持那些比较 老的浏览器,可能还是用一个大文件更合适。
文档模式
混杂模式:所有浏览器都一样省略文档开头的doctype作为开关。
标准模式:可以通过一下几种方式声明
<!-- HTML 4.01 Strict -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!-- XHTML 1.0 Strict -->
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- HTML5 -->
<!DOCTYPE html>
准标准模式:
<!-- HTML 4.01 Transitional -->
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<!-- HTML 4.01 Frameset -->
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
<!-- XHTML 1.0 Transitional -->
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- XHTML 1.0 Frameset -->
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
文档模式不同,主要的影响就是样式不同,js也有些关联影响或称为副作用。
总结:
JavaScript是可以通过<script>标签混入到html代码中,也可以通过src属性引用外部文件,在不使用defer和async属性的情况下,浏览器会严格的一次按照顺序进行解释,且将解释到的<script>标签时,会把里边的代码或文件解释完毕,才继续进行。