【问题标题】:Clearscript Javascript 'require' functionalityClearscript Javascript“需要”功能
【发布时间】:2020-09-01 22:53:04
【问题描述】:

我正在尝试为 Twilio 可编程聊天工具编写 C# 包装器。提供的库是为 JS 客户端提供的。我认为使用 ClearScript (V8) 之类的工具可以让我根据需要包装 js。

网站上的示例代码是

const Chat = require('twilio-chat');

// Make a secure request to your backend to retrieve an access token.
// Use an authentication mechanism to prevent token exposure to 3rd parties.

const accessToken = '<your accessToken>';

Chat.Client.create(accessToken)
  .then(client => {
   // Use Programmable Chat client
});

所以在我初始化之后

using (var engine = new V8ScriptEngine())
{
  engine.Execute(@"
    const Chat = require('twilio-chat.js');

    const token = 'my token';

    Chat.Client.create(token).then(client=>{
    });
  ");
 }

'require' 行中的程序错误,错误为 require 未定义。 我读过 require 只是返回模块导出,所以我替换了 require('... 与

engine.Execute(@"
    const Chat = ('twilio-chat.js').module.exports;
...

但是无法读取未定义的属性“出口”的错误

我从https://media.twiliocdn.com/sdk/js/chat/releases/4.0.0/twilio-chat.js得到了js文件

我该如何解决这个问题,或者也许有更好的方法。我很感激任何和所有的见解。

谢谢

【问题讨论】:

    标签: c# twilio-programmable-chat clearscript


    【解决方案1】:

    我对 Twilio 一无所知,但这里是启用 ClearScript 的 CommonJS 模块支持的方法。此示例从 Web 加载脚本,但您可以将其限制为本地文件系统或提供自定义加载器:

    engine.AddHostType(typeof(Console));
    engine.DocumentSettings.AccessFlags = DocumentAccessFlags.EnableWebLoading;
    engine.DocumentSettings.SearchPath = "https://media.twiliocdn.com/sdk/js/chat/releases/4.0.0/";
    engine.Execute(new DocumentInfo() { Category = ModuleCategory.CommonJS }, @"
        const Chat = require('twilio-chat');
        const token = 'my token';
        Chat.Client.create(token).then(
            client => Console.WriteLine(client.toString()),
            error => Console.WriteLine(error.toString())
        );
    ");
    

    这成功加载了 Twilio 脚本,该脚本似乎依赖于其他脚本和资源,这些脚本和资源不属于 ClearScript/V8 提供的裸标准 JavaScript 环境的一部分。要使其正常工作,您必须增加搜索路径并可能手动公开其他资源。如图所示,这段代码打印出ReferenceError: setTimeout is not defined

    【讨论】:

    • 谢谢。这有助于我更好地理解 ClearScript 的工作原理,而且我已经做到了。谢谢谢谢谢谢。
    • @BitCortex - 您能否扩展“此示例从 Web 加载脚本,但您可以将其限制为本地文件系统或提供自定义加载器:”?我有兴趣加载一个初始本地脚本,然后命名它需要的其他本地脚本。在我的例子中,初始脚本是过程代码,它要加载的脚本是代表它所引用的 JS 类的文件。所以第一个脚本可能想要显示员工的薪水,为此它需要一个名为 emp.js 的类文件,其中包含一个带有 showSalary 方法的 emp 类。
    • @VanquiishedWombat 您可以使用engine.DocumentSettings.AccessFlags 来启用从网络、文件系统或两者兼而有之的加载。您也可以更改engine.DocumentSettings.Loader(甚至是engine.DocumentSettings 本身),但这可能有点过头了。查看 ClearScript 的 API 文档。
    猜你喜欢
    • 1970-01-01
    • 2017-04-02
    • 2020-06-11
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2022-01-11
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多