Mojolicious模板渲染(十六)

一、将资产与插件绑定

模板和静态文件等资产可以很容易地与插件绑定在一起。我们先执行如下的命令,以创建js和html静态文件:

$ mojo generate plugin AlertAssets
$ mkdir Mojolicious-Plugin-AlertAssets/lib/Mojolicious/Plugin/AlertAssets
$ cd Mojolicious-Plugin-AlertAssets/lib/Mojolicious/Plugin/AlertAssets
$ mkdir public
$ echo 'alert("Hello World!");' > public/alertassets.js
$ mkdir templates
$ echo '%= javascript "/alertassets.js"' > templates/alertassets.html.ep

我们最好基于插件的名字来起一个唯一的名称,然后调用register时,将它们各自的目录添加到搜索路径列表中:

package Mojolicious::Plugin::AlertAssets;
use Mojo::Base 'Mojolicious::Plugin', -signatures;

use Mojo::File qw(curfile);

sub register ($self, $app, $conf) {

  # 增加 "templates" 和 "public" 目录
  my $base = curfile->sibling('AlertAssets');
 #这是唯一名字
  push @{$app->renderer->paths}, $base->child('templates')->to_string;
 #将目录加入搜索路径列表中
  push @{$app->static->paths},   $base->child('public')->to_string;
 #将目录加入搜索路径列表中
}

1;

一旦我们安装并加载了插件,这两个(js和html的静态文件)都将像普通的template和pulic目录一样工作,只是优先级稍微低一些:

use Mojolicious::Lite;

plugin 'AlertAssets';

get '/alert_me';

app->start;
__DATA__

@@ alert_me.html.ep
<!DOCTYPE html>
<html>
  <head>
    <title>Alert me!</title>
    %= include 'alertassets'
  </head>
  <body>You've been alerted.</body>
</html>

上面的代码例子的工作原理与插件放置于DATA节绑定是一样的:

package Mojolicious::Plugin::AlertAssets;
use Mojo::Base 'Mojolicious::Plugin', -signatures;

sub register ($self, $app, $conf) {

  # Append class
  push @{$app->renderer->classes}, __PACKAGE__;
  push @{$app->static->classes},   __PACKAGE__;
}

1;
__DATA__

@@ alertassets.js
alert("Hello World!");

@@ alertassets.html.ep
%= javascript "/alertassets.js"

标签