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

使用此巧的一个额外奖励是,所有这些资源的下载将只会使用一个连接,极大地提高了页面速度。