后端代码也能执行JavaScript脚本?

372 阅读2分钟

前言

  • 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

偶然一次听同事说起一个开源项目,确实让我很好奇,即使用 .NET 来执行 Javascript 脚本, 这个开源项目叫 Jint,感兴趣的同学可以下载Nuget包自己本地玩玩,或者拉源码下来分析是如何实现的。

安装

使用 Vs 安装Nuget包即可,名称为 Jint,类似这种类型的开源项目也不少,今天就先来讲讲Jint吧

image.png

使用

  • 简单使用计算3+4,Execute方法执行一串JS代码
static void Main(string[] args)
{
    // 实例化引擎
    var engine = new Engine();
    // 即可操作Jint引擎提供的一些相关方法
    Console.WriteLine(engine.Execute("4+3").GetCompletionValue());
}

image.png

  • 使用Jint执行一段函数
static void Main(string[] args)
{
    var engine = new Engine();

    while (true)
    {
        Console.WriteLine(">");
        // 获取输入的JS代码
        string JsCode = Console.ReadLine();
        // 执行获取值
        JsValue val = engine.Execute(JsCode).GetCompletionValue();
        // 控制台打印值
        Console.WriteLine(val);
    }
}

先定义一个计算函数Calc并且包含两个参数a、b,定义好之后,再执行calc方法。

image.png

  • 使用Jint引擎编写一段JS代码,并且在代码中调用 C# 定义的方法
static void Main(string[] args)
{
    // 定义一个get对象指向GetString方法
    var engine = new Engine()
        .SetValue("get", new Action<string>(GetString));

    // 执行JS方法hello,并且代码中调用了get方法即我们定义的GetString
    engine.Execute(@"
        function hello() { 
            get('Hello World');
        };

        hello();
    ");
}
// 自定义方法
public static void GetString(string str) 
{
    // 打印值
    Console.WriteLine(str);
}
  • 使用Jint引入Js模块

创建一个test.js 里面包含一个add方法,并有两个参数

image.png

static void Main(string[] args)
{
    var engine = new Engine();

    engine.Execute(File.ReadAllText(@"......\test.js"));

    // 调用js里面的add方法
    var result = engine.Execute("add(1,2)").GetCompletionValue();

    Console.WriteLine(result);
}

image.png

结语

其实能在后端代码执行JavaScript还是非常不错的,如前后端的一些加解密库不一样的时候,我们可以调用JS的一些库用来统一这些加解密算法。Js还是有很多不错好用的库噢,如果大家觉得Jint还有哪些用途可以一起分享哈。