Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2014-03-22) 自己动手写模板引擎 – SharkDart (8) – 在项目中使用及总结(完结)

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

模板引擎用了,我们如何在项目中使用呢?

如何在项目中调用

由于SharkDart是编译型的,将会把模板文件生成一个个dart文件,所以对于我们的程序来说,我们只需要知道这些dart文件的存在,并调用它们的render方法就行了,可以完全忽略模板文件的存在。

比如说,现在在一个web框架里,index.shark被编译成了index.dart,那么我们在controller或者action里,只需要调用:

import "./path/of/index.dart" as view_index;

get('/index', (request, response) {
  var content = view_index.render(user:'Shark');
  response.write(content);
})


相应的`index.shark`跟我们没有任何关系了。

## 自动编译修改过的模板

Shark模板修改后,并不会自动被编译为dart文件,需要我们手动调用一下相关的编译函数。虽然我们可以在SharkDart中加入监视模板目录并自动编译的功能,但是我没做,所以只能先用第三方的方案了,比如[node-supervisor](https://github.com/isaacs/node-supervisor)

node-supervisor可以监视某一个目录的变化,并自动调用另一个脚本。

supervisor -w lib -i lib/packages,lib/gen -n exit -e shark,html -x ./shark0 dummy-but-required-argu


这行命令是说,让supervisor监视`lib`目录中`shark`和`html`类型的文件,但忽略掉`lib/packages`与`lib/gen`目录,并且在发生错误时不退出。每当发现文件变化时,便调用`./shark0`脚本。最后一个`dummy-but-required-argu`只是个占位符,用不上但必须提供,不过你也可以根据自己需求传一个有意义的参数。(不知道最新版的有没有什么变化,我这里引用的是一年前的旧代码)

然后我们可以在`shark0`中加上自己的命令,如调用SharkDart的编译器等:

dart --package-root=packages/ bin/shark_compiler.dart

最后在shark_compiler里,写一个可执行的main(),调用SharkDart提供的compileTemplateDir函数编译指定的模板根目录。

上面所说的是笨办法,如果每个项目都这么做太麻烦了。在dart中也有一些构建工具,如hop,可以让我们自定义一些构建任务,我们可以考虑使用它写一些可复用的任何来做这件事。(我还没有用它实践过,不确定能否满足需求)

总结

到此整个“自动动手写模板引擎”系列就结束了。

这个模板引擎比较简单,技术含量不高,但是可以从中了解到一些基本的思路。有一些套路是固定的,但我们可以选择更合适的工具来实现,比较解析库的选择。

虽然这里实现的是一个简单的模板引擎,但是如何扩展一下,可以用同样的思路去实现一些DSL,甚至一门语言,只是难度会更大。在现在相关工具越来越成熟的情况下,实现对一套语法的解析越来越容易,但是这只是一个开始,还有很多地方需要完善:

留待以后考虑。

(终于以每天一篇的速度,没有辜负大大的嘱托~)

comments powered by Disqus