Estoy tratando de crear una Razor Class Library
que expone la función 1 js. Mi problema es que el paquete web elimina mi función exportada en el archivo del paquete final.
index.js
import * as myLib from "someLib" export function connect(params) { // function logic omitted for clarity }
Y así es como quiero consumir el código js
using MyComponent.Common; using Microsoft.JSInterop; namespace MyComponent.Services { /// <inheritdoc /> public class MyService : IMyService { private readonly Lazy<Task<IJSObjectReference>> _myWrapper; public MyService(IJSRuntime jsRuntime) { _myWrapper = new Lazy<Task<IJSObjectReference>>(() => jsRuntime.InvokeAsync<IJSObjectReference>("import", "./_content/MyComponent/index.bundle.js") .AsTask()); } /// <inheritdoc /> public async Task Connect(params) { if (_myWrapper is null) { throw new InvalidOperationException("Wrapper is not initialized"); } IJSObjectReference module = await _myWrapper.Value; await module.InvokeVoidAsync("connect", params); } } }
La excepción que obtengo es (como se esperaba porque no hay una función de conexión expuesta en index.bundle.js)
Could not find 'connect' ('connect' was undefined). Error: Could not find 'connect' ('connect' was undefined). at https://localhost:7134/_framework/blazor.webassembly.js:1:328 at Array.forEach (<anonymous>) at a.findFunction (https://localhost:7134/_framework/blazor.webassembly.js:1:296) at _ (https://localhost:7134/_framework/blazor.webassembly.js:1:2437) at https://localhost:7134/_framework/blazor.webassembly.js:1:3325 at new Promise (<anonymous>) at Object.beginInvokeJSFromDotNet (https://localhost:7134/_framework/blazor.webassembly.js:1:3306) at Object.St [as invokeJSFromDotNet] (https://localhost:7134/_framework/blazor.webassembly.js:1:59849) at _mono_wasm_invoke_js_blazor (https://localhost:7134/_framework/dotnet.6.0.2-mauipre.1.22102.15.kf8l5pkaed.js:1:194973) at wasm://wasm/00970ba6:wasm-function[219]:0x1a129
Acabo de encontrar una manera de arreglar esto. Al final de index.js
la siguiente línea
window.connect = connect;
Esto hace que el paquete web no elimine la función de conexión, sin embargo, todavía no se puede usar a través IJSObjectReference
porque espera que la función se exporte como export function connect
de exportación, así que inserté otra línea al final de index.bundle.js
final
export function connect(params) { window.connect(params); }
También tuve que deshabilitar las compilaciones automáticas de paquetes web en mi archivo csproj, ya que mis modificaciones se perderían después de cada compilación y eso es todo, pude usar mi función sin problemas después de eso.