Perl: Javascript::V8模板-来自Perl



寻找像HTML::Mason(或Mason)这样的模板引擎,所以什么将源组件"编译"成perl代码,而不是perl代码将组件"编译"成JavaScript代码,然后用JavaScript::V8 perl模块运行/执行它们。

动机:寻找安全的模板语言的解决方案,可以编辑用户而不损害服务器安全性。JavaScript是一种功能齐全的语言,所以使用它可能比像TT或类似的"迷你语言"更好/更快。对我来说,最好的方法是对Mason进行扩展(重写),以便编译成Moose/JavaScript,而不是Moose/Perl。;)

是的,我想用Javascript::V8从perl中完成这个,因为这样可以通过Javascript::V8以非常安全的方式使用所有perl的功能。

问题:

  • 有人知道吗?(在CPAN中没有发现任何内容)…

编辑:在Mason中你可以写

% #perl version
% my(@list) = qw(Jane John Doe);
<ul> 
% foreach my $item (@list) { 
  <li><% uc($item) %></li> 
% } 
</ul>

将有可能在JS中编写上述内容,如:

% //javascript version
% var list = ["Jane", "John", "Doe"];
<ul> 
% for(var i in list) {
  <li><% perl_uc($list[i]) %></li>
  <!-- the "perl_uc" is the real perl uc() what is binded
       with Javascript::V8::bind_function(perl_uc => sub { return uc(@_) }
  -->
% } 
</ul>

上面的源代码应该被"编译"成JavaScript (Joose),并使用JavaScript::V8执行。(和Mason一样——源代码被编译成perl/Moose对象,然后用perl执行)…

可以看到,for(var i in list)是用纯JS编写的,而不是用"mini-language"编写的…

时隔多年重访编辑:)

这是EJS::模板。它完全符合您的要求-将模板编译成JS并使用V8(甚至JE)引擎进行评估。不幸的是,还没有Javascript::Duktape引擎支持。

此外,这里有一个如何使用Jemplate(服务器端)从伟大的 @ yth的答案与Duktape引擎的片段。

use strict;
use warnings;
use Jemplate;
use JavaScript::Duktape;
# can omit these steps - see bellow 
# Get the lite runtime js-source without the unnecessary AJAX  (we are server side)
my $jemp_runtime = Jemplate::runtime_source_code('lite');
# The Template::Toolkit template
my $template = q{
[%- FOREACH pope IN perlmonks -%]
pope: [% pope.name %] = [% pope.experience %]
[% END -%]
};
# compile the Template source using Jemplate and name it
my $jemp_template = Jemplate->compile_template_content($template, 'monkstemplate');
# the data
my $data = {
    'perlmonks' => [
        { 'name' => 'vroom',    'experience' => '1007479', },
        { 'name' => 'BrowserUk','experience' => '167247', },
        { 'name' => 'Corion',   'experience' => '133975', },
        { 'name' => 'ikegami',  'experience' => '128977', }
    ]
};
# init
my $js = JavaScript::Duktape->new();
$js->set( 'write' => sub { print $_[0]; } );
$js->eval($jemp_runtime);   # eval the runtime code
$js->eval($jemp_template);  # the Template code compiled into JS
$js->set("monkdata", $data);# bind the data
# finally eval the template processing code
$js->eval(q!
    write(
        Jemplate.process('monkstemplate', monkdata)
    );
!);

生产

pope: vroom = 1007479
pope: BrowserUk = 167247
pope: Corion = 133975
pope: ikegami = 128977 

您可以省略所有的Jemplate调用,通过事先使用jemplate命令编译模板,如:

jemplate --runtime=lite --compile /path/to/templates > jemplate_source.js

加载jemplate_source.js并在JS引擎中求值。

只是为了说明:在我的笔记本上,使用原始的TemplateToolkit,我得到了10k/秒。以上Jemplate/Duktape仅5k/秒。

我原来的回答:

这是由Tenjin模板系统衍生出来的Shotenjin。(perl Tenjin在这里。

Shotenjin是基于joose的,所以有一些额外的工作将可能使用Shotenjin从perl与Javascript::V8。但它仍然不是你想要的。

编辑:你所看到的已经完成了——不幸的是,对于RUBY来说。https://github.com/elado/isotope

EDIT2:刚刚发现:这里是模板::JavaScript什么是TT编译成JS和v8服务器端执行…

Jemplate

(也就是说,我完全不同意你的前提"Javascript是一种功能齐全的语言,所以使用它可能比一些像TT或类似的"迷你语言"更好/更快"-在我看来,绝对没有理由去做你所要求的。)

相关内容

  • 没有找到相关文章

最新更新