Как и где сторона javascript JsInterop реализована в приложении Blazor Server?

Контекст

Я пытаюсь понять, как и где реализована сторона javascript JsInterop.

Учитывая следующий пример кода в моем проекте Blazor Server:

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

Я попытался найти эту часть (где выполняется функция javascript, заданная ее именем, исходящим от сервера) в источниках машинописного текста, но безуспешно. Может ли кто-нибудь указать мне правильное направление? Я ищу не в том месте или нет eval()?

*** edit: Тем временем я узнал, что здесь играет не только eval(), на самом деле это последний шанс, есть window["functionName"](arguments);тоже и его варианты. Все еще нахожу соответствующие исходные строки...

2 ответа

Решение

Я пытаюсь понять, как и где реализована сторона javascript JsInterop.

На главной странице приложения обычно _Host.cshtml (или _index.cshtml или wwwroot/index.htmlи т. д., в зависимости от структуры кода вашего сервера), где-то в <head> или конец <body>тег. Вы можете разместить<script src="path/to/exampleJsFunctions.js"></script> там или определите функции прямо внутри <script> тег.

К вашему сведению, blazor.server.jsscript - это тот, кто отвечает за соединение веб-сокета между браузером и сервером. Когда вы звонитеPrompt(...)в приложении, сервер просит браузер (через веб-сокет) запустить js-функцию, называемуюexampleJsFunctions.showPrompt определено в window, с заданными аргументами message. Если функция js определена вwindow, браузер запустит его (и если вы установите для него точку останова с помощью инструментов разработчика браузера, он будет запущен). В противном случае выдаст ошибку. Здесь нетeval.

(На самом деле, на самом деле не имеет значения, как вы определяете функции для браузера. Единственное, что имеет значение, это то, что когда сервер просит браузер вызвать функцию, браузер может найти функцию подwindow объект.)

Если вам так хочется увидеть исходный код, вы должны найти его в источниках jsinterop.

Вы можете добавить свои собственные файлы JS в файл blazor.js. В нем вы можете объявить свои функции, а затем вызвать их из компонентов бритвы через JsRuntime.

Самый простой способ, который я нашел, - это вставить IJSRuntime в компонент.

@inject IJSRuntime JSRuntime;
Другие вопросы по тегам