我可以使用 Mojolicious 构建静态网站吗?

2024-01-10

是否可以使用Mojolicious模板系统来构建静态网站?

我正在尝试使用这样的(骨架)脚本:

use Mojo::Template;
use Mojolicious::Plugin::DefaultHelpers;
use Mojolicious::Plugin::TagHelpers;

my $mt = Mojo::Template->new;
print $mt->render_file('index.html.ep');

Where index.html.ep是这样的:

% layout 'default';
This is a foo

但是我收到一条错误消息:

String found where operator expected at index.html.ep line 1, near "layout 'default'"
    (Do you need to predeclare layout?)
syntax error at index.html.ep line 1, near "layout 'default'"
1: % layout 'default';
2: This is a foo

显然,如果我省略% layout 'default';一切都很好,但能够重用片段和布局才是重点。

I know我可以使用模板工具包或其他一些模板系统,但如果可能的话,我想避免使用多个系统的认知摩擦。

我还知道我可以启动 mojolicious 作为服务器并获取所有页面,但这似乎有点过头了。

这里有什么帮助吗?


您可以在 Mojolicious Web 框架之外使用 Mojo 模板 - 我曾经这样做来为我的博客呈现静态页面。但是,那Mojo::Template默认情况下不附带普通助手。相反,Mojolicous 的其余部分将变量和助手注入到模板中。

对于我的博客,我决定实现自己的帮助系统。我将在本答案的其余部分中描述我的解决方案。 Mojo 可能同时发生了变化,并且可能更喜欢一些不同的解决方案。

我将模板建模为一对stash引用和 Mojo::Template 对象。每个模板都被编译成它自己的包。稍后,我们可以将临时值注入到存储引用中并将值传递给外部。助手是特定存储引用的闭包,因此它可以在不使用显式参数的情况下访问这些值。

以下是模板的编译方式:

package AMON::Blog::TemplateCollection;

sub add_template($self, $name, $source) {
    state $namespace_id = 0;
    my $namespace = Package::Stash->new(
        __PACKAGE__ . '::Namespace::' . ++$namespace_id);

    my $template = Mojo::Template->new(
        name => $name,
        namespace => $namespace->name,
        auto_escape => 1,
        tag_start => '{{',
        tag_end => '}}',
    );

    # enter the helpers into the namespace
    my $stash_ref = \{};
    while (my ($name, $code) = each %{ $self->helpers }) {
        $namespace->add_symbol('&' . $name => $code->($stash_ref));
    }

    $template->parse($source);

    $self->templates->{$name} = {
        stash_ref => $stash_ref,
        template => $template
    };

    return;
}

这里有一个layout将请求的布局写入存储变量的帮助器:

layout => sub ($stash_ref) {
    return sub ($name, %args) {
        if (my $existing = $$stash_ref->{layout}) {
            croak sprintf q(Can't change layout from "%s" to "%s"), $existing->{name}, $name;
        }
        $$stash_ref->{layout} = { name => $name, args => \%args };
    };
},

外部接头仅用于关闭$stash_ref,并在上面的模板编译期间执行。

为了渲染模板,我们提供临时存储值,然后处理 Mojo::Template。如果存储包含布局参数,我们会递归以当前模板的输出作为内容来渲染布局模板:

sub render($self, $name, %args) {
    my $template = $self->templates->{$name}
        // croak qq(Unknown template "$name");

    my ($stash_ref, $template_object) = @$template{qw/stash_ref template/};

    $$stash_ref = {
        name => $name,
        layout => undef,
        args => \%args,
    };

    my $result = $template_object->process();

    my $layout_args = $$stash_ref->{layout};
    $$stash_ref = undef;

    if (blessed $result and $result->isa('Mojo::Exception')) {
        die $result;
    }

    if ($layout_args) {
        my $name = $layout_args->{name};
        my $args = $layout_args->{args};
        return $self->render($name, %$args, content => $result);
    }

    return $result;
}

这种方法并不是非常优雅,但它不需要引入 Mojolicious 的所有其余部分(特别是控制器,这对于静态站点来说毫无意义)就可以工作。一段时间后,我切换到另一个模板引擎,它支持开箱即用的模板继承,而无需如此广泛的解决方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用 Mojolicious 构建静态网站吗? 的相关文章

  • Web 开发中的 Perl [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么这个特定 Perl 脚本的线程版本比非线程版本慢 200 倍?

    A 推介会 http migo sixbit org papers Perl Threads by 米哈埃尔 戈伊克曼 http migo sixbit org 2003 年 Perl 会议上的文档包含两个质数查找脚本的示例 One htt
  • 在 Perl 中查找数组的大小

    我似乎遇到过几种不同的方法来查找数组的大小 这三种方法有什么区别呢 my arr 2 print scalar arr First way to print array size print arr Second way to print
  • 我们应该聘请用 Perl 编写 C 的人吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的一位同事最近面试了一些求职者 其中一位说他们有非常好的 Perl 经验 由于我的同事不懂 Perl 他要求我对那位潜在雇员编写的 场外 一些代码进
  • Log4Perl 将多个程序的日志记录捆绑到一个日志中

    CPAN 上是否有任何 Logger 它允许我将多个程序的日志捆绑到一个文件中 并在两个程序同时运行并并行调用 log4Perl 时同步并行日志记录 背景是我使用一个自定义附加程序来写入电子邮件 我想将所有电子邮件捆绑在一个文件中作为备份
  • perl:正确的“内容类型”格式以返回“图像数据 uri”

    我有一个模板angularjs期待着image data uri由通过调用的服务器调用返回src的属性img模板的元素 img width 200px height 200px src http localhost 3000 returni
  • 哪些字符可以用作正则表达式分隔符?

    哪些字符可以用作 Perl 正则表达式的分隔符 m re m re and m re 一切似乎都有效 但我想知道所有可能性 From perlop http perldoc perl org perlop html 通过 m 您可以使用任意
  • api网关CORS设置

    我正在尝试在部署脚本中使用 aws cli 从命令行设置 aws CORS 我使用以下 perl to shell 命令创建了 POST 资源 我正在尝试将集成响应设置为 就像启用核心一样 aws apigateway put method
  • SFTP文件同时上传和下载

    cronjob 每 3 小时运行一次 使用 SFTP 下载文件 调度程序是用Perl编写的 使用的模块是Net SFTP Foreign Can the Net SFTP Foreign下载仅使用 SFTP 部分上传的文件 如果是这样 我们
  • 使用 Perl 写入文件的最简单方法是什么?

    目前我正在使用 system echo panel login panel password root name root pass port panel type gt gt home shared ftp 使用 Perl 做同样的事情最
  • Perl 中的“@_”有什么作用?

    我浏览了一些我在 Perl 类中编写的代码 我注意到了这一点 my string my stringarray split string 我想知道两件事 变量位于括号中的第一行 这是声明多个变量时所做的事情 如果我删除它们 它仍然可以正常工
  • 在 Objective-C 中使用 perl?

    CPAN 有大量非常有用的库 除了将它们移植到 Objective C 之外 是否还有在 iOS 上将 Perl 代码嵌入到 Objective C 中的方法 我对使用特别感兴趣电子表格 阅读 http kobesearch cpan or
  • 有没有对数字(千)进行分组的函数?

    小 模块中是否隐藏着一个函数 它为我执行此操作 my var 23654325432 var reverse var var s d 3 K d g var reverse var I like 数字 格式 http search cpan
  • 如何从 Perl 中的 Subversion 预提交挂钩访问提交的文件?

    我需要执行以下操作 用 Perl 编写预提交钩子 Hook 应检查所有提交的文件是否存在某些文本 如果未找到该文本则失败 基本上 我需要一个读取正在提交的文件的 Perl 钩子示例 我真的在寻找一些代码量最少的优雅解决方案 笔记 钩子应该使
  • Perl LWP::简单 HTTPS 错误

    我正在尝试获取网站的内容并打印 该代码按照我希望的方式在常规 HTTP 网站上运行 但它不适用于 HTTPS 我已经查找了此问题的修复程序 但它们在我的程序中不起作用 这是我目前拥有的代码 usr bin perl use strict u
  • Perl Moose TypeDecorator 错误。我该如何调试?

    我最近遇到了一个问题 非常感谢您的见解 我在圣诞节前在 PerlMonks 上发布了类似的问题 并提供了一些从 MooseX Declare 切换的反馈 http www perlmonks org node id 877703 1 我现在
  • 合并 Perl Hashref 和 unique

    我有两个 Perl 哈希值 内容如下 First VAR1 name1 gt adam bob name2 gt Miller Schumacher Second VAR1 name1 gt tina jason jeff
  • 这可以一行完成吗?

    我像这样提取MAC地址 my tmp split domain 123 123 123 123 at 00 11 22 33 44 55 ether on eth0 my vip tmp 3 但不使用临时变量可以完成吗 是的 它可以 my
  • 使用perl,在每行都有相同单词的情况下如何选择最后两行?

    Bini 21 89753 20 47853 20 27835 18 34952 16 23454 Bini 16 89753 14 47853 13 27835 12 34952 11 23454 Bini 10 09014 我的文件有一
  • Path::Class::File 或 ::Dir & Moose 初始化和强制

    目前有 package Local use warnings use Moose use Method Signatures Simple use Path Class File use Path Class Dir method buil

随机推荐

  • 在 JavaScript 中创建隐藏字段

    如何在 JavaScript 中将隐藏字段创建为特定的表单
  • 神秘的CloudFront“错误请求”

    我已经设置了一个新的域和 Web 服务器 以及一个为其提供服务的 CloudFront 发行版 CloudFront 已成功在其自己的域上为站点提供服务 d1lnegrqin0up5 cloudfront net 我希望 mpe io 不带
  • 为什么 MongoDb 不将我的斜杠存储在该字符串中?

    谁能告诉我为什么这个命令在 MongoDB shell 客户端不起作用 db coll update live true set mask D D D D D D D D false true but db coll findOne id
  • Unicode 符号和操作系统/浏览器字体支持

    有很多精彩的 unicode 符号 这真太了不起了 但如果我不知道我的用户的字体是否支持它们 它们就毫无用处 我怎样才能找到它 我可以跟踪用户的字体是否支持 unicode 符号吗 有什么办法可以有某种后备吗 如果不支持此 unicode
  • Microsoft.Practices.ServiceLocation 来自哪里?

    有谁知道哪里Microsoft Practices ServiceLocation来自 这是 MS EnterpriseLibrary 中使用的命名空间和 dll 诚然 这是一个非常简单的 dll 只有少数类 使用反射器 但我找不到它的已发
  • 动态改变admob横幅尺寸

    事情是这样的 你可能知道 Admob 有一个AdSize 函数 你把它放在哪里Banner要显示横幅广告和平板电脑横幅的 AD banner 我想要做的是获取设备的屏幕尺寸 以便我可以将其放入 if 语句中 然后为正确的设备放置正确的横幅
  • 如何设置全局CURL速率(速度)限制?

    我环顾四周寻找 CURL 设置文件 但在 etc 中没有找到它 并且在curl 站点 ether 上也没有找到太多 所以基本上我想要做的就是设置curl可以上传的最大速度限制 无论有多少个实例正在运行 以便我的服务器有一些上传能力留给其他任
  • python 子进程正在覆盖用于标准输出的文件 - 我需要它附加到文件(Windows)

    我想附加STDOUT of subprocess call 到现有文件 我下面的代码覆盖该文件 log file open log file path r cmd r echo some info for the log file subp
  • 缩进多行标签

    我有以下自动生成的 HTML http jsfiddle net BrV8X http jsfiddle net BrV8X 使用 CSS 缩进标签以便单选按钮下方有一些空白的建议方法是什么 label display block marg
  • geom_smooth 自定义线性模型

    一边看着this https stackoverflow com questions 44766497 plotting multiple regression lines based on a variable in rs ggplot2
  • 如何隐藏winforms numericUpDown控件上的箭头?

    为了隐藏箭头 我添加了 numericUpDown Controls 0 Hide 它隐藏了箭头 但在打开表单时留下了空白 如何将它们隐藏为像简单的文本框一样 您可以通过访问 numericUpDown 来隐藏箭头Controls财产 您可
  • 按需复制 Google 电子表格

    我创建了一个相当复杂的 Google 电子表格 我希望用户能够单击按钮或点击链接 并获取此电子表格的副本 他们可以在其中填写数据 我稍后会检查手动处理这些数据 无论如何 我可以通过复杂的链接或一些 JavaScript 甚至可能使用服务器端
  • VS Code 中的快速文本滚动

    我正在 macOS 上测试 Visual Studio Code 想知道是否有可以加快滚动速度的组合键 例如 我需要这个来快速从代码的早期部分转到文件末尾的部分 e g in Emacs when I hold up down arrow
  • 使用 Bootstrap 3 如何隐藏表中的列?

    我试图在我的响应式设计中隐藏列col xs and col sm 我首先尝试使用hidden xs hidden sm类 但这不起作用 我也尝试过使用visible desktop正如这里提到的 Twitter Bootstrap 响应式
  • 在特定的 Woocommerce 产品类别档案页面上显示产品属性

    我想在类别页面上显示两个属性 仅在特定类别上显示属性名称和值 我发现的这段代码显示了属性的标签 但复制了值 我真的很难显示类别变量 任何帮助是极大的赞赏 代码 add action woocommerce after shop loop i
  • 将泛型参数与 impl 中的关联类型相匹配

    我有一个具有关联类型和通用结构的特征 trait Generator type Foo fn generate self gt Self Foo struct Baz
  • Eclipse RCP 应用程序中的项目特定首选项页面

    我想为我们的产品启用基于项目的首选项对话框 我偶然发现了两个不同的问题 我如何存储这些项目相关信息 作为一种有根据的猜测 我会尝试这个 IPreferenceStore store new ScopedPreferenceStore new
  • 找出SQL查询的历史记录

    在服务器上执行了更新SQL查询 导致后来出现很多问题 如何获取过去 2 个月执行的更新查询的列表 以便我可以准确跟踪有问题的 SQL 查询 select v SQL TEXT v PARSING SCHEMA NAME v FIRST LO
  • 如何在 SwiftUI NavigationLink 中删除不透明动画

    当点击 NavigationLink 时 它会稍微降低不透明度 有没有办法禁用此功能 我尝试使用 buttonStyle PlainButtonStyle 但这并没有达到预期的效果 它嵌入在滚动视图中 在可定制性方面优于列表 ScrollV
  • 我可以使用 Mojolicious 构建静态网站吗?

    是否可以使用Mojolicious模板系统来构建静态网站 我正在尝试使用这样的 骨架 脚本 use Mojo Template use Mojolicious Plugin DefaultHelpers use Mojolicious Pl