我是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 Extras、generators and iterators、destructuring assignments 和 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.Database 和 Myna.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 代码并不困难