public function JsCollectionRenderer::render in HTTP/2 Server Push 8
Renders an asset collection.
Parameters
array $assets: An asset collection.
Return value
array A render array to render the asset collection.
Overrides AssetCollectionRendererInterface::render
File
- src/
Asset/ JsCollectionRenderer.php, line 48
Class
- JsCollectionRenderer
- Decorates the JS collection renderer service, adds Server Push.
Namespace
Drupal\http2_server_push\AssetCode
public function render(array $js_assets) {
$elements = $this->jsCollectionRenderer
->render($js_assets);
$request = $this->requestStack
->getCurrentRequest();
$link_headers = $request->attributes
->get('http2_server_push_link_headers', []);
foreach ($elements as &$element) {
if (!static::isScript($element)) {
continue;
}
// Locally served JS files that are sent to all browsers can be pushed.
if (isset($element['#attributes']['src']) && static::hasRootRelativeUrl($element, 'src') && static::isUnconditional($element)) {
$link_header_value = '<' . $element['#attributes']['src'] . '>; rel=preload; as=script';
$link_headers[] = $link_header_value;
// @todo When this is moved into Drupal core, consider allowing bubbling
// of bubbleable metadata from the return value of
// \Drupal\Core\Render\HtmlResponseAttachmentsProcessor::processAssetLibraries
// so this line of code can work, which would mean we would no longer
// need to use request attributes. (The problem is that a key assumption
// is that rendering set of asset libraries to HTML that loads CSS/JS,
// no further attachment bubbling happens. That's a fine assumption, but
// this module is the first and sole exception.)
/*
$element['#attached']['http_header'][] = ['Link', $link_header_value];
*/
}
}
$request->attributes
->set('http2_server_push_link_headers', $link_headers);
return $elements;
}