通过 Edge.js 项目,你可以在一个进程中同时运行 Node.js 和.NET 代码。在本文中,我将会论述这个项目背后的动机,并描述 Edge.js 提供的基本机制。随后将探讨一些 Edge.js 应用场景,它在这些场景中可以为你开发 Node.js 程序提供帮助。
为何要使用 Edge.js?
虽然许多应用程序只能用 Node.js 编写,不过有些情况下又需要综合 Node.js 和.NET 两者的优点。基于以下几个理由,你想要在程序中使用.NET 和 Node.js:.NET 框架和 NuGet 包提供了一个丰富的功能生态系统,它很好地补充了 Node.js 和 NPM 模块;可能你希望在 Node.js 程序中重用某些现成的.NET 组件;也可能想使用多线程 CLR 运行 CPU 密集型的计算,而这绝非是单线程的 Node.js 所擅长的;又或者你可能优先选择使用.NET 框架和 C#而不是使用 C/C++ 编写原生的 Node.js 扩展来访问那些尚未通过 Node.js 暴露的操作系统机制。
一旦你决定在程序中使用 Node.js 和.NET,那么你必须将 Node.js 和.NET 的组件用进程壁垒将两者分离开来,并建立某种形式的进程间通信的机制,比如说 HTTP:
Edge.js 提供另一种类似的组建异构系统的方式。它允许你在单一进程中同时运行 Node.js 和.NET 代码,并且提供了 V8 和 CLR 之间的互操作机制。
使用 Edge.js 可以在一个进程中运行 Node.js 和.NET,而不用将其分割为两个进程,这样有两个主要的好处:更好的性能和更低的复杂性。
某个场景的性能测试显示,从 Node.js 向 C#发出的进程内 Edge.js 请求比两个进程间通过 HTTP 发送的相同请求快 32 倍。与两个进程和进程间的通信信道相比,只处理一个单独的进程,明显降低了你需要解决的部署和维护的复杂性。
.NET 欢迎 Node.js
接下来我将用一个基础实例讲解 Edge.js 的关键概念,这个例子是从 Node.js 向 C#发送请求。
第 1 行引入事先从 NPM 安装的 edge 模块。Edge.js 是一个原生的 Node.js 组件。Edge.js 的特殊之处在于,它被加载的时候便在 node.exe 进程内部开始代管 CLR。
edge 模块暴露了一个名为 func 的单函数。在高层次上,该函数以 CLR 代码为参数,然后返回一个 JavaScript 函数作为 CLR 代码的代理。func 函数接受多种格式的 CLR 代码,从源代码,文件名,到预编译的 CLR 都可以。在上面的 3-8 行中,程序指定了一个异步的 Lambda 表达式作为 C#文本代码。Edge.js 提取出那段代码并将其编译为内存中的 CLR 程序集。然后它围绕着第 3 行的 CLR 代码(分配给 hello 变量的)创建并返回了一个 JavaScript 代理函数。需要注意的是,这个编译过程在每次调用 edge.func 函数时都会执行一次并将结果缓存。此外,如果你用同样的字符串变量调用 edge.func 函数两次,那么就会从缓存中获得相同的 Func<object,Task
评论