16

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

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

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

  • 有什么优点和缺点?

  • 这在性能方面如何运作良好?

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

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

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

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

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

编辑:

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

这就是我想问的。。

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

4

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

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

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

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

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

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

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

缺点:

  • 工具:像 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 代码没有太大困难

于 2009-10-31T15:21:09.423 回答
12

通过使用服务器端 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(开源)有哪些可用的替代方案?

维基百科有很多选项,但没有太多有用的信息。有很多选择,成熟度和大小范围很广。

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

  • 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 的任何具体支持,但应该是可能的

于 2009-09-25T14:17:51.867 回答
6

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

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

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

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

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

这在性能方面如何运作良好?

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

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

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

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

编辑:添加链接

于 2009-10-02T02:34:22.867 回答