我是
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.Database 和 Myna.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代码。