首頁 > 易卦

在 .NET 應用程式中執行 JavaScript,你會了嗎?

作者:由 Nodejs開發 發表于 易卦日期:2022-09-23

js指令碼如何執行

作者:liamwang

在 .NET 應用程式中執行 JavaScript,你會了嗎?

在這篇文章中,我展示瞭如何使用 JavaScriptEngineSwitcher NuGet

包來

在 。NET 應用程式中執行 JavaScript。這個包為許多不同的 JavaScript 引擎提供了一個一致的介面。

1。你為什麼要這樣做?

儘管我很喜歡 。NET 生態系統,但有些事情,JavaScript 生態系統做得更好。其中之一就是任何事情都能找到一個

,特別是涉及到網路時。

以語法高亮為例。這可以直接用 C# 來做,但這不是一個特別流暢的體驗。例如,TextMateSharp 專案為 TextMate 語法提供了一個直譯器。這些檔案是 VS Code 用來為一種語言新增基本語法高亮的。然而,如果你想部署應用程式,它包裝了一個本地依賴,這就增加了一些複雜性。

相比之下,JavaScript 有大量成熟的語法高亮庫。僅舉幾例,有 highlight。js、Prism。js(在本部落格中使用)和 shiki。js。尤其是前兩個,非常成熟,有多個外掛和主題,而且有簡單的 API。

作為一個 。NET 開發者,JavaScript 的明顯問題是,你需要學習並選擇進入一個完整的獨立工具鏈,與 Node。js 和 NPM 一起工作。這似乎是一個很大的開銷,只是為了使用一個小功能。

因此,我們陷入了一個困境。我們要麼走 C#(+ Native)路線,要麼就得轉用 JavaScript。

或者……我們直接從我們的 。NET 應用程式中呼叫 JavaScript 。

2。在 。NET 中執行 JavaScript

一旦你決定在你的 。NET 程式碼中執行 JavaScript,你就會考慮幾個選擇。你可以借用 JavaScript 引擎,讓它為你執行你

JavaScript,但你並沒有真正解決問題,你仍然需要安裝 Node。js。

另一個選擇是在你的庫中直接捆綁 JavaScript 引擎。這並不像聽起來那麼瘋狂,有

幾個

NuGet 包採用了這種方法,然後暴露出一個 C# 層來與引擎進行互動。

下面是你可以使用的一些包的列表。

Jering。Javascript。NodeJS

這個庫採取了上述的第一種方法。它不包括包中的 Node。js。相反,它為執行 JavaScript 程式碼提供了一個 C# API,並呼叫了安裝在你機器上的 Node。js。這在你知道兩者都已安裝的環境中可能很有用,但它並沒有真正解決我想避免的問題。

ChakraCore

ChakraCore 是 Edge 轉為基於 Chromium 引擎之前最初使用的 JavaScript 引擎。根據 GitHub 專案的介紹:

ChakraCore 是一個帶有 C 語言 API 的 JavaScript 引擎,你可以用它來為

任何

C 語言或 C 語言相容專案新增對 JavaScript 的支援。它可以在 Linux macOS 和 Windows 上針對 x64 處理器進行編譯。而 x86 和 ARM 只適用於 Windows。

因此,ChakraCore 包括一個本地依賴,但由於 C# 可以 P/Invoke 到本地庫,這本身並不是一個問題。但它會帶來一些部署方面的挑戰。

ClearScript (V8)

Node。JS、Chromium、Chrome 和最新的 Edge 使用的都是 V8 JavaScript 引擎。Microsoft。ClearScript 包為該庫提供了一個封裝,為呼叫 V8 庫提供了一個 C# 介面。就像 ChakraCore 一樣,V8 引擎本身是一個本地依賴。ClearScript 庫負責 P/Invoke 呼叫,提供了一個很好

C# API,但你仍然要確保你在目標平臺上部署了正確的本地庫。

Jint

Jint 很有意思,因為它是一個完全在 。NET 中執行的 JavaScript 直譯器,沒有任何本地的依賴!它完全支援 ECMAScript 5。1 (ES5),並支援 。NET Standard 2。0,所以你可以在你的所有專案中使用它!

Jurassic

Jurassic 是另一個 JavaScript 引擎的 。NET 實現,類似於 Jint。也和 Jint 類似,它支援所有的 ES5,而且似乎也部分支援 ES6。與 Jint 不同的是,Jurassic 不是一個直譯器,它將 JavaScript 編譯成 IL,這使得它的速度非常快,而且它沒有本地的依賴性。

那麼,在所有這些選擇中,你應該選擇哪一個?

3。JavaScriptEngineSwitcher:當一個 JS 引擎不夠用的時候

還有一個偉大的專案可以讓你簡單地嘗試上面其中的任何一個庫。雖然所有的庫都允許你執行 JavaScript,但它們都有略微不同的 C# API 來與之互動。這可能會使比較它們變得有點痛苦,因為你必須為每個庫學習不同的 API。

JavaScriptEngineSwitcher 這個庫為我提到的所有庫和更多的庫提供了封裝:

Jering。Javascript。NodeJS

ChakraCore

Microsoft ClearScript。V8

Jint

Jurassic

MSIE JavaScript Engine for 。NET

NiL。JS

VroomJs

每個庫都在一個單獨的包中(有本地依賴關係的引擎需要一個額外的本地包),還有一個 Core 包,它提供通用的 API。即使你不打算切換 JS 引擎,我也傾向於儘可能地使用 JavaScriptEngineSwitcher 封裝庫,這樣你就不必在以後需要切換引擎時弄清楚一個新的 API 了。

在 。NET 專案中改變使用的 JavaScript 引擎在我看來是完全可能的。例如,我開始使用 Jint,但當我需要執行更大的指令碼時,我遇到了效能問題,於是換成了 Jurassic。JavaScriptEngineSwitcher 讓這一切變得很簡單,只需在我的專案中新增一個新的包並改變一些初始化程式碼即可。

我最近才發現 JavaScriptEngineSwitcher 這個庫,但最新版本的下載量已接近一百萬,它被用於 。NET 靜態網站建設者 Statiq 中。在這篇文章的最後部分,我將舉一個最基本用法的例子。

4。案例:用 JavaScriptEngineSwitcher 在控制檯應用中執行 prism。js

在這篇文章的開頭,我討論了一個特定的場景——程式碼塊的語法高亮。在本節中,我將展示如何使用 prism。js 高亮一小段程式碼,並在一個控制檯應用程式中執行。

開始之前請新增 JavaScriptEngineSwitcher。Jurassic NuGet 包的引用。

dotnet add package JavaScriptEngineSwitcher。Jurassic1。

接下來,下載你想執行的 JavaScript 檔案。例如,我從 Prism。js 的官網下載了 prism。js 檔案,並將 C# 新增到預設支援高亮的語言集。在把檔案放到專案資料夾的根目錄後,我把檔案更新為嵌入資源。你可以在你的 IDE 中操作,也可以手動編輯專案檔案:

Exe net6。0 enable enable <!—— Make prism。js an embedded resource ——> 1。2。3。4。5。6。7。8。9。10。11。12。13。14。15。16。17。18。19。20。

剩下的就是編寫程式碼,在我們的程式中執行指令碼。下面的程式碼段設定了 JavaScript 引擎,從程式集中載入嵌入的 prism。js 庫,並執行它。

using JavaScriptEngineSwitcher。Jurassic;// Create an instance of the JavaScript engineIJsEngine engine = new JurassicJsEngine();// Execute the embedded resource called JsInDotnet。prism。js from the provided assemblyengine。ExecuteResource(“JsInDotnet。prism。js”, typeof(Program)。Assembly);1。2。3。4。5。6。7。

現在我們可以在同一個上下文中執行我們自己的 JavaScript 命令。我們可以透過使用 SetVariableName、Execute 和 Evaluate 從 C# 向 JavaScript 引擎傳遞數值:

// This is the code we want to highlightstring code = @“using System;public class Test : ITest{ public int ID { get; set; } public string Name { get; set; }}”;// set the JavaScript variable called “input” to the value of the c# variable “code”engine。SetVariableValue(“input”, code);// set the JavaScript variable called “lang” to the string “csharp”engine。SetVariableValue(“lang”, “csharp”);// run the Prism。highlight() function, and set the result to the “highlighed” variableengine。Execute($“highlighted = Prism。highlight(input, Prism。languages。csharp, lang)”);// “extract the value of ”highlighted“ from JavaScript to C#string result = engine。Evaluate(”highlighted“);Console。WriteLine(result);1。2。3。4。5。6。7。8。9。10。11。12。13。14。15。16。17。18。19。20。21。22。23。

當你把它們放在一起執行時,高亮的程式碼會被列印到控制檯:

using Systempublic class Test ITest { public int ID { get set } public string Name { get set }}

渲染後,看起來像這樣:

在 .NET 應用程式中執行 JavaScript,你會了嗎?

我對整個過程的簡單程度感到驚訝。啟動一個 JavaScript 引擎,載入 prism。js 檔案,並執行我們的自定義程式碼是如此順利。這是我面臨問題的完美解決方案。

我顯然不建議所有的應用程式都這樣做。如果你需要執行大量的 JavaScript,那麼直接使用 Node。js 生態系統及工具可能更容易。但如果你只是想利用一個小型的、獨立的工具(如 prims。js),那麼這是一個不錯的選擇。

5。總結

在這篇文章中,我展示瞭如何使用 JavaScriptEngineSwitcher NuGet 包來在 。NET 應用程式中執行 JavaScript。這個包為許多不同的 JavaScript 引擎提供了一個一致的介面。其中一些引擎(如 Chakra Core 和 V8)需依賴一個本地元件,而其他引擎(如 Jint 和 Jurassic)只使用託管程式碼。最後,我展示了你如何使用 JavaScriptEngineSwitcher 在 。NET 應用程式內部執行 Prims。js 程式碼高亮庫。

原文:bit。ly/38awq7W

作者:Andrew Lock

翻譯:精緻碼農