在没有浏览器的情况下执行JavaScript?主要答案补遗

2022-08-30 04:15:17

我正在研究没有浏览器的Javascript编程。我想从Linux或Mac OS X命令行运行脚本,就像我们运行任何其他脚本语言(ruby,php,perl,python...)一样。

$ javascript my_javascript_code.js

我研究了蜘蛛猴(Mozilla)和v8(谷歌),但这两个似乎都是嵌入的。

是否有人使用Javascript作为脚本语言从命令行执行?

如果有人好奇我为什么要研究这个问题,我一直在研究node.js。node.js的性能让我怀疑javascript是否是处理大数据的可行脚本语言。


答案 1

主要答案

是的,为了回答您的问题,可以从命令行使用JavaScript作为“常规”脚本语言,而无需浏览器。由于其他人还没有提到它,我认为它值得一提:

在基于 Debian 的系统(至少包括 Ubuntu、Linux Mint 和 aptosid/sidux)上),除了安装 Rhino 和其他已经提到的选项之外,你还有其他选择:

  • 安装libmozjs-78-0软件包,它将在命令行上为您提供Mozilla的Spidermonkey引擎,作为一个简单的,也可以用作交互式解释器。(名称中的表示它对应于 Firefox 的版本 24)。js2424

  • 安装libv8-dev软件包,它将为您提供Google的V8引擎。作为其示例之一,它具有可以非常简单地解压缩和编译的文件(例如,)。/usr/share/doc/libv8-dev/examples/shell.cc.gzg++ -Os shell.cc -o shell -lv8

  • 安装软件包nodejs,它将既可以作为可执行文件使用,也可以作为替代文件(在 Debian 意义上)来提供可执行文件。JIT 编译由 V8 提供。nodejsjs

  • 安装 libjavascriptcoregtk-4.0-bin 软件包,并从命令行使用 WebKit 的 JavaScriptCore 解释器 () 作为常规解释器。这是不需要访问Mac的。在许多平台上(例如,x86和x86_64),此解释器将附带一个JIT编译器。jsc

因此,在几乎没有编译的情况下,您将拥有三个重量级的JavaScript引擎供您使用。

补遗

安装完成后,您只需使用shebang行创建文件,事情就会起作用:#!/usr/bin/js

$ cat foo.js 
#!/usr/bin/js

console.log("Hello, world!");
$ ls -lAF /usr/bin/js /etc/alternatives/js /usr/bin/nodejs
lrwxrwxrwx 1 root root      15 Jul 16 04:26 /etc/alternatives/js -> /usr/bin/nodejs*
lrwxrwxrwx 1 root root      20 Jul 16 04:26 /usr/bin/js -> /etc/alternatives/js*
-rwxr-xr-x 1 root root 1422004 Apr 28 20:31 /usr/bin/nodejs*
$ chmod a+x foo.js 
$ ./foo.js 
Hello, world!
$ js ./foo.js
Hello, world!
$

旧版本:
libmozjs-24-binlibmozjs-52libmozjs-60libmozjs-91libjavascriptcoregtk-3.0-bin


答案 2

我在这个主题上找到了这个相关的问题,但是如果你想要直接链接,这里是:

  • 您可以像其他人指出的那样安装Rhino。这篇文章展示了一种启动和运行它的简单方法,以及如何别名命令以轻松调用它
  • 如果您使用的是Mac,则可以使用JavaScriptCore,它调用WebKit的JavaScript引擎。这是一篇关于它的帖子
  • 您也可以使用Chome / Google的V8解释器。以下是说明
  • JavaScript作为OSA很有趣,因为它可以让你(AFAIK)与可编写脚本的OS X应用程序进行交互,就好像你在AppleScript中一样(没有可怕的语法)

我很惊讶node.js没有附带shell,但我想它实际上更像是一个基于epoll/选择器的回调/面向事件的Web服务器,所以也许它不需要完整的JS功能集,但我不太熟悉它的内部工作原理。

由于您似乎对node.js并且它基于V8,因此最好按照这些说明设置V8环境,以便您可以为JavaScript编程提供一致的基础(我应该希望JSC和V8大致相同,但我不确定)。