2012-09-08 16 views
1

我想知道是否有人试图将编译实现CommonJS API(require())的JavaScript文件编译成本地Java代码。将需要CommonJS功能的JavaScript编译为本地Java

我现在有一个网站,我的建筑,将使用类似这样的一个文本编辑器,计算器开源(WMD编辑器的端口): http://code.google.com/p/pagedown/

该项目自带一些JavaScript文件,它将编辑器的标记语言清理并转换为有效的HTML。

在Rhino 1.7R4上玩了一段时间后,我已经设法在运行时加载JavaScript文件/模块,并且能够在需要时执行require函数。

但是,我宁愿将这些脚本预编译为本机Java代码。我已经成功地编译脚本单不使用CommonJS的功能,下面这个犀牛DOC:

https://developer.mozilla.org/en-US/docs/Rhino/JavaScript_Compiler

但我在茫然,编译实现CommonJS的功能多依赖脚本的正确方法,而犀牛本身并没有很好的记录。

这个想法是有本地Java代码的标记转换和sanitisation,没有编写/维护两个不同的代码库的转换成本(通过只是将JS转换为JAVA)。

干杯

+0

可能重复(http://stackoverflow.com/questions/11074836/resolving-modules-using-require-js-and-java-rhino ) –

回答

0

RingoJS可以做这样的事情:

林戈实现了CommonJS的模块规范。简而言之,这意味着:

每个JavaScript文件都被视为一个生活在自己顶级范围内的模块。

附加到模块导出对象的任何函数或属性都将被公开。

require()函数返回模块的exports对象。

如果给定的标识符字符串以./或../开头,Ringo的模块加载程序将搜索文件并尝试加载它。因此require('./ foo')建议Ringo加载文件./foo.js作为模块。

否则Ringo会在模块路径的每个文件夹中查找模块。

模块路径是Ringo将查找模块的标准位置的列表。

模块路径可以通过以下方法进行设置:

设置RINGO_MODULE_PATH环境变量。

设置ringo.modulepath Java系统属性。

对ringo命令行工具使用-m或--modules选项。

在JsgiServlet中使用模块路径servlet初始参数。

将要素添加到require.paths或从Ringo内部删除类似数组的属性。

软件包提供了将几个模块和其他资源捆绑到一个单元中的方法。包是包含package.json包描述符文件的目录。在的package.json描述符中的主要属性是由Ringo的模块加载器识别为主要切入点模块:

{ 
    "main": "lib/main.js" 
} 

如果一个模块ID直接解析为一个程序包目录的package.json定义一个主要的属性,Ringo会尝试加载指定的资源。主属性的值必须是相对于包根的路径。

如果模块ID解析为不包含package.json文件的目录,或者package.json未定义主属性,则Ringo将尝试在该目录中加载文件index.js。

如果模块id的一部分解析为包目录,Ringo将尝试解析该包的lib目录的id的剩余部分。 lib目录的位置可以使用package.json中的directories.lib属性重写。

{ 
    "directories": { 
     "lib": "new-lib" 
    } 
} 

的CommonJS的模块规范保持故意小。 Ringo为出口和进口产品提供了一些额外的细节。使用这些代码的缺点是代码与Ringo绑定,但将代码转换为“纯粹的”CommonJS相对容易,并且还有一个用于此目的的命令行工具。

一个Ringo扩展是包含功能。这与require相似,但不是将其他模块的exports对象作为整体返回,而是直接将其每个属性复制到调用模块的作用域,使它们像本地定义的那样可用。

包括非常适合外壳工作和快速脚本,其中打字经济至关重要,这就是它的意义。将它用于大型,长期生活的程序通常不是一个好主意,因为它隐藏了程序中使用的顶级函数的起源。

为此,它更建议使用需要组合使用JavaScript 1.8解构赋值明确包括在局部范围从另一个模块中选择属性:

var {foo, bar} = require("some/module"); 

以上陈述进口直接在调用范围内由“some/module”导出的API的“foo”和“bar”属性。

用Ringo编写命令行脚本非常简单。

ringo [script-file] [script-arg1] [script-arg2] ... 

林檎加载脚本文件,并提供经由系统模块的args数组参数:每个任意的JavaScript文件可以为[脚本文件]参数向林檎命令被传递。 args数组中的第一个元素是脚本文件的名称。

参考