js和css文件位置对页面性能有什么影响?


本文摘自PHP中文网,作者青灯夜游,侵删。

CSS和JS文件的位置会影响页面效率。js脚本应放在底部,如果放在首部,当下载执行js时,会影响渲染行程绘制页面;而CSS应放在顶部,如果放在底部,页面可以逐步呈现,但在CSS下载并解析完毕后,已经呈现的文字和图片就要需要根据新的样式重绘。

js脚本文件的位置

js脚本应该放在底部,原因在于js线程与GUI渲染线程是互斥的关系,如果js放在首部,当下载执行js的时候,会影响渲染行程绘制页面,js的作用主要是处理交互,而交互必须得先让页面呈现才能进行,所以为了保证用户体验,尽量让页面先绘制出来。

CSS文件的位置

CSS 是页面渲染的关键因素之一,(当页面存在外链 CSS 时,)浏览器会等待全部的 CSS 下载及解析完成后再渲染页面。关键路径上的任何延迟都会影响首屏时间,因而我们需要尽快地将 CSS 传输到用户的设备,否则,(在页面渲染之前,)用户只能看到一个空白的屏幕。

CSS文件放在顶部一方面是因为放置顺序决定了下载的优先级,更关键的是浏览器的渲染机制。

css在加载过程中不会影响到DOM树的生成,但是会影响到Render树的生成,进而影响到layout,所以一般来说,style的link标签需要尽量放在head里面,因为在解析DOM树的时候是自上而下的,而css样式又是通过异步加载的,这样的话,解析DOM树下的body节点和加载css样式能尽可能的并行,加快Render树的生成的速度。

将CSS放在底部,页面可以逐步呈现,但在CSS下载并解析完毕后,已经呈现的文字和图片就要需要根据新的样式重绘,这是一种不好的用户体验。

js、css等脚本位置对性能的影响

用一句话概括就是: JS 全阻塞,CSS 半阻塞。(词是我发明的,方便记忆而已)

  • JS 会阻塞后续 DOM 解析以及其它资源(如 CSS,JS 或图片资源)的加载。

  • CSS 不会阻塞后续 DOM 结构的解析,不会阻塞其它资源(如图片)的加载,但是会阻塞 JS 文件的加载。

  • 现代浏览器很聪明,会进行 prefetch 优化,浏览器在获得 html 文档之后会对页面上引用的资源进行提前下载。(注意仅仅只是提前下载)

下面开始我就一边测试,一边解释上述测试的结果:

测试的浏览器是 Chrome,版本号为 55.0.2883.95 (64-bit)

先用 Nodejs 搭建一个简单 http 服务器:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

//test.jsconst http = require('http');const fs = require('fs');const hostname = '127.0.0.1';const port = 9000;http.createServer((req, res) => {

    if(req.url === "/") {

        fs.readFile("index.html", "utf-8", function(err, data) {

            res.writeHead(200, { 'Content-Type': 'text/html' });

        res.write(data);

        res.end(); 

    })

    }else if(req.url === "/yellow.js") {

    //延迟 5s fs.readFile("yellow.js", "utf-8", function(err, data) {

        res.writeHead(200, { 'Content-Type': 'text/plain' });

        setTimeout(function () {

            res.write(data);

            res.end();

        }, 5000);

    })

    }else if(req.url === "/blue.js") {

    //延迟 10s    fs.readFile("blue.js", "utf-8", function(err, data) {

        res.writeHead(200, { 'Content-Type': 'text/plain' });

        setTimeout(function () {

            res.write(data);

            res.end();

        }, 10000);

    })

    }else if(req.url === "/red.css") {

    //延迟 15s    fs.readFile("red.css", "utf-8", function(err, data) {

        res.writeHead(200, { 'Content-Type': 'text/css' });

        setTimeout(function () {

            res.write(data);

            res.end();

        }, 15000);

    })

    }else if(req.url === "/green.css") {

    //延迟 20s    fs.readFile("green.css", "utf-8", function(err, data) {

        res.writeHead(200, { 'Content-Type': 'text/css' });

        setTimeout(function () {

            res.write(data);

            res.end();

        }, 20000);

    })

    }}).listen(port, hostname, () => {

  console.log('Server running at ' + hostname);});

首页的代码结构:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

//index.html

<!DOCTYPE html>

<html>

<head>

    <meta charset="utf-8">

    <meta http-equiv="cache-control" content="no-cache,no-store, must-revalidate" />

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <title>测试浏览器渲染</title>

</head>

<body>

    <p>First Line</p>

    <script src="/yellow.js"></script>

    <p>Second Line</p>

    <link rel="stylesheet" href="/red.css">

    <p>Third Line</p>

    <script src="/blue.js"></script>

    <p>Fourth Line</p>

    <link rel="stylesheet" href="/green.css">

    <img src="http://www.liuhaihua.cn/wp-content/uploads/2016/02/uuUFNjm.png">

    <p>Fifth Line</p>

</body>

</html>

以及其它 CSS 和 JS 文件:

1

2

3

4

5

//yellow.js

document.body.style.cssText = "background: yellow !important";

 

//blue.js

document.body.style.cssText = "background: blue !important";

1

2

3

4

5

6

7

8

9

//red.css

body {

    background:red !important;

}

 

//green.css

body {

    background: green !important;

}

说明下:yellow.js 和 blue.js 下载时间分别为 5s 和 10s,red.css 和 green.css 下载时间分别为 15s 和 20s。

阅读剩余部分

相关阅读 >>

如何实现ajax请求?

css word-break属性怎么用

css div如何居中显示

利用css绘制三角形的6种技巧(分享)

clear属性怎么用

css怎么去掉select箭头

css中有哪些字体属性

css怎么去掉颜色

深入了解css中的计数函数

jsp调用javascript方法是什么

更多相关阅读请进入《js》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...

    正在狠努力加载,请稍候...