上下文
我正在努力了解JsInteropjavascript端是如何以及在哪里实现的。
在我的Blazor服务器项目中给出以下示例代码:
public static ValueTask<string> Prompt(IJSRuntime jsRuntime, string message)
{
// Implemented in exampleJsInterop.js
return jsRuntime.InvokeAsync<string>(
"exampleJsFunctions.showPrompt",
message);
}
及其javascript对应项:
window.exampleJsFunctions = {
showPrompt: function (message) {
return prompt(message, 'Type anything here');
}
};
(我确实理解SignalR基础设施及其对电路概念的使用,我确实理解Blazor server项目中电路用于双向客户端-服务器通信。(
问题
该项目使用的唯一客户端脚本是:<script src="_framework/blazor.server.js"></script>
就理解而言,所有javascript执行调度功能都应该存在。我认为从服务器端完成javascript调用的唯一方法是一些javascript eval((功能。我试图找到源代码_framework/blazor.server.js,我想它就在github中,因为它在/dist文件夹中的构建输出包含文件blazor.server.js
我试图在typescript源中找到这一部分(其中执行了来自服务器的javascript函数名所给出的javascript函数(,但没有成功。有人能给我指正确的方向吗?我是找错地方了,还是没有eval((?
***edit:同时我了解到,这里不仅播放eval((,实际上这是最后一次机会,还有window["functionName"](arguments);
及其变体。仍在寻找相关的来源行。。。
我正在努力了解JsInterop javascript端是如何以及在哪里实现的。
在应用程序主页中,通常是_Host.cshtml
(或_index.cshtml或wwwroot/index.html
等,取决于您的服务器代码结构(,位于<head>
或<body>
标记的末尾。您可以在那里放置<script src="path/to/exampleJsFunctions.js"></script>
,也可以在<script>
标记中立即定义函数。
仅供参考,blazor.server.js
脚本负责浏览器和服务器之间的websocket连接。当您在应用程序中调用Prompt(...)
方法时,服务器会要求浏览器(通过websocket(运行在window
中定义的名为exampleJsFunctions.showPrompt
的js函数,并使用给定的参数message
。如果js函数是在window
中定义的,浏览器将运行它(如果使用浏览器devtools在上面设置断点,它就会被击中(。否则,它将抛出一个错误。没有eval
。
(实际上,如何定义浏览器的函数并不重要。唯一重要的是当服务器要求浏览器调用该函数时,浏览器可以在window
对象下方找到该函数。(
如果您非常想了解源代码,那么应该在jsinterop源代码中找到它。
您可以在blazor.JS文件下添加自定义JS文件。在它中,您可以声明您的函数,然后通过JsRuntime从剃刀组件调用它。
我发现的最简单的方法是将IJSRuntime注入到组件中。
@inject IJSRuntime JSRuntime;