【问题标题】:pros and cons of serverside javascript implementation?服务器端javascript实现的优缺点?
【发布时间】:2010-12-01 09:49:00
【问题描述】:

我刚刚开始为我的下一个项目试验Aptana Jaxer 服务器端javascript 引擎。我对此有一些疑问

  • 通过使用服务器端 JS,我们是否可以在不使用任何服务器端语言(如 C#、java 等)的情况下实现整个 Web 应用程序。或者服务器端 JS 位于 Web 服务器和其他语言堆栈之间。

  • 真的是更好的方法吗?

  • 有什么优点和缺点?

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

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

  • Aptana jaxer(开源)有哪些可用的替代方案?

  • 我们可以在多大程度上实现和维护数据库事务?我们可以在服务器端 JS 中做到这一点吗?

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

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

编辑:

根据 Matthew & Ken cmets 的说法,我已经为这个问题增加了一些清晰度这真的是更好的方法吗??

这就是我想问的..

这真的是比使用服务器端语言更好的方法(假设 c#),我们如何将其与网站的 c# 实现(性能、语言特性)进行比较? 哪种方法更好,在服务器端单独使用 JS 还是在其他语言堆栈和 Web 服务器之间的中间层使用 JS??

【问题讨论】:

    标签: javascript serverside-javascript jaxer


    【解决方案1】:

    通过使用服务器端JS,我们是否可以在不使用任何服务器端语言(如C#、java等)的情况下实现整个Web应用程序。

    没有必要用任何其他语言编写代码,尽管许多服务器端 JavaScript 框架使用 Rhino 引擎,它允许您调用任何 Java 代码。

    真的是更好的方法吗?

    我不认为 JavaScript(作为一种语言)真的比传统的服务器端语言更好或更差。它具有灵活性、快速原型设计(没有双关语)、灵活性等优点(以及其他动态语言,如 Ruby 和 Python)。另一方面,它没有 Java 和 C# 所具有的库支持或静态类型(我不会在这里讨论哪个更好;我喜欢两者的原因不同)。

    如果您想要两者兼得,您可以使用 JavaScript 作为脚本语言,嵌入到您的应用程序中。 Rhino for Java 和 JScript.NET 使在 JavaScript 中操作“原生”对象变得容易。例如,您可以用 Java 或 C# 编写域类,并在需要更大灵活性的地方使用 JavaScript 编写脚本。如果您对 JavaScript 足够熟悉,那么用单一语言编写可能会更简单。

    我从未使用 JavaScript 编写过“真正的”服务器端应用程序,因此我无法真正判断它是否比 .NET 更好或更差(我也从未使用过 JScript.NET)。虽然我玩过一些有趣的框架,但我目前正在使用 Helma NG 重写我的个人网站。到目前为止,这是一次很好的体验(比我从未真正喜欢过的 PHP 好多了)。

    优点和缺点是什么?

    优点:

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

    缺点:

    • 许多框架都是实验性的/不是很成熟。
    • 您必须使用 JavaScript 进行编程(假设您不喜欢这种语言)。

    这在性能方面表现如何?

    性能应该与其他脚本语言大致相当。

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

    我不知道有什么大型网站使用 JavaScript,但可能有一些。

    Aptana jaxer(开源)有哪些可用的替代方案?

    维基百科有一个large list of options,但它没有太多有用的信息。有很多选择,成熟度和规模范围很广。

    以下是我熟悉的一些(在不同程度上)

    • Helma - 基于 Rhino (Java) 的框架,具有活动记录。
    • Helma NG - Helma Next Generation(实验性重写,正在积极开发中)。
    • 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 花时间回答我的问题。我已将我的问题更新为“这真的是更好的方法吗??”部分...
    • 不错的答案。你回答问题后,作者只是改变了问题吗?如果是这样,那就是糟糕的形式......
    • @ken,我试图改变这个问题...... mathew 需要一些关于“这真的是更好的方法吗??”的信息......所以我只是在这个问题上增加了一些清晰度(单独)...... . 如果需要,您可以检查修订历史... :(
    • @ken,我已经用 EDIT 部分更新了我的问题。这现在显示了我的实际问题和我在编辑部分修改的问题......希望这能澄清......
    • 对不起,我应该自己检查历史记录——我只是讨厌发生这种情况!
    【解决方案2】:

    作为序言,我在日常工作中使用 SSJS。我们在 SpiderMonkey 上运行一个相当大的(就复杂性和页面浏览量而言)网站。我会在我有经验的地方添加到马修的优秀答案中。

    它真的比使用服务器端语言更好吗(假设 c#)

    “更好”真的取决于你想用它做什么。 JavaScript 本身有一些很棒的特性,也有一些非常糟糕的特性。如果您对开发 JS(客户端或服务器)很认真,我强烈建议您观看 Douglas Crockford 的演示文稿,Javascript: The Good Parts(如果您还没有的话)。他在整理杂物方面做得非常出色,而且他是一位出色的演讲者。

    我发现 SSJS 世界目前最缺乏的就是成熟度。我对C#不熟悉,但是JavaScript没有成熟的标准库,也没有成熟的包分发手段。对我来说,这是一个很大的难题。

    也就是说,请密切关注CommonJS 组。他们正在努力定义那些确切的东西。此外,Jaxer Api 文档列出了该框架中包含的内置插件。

    这在性能方面表现如何?

    JavaScript 本身并不是一种慢速语言,也不是特别快的语言。正如 Matthew 所指出的,它应该与您将使用的任何其他脚本语言相媲美。浏览器供应商之间的战争,看谁可以构建最快的浏览器也将使 SSJS 人群受益。

    V8 团队在他们的引擎中构建的分代垃圾收集就是一个很好的例子。暂停虚拟机以从堆中释放无法访问的对象并回收其内存可能会有些慢,但他们通过减少垃圾收集器运行时需要检查的对象数量来缓解这种情况。

    我们可以在多大程度上实现和维护数据库事务?我们可以在服务器端 JS 中做到这一点吗?

    Jaxer 似乎有 MySQL 和 SQLite 数据库 API。正如 Matthew 所说,如果您使用 Rhino,则可以使用 JDBC api。

    编辑:添加链接

    【讨论】:

      【解决方案3】:

      我是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 中,您只需在 webroot 中创建扩展名为 .sjs 的文件。这意味着您可以创建一个编辑-保存-刷新浏览器循环,用于调试/调整代码非常快。

      • 简单的 JSON:让 JS 支持服务器端意味着移动复杂结构非常容易

      • 共享代码:如果需要在服务器和浏览器上执行相同的功能,可以使用相同的代码

      • 动态 ORM:静态类型的编译语言很难在运行时更改对象。这通常意味着必须提前定义 ORM。在 Myna 中构建 ORM 就像

        var manager =new Myna.DataManager("DataSource name").getManager("table name");
        

        您将获得一个无需显式定义数据库表即可执行所有基本 CRUD 操作的对象。作为另一个示例,您可以从表单帖子中插入包含所有匹配值的行:

        manager.create($req.data);
        
      • 函数式编程:如果您已经开始使用高级 JavaScript 功能,那么您将体会到它们在服务器端的帮助。由于服务器端环境一致,因此可以安全地使用高级功能,例如 Array Extrasgenerators and iteratorsdestructuring assignmentsE4X

      缺点:

      • 工具:C# 和 Java 等静态类型语言拥有出色的 IDE 和开发工具。像 JS 这样的动态语言还没有工具支持。就我个人而言,我发现样板代码的大量减少和繁琐的类型转换弥补了这一点,但如果你一直在 IDE 中进行大量开发,这仍然是一个很大的缺点。如果您当前使用的是 IDE,请考虑将 jedit 用于动态语言

      • 成熟度/标准化:Serverside 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 参数、自定义行处理程序、查询查询、缓存等
      • Myna 的 DataManager 对象支持运行时 ORM 对象创建

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

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

      • 肥皂
      • XML-RPC
      • JSON-RPC
      • 外线直通
      • JSON-MYNA (一个简单的协议,使用普通形式的帖子并返回 JSON。易于在浏览器中使用)

      Myna 还了解 PUT 和 DELETE 请求方法,并以文本和二进制形式提供对请求正文内容的访问,因此可以以特定于应用程序的方式处理这些 RESTful 方法。

      调试

      传统的断点调试是服务器端的真正挑战。尽管 Rhino 支持调试器钩子,但在无状态 Web 应用程序中使用这些钩子会非常复杂。就我个人而言,我什至不使用断点调试器,即使它们可用(例如 firebug)。相反,我更喜欢记录。

      在八哥,

       Myna.log(type,label,detail)
      

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

      【讨论】:

      • 马克,很高兴看到核心 SSJS 开发人员的这些观点。非常感谢您的支持。我现在正在和 Jaxer 一起玩。防御我会调查八哥。从你的回答来看,八哥看起来很有希望。如果可能的话,您能否使用 SSJS 服务器端调试功能编辑您的答案。??
      • 我更新了调试,并修复了 Myna 文档链接,以便它们显示在答案中。
      • 感谢 Mark 的更新。断点调试是像我这样早期完全在 VS IDE 中开发的人的主要关注点。我发现它非常困难。 Jaxer 还支持断点调试。您是否有任何未来计划实施您自己的带有断点调试支持的 IDE??
      • 好的,我做了一点研究[1],如果你在运行 Windows/X-Windows 的机器上运行你的 servlet,你似乎可以启动 Rhino 图形调试器。我将在未来的版本中对此进行研究。 [1]osdir.com/ml/mozilla.devel.jseng/2005-09/msg00143.html
      猜你喜欢
      • 2011-03-27
      • 2017-08-15
      • 1970-01-01
      • 2016-03-29
      • 2010-12-08
      • 1970-01-01
      • 2018-05-19
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多