当前位置:编程学习 > JS >>

Jscex预编译器及其DocPad插件

需求本身会是最好的动力。上个周末除了忙于构建Jscex主站以外,我还重新整理了Jscex的预编译器——或者说是AOT编译器。Jscex自带一个JIT编译器,配合eval可以在开发时避免额外的编译过程,这也可以说是Jscex的亮点之一。不过对于线上环境,一般都还是建议进行预编译,也就是将Jscex方法定义直接替换为目标代码。这么做的好处主要是为了降低部署时的脚本体积(摆脱对编译器的依赖所有代码加起来不到4KB),或是让异常情况下的错误定位变得容易(主要面向Node.js生产环境)。此外,为了便于编写文档,我还为DocPad开发了一个插件,用于对Jscex脚本进行预编译。

与其他Jscex的包不同,Jscex预编译器的定位不是一个Jscex模块,而是一个独立的工具。因此,它的第一种使用方式是作为一个命令:

> npm install jscexc
...

> node node_modules/jscexc
Usage: node ./node_modules/jscexc --input <input_file> --output <output_file>

Options:
  --input, -i   The input file   [required]
  --output, -o  The output file  [required]

Missing required arguments: input, output但其实最好是将这个包构造为一个可以直接执行的命令,但我还不是还不是很清楚如何让它像mocha那样同时支持Windows和*nix,所以暂时还没去实现。等搞定这个问题之后,就可以像下面这样使用jscexc命令了:

> [sudo] npm -g install jscexc
...

> jscexc --input test.js --output test.aot.js于是这样便能将test.js的内容转化为test.aot.js,其中的Jscex方法定义都会被直接替换成目标代码。

这么做便达到了预编译的效果,但Jscex预编译器同样可以当作模块使用。例如,我在编写首页示例的时候,我就利用DocPad提供的插件机制,直接将*.jscex文件经过预编译,转化为最终的JavaScript代码:

# Export Plugin
module.exports = (BasePlugin) ->
    # Define Plugin
    class JscexcPlugin extends BasePlugin
        name: "jscexc"
       
        # Render some content
        render: (opts, next) ->
            # Prepare
            {inExtension, outExtension, templateData, file} = opts

            # Check extensions
            if inExtension in ["jscex"] and outExtension in ["js"]
                # Requires   www.zzzyk.com
                jscexc = require("jscexc")

                # Render
                opts.content = jscexc.compile(opts.content)

            # Done, return back to DocPad
            return next()


作者:zhaojie
补充:web前端 , JavaScript ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,