JavaScript-hely ASP.NET Core Blazor-alkalmazásokban
A cikk tartalma
Figyelmeztetés
A ASP.NET Core ezen verziója már nem támogatott. További információ: .NET és .NET Core támogatási szabályzat. Az aktuális kiadáshoz tekintse meg a jelen cikk .NET 9-es verzióját .
Fontos
Ezek az információk egy olyan előzetes termékre vonatkoznak, amelyet a kereskedelmi forgalomba kerülés előtt jelentősen módosíthatnak. A Microsoft nem vállal kifejezett vagy hallgatólagos szavatosságot az itt megadott információkra vonatkozóan.
Az aktuális kiadáshoz tekintse meg a jelen cikk .NET 9-es verzióját .
Töltse be a JavaScript (JS) kódot az alábbi módszerek bármelyikével:
Beágyazott JavaScript nem ajánlott Blazor alkalmazásokhoz. Javasoljuk, hogy JS elrendezést kombináljon a JS modulokkal.
Csak akkor helyezzen <script>
címkét egy összetevőfájlba (.razor
), ha az összetevő garantáltan statikus kiszolgálóoldali renderelést (statikus SSR) alkalmaz továbbfejlesztett navigáció nélkül. Ha <script>
címkét helyez el egy összetevőfájlban, az nem okoz fordítási időt jelző figyelmeztetést vagy hibát, de előfordulhat, hogy a szkriptbetöltési viselkedés nem felel meg az interaktív renderelési módot vagy statikus SSR-t továbbfejlesztett navigációval használó összetevőkre vonatkozó elvárásainak.
Ne helyezzen <script>
címkét egy összetevőfájlba (.razor
), mert a <script>
címke nem frissíthető dinamikusan. Ha egy <script>
címkét helyez el egy összetevőfájlban, fordítási időben jelentkező hibát okoz.
Megjegyzés
A dokumentációs példák általában egy <script>
címkébe helyezik a szkripteket, vagy külső fájlokból töltik be a globális szkripteket. Ezek a megközelítések globális függvényekkel szennyezi az ügyfelet. Éles alkalmazások esetén javasoljuk, hogy külön JS modulokba helyezze el a JS-t, amelyeket szükség esetén importálhat. További információ: JavaScript-elkülönítés a JavaScript-modulokban szakaszban.
Megjegyzés
A dokumentációs példák szkripteket helyeznek egy <script>
címkébe, vagy betöltik a globális szkripteket külső fájlokból. Ezek a megközelítések globális függvényekkel szennyezi az ügyfelet. A JS különálló JS modulokba, amelyek szükség esetén importálhatók, nem támogatottak Blazor ASP.NET Core 5.0-nál korábbi verzióiban. Ha az alkalmazás JS modulok használatát igényli JS elkülönítéshez, javasoljuk, hogy ASP.NET Core 5.0-s vagy újabb verzióját használja az alkalmazás létrehozásához. További információkért használja a
Az ebben a szakaszban ismertetett megközelítés általában nem ajánlott.
Helyezze a JavaScript (JS) címkéket (<script>...</script>
) a <head>
elem jelölésébe ():
<head>
...
<script>
window.jsMethod = (methodParameter) => {
...
};
</script>
</head>
A JS<head>
-ból való betöltése nem a legjobb módszer az alábbi okokból:
-
JS interop meghiúsulhat, ha a szkript attól függ, hogy Blazorelérhető-e. Azt javasoljuk, hogy a szkripteket a többi módszer egyikével töltse be, ne a
<head>
korrektúra használatával. - A lap lassabban válhat interaktívvá a szkript JS elemzéséhez szükséges idő miatt.
Az összetevőjelölés esetében a szkriptek egy HeadContent
összetevőn keresztül tölthetők be, a szokásos figyelmeztetéssel, hogy a módszer lelassítja a kliens oldal betöltését, ezért javasoljuk annak elkerülését. Ha egy szkript HeadContent
összetevővel töltődik be egy Blazor Server alkalmazásban, Blazor WebAssembly alkalmazásban vagy olyan Blazor Web App-ban, amely interaktív renderelési módot (interaktív SSR, CSR) vagy továbbfejlesztett navigációval rendelkező statikus SSR-t használ, az összetevő oldalának elhagyásakor a <script>
címke eltávolításra kerül a renderelt <head>
tartalomból, de a szkript JavaScript-kódja nem töltődik ki, beleértve az eseménykezelőket, amelyeket a szkript regisztrál, a nyilvánosságra hozott változókat és a szkript által biztosított metódusokat. Csak a Blazor Web App-k, amelyek statikus SSR-t használnak továbbfejlesztett navigáció nélkül, oldják fel a JavaScript-kódot, amikor a felhasználó elnavigál az oldalról. Általában jobb, ha <script>
címkéket ad hozzá a fizikai <head>
tartalomhoz, kivéve, ha kifejezetten meg szeretné tartani az ilyen szkripthivatkozásokat az őket használó összetevőkben, és nem bánja, hogy a kód nem kerül eltávolításra a navigációs események során.
Az összetevő jelölőnyelv esetében a szkriptek egy HeadContent
összetevőn keresztül tölthetők be, a szokásos figyelmeztetéssel, hogy a módszer lassítja az oldal betöltését a kliensnél, ezért javasoljuk, hogy kerülje el. Ha egy szkript HeadContent
összetevővel van betöltve, az összetevő oldaláról lépve eltávolítja a <script>
címkét a renderelt <head>
tartalomból, de nem távolítja el a szkript JavaScript-kódját, beleértve a szkript által regisztrált eseménykezelőket, a közzétett változókat és a szkript által biztosított metódusokat. Általában jobb, ha <script>
címkéket ad hozzá a fizikai <head>
tartalomhoz, kivéve, ha kifejezetten meg szeretné tartani az ilyen szkripthivatkozásokat az őket használó összetevőkben, és nem bánja, hogy a kód nem kerül eltávolításra a navigációs események során.
Helyezze a JavaScript-címkéket (<script>...</script>
) a záró </body>
elembe a Blazor szkripthivatkozás után:
<body>
...
<script src="{BLAZOR SCRIPT}"></script>
<script>
window.jsMethod = (methodParameter) => {
...
};
</script>
</body>
Az előző példában a {BLAZOR SCRIPT}
helyőrző a Blazor szkript elérési útja és fájlneve. A szkript helyéről lásd: ASP.NET Core Blazor projektstruktúra.
A JavaScript-fájlok (JS) összetevők (Razor) számára történő együtt elhelyezése kényelmes módszer a szkriptek alkalmazásbeli rendszerezésére.
Razor
Blazor-alkalmazások összetevői a JS kiterjesztést használva helyezik el a .razor.js
fájlokat, amelyek nyilvánosan elérhetők a projekt fájljának útvonalán keresztül.
{PATH}/{COMPONENT}.razor.js
- A
{PATH}
helyőrző az összetevő elérési útja. - A
{COMPONENT}
helyőrző az összetevő.
Az alkalmazás közzétételekor a keretrendszer automatikusan áthelyezi a szkriptet a webgyökérbe. A szkriptek átkerülnek a bin/Release/{TARGET FRAMEWORK MONIKER}/publish/wwwroot/{PATH}/{COMPONENT}.razor.js
-ba, ahol a következő helyőrzők találhatók:
-
{TARGET FRAMEWORK MONIKER}
a célkeretrendszer moniker (TFM). -
{PATH}
az összetevő elérési útja. -
{COMPONENT}
az összetevő neve.
Nincs szükség a szkript relatív URL-címének módosítására, mivel a Blazor automatikusan gondoskodik róla, hogy a JS fájl bekerüljön a közzétett statikus eszközök közé.
Ez a szakasz és a következő példák elsősorban a JS fájlelhelyezés magyarázatára összpontosítanak. Az első példa bemutat egy együtt működő JS fájlt egy szokásos JS függvénnyel. A második példa egy modul függvény betöltésére való használatát mutatja be, amely a legtöbb éles alkalmazás esetében ajánlott módszer. A .NET-ből való
Az alábbi JsCollocation1
összetevő betölt egy szkriptet egy HeadContent
összetevőn keresztül, és meghív egy JS függvényt IJSRuntime.InvokeAsync. A {PATH}
helyőrző az összetevő elérési útja.
Fontos
Ha a következő kódot használja egy tesztalkalmazás bemutatójára, módosítsa a {PATH}
helyőrzőt az összetevő elérési útjára (például: .NET 8-ban vagy újabb verzióban Components/Pages
vagy a .NET 7-ben vagy korábbi verziókban Pages
). Egy Blazor Web App (.NET 8 vagy újabb verzió) az összetevőhöz az alkalmazásra vagy az összetevő definícióra globálisan alkalmazott interaktív renderelési mód szükséges.
Adja hozzá a következő szkriptet a Blazor szkript után (a Blazor indítási szkript helyét):
<script src="{PATH}/JsCollocation1.razor.js"></script>
JsCollocation1
összetevő ({PATH}/JsCollocation1.razor
):
@page "/js-collocation-1"
@inject IJSRuntime JS
<PageTitle>JS Collocation 1</PageTitle>
<h1>JS Collocation Example 1</h1>
<button @onclick="ShowPrompt">Call showPrompt1</button>
@if (!string.IsNullOrEmpty(result))
{
<p>
Hello @result!
</p>
}
@code {
private string? result;
public async Task ShowPrompt()
{
result = await JS.InvokeAsync<string>(
"showPrompt1", "What's your name?");
StateHasChanged();
}
}
Az csoportosított JS fájl a JsCollocation1
összetevőfájl mellett található, és a fájl neve JsCollocation1.razor.js
. Az JsCollocation1
összetevőben a szkript az csoportosított fájl elérési útjára hivatkozik. Az alábbi példában a showPrompt1
függvény elfogadja a felhasználó nevét egy Window prompt()
, és visszaadja a JsCollocation1
összetevőnek megjelenítésre.
{PATH}/JsCollocation1.razor.js
:
function showPrompt1(message) {
return prompt(message, 'Type your name here');
}
Az előző megközelítés nem ajánlott az éles alkalmazásokban való általános használathoz, mert a megközelítés globális függvényekkel szennyezi az ügyfelet. Az termelési alkalmazások jobb megközelítése a JS modulok használata. Ugyanezek az általános alapelvek vonatkoznak egy JS modul egy csoportosított JS fájlból való betöltésére, ahogyan azt a következő példa is mutatja.
Az alábbi JsCollocation2
összetevő OnAfterRenderAsync
metódusa betölt egy JS modult a module
-ba, amely az összetevő osztályának IJSObjectReference-je.
module
a showPrompt2
függvény meghívására szolgál. A {PATH}
helyőrző az összetevő elérési útja.
Fontos
Ha a következő kódot használja egy tesztalkalmazásban történő bemutatóhoz, módosítsa a {PATH}
helyőrzőt az összetevő elérési útjára. Egy Blazor Web App (.NET 8 vagy újabb verzió) az összetevőhöz az alkalmazásra vagy az összetevő definícióra globálisan alkalmazott interaktív renderelési mód szükséges.
JsCollocation2
összetevő ({PATH}/JsCollocation2.razor
):
@page "/js-collocation-2"
@implements IAsyncDisposable
@inject IJSRuntime JS
<PageTitle>JS Collocation 2</PageTitle>
<h1>JS Collocation Example 2</h1>
<button @onclick="ShowPrompt">Call showPrompt2</button>
@if (!string.IsNullOrEmpty(result))
{
<p>
Hello @result!
</p>
}
@code {
private IJSObjectReference? module;
private string? result;
protected async override Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
/*
Change the {PATH} placeholder in the next line to the path of
the collocated JS file in the app. Examples:
./Components/Pages/JsCollocation2.razor.js (.NET 8 or later)
./Pages/JsCollocation2.razor.js (.NET 7 or earlier)
*/
module = await JS.InvokeAsync<IJSObjectReference>("import",
"./{PATH}/JsCollocation2.razor.js");
}
}
public async Task ShowPrompt()
{
if (module is not null)
{
result = await module.InvokeAsync<string>(
"showPrompt2", "What's your name?");
StateHasChanged();
}
}
async ValueTask IAsyncDisposable.DisposeAsync()
{
if (module is not null)
{
try
{
await module.DisposeAsync();
}
catch (JSDisconnectedException)
{
}
}
}
}
Az előző példában JSDisconnectedException problémát okoz a modul eltávolítása során, ha BlazorSignalR áramköre elveszik. Ha az előző kódot egy Blazor WebAssembly alkalmazásban használják, nincs SignalR kapcsolat, amit elveszíthetne, így eltávolíthatja a try
-catch
blokkot, és meghagyhatja a sort, amely megsemmisíti a modult (await module.DisposeAsync();
). További információ: ASP.NET Core Blazor JavaScript-együttműködés (JS interop).
{PATH}/JsCollocation2.razor.js
:
export function showPrompt2(message) {
return prompt(message, 'Type your name here');
}
Fontos
Ne helyezzen <script>
JsCollocation2.razor.js
címkét a Blazor szkript után, mert a modul automatikusan betöltődik és gyorsítótárazódik a dinamikus import()
meghívásakor.
A szkriptek és modulok használata a JS osztálykönyvtárban (RCL) lévő csoportosított Razor esetén csak BlazorJS interfészességen alapuló IJSRuntime interop mechanizmushoz támogatott. Ha a JavaScript [JSImport]
/[JSExport]
interop funkciót implementálja, tekintse meg a JavaScript JSImport/JSExport interop és ASP.NET Core lehetőségeit Blazor.
Az Razor osztálykódtár (RCL) által IJSRuntime-alapú JS interop használatával biztosított szkriptek vagy modulok esetében a következő elérési utat használja a rendszer:
./_content/{PACKAGE ID}/{PATH}/{COMPONENT}.{EXTENSION}.js
- Az aktuális könyvtár elérési útja (
./
) szükséges a megfelelő statikus objektum elérési útjának létrehozásához a JS fájlhoz. - A
{PACKAGE ID}
helyőrző az RCL csomagazonosítója (vagy az alkalmazás által hivatkozott osztálytár könyvtárneve). - A
{PATH}
helyőrző az összetevő elérési útja. Ha egy Razor összetevő az RCL gyökerénél található, az elérésiút-szegmens nem lesz benne. - A
{COMPONENT}
helyőrző az összetevő neve. - A
{EXTENSION}
helyőrző megegyezik a komponens kiterjesztésével:razor
vagycshtml
.
Az alábbi Blazor alkalmazás példája:
- Az RCL csomagazonosítója
AppJS
. - A modul szkriptjei be vannak töltve a
JsCollocation3
összetevő (JsCollocation3.razor
) számára. - A
JsCollocation3
összetevő az RCLComponents/Pages
mappájában található.
module = await JS.InvokeAsync<IJSObjectReference>("import",
"./_content/AppJS/Components/Pages/JsCollocation3.razor.js");
További információ az RCL-ekről: ASP.NET Core Razor-összetevők felhasználása Razor osztálytárból (RCL).
Helyezze a JavaScript (JS) címkéket (<script>...</script>
), ahol a szkriptforrás (src
) elérési útja van, a záró </body>
elem belsejébe, a Blazor szkripthivatkozás után.
<body>
...
<script src="{BLAZOR SCRIPT}"></script>
<script src="{SCRIPT PATH AND FILE NAME (.js)}"></script>
</body>
Az előző példában szereplő helyőrzők esetében:
- A
{BLAZOR SCRIPT}
helyőrző a Blazor szkript elérési útját és fájlnevét jelöli. A szkript helyéről lásd: ASP.NET Core Blazor projektstruktúra. - A
{SCRIPT PATH AND FILE NAME (.js)}
helyőrző az elérési út és a szkriptfájl neve awwwroot
alatt.
Az előző <script>
címke alábbi példájában a scripts.js
fájl az alkalmazás wwwroot/js
mappájában található:
<script src="js/scripts.js"></script>
A szkripteket közvetlenül a wwwroot
mappából is kiszolgálhatja, ha nem szeretné, hogy az összes szkript külön mappában maradjon a wwwroot
alatt:
<script src="scripts.js"></script>
Ha a külső JS fájlt egy Razor osztálykönyvtár adja meg, adja meg a JS fájlt a statikus, stabil webes erőforrás elérési útjával: _content/{PACKAGE ID}/{SCRIPT PATH AND FILE NAME (.js)}
.
- A
{PACKAGE ID}
helyőrző a könyvtár csomagazonosítója. Ha a projektfájlban nincs megadva a<PackageId>
, akkor a csomagazonosító alapértelmezés szerint a projekt összeállítás neve lesz. - A
{SCRIPT PATH AND FILE NAME (.js)}
helyőrző awwwroot
alatti elérési út és fájlnév.
<body>
...
<script src="{BLAZOR SCRIPT}"></script>
<script src="_content/{PACKAGE ID}/{SCRIPT PATH AND FILE NAME (.js)}"></script>
</body>
Az előző <script>
címke alábbi példájában:
- A Razor osztálykönyvtár összeállítás neve
ComponentLibrary
, és a könyvtár projektfájljában nincs megadva<PackageId>
. - A
scripts.js
fájl az osztálytárwwwroot
mappájában található.
<script src="_content/ComponentLibrary/scripts.js"></script>
További információért lásd: ASP.NET Core Razor összetevőinek felhasználása Razor osztálykönyvtárból (RCL).
Ha gondoskodni szeretne arról, hogy a szkriptek betöltődjenek Blazor indítása előtt vagy után, használjon JavaScript-inicializálót. További információkért és példákért lásd: ASP.NET Core Blazor indítás.
Ha a Blazor indítása után szeretne szkriptet injektálni, akkor kapcsolódjon ahhoz a Promise
-hez, amely a Blazormanuális indításából ered. További információért és példáért lásd: ASP.NET Core Blazor indítás.
Blazor engedélyezi a JavaScript (JS) elkülönítését standard JS modulokban (ECMAScript specifikáció).
JS elkülönítés a következő előnyöket biztosítja:
- Az importált JS már nem szennyezi a globális névteret.
- A könyvtárak és összetevők felhasználóinak nem szükséges importálni a kapcsolódó JS-t.
Kiszolgálóoldali forgatókönyvekben mindig fogd el a JSDisconnectedException-t arra az esetre, ha a BlazorSignalR áramkörének meghibásodása megakadályozza, hogy egy JS interop hívás lezárja a modult, ami kezeletlen kivételt eredményez. Blazor WebAssembly alkalmazások nem használnak SignalR kapcsolatot JS interop során, így nincs szükség JSDisconnectedException megfogására a Blazor WebAssembly alkalmazásokban a modulok felszabadításához.
További információ:
ASP.NET Core-visszajelzés
A(z) ASP.NET Core egy nyílt forráskód projekt. Visszajelzés adásához válasszon egy hivatkozást: