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.aiwalls.com
                jscexc = require("jscexc")

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

            # Done, return back to DocPad
            return next()

作者:zhaojie

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *