首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl: Javascript::V8模板-来自perl

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

Stack Overflow用户
提问于 2011-07-10 16:01:24
回答 2查看 911关注 0票数 7

寻找像HTML::Mason (或Mason)这样的模板引擎,那么什么“编译”源代码到perl代码中,而不是perl -代码将组件“编译”成JavaScript代码,并在使用Javascript::V8perl模块运行/执行它们之后。

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

是的,希望使用Javascript::V8从perl中实现这一点,因为这种方式可以通过Javascript::V8 $context->bind_function以非常安全的方式获得所有perl的功能。

问题:

  • 有人知道类似的事吗?(在CPAN中什么也没有发现)..。

编辑:例如,在Mason中,您可以编写

代码语言:javascript
复制
% #perl version
% my(@list) = qw(Jane John Doe);
<ul> 
% foreach my $item (@list) { 
  <li><% uc($item) %></li> 
% } 
</ul>

如果有可能在JS中编写上面的内容,那就太好了,比如:

代码语言:javascript
复制
% //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”…编写的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-10 18:55:45

几年后重新审查和编辑:)

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

另外,下面是如何使用Jemplate (服务器端)的代码片段,它来自于great @ysth对Duk磁带引擎的回答。

代码语言:javascript
复制
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)
    );
!);

产生

代码语言:javascript
复制
pope: vroom = 1007479
pope: BrowserUk = 167247
pope: Corion = 133975
pope: ikegami = 128977 

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

代码语言:javascript
复制
jemplate --runtime=lite --compile /path/to/templates > jemplate_source.js

只需加载jemplate_source.js并在JS引擎中对其进行评估。

请注意:在我的记事本上,使用原始的TemplateToolkit,我得到了10k/秒。上面的Jemplate/Duk磁带只有5k/秒。

我最初的回答是:

以下是从Tenjin模板系统派生出来的肖滕金。( perl 天进来了

Shotenjin是基于joose的,因此,通过一些附加的工作,可以使用来自perl的Shotenjin和Javascript::V8。但对于你所看到的还是不够精确的。

编辑:对于你正在寻找的已经完成了-不幸的是,对于RUBY。https://github.com/elado/isotope

EDIT2:刚刚发现:这里是模板:JavaScript,TT编译成JS并在v8服务器端执行.

票数 9
EN

Stack Overflow用户

发布于 2011-07-10 16:37:52

喷射板

(尽管如此,我完全不同意你的假设:"Javascript是功能齐全的语言,所以使用它可能比TT或类似的一些“迷你语言”更好/更快“-我绝对没有理由照你的要求去做。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6642108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档