Contributed by
Ryan Weaver in #22046.
Asset组件 的一个主要功能,就是具有管理程序资源的版本的能力。Asset versions通常用于控制这些资源应如何被缓存。例如,如果你为自己的assets定义了如下配置:
1 2 3 4 5 | # app/config/config.yml
framework:
# ...
assets:
version: 'v2' |
然后在模板中使用了 asset()
功能来引用你的资源:
1 | <img src="{{ asset('images/logo.png') }}" /> |
那么,为图片所生成的URL将会是 /images/logo.png?v2
。这是由 StaticVersionStrategy
类所管理的,它是由Asset提供的内置版本策略(versioning strategies)之一。
在query string中附有某些可以改变的值的静态策略(static strategies)已经淡出,因此开发者需要 使用自定义的Assets版本策略 以便跟上asset versioning的发展趋势。
这就是为什么在Symfony 3.3中我们决定添加一个 全新的基于JSON文件清单的版本策略。这是可被诸如 Webpack 等人气工具所使用的策略,它生成的是一个映射有“全部资源文件名及其相应的输出文件”的JSON文件,例如:
1 2 3 4 5 | {
"css/app.css": "build/css/app.b916426ea1d10021f3f17ce8031f93c2.css",
"js/app.js": "build/js/app.13630905267b809161e71d0f8a0c017b.js"
"...": "..."
} |
路径中的随机字符部分在Webpack中被称为“chunk hash”,它是文件内容的加密。对于长期化的资源缓存来说此为最佳策略,因为这个hash,连同资源路径,将在你于asset文件中做出任何修改时立即改变,并击碎(busting)任何既存的缓存。
为了能在Symfony程序中使用此策略,定义一个全新的 json_manifest_path
asset配置选项:
1 2 3 4 5 | # app/config/config.yml
framework:
# ...
assets:
json_manifest_path: '%kernel.root_dir%/../web/build/manifest.json' |
然后,像以前一样,继续使用 asset()
模板函数:
1 | <link href="{{ asset('/css/app.css') }}"> |
新的版本策略将把链接转换为 <link href="/build/css/app.b916426ea1d10021f3f17ce8031f93c2.css">
,并且将在你改变原始asset文件时立即更新。