在 .NET Framework 時,咱們能夠經過V8.NET等組件來運行 JavaScript,不過目前我看了好幾個開源組件包括V8.NET都還不支持 .NET Core ,咱們如何在 .NET Core 中運行 JavaScript 呢,答案是使用 NodeServices。關於爲什麼有在 .NET Core 中執行 JavaScript 這種需求,比較特殊,舉個栗子:當你作模擬登陸時,目標網站可能採用一些加密算法來計算特殊的值,若是你要徹底模擬,那麼除了用C#翻譯這個算法還有個辦法就是直接將這段加密算法JS代碼拷貝使用C#來執行。還舉個栗子:SPA服務端渲染,好比Angular、 React等。javascript
NodeServices 是一個 ASP.NET Core 中間件,將它添加到 ASP.NET Core 管道中,該中間件調用Node在運行時執行JavaScript。 這意味着若是使用 NodeServices,你必須在主機上安裝Node。java
NodeServices 的開源地址爲:https://github.com/aspnet/JavaScriptServicesnode
在 Nuget 發佈的包名爲:Microsoft.AspNetCore.NodeServices
git
1.新建一個 ASP.NET Core 2.2 應用程序github
2.而後經過Nuget安裝包 Microsoft.AspNetCore.NodeServices
(v2.2.0)算法
3.在Startup.cs文件的ConfigureServices方法中引用它api
public void ConfigureServices(IServiceCollection services) { services.AddNodeServices(); }
如今,咱們能夠使用接口INodeServices
來調用Js代碼,它的源碼以下:async
public interface INodeServices : IDisposable { Task<T> InvokeAsync<T>(string moduleName, params object[] args); Task<T> InvokeAsync<T>(CancellationToken cancellationToken, string moduleName, params object[] args); Task<T> InvokeExportAsync<T>(string moduleName, string exportedFunctionName, params object[] args); Task<T> InvokeExportAsync<T>(CancellationToken cancellationToken, string moduleName, string exportedFunctionName, params object[] args); }
基本用法ide
如今咱們已經安裝了 NodeServicess,讓咱們看一下簡單的用例,而後介紹如何在應用程序中執行一些簡單的JavaScript 並捕獲輸出。測試
首先,咱們將首先建立一個包含返回問候消息的 NodeJs module 的簡單JavaScript文件,保存在 scripts/greeter.js
文件中:
// greeter.js module.exports = function (callback, name) { var greet = function (name) { return "Hello " + name; } callback(null, greet(name)); }
接下來,咱們將INodeServices的一個實例注入到咱們的控制器中,並經過調用InvokeAsync<T>
方法來調用咱們的Js代碼,其中T是咱們Js代碼的返回類型(在這個實例中是一個string)。
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { private readonly INodeServices _services; public ValuesController(INodeServices services) { _services = services; } // GET api/values [HttpGet] public async Task<string> Get() { string greetingMessage = await _services.InvokeAsync<string>("./scripts/greeter", "曉晨"); return greetingMessage; } }
運行測試:
NodeServices 能夠使 .NET Core 接入 NodeJs 生態,創造了更多的可能,你們能夠去探索更多的用法。
Using Node Services in ASP.NET Core by dotnetthoughts
Executing JavaScript inside of .NET Core using JavaScriptServices by josephwoodward
本文Demo: DotNetCoreUseJs
增長一個組件 https://github.com/sebastienros/jint 其也支持 .NET Core 運行 JavaScript,跨平臺的。