歡迎光臨
每天分享高質量文章

.NET Core中執行JavaScript

作者:曉晨Master

連結:http://www.cnblogs.com/stulzq/p/10535310.html

一、前言

在 .NET Framework 時,我們可以透過V8.NET等元件來執行 JavaScript,不過目前我看了好幾個開源元件包括V8.NET都還不支援 .NET Core ,我們如何在 .NET Core 中執行 JavaScript 呢,答案是使用 NodeServices。

關於為何有在 .NET Core 中執行 JavaScript 這種需求,比較特殊,舉個慄子:當你做模擬登入時,標的網站可能採用一些加密演演算法來計算特殊的值,如果你要完全模擬,那麼除了用C#翻譯這個演演算法還有個辦法就是直接將這段加密演演算法JS程式碼複製使用C#來執行。還舉個慄子:SPA服務端渲染,比如Angular、 React等。

二、什麼是 NodeServices

NodeServices 是一個 ASP.NET Core 中介軟體,將它新增到 ASP.NET Core 管道中,該中介軟體呼叫Node在執行時執行JavaScript。 

這意味著如果使用 NodeServices,你必須在主機上安裝Node。

三、使用 NodeServices

NodeServices 的開源地址為:https://github.com/aspnet/JavaScriptServices

在 Nuget 釋出的包名為:Microsoft.AspNetCore.NodeServices

1、新建一個 ASP.NET Core 2.2 應用程式

2、然後透過Nuget安裝包 Microsoft.AspNetCore.NodeServices(v2.2.0)

3、在Startup.cs檔案的ConfigureServices方法中取用它

public void ConfigureServices(IServiceCollection services)
{
    services.AddNodeServices();
}

 

現在,我們可以使用介面INodeServices來呼叫Js程式碼,它的原始碼如下:

public interface INodeServices : IDisposable
{
    Task InvokeAsync(string moduleName, params object[] args);
    Task InvokeAsync(CancellationToken cancellationToken, string moduleName, params object[] args);

    Task InvokeExportAsync(string moduleName, string exportedFunctionName, params object[] args);
    Task InvokeExportAsync(CancellationToken cancellationToken, string moduleName, string exportedFunctionName, params object[] args);
}

 

基本用法

現在我們已經安裝了 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方法來呼叫我們的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<stringGet()
    
{
        string greetingMessage = await _services.InvokeAsync<string>("./scripts/greeter""曉晨");
        return greetingMessage;
    }
}

 

執行測試:

四、結束

NodeServices 可以使 .NET Core 接入 NodeJs 生態,創造了更多的可能,大家可以去探索更多的用法。

五、參考資料

本文Demo:https://github.com/stulzq/BlogDemos/tree/master/DotNetCoreUseJs

增加一個元件https://github.com/sebastienros/jint 其也支援 .NET Core 執行 JavaScript,跨平臺的。

贊(0)

分享創造快樂