服务器端JavaScript实现的优缺点是什么?

16
我刚开始尝试使用Aptana Jaxer服务端JavaScript引擎来开发我的下一个项目。我有几个问题:
  • 使用服务器端JS,我们是否可以实现整个Web应用程序而不使用任何服务器端语言(如C#,Java等),还是服务器端JS位于Web服务器和其他语言堆栈之间。

  • 这真的是一个更好的方法吗?

  • 它的优点和缺点是什么?

  • 在性能方面,这个方法表现如何?

  • 是否有只使用服务器端JS(没有其他语言)的实时实现(公共网站)?

  • Aptana Jaxer(开源)的替代方案有哪些?

  • 我们如何在服务器端JS中实现和维护数据库事务?

  • 是否可能在服务器端JS中开发RESTful和SOAP服务?

我知道这太长了(并且是幼稚的问题)。我只是希望有人在实现服务器端JS时已经遇到过所有这些问题。

编辑:

根据Matthew和Ken的评论,我对问题“这真的是一个更好的方法吗?”进行了一些澄清。

这就是我的意思:

与使用服务器端语言(假设C#)相比,这真的是一个更好的方法吗?我们如何比较使用这种方法和使用C#实现网站(性能、语言功能)?哪种方法更好,只使用服务器端JS还是在其他语言堆栈和Web服务器之间使用JS中间层?

3个回答

19
我是 Myna(www.mynajs.org)的开发人员,它是一个基于Rhino和Java的开源服务器端JS平台。我将针对与Myna相关的问题进行讨论,但其中许多观点适用于服务器端JS普遍存在的情况:
使用服务器端JS,我们能否在不使用任何服务器端语言(如C#、Java等)的情况下实现整个Web应用程序?或者说服务器端JS位于Web服务器和其他语言堆栈之间。
在Myna中,您可以完全使用JS编写应用程序。 Myna已经包含了数据库访问、对象关系映射、加密、OpenID等API。
相比使用C#/Java,这是否真的是更好的方法?
使用基于Rhino的服务器,可以轻松地在需要时转换为Java。您可以轻松安装开源/商业/手工编码的Java库,然后从JS脚本中对它们进行操作。这意味着您可以获得JS的快速开发,并保持Java平台的优势。
有哪些优缺点?
优点:
- 快速开发:在Myna中,您只需在Web根目录中创建扩展名为.sjs的文件。这意味着您可以创建一个编辑-保存-刷新浏览器周期,这对于调试/调整代码非常快。 - 简单的JSON:JS支持服务器端,这意味着移动复杂结构非常容易 - 共享代码:如果您需要在服务器和浏览器上执行相同的功能,则可以使用相同的代码 - 动态ORM:静态类型编译语言很难在运行时更改对象。这通常意味着必须预先定义ORM。在Myna中,构建ORM就像
var manager =new Myna.DataManager("DataSource name").getManager("table name");

您可以获得一个对象,该对象可以执行所有基本的CRUD操作,而无需明确定义DB表。作为另一个例子,您可以通过表单提交插入一行具有所有匹配值的数据:


manager.create($req.data);
  • 函数式编程:如果你已经开始尝试使用高级JavaScript特性,那么你会欣赏到它们在服务器端的帮助。由于一致的服务器环境,可以安全地使用高级特性,如Array Extras生成器和迭代器解构赋值E4X

  • 缺点:

    • 工具:像C#和Java这样的静态类型语言拥有出色的IDE和开发者工具,而JS这样的动态语言尚没有良好的工具支持。就我个人而言,我发现大幅减少样板代码和繁琐的类型强制转换可以弥补这一点,但是如果你一直在使用IDE进行开发,则这仍然是一个很大的劣势。如果你目前正在使用IDE,请考虑使用jedit进行动态语言开发。

    • 成熟度/标准化:服务器端JS仍然是一个新兴范例,有许多参与者,还没有明确的赢家。ECMA没有任何关于服务器端JS的标准。正如Brandon的回答中所提到的,CommonJS组正在试图形成一种服务器端JS标准,而Myna通过Narwhal进行了实验性的CommonJS支持。

    它在性能方面表现如何?

    就原始计算速度而言,很少有动态语言可以与C#和Java等静态编译语言匹敌。话虽如此,这并不重要。你的应用程序中任何需要计算的部分都应该使用Java编写,或者使用现有的Java库。例如,我不建议任何人在JS中编写数据库。对于真实世界的Web应用程序/SOA服务,减慢速度的主要原因不是原始计算速度,而是低效的代码,特别是数据库访问。Myna通过执行以下操作来提高性能:

    • 内部缓存已编译的JS脚本
    • 内部使用缓存的准备好的语句进行数据库事务
    • 查询和输出片段缓存
    • 数据库连接池
    • 自动ETag哈希支持
    • 分析工具
    • 元数据的惰性加载

    我们能够很好地实现和维护数据库事务吗?我们可以在服务器端使用JS做到这一点吗?

    如果您指的是"一组可以撤销或提交的SQL语句",那么Myna目前还不支持事务。如果有足够的兴趣,我很乐意实现它。

    如果您指的是"服务器端JS有哪些数据库支持?",则答案取决于平台。Myna平台提供以下数据库功能:

    • 一个基于Web的管理应用程序,您可以在其中定义"数据源",即数据库连接信息。然后您可以通过名称查询这些数据源。Myna包括H2、MySQL、Microsoft SQL Server和Postgresql的JDBC驱动程序,但可以使用任何JDBC或ODBC数据源
    • Myna.DatabaseMyna.Table 提供了数据库中立的元数据访问以及表的创建和修改。
    • Myna的Query对象支持maxRows、分页、SQL参数、自定义行处理程序、query-of-query、缓存等功能。
    • Myna的DataManager对象支持运行时ORM对象创建。

    在服务器端JS中是否可以开发RESTful和SOAP服务?

    REST和SOAP支持是平台特定的功能。Myna的WebService对象支持以下协议:

    • SOAP
    • XML-RPC
    • JSON-RPC
    • Ext Direct
    • JSON-MYNA(一种使用普通表单提交并返回JSON的简单协议。易于从浏览器使用)

    Myna还了解PUT和DELETE请求方法,并以文本和二进制形式呈现请求体内容,因此可以以应用程序特定的方式处理这些RESTful方法。

    调试

    传统的断点调试在服务器端确实是个挑战。虽然Rhino支持调试器钩子,但从无状态Web应用程序中使用这些钩子会非常麻烦。即使可用(例如Firebug),我个人也不使用断点调试器。相反,我更喜欢日志记录。

    在Myna中,

     Myna.log(type,label,detail)
    

    将会产生一个低优先级的线程,将HTML日志消息写入Myna的日志数据库中。这些日志可以通过Myna管理员进行搜索。日志还记录了时间戳和经过的毫秒数,用于分析性能。Myna.dump(obj)还可以用于呈现任何对象的HTML表格表示。Myna还记录所有未处理的异常与堆栈跟踪、源代码上下文和请求详细信息。在dump()、log()和默认错误处理程序之间,我没有太多困难来调试Myna代码。


    马克,很高兴看到这些来自核心SSJS开发人员的观点。非常感谢您的支持。我目前正在尝试使用Jaxer。肯定会研究一下Myna。从您的回答中可以看出Myna很有前途。如果可能的话,您能否编辑您的回答并加入SSJS服务器端调试功能? - RameshVel
    我进行了调试更新,并修复了Myna文档链接,以便在答案中显示。 - Mark Porter
    感谢更新,像我这样早期完全在VS IDE中开发的人来说,断点调试是主要关注点。我发现这非常困难。Jaxer也不支持断点调试。您是否有未来计划实现自己的IDE并支持断点调试? - RameshVel
    1
    好的,我做了一些研究[1],似乎如果你在运行Windows/X-Windows的机器上运行你的servlet,你可以启动Rhino图形调试器。我会在未来的版本中研究这个问题。[1] http://osdir.com/ml/mozilla.devel.jseng/2005-09/msg00143.html - Mark Porter

    12

    通过使用服务器端JS,我们能否实现整个Web应用程序而不使用任何服务器端语言(例如C#、Java等)?

    虽然许多服务器端JavaScript框架使用Rhino引擎,允许您调用任何Java代码,但不必在任何其他语言中编写代码。

    这真的是更好的方法吗??

    我认为JavaScript(作为一种语言)并不比传统的服务器端语言更好或更差。它具有优点(以及其他动态语言如Ruby和Python):灵活性,快速原型设计(无恶意),灵活性等。另一方面,它没有Java和C#拥有的库支持或静态类型(我不会在此展开哪种更好的辩论; 我因不同的原因都喜欢两者)。

    如果想要两全其美,可以将JavaScript用作嵌入在应用程序中的脚本语言。Java的Rhino和JScript.NET使JavaScript操作“本地”对象变得容易。例如,您可以在Java或C#中编写您的领域类,并使用JavaScript脚本来实现更大的灵活性。如果您足够熟悉JavaScript,则单一语言编写可能会更简单。

    我从未使用JavaScript编写过“真正”的服务器端应用程序,因此无法就其是否优于.NET(我也从未使用过JScript.NET)做出判断。不过,我已经为了好玩尝试了一些框架,并且目前正在使用Helma NG重新编写我的个人网站。到目前为止,这是一次很好的体验(比PHP好多了,我从来没有真正喜欢过它)。

    它有什么优点和缺点?

    优点:

    • 仅需要一种语言进行服务器端和客户端编程。
    • 共享代码的可能性,例如表单验证。 Jaxer可以在客户端、服务器或两者上运行脚本。
    • 您可以使用JavaScript编程(如果您喜欢该语言)。

    缺点:

    • 许多框架是实验性/不成熟的。
    • 您必须使用JavaScript编程(如果您不喜欢该语言)。
    • 关于性能方面,这个技术如何表现良好?

      性能应该与其他脚本语言差不多。

    • 有没有实时实现(公共网站)只使用服务器端JS(无其他语言)的例子?

      我不知道是否有大型网站使用JavaScript,但可能存在这样的网站。

    • Aptana Jaxer(开源)的替代方案有哪些?

      维基百科有一个大型选项列表,但信息不够有用。有许多不同成熟度和规模的选项。

      以下是我比较熟悉的一些:

      • Helma - 基于 Rhino(Java)的框架,包含 active record。
      • Helma NG - Helma 的下一代(实验性重写,正在积极开发中)。
      • Phobos - 在 NetBeans 中有良好的支持。
      • v8cgi - 小而简单,使用 Google 的 V8 引擎,可能还不太适合生产环境。
      • Jaxer - 运行在带有 DOM 实现的 Spidermonkey 上,因此您可以使用诸如 jQuery 或 Prototype 等框架来操作页面。在 Aptana Studio 中具有良好的 IDE 支持。
    • 我们能够有多好地实现和维护数据库事务?我们能在服务器端JS中做到这一点吗?

      基于 Rhino 的框架允许您使用 Java 类,因此您拥有完整的 JDBC 支持。我没有使用过 Jaxer 的数据库库,所以不了解其能力。

    在服务器端 JS 中开发 RESTful 和 SOAP 服务可能吗..??

    RESTful API 应该没有问题。我不知道是否有针对 SOAP 的具体支持,但是应该是可能的


    感谢Matthew抽出时间回答我的问题。我已经更新了“这是真的更好的方法吗?”部分的问题... - RameshVel
    不错的回答。那个作者在你回答后改变了问题吗?如果是这样,那就不太好了… - ken
    @ken,我没有改变问题……马修需要一些关于“这是否真的是更好的方法?”的信息……所以我只是在那个问题上添加了一些清晰度……如果你想的话,你可以检查修订历史……:( - RameshVel
    @ken,我已经在编辑部分更新了我的问题。现在这部分显示了我的实际问题和我在编辑中修改的问题...希望这样可以澄清问题。 - RameshVel
    抱歉指责了,我应该自己检查历史记录——我只是讨厌这种事情发生! - ken

    6
    作为前言,我在我的工作中使用SSJS。我们在SpiderMonkey上运行一个相当大的(就复杂性和页面浏览量而言)网站。在我有经验的地方,我会补充Matthew的优秀答案。
    “它真的比使用服务器端语言(假设c#)更好吗?”
    “更好”实际上取决于你想要做什么。JavaScript本身具有一些很棒的特性,也有一些非常糟糕的特性。如果你认真考虑开发JS(客户端或服务器端),我强烈建议你观看Douglas Crockford的演讲,《JavaScript:精粹》(Javascript: The Good Parts),如果你还没有看过的话。他已经做了一个很好的工作来整理这个领域的混乱,并且他是一个优秀的演讲者。
    我发现SSJS世界最缺乏的是成熟度。我不熟悉C#,但JavaScript没有成熟的标准库,也没有成熟的包分发方式。对我来说,这是谜题中的一个重要部分。
    那么,关注CommonJS组。他们正在努力定义这些确切的事情。此外,Jaxer Api文档列出了该框架所包含的内置内容。
    在性能方面,这如何运作得很好?
    JavaScript本身不是一个慢语言,也不是特别快的语言。正如Matthew指出的那样,它应该与您使用的任何其他脚本语言相当。浏览器供应商之间为构建最快速度的浏览器而进行的战争也将使SSJS群体受益。
    V8团队在其引擎中构建的分代垃圾收集是一个很好的例子。停止虚拟机以释放堆中不可达对象并回收其内存可能有点慢,但通过减少垃圾收集器运行时需要检查的对象数量来减轻了这种情况。
    我们可以多么好地实现和维护数据库事务?我们可以在服务器端使用JS做到吗?
    Jaxer似乎具有MySQL和SQLite数据库API。正如Matthew所提到的,如果使用Rhino,则可以使用JDBC API。
    编辑:添加链接

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接