在 .NET Core 中運行 JavaScript


一.前言

在 .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<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);
}

基本用法

現在我們已經安裝了 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;
    }
}

運行測試:

1552615237181

四.結束

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,跨平台的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM