Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão do .NET 10 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, consulte a Política de Suporte do .NET e do .NET Core. Para a versão atual, consulte a versão do .NET 10 deste artigo.
Carregue o código JavaScript (JS) usando qualquer uma das seguintes abordagens:
-
Carregar o script na
<head>marcação (Geralmente não é recomendado) -
Carregar um script na marcação de
<body> -
Carregar um script de um arquivo JavaScript externo (
.js) localizado junto a um componente -
Carregar um script de um arquivo JavaScript externo (
.js) - Injetar um script antes ou após o Blazor início
O JavaScript embutido não é recomendado para aplicativos Blazor. Recomendamos usar a colocação JS em conjunto com os módulos JS.
Local das tags <script>
Coloque apenas uma marcação de <script> em um arquivo de componente (.razor) se for garantido que o componente adotará a renderização estática do lado do servidor (SSR estático) sem navegação aprimorada . Colocar uma tag <script> em um arquivo de componente não produz um aviso ou erro em tempo de compilação, mas o comportamento de carregamento de script pode não corresponder às suas expectativas em componentes que adotam um modo de renderização interativo ou SSR estático aprimorado com navegação.
Não coloque uma marca <script> em um arquivo de componente (.razor) porque a marca <script> não pode ser atualizada dinamicamente. Colocar uma tag <script> em um arquivo de componente produz um erro em tempo de compilação.
Observação
Exemplos de documentação geralmente colocam scripts em uma tag <script> ou carregam scripts globais de arquivos externos. Essas abordagens poluem o cliente com funções globais. Para aplicativos de produção, recomendamos colocar JS em módulos JS separados que podem ser importados quando necessário. Para obter mais informações, consulte a seção Isolamento de JavaScript em módulos de JavaScript.
Observação
Exemplos de documentação colocam scripts em uma tag <script> ou carregam scripts globais de arquivos externos. Essas abordagens poluem o cliente com funções globais. A inclusão de JS em módulos separadosJS que podem ser importados quando necessário não é suportada em antes do .NET 5. Se o aplicativo exigir o uso de módulos JS para isolamento de JS, recomendamos usar o .NET 5 ou posterior para criar o aplicativo. Para obter mais informações, use a lista suspensa Versão para selecionar um .NET 5 ou uma versão posterior deste artigo e consulte a seção Isolamento de JavaScript em módulos JavaScript.
Carregar um script na marcação de <head>
A abordagem nesta seção não é geralmente recomendada.
Coloque as marcas de JavaScript (JS) e (<script>...</script>) na <head> marcação do elemento:
<head>
...
<script>
window.jsMethod = (methodParameter) => {
...
};
</script>
</head>
O carregamento de JS do <head> não é a melhor abordagem pelos seguintes motivos:
- A interoperabilidade de JS poderá falhar se o script depender de Blazor. É recomendável carregar os scripts usando uma das outras abordagens, não por meio da marcação de
<head>. - A página poderá se tornar interativa mais lentamente devido ao tempo necessário para analisar o JS no script.
Na marcação de componente, os scripts podem ser carregados por meio de um componente HeadContent com a ressalva usual de que essa abordagem pode diminuir a velocidade de carregamento da página no cliente, o que recomendamos evitar. Quando um script é carregado com um componente HeadContent em um aplicativo Blazor Server, Blazor WebAssembly ou Blazor Web App usando um modo de renderização interativo (SSR interativo, CSR) ou SSR estático com navegação avançada, navegar para fora da página do componente remove a etiqueta <script> do conteúdo renderizado <head>, mas não descarrega o código JavaScript do script, incluindo manipuladores de eventos que o script registra, variáveis expostas e métodos que o script fornece. Somente Blazor Web Apps que usam SSR estático sem navegação aprimorada descarregam o código JavaScript quando o usuário sai da página. Geralmente, é melhor adicionar marcações <script> ao conteúdo <head> físico, a menos que você queira explicitamente manter essas referências de script nos componentes que as usam e não se importe que o código não seja descarregado em eventos de navegação.
Na marcação de componente, os scripts podem ser carregados por meio de um componente HeadContent com a ressalva usual de que essa abordagem pode diminuir a velocidade de carregamento da página no cliente, o que recomendamos evitar. Quando um script é carregado com um componente HeadContent, sair da página do componente remove a marcação <script> do conteúdo <head> renderizado, mas não descarrega o código JavaScript do script, incluindo manipuladores de eventos que o script registra, variáveis expostas e métodos fornecidos pelo script. Geralmente, é melhor adicionar marcações <script> ao conteúdo <head> físico, a menos que você queira explicitamente manter essas referências de script nos componentes que as usam e não se importe que o código não seja descarregado em eventos de navegação.
Carregar um script na marcação de <body>
Coloque as marcas JavaScript (<script>...</script>) dentro do elemento de fechamento </body> após a referência do script Blazor:
<body>
...
<script src="{BLAZOR SCRIPT}"></script>
<script>
window.jsMethod = (methodParameter) => {
...
};
</script>
</body>
No exemplo anterior, o espaço reservado {BLAZOR SCRIPT} é o caminho de script Blazor e o nome do arquivo. Para obter a localização do script, confira a estrutura do projeto ASP.NET Core Blazor.
Carregar um script de um arquivo JavaScript externo (.js) localizado junto a um componente
A colocação de arquivos JavaScript (JS) para componentes Razor é uma maneira conveniente de organizar scripts em um aplicativo.
Os componentes Razor de aplicativos Blazor colocam arquivos JS usando a extensão .razor.js e são endereçáveis publicamente usando o caminho para o arquivo no projeto:
{PATH}/{COMPONENT}.razor.js
- O
{PATH}placeholder é o caminho para o componente. - O placeholder
{COMPONENT}é o componente.
Quando o aplicativo é publicado, o framework move automaticamente o script para a raiz da Web. Os scripts são movidos para bin/Release/{TARGET FRAMEWORK MONIKER}/publish/wwwroot/{PATH}/{COMPONENT}.razor.js, onde estão os marcadores de posição:
-
{TARGET FRAMEWORK MONIKER}é o Target Framework Moniker (TFM). -
{PATH}é o caminho para o componente. -
{COMPONENT}é o nome do componente.
Nenhuma alteração é necessária para a URL relativa do script, pois Blazor cuida de colocar o arquivo JS em ativos estáticos publicados para você.
Esta seção e os exemplos a seguir se concentram principalmente em explicar a colocação de arquivos JS. O primeiro exemplo demonstra um arquivo colocado JS com uma função comum JS. O segundo exemplo demonstra a utilização de um módulo para carregar uma função, que é a abordagem recomendada para a maioria dos aplicativos de produção. Chamar JS a partir do .NET é totalmente abordado em Chamar funções JavaScript de métodos .NET no ASP.NET Core Blazor, em que há mais explicações sobre a API BlazorJS com exemplos adicionais. O descarte de componentes, que está presente no segundo exemplo, é abordado no descarte de componentes do ASP.NET CoreRazor.
O componente JsCollocation1 a seguir carrega um script por meio de um componente HeadContent e chama uma função JS com IJSRuntime.InvokeAsync. O espaço reservado {PATH} é o caminho para o componente.
Importante
Se você usar o seguinte código para uma demonstração em um aplicativo de teste, altere o espaço reservado {PATH} para o caminho do componente (por exemplo: Components/Pages em .NET 8 ou posterior ou Pages em .NET 7 ou anterior). Em um Blazor Web App (.NET 8 ou mais recente), o componente requer um modo de renderização interativo aplicado globalmente ao aplicativo ou à definição do componente.
Adicione o script a seguir após o script Blazor (local do script inicial Blazor):
<script src="{PATH}/JsCollocation1.razor.js"></script>
Componente JsCollocation1 ({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();
}
}
O arquivo colocado JS é colocado ao lado do arquivo de componente JsCollocation1 com o nome do arquivo JsCollocation1.razor.js. No componente JsCollocation1, o script é referenciado no caminho do arquivo colocado. No exemplo a seguir, a função showPrompt1 aceita o nome do usuário de um Window prompt() e o retorna ao componente JsCollocation1 para exibição.
{PATH}/JsCollocation1.razor.js:
function showPrompt1(message) {
return prompt(message, 'Type your name here');
}
A abordagem anterior não é recomendada para uso geral em aplicativos de produção porque a abordagem polui o cliente com funções globais. Uma abordagem melhor para aplicativos de produção é usar módulos JS. Os mesmos princípios gerais se aplicam ao carregamento de um módulo JS a partir de um arquivo JS co-localizado, como demonstra o próximo exemplo.
O método OnAfterRenderAsync do componente JsCollocation2 a seguir carrega um módulo JS em module, que é uma classe de componente IJSObjectReference.
module é usado para chamar a função showPrompt2. O espaço reservado {PATH} é o caminho para o componente.
Importante
Se você usar o seguinte código para uma demonstração em um aplicativo de teste, altere o espaço reservado {PATH} para o caminho do componente. Em um Blazor Web App (.NET 8 ou mais recente), o componente requer um modo de renderização interativo aplicado globalmente ao aplicativo ou à definição do componente.
Componente JsCollocation2 ({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)
{
}
}
}
}
No exemplo anterior, JSDisconnectedException é retido durante o descarte do módulo, caso o circuito de Blazor's SignalR seja perdido. Se o código anterior for usado em um aplicativo Blazor WebAssembly, não haverá conexão SignalR a perder, portanto, você poderá remover o bloco try-catch e deixar a linha que descarta o módulo (await module.DisposeAsync();). Para obter mais informações, confira Interoperabilidade ASP.NET Core Blazor JavaScript (interoperabilidade JS).
{PATH}/JsCollocation2.razor.js:
export function showPrompt2(message) {
return prompt(message, 'Type your name here');
}
Importante
Não coloque uma marcação de <script> para JsCollocation2.razor.js após o script Blazor porque o módulo é carregado e armazenado em cache automaticamente quando o dinâmico import() é invocado.
O uso de scripts e módulos para JS agrupados em uma biblioteca de classes de Razor (RCL) só tem suporte para JSmecanismo de interoperabilidade de Blazor com base na interface IJSRuntime. Se você estiver implementando a interop [JSImport]/[JSExport] JavaScript, consulte Interop JSImport/JSExport JavaScript com o ASP.NET Core Blazor.
Para scripts ou módulos fornecidos por uma biblioteca de classes (RCL) Razor, usando interop JS baseada emIJSRuntime, o seguinte caminho é usado:
./_content/{PACKAGE ID}/{PATH}/{COMPONENT}.{EXTENSION}.js
- O segmento de caminho para o diretório atual (
./) é necessário para criar o caminho de ativo estático correto para o arquivo JS. - O espaço reservado
{PACKAGE ID}é o identificador do pacote da RCL (ou nome da biblioteca para uma biblioteca de classes referenciada pelo aplicativo). - O espaço reservado
{PATH}é o caminho para o componente. Se um componente Razor estiver localizado na raiz da RCL, o segmento de caminho não será incluído. - O espaço reservado
{COMPONENT}é o nome do componente. - O placeholder
{EXTENSION}corresponde à extensão do componente, sejarazoroucshtml.
No seguinte exemplo de aplicativo Blazor:
- O identificador do pacote da RCL é
AppJS. - Os scripts de um módulo são carregados para o componente
JsCollocation3(JsCollocation3.razor). - O componente
JsCollocation3está na pastaComponents/Pagesda RCL.
module = await JS.InvokeAsync<IJSObjectReference>("import",
"./_content/AppJS/Components/Pages/JsCollocation3.razor.js");
Para obter mais informações sobre RCLs, consulte Consumir componentes do ASP.NET Core Razor de uma Razor biblioteca de classes (RCL).
Carregar um script de um arquivo JavaScript externo (.js)
Coloque as marcas de JavaScript (JS) (<script>...</script>) com um caminho de origem de script (src) dentro do elemento de </body>fechamento após a referência de script Blazor:
<body>
...
<script src="{BLAZOR SCRIPT}"></script>
<script src="{SCRIPT PATH AND FILE NAME (.js)}"></script>
</body>
Para os espaços reservados no exemplo anterior:
- O espaço reservado
{BLAZOR SCRIPT}é o caminho do script Blazor e o nome do arquivo. Para obter a localização do script, confira a estrutura do projeto ASP.NET Core Blazor. - O espaço reservado
{SCRIPT PATH AND FILE NAME (.js)}é o caminho e o nome do arquivo de script sobwwwroot.
No seguinte exemplo da tag <script> anterior, o arquivo scripts.js está na pasta wwwroot/js do aplicativo:
<script src="js/scripts.js"></script>
Você também pode servir scripts diretamente da pasta wwwroot se preferir não manter todos os scripts em uma pasta separada em wwwroot:
<script src="scripts.js"></script>
Quando o arquivo JS externo é fornecido por uma biblioteca de classes Razor, especifique o arquivo JS usando o caminho de ativo da Web estático estável: _content/{PACKAGE ID}/{SCRIPT PATH AND FILE NAME (.js)}:
- O espaço reservado
{PACKAGE ID}é a ID do pacote da biblioteca. A ID do pacote terá como valor padrão o nome do assembly do projeto, se<PackageId>não for especificado no arquivo de projeto. - O espaço reservado
{SCRIPT PATH AND FILE NAME (.js)}é o caminho e o nome do arquivo emwwwroot.
<body>
...
<script src="{BLAZOR SCRIPT}"></script>
<script src="_content/{PACKAGE ID}/{SCRIPT PATH AND FILE NAME (.js)}"></script>
</body>
No seguinte exemplo da marca <script> anterior:
- A biblioteca de classes Razor tem um nome de assembly
ComponentLibrarye um<PackageId>não é especificado no arquivo de projeto da biblioteca. - O arquivo
scripts.jsestá na pastawwwrootda biblioteca de classes.
<script src="_content/ComponentLibrary/scripts.js"></script>
Para obter mais informações, consulte Consumir componentes Razor do ASP.NET Core de uma RCL (biblioteca de classes) Razor.
Injetar um script antes ou depois que Blazor iniciar
Para garantir que os scripts carreguem antes ou após o início de Blazor, use um inicializador JavaScript. Para obter mais informações e exemplos, veja Inicialização de Blazor no ASP.NET Core.
Injetar um script após o início de Blazor
Para injetar um script após a inicialização de Blazor, encadeie para o Promise que resulta de um início manual de Blazor. Para obter mais informações e um exemplo, veja Inicialização de Blazor no ASP.NET Core.
Isolamento de JavaScript em módulos JavaScript
Blazor ativa o isolamento do JavaScript (JS) em módulos JS padrão (especificação ECMAScript).
O isolamento de JS oferece os seguintes benefícios:
- O JS importado não polui mais o namespace global.
- Os consumidores de uma biblioteca e componentes não precisam importar o JS relacionado.
Em cenários do lado do servidor, sempre intercepte JSDisconnectedException caso a perda do circuito SignalR de Blazor impeça que uma chamada de interoperabilidade JS descarte um módulo, o que resulta em uma exceção sem tratamento. Os aplicativos Blazor WebAssembly não usam uma conexão SignalR durante a interoperabilidade JS, portanto, não há necessidade de capturar JSDisconnectedException em aplicativos Blazor WebAssembly para descarte de módulos.
Para saber mais, consulte os recursos a seguir: