본문 바로가기
프로그래밍/Blazor

Blazor에서 OnInitialized() 함수가 두 번 호출되는 이유

by bantomak 2023. 5. 18.

문제 발견

OnInitialized() 함수에서 작성한 함수가 2번 연속으로 호출되는 이슈가 있어서 확인해 보니 실제로 2번 호출되는 게 맞았다.

 

구글링을 통해 Render-mode에 따라서 함수가 호출되는 횟수가 변경된다는걸 확인

  • Static : 일반 HTML파일처럼 정적 페이지를 로드하는 방식
  • Server : 실시간으로 변하는 Blazor를 그때그때 그리는 방식
    (React 초기에 페이지 로딩이 느린 것과 동일한 방법으로 이해)
  • ServerPrerendered : "Static"방식과 "Server"방식에 중간에 해당하는 방식, 초기 페이지 로딩속도를 빠르게 하기 위해서 정적 데이터로 정적 페이지를 로딩하고 그다음에 페이지의 변화가 있으면 SPA처럼 렌더링을 시키는 방식으로 작동한다. 그래서 OnInitialized() 함수가 두 번 호출됨

 

문제 해결

Blazor 프로젝트 생성시에 자동 생성되는 _Host.cshtml에서 render-mode를 변경할 수 있다.

render-mode="ServerPrerendered"를 render-mode="Server"로 변경

 

//_Host.cshtml

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>TestBlazor</title>
    <base href="~/" />
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"></script>
    <link href="css/site.css" rel="stylesheet" />
    <link href="TestBlazor.styles.css" rel="stylesheet" />
</head>
<body>
    <component type="typeof(App)" render-mode="Server" />

    <div id="blazor-error-ui">
        <environment include="Staging,Production">
            An error has occurred. This application may no longer respond until reloaded.
        </environment>
        <environment include="Development">
            An unhandled exception has occurred. See browser dev tools for details.
        </environment>
        <a href="" class="reload">Reload</a>
        <a class="dismiss">🗙</a>
    </div>

    <script src="_framework/blazor.server.js"></script>
</body>
</html>

댓글