如何推迟 <head> 渲染?
How to postpone <head> rendering?
我有这样的布局:
@@ layouts/v2.html.ep
<html lang="en">
<head>
%= content_for 'stylesheets'
</head>
<body>
%= include 'layouts/v2/header'
<main class="main">
%= include 'layouts/v2/menu'
<div class="content">
%= content
</div>
</main>
</body>
</html>
@@ layouts/v2/menu
% content_for stylesheets => begin
%= stylesheet 'v2/css/menu.css'
% end
<aside class="menu">
...
</aside>
@@ layouts/v2/header
% content_for stylesheets => begin
%= stylesheet 'v2/css/header.css'
% end
<header class="header">
...
</header>
在这里,当包含模板时,我包含了它们的样式表。
在模板中注意这一点:
% content_for stylesheets => begin
%= stylesheet 'v2/css/menu.css'
% end
但为时已晚,因为 <head>
已经呈现。
作为解决此问题的方法,我可以将 %= content_for 'stylesheets'
从 <head>
移动到页面底部。但我希望先加载样式表。
有没有什么办法可以推迟渲染 'stylesheets' 块的内容,直到渲染整个页面?
UPD
感谢@amon Mojolicous layouts are rendered inside out
。我理解这个问题,对于第一个包含的模板 layout
我手动包含样式表:
@@ layouts/v2.html.ep
<html lang="en">
<head>
%= stylesheet 'v2/css/header.css'
%= stylesheet 'v2/css/menu.css'
%= content_for 'stylesheets'
</head>
<body>
%= include 'layouts/v2/header'
<main class="main">
%= include 'layouts/v2/menu'
<div class="content">
%= content
</div>
</main>
</body>
</html>
因此在任何 rendered/included 模板(布局除外)下一个都可以正常工作:
@@ some/template
% content_for stylesheets => begin
%= stylesheet 'some/template.css'
% end
template content
Mojolicous 布局由内而外呈现,您可以嵌套任意多个布局。
创建一个仅包含最外层文档内容和其他 HTML 样板的模板,并为 <body>
的内容添加一个占位符
<html lang="en">
<head>
%= content_for 'stylesheets'
</head>
<body>
%= content
</body>
</html>
然后您可以将该模板用作 HTML 页面正文的布局。即,像这样使用 layout
助手:
% layout 'outermost_layout';
%= include 'layouts/v2/header'
<main class="main">
%= include 'layouts/v2/menu'
<div class="content">
%= content
</div>
</main>
渲染模板后,Mojolicious 将检查您是否指定了 layout
然后渲染它,使用此模板的输出作为外部布局的 content
。因此,因为最里面的布局首先呈现,所以数据可以从您的模板通过存储流向包装布局。
我有这样的布局:
@@ layouts/v2.html.ep
<html lang="en">
<head>
%= content_for 'stylesheets'
</head>
<body>
%= include 'layouts/v2/header'
<main class="main">
%= include 'layouts/v2/menu'
<div class="content">
%= content
</div>
</main>
</body>
</html>
@@ layouts/v2/menu
% content_for stylesheets => begin
%= stylesheet 'v2/css/menu.css'
% end
<aside class="menu">
...
</aside>
@@ layouts/v2/header
% content_for stylesheets => begin
%= stylesheet 'v2/css/header.css'
% end
<header class="header">
...
</header>
在这里,当包含模板时,我包含了它们的样式表。 在模板中注意这一点:
% content_for stylesheets => begin
%= stylesheet 'v2/css/menu.css'
% end
但为时已晚,因为 <head>
已经呈现。
作为解决此问题的方法,我可以将 %= content_for 'stylesheets'
从 <head>
移动到页面底部。但我希望先加载样式表。
有没有什么办法可以推迟渲染 'stylesheets' 块的内容,直到渲染整个页面?
UPD
感谢@amon Mojolicous layouts are rendered inside out
。我理解这个问题,对于第一个包含的模板 layout
我手动包含样式表:
@@ layouts/v2.html.ep
<html lang="en">
<head>
%= stylesheet 'v2/css/header.css'
%= stylesheet 'v2/css/menu.css'
%= content_for 'stylesheets'
</head>
<body>
%= include 'layouts/v2/header'
<main class="main">
%= include 'layouts/v2/menu'
<div class="content">
%= content
</div>
</main>
</body>
</html>
因此在任何 rendered/included 模板(布局除外)下一个都可以正常工作:
@@ some/template
% content_for stylesheets => begin
%= stylesheet 'some/template.css'
% end
template content
Mojolicous 布局由内而外呈现,您可以嵌套任意多个布局。
创建一个仅包含最外层文档内容和其他 HTML 样板的模板,并为 <body>
<html lang="en">
<head>
%= content_for 'stylesheets'
</head>
<body>
%= content
</body>
</html>
然后您可以将该模板用作 HTML 页面正文的布局。即,像这样使用 layout
助手:
% layout 'outermost_layout';
%= include 'layouts/v2/header'
<main class="main">
%= include 'layouts/v2/menu'
<div class="content">
%= content
</div>
</main>
渲染模板后,Mojolicious 将检查您是否指定了 layout
然后渲染它,使用此模板的输出作为外部布局的 content
。因此,因为最里面的布局首先呈现,所以数据可以从您的模板通过存储流向包装布局。