我是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.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 代码没有太大困难