Contributed by
Kévin Dunglas
in #21478.
一个和 HTTP/2 所推荐的用于“改善页面加载”的最相关新功能就是 Server Push。HTTP/2 Push允许web服务器在浏览器在获得资源请求之前就发送那些资源。
在Symfony 3.3中我们添加了 对web assets的HTTP/2 Push支持 (CSS, JS, images) 以允许预加载在 Preload W3C Working Draft 中所描述的资源。实践中,为了在使用时遵循传统的Symfony哲学,通过把你的资源用全新的 preload()
函数进行打包,可以开启此功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <head>
{# by default, assets are pushed / 默认时,资源被推送 #}
<link href="{{ preload(asset('/css/app.css')) }}">
{# ... but you can disable pushing / 但你可以关闭之... #}
<link href="{{ preload(asset('/css/app.css'), { nopush: true }) }}">
{# ... and you can also explicit the asset type / 你还可以显式表达资源类型 #}
<link href="{{ preload(asset('/css/app.css'), { as: 'style' }) }}">
...
</head>
<body>
...
<script src="{{ preload(asset('/js/app.js')) }}"></script>
</body> |
背后的事情是, preload()
函数添加了一个 Link
HTTP header,这个头由兼容HTTP/2的中间代理(intermediate proxies)进行处理:
1 2 3 4 | HTTP/1.1 200 OK
Content-Type: text/html
...
Link: </css/app.css>; rel=preload,</cjs/app.js>; rel=preload |
使用此巧的一个额外奖励是,所有这些资源的下载将只会使用一个连接,极大地提高了页面速度。