Tyl*_*ies 24 javascript rhino spidermonkey ubuntu-10.04
我注意到ubuntu 10.04删除了spidermonkey包.犀牛看起来仍然在那里.犀牛和蜘蛛侠之间有什么区别(除了他们写的是什么语言).他们为什么要删除蜘蛛侠?
小智 18
我担心区别在于它们所写的语言或它的含义.人们使用C/C++编写各种方式(如Firefox),而Java在应用服务器中最为普遍.来自http://en.wikipedia.org/wiki/Rhino_%28JavaScript_engine%29:
Rhino将JavaScript脚本转换为Java类.Rhino既可以编译也可以解释模式.它旨在用于服务器端应用程序,因此没有内置支持通常与JavaScript相关联的浏览器对象.
这里有三个重要的部分.首先,没有DOM(SpiderMonkey也是如此).其次,服务器端是预期用途.您应该能够在您的大企业应用程序中使用Rhino,以便在更加临时的基础上自动化内容.最后,Javascript就像Java类层次结构的其余部分一样成为一个类,您可以与Java类进行交互(请参阅该页面上的代码示例).
简而言之,您可以非常轻松地操作基于POJO/JPA的对象/消息Bean /无论您想要称之为"企业"Java类,都可以在通过Rhino运行的javascript中操作.将此与Jython进行比较,您可以使用Python语法和类与Java进行交互.如果你有一些JavaScript/Python高手在办公室里无所事事,那就很方便.
相比之下,SpiderMonkey更像是LUA.这是一种脚本语言.有什么不同?好吧,我怀疑你可以直接访问printf.您无法直接访问C/C++类,而无法直接访问Java类.相反,您使用C/C++来编写该语言的额外功能.
简而言之,Rhino允许JS与您的代码进行交互.SpiderMonkey更像是一个自己动手编译器套件,其附加优势是许多人都知道已经构建了一种标准语言,您只需要添加自定义语言即可.
由于我很难找到有关JavaScript shell /解释器的基本示例,特别是rhino在Ubuntu上 - 我会在这里发布这个...
基本上,我对安装什么以及调用哪种命令行感到有点困惑:)
首先,我在rhino(Ubuntu)中发现了Bug#705339:"Rhino shell崩溃并出现NullPointerException" - 并意识到OpenJDK实际上安装了一个rhino.jarJava归档文件.所以,如果你有,你可以立即在bash终端shell中做:
$ java -jar /usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar
Rhino 1.7 release 2 2010 11 17
js> print("answer " + 42.0);
answer 42
js> quit()
Run Code Online (Sandbox Code Playgroud)
这对于基本的东西来说已经足够了......但是,如果你想使用DOM window对象或setTimeout()函数 - 本质上,那些是"特定于setTimeout浏览器的实现"(对于,参见SO:7286178),以及没有使用的脚本引擎浏览器不会"知道"他们.
然而,至少rhino,这是由补救Envjs "浏览器环境"库,它的最新版本- 1.2为rhino是env.rhino.js(见SO:6170676为setTimeout中rhino).
所以我们可以这样做:
wget http://www.envjs.com/dist/env.rhino.1.2.js
$ java -jar /usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar
Rhino 1.7 release 2 2010 11 17
js> load('env.rhino.1.2.js');
js: "env.rhino.1.2.js", line 1247: uncaught JavaScript runtime exception: TypeError: Cannot call property getCurrentContext in object [JavaPackage org.mozilla.javascript.Context]. It is not a function, it is "object".
at env.rhino.1.2.js:1247
at <stdin>:2
js> ^C
Run Code Online (Sandbox Code Playgroud)
...和ooops - 它不起作用:)但是,由于getCurrentContext错误,无法运行1.2中阐明了这一点. - Env.js | Google网上论坛:
对不起,Envjs无法运行与java捆绑的rhino.你需要使用1.7rc2从这里:
值得庆幸的是,在Ubuntu中,我们可以直接执行以下操作,而不是从源代码构建:
sudo apt-get install rhino
Run Code Online (Sandbox Code Playgroud)
...因为正如rhino文件列表所述,此软件包安装js-1.7R2.jar.该软件包还安装了一个脚本rhino,它本质上是这些Java档案的shell包装器(请参阅参考资料less $(which rhino)) - 所以我们可以方便地使用它,而不是输入java -jar ...等:
$ rhino
Rhino 1.7 release 2 2010 11 17
js> load('env.rhino.1.2.js'); // takes a while to load
[ Envjs/1.6 (Rhino; U; Linux i386 2.6.38-11-generic; en-US; rv:1.7.0.rc2) Resig/20070309 PilotFish/1.2.13 ]
js> print("loaded " + 1.2);
loaded 1.2
js> window;
[Window]
js> ^C
Run Code Online (Sandbox Code Playgroud)
但是,现在尝试将这些相同的行包含在脚本中,让我们称之为test.js:
load('env.rhino.1.2.js'); // takes a while to load
print("loaded " + 1.2);
print(window);
Run Code Online (Sandbox Code Playgroud)
并尝试呼吁rhino它:
$ rhino test.js
loaded 1.2
js: uncaught JavaScript runtime exception: ReferenceError: "window" is not defined.
Run Code Online (Sandbox Code Playgroud)
亲爱的 - 再次失败,现在怎么样?:)好吧,幸运的是,即使这在Envjs指南中有所暗示(注意:允许该页面使用javascript,否则代码几乎不可见) - 特别是:
#从脚本或命令行运行env.rhino.js
#注意优化设置
java -jar lib/js.jar -opt -1 myscript.js
对 - 最后,我们只需添加此优化设置,并:
$ rhino -opt -1 test.js
[ Envjs/1.6 (Rhino; U; Linux i386 2.6.38-11-generic; en-US; rv:1.7.0.rc2) Resig/20070309 PilotFish/1.2.13 ]
loaded 1.2
[Window]
Run Code Online (Sandbox Code Playgroud)
...最后它的工作原理:)编辑:用env.rhino.1.2.js,你也可以console.log()用来写入stdout.编辑:要运行rhinoJava调试器,请参阅使用less $(which rhino)安装的特定.jars的位置,然后java直接调用(该rhino脚本使用一组不同的命令行开关,因此无法说服它调用调试器):
java -cp /usr/share/java/js.jar org.mozilla.javascript.tools.debugger.Main test.js
Run Code Online (Sandbox Code Playgroud)
如果您现在尝试运行相同的脚本spidermonkey(另请参阅最佳方法中的 PPA说明以获取Ubuntu 11.04上的spidermonkey js),您将获得:
$ js test.js
env.rhino.1.2.js:1247: ReferenceError: Packages is not defined
Run Code Online (Sandbox Code Playgroud)
...也就是说,spidermonkey会不会一起工作env.rhino.1.2.js.
嗯,希望这有助于某人,
干杯!
| 归档时间: |
|
| 查看次数: |
11214 次 |
| 最近记录: |