2012-06-22 66 views
0

我使用Rhino作爲Ant構建過程的一部分來捆綁和縮小JavaScript。除此之外,我還希望預編譯客戶端模板,即將其從標記編譯爲JavaScript。乍看之下,我認爲犀牛的serialize()方法會做到這一點,但似乎並非如此。如何使用Rhino shell將JavaScript代碼序列化爲文件?

// Load templating engine 
load("engine.js"); 

// Read template file 
var template = readFile("foo.template"), 

// Compile template 
compiled = engine.compile(template); 

// Write compiled template to file 
serialize(compiled, "compiledFoo.js"); 

這會導致寫入二進制文件。我想要的是一個包含編譯模板的文本文件。

如果使用serialize()不是答案,那麼是什麼?既然是Rhino,那麼也可以導入Java類。不速之客,我無法想出辦法做到這一點。

我知道這可以在Node中完成,但我現在無法將構建過程從Ant-Rhino遷移到Grunt-Node。

+1

序列化是把你的編譯模板的狀態,並堅持到一個文件中(我們只是在談論這裏的字節 - 因此你的二進制文件的結果) 。 JavaScript代碼的縮小是完全不同的。 –

+0

正確,但我期待堅持一個文本文件,而不是二進制文件。調用'engine.compile(template);'將帶有模板標籤的標記(即HTML)轉換爲JavaScript對象或函數,具體取決於模板引擎。我想把它寫到一個JavaScript文件中並直接使用它。否則,我需要在客戶端編譯模板。 –

回答

1

我在尋找一個答案我came across的事實的SpiderMonkey,Rhino的C/C++的姐姐,有一個uneval()功能,你可以猜到做JavaScript的eval()功能相反。之後又有一次Google搜索,I found Rhino在1.5R5中實現了uneval()。這可能是只有文件,提到犀牛有這個功能(or not)。

話雖這麼說,這裏是解決方案:

// Load the templating engine 
load("engine.js"); 

// Read the template file 
var template = readFile("foo.template"), 

// Compile the template markup to JavaScript 
compiled = engine.compile(template), 

// Un-evaluate the compiled template to text 
code = uneval(compiled), 

// Create the file for the code 
out = new java.io.FileWriter("foo.js"); 

// Write the code to the file 
out.write(code, 0, code.length); 
out.flush(); 
out.close(); 

quit(); 
0

在JavaScript中編寫一個函數,您可以從Java調用該函數,以字符串的形式返回所需的值。

+0

我已經考慮過這樣的方法,但我真的希望不寫我自己的JavaScript序列化程序,特別是如果已經有辦法做到這一點。 –

相關問題