بهبود صفحهی بارگذاری اولیه در Blazor WASM
نویسنده: وحید نصیری
تاریخ: ۱۴۰۱/۰۵/۰۶ ۱۳:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<script src="_framework/blazor.webassembly.js" autostart="false"></script>
<body>
<div id="app">
<div class="d-flex flex-column min-vh-100">
<div class="d-flex vh-100">
<div class="d-flex w-100 justify-content-center align-self-center">
<div class="d-flex flex-column w-25">
<div>Loading <label id="progressbarLabel"></label></div>
<div class="progress mt-2" style="height: 2em;">
<div id="progressbar" class="progress-bar progress-bar-striped"></div>
</div>
</div>
</div>
</div>
</div>
</div>
(function () {
let resourceIndex = 0;
const fetchResponsePromises = [];
const progressbar = document.getElementById("progressbar");
const progressbarLabel = document.getElementById("progressbarLabel");
const loadStart = new Date().getTime();
if (!isAutostartDisabled()) {
console.warn(
"`blazor.webassembly.js` script tag doesn`t have the `autostart=false` attribute."
);
return;
}
Blazor.start({
loadBootResource: function (type, filename, defaultUri, integrity) {
if (type === "dotnetjs") {
progressbarLabel.innerText = filename;
return defaultUri;
}
const responsePromise = fetch(defaultUri, {
cache: "no-cache",
integrity: integrity,
});
fetchResponsePromises.push(responsePromise);
responsePromise.then((response) => {
if (!progressbar) {
console.warn("Couldn't find the progressbar element on the page.");
return;
}
if (!progressbarLabel) {
console.warn(
"Couldn't find the progressbarLabel element on the page."
);
return;
}
resourceIndex++;
const totalResourceCount = fetchResponsePromises.length;
const percentLoaded = Math.round(
100 * (resourceIndex / totalResourceCount)
);
progressbar.style.width = `${percentLoaded}%`;
progressbar.innerText = `${percentLoaded} % [${resourceIndex}/${totalResourceCount}]`;
progressbarLabel.innerText = filename;
if (percentLoaded >= 100) {
var span = new Date().getTime() - loadStart;
console.log(`All done in ${span} ms.`);
}
});
return responsePromise;
},
});
function isAutostartDisabled() {
var wasmScript = document.querySelector(
'script[src="_framework/blazor.webassembly.js"]'
);
if (!wasmScript) {
return false;
}
var autostart = wasmScript.attributes["autostart"];
return autostart && autostart.value === "false";
}
})(); <script src="_framework/blazor.webassembly.js" autostart="false"></script> <script src="js/blazorLoader.js"></script> </body>
<body>
<div id="app">
<svg class="loading-progress">
<circle r="40%" cx="50%" cy="50%" />
<circle r="40%" cx="50%" cy="50%" />
</svg>
<div class="loading-progress-text"></div>
</div> .loading-progress {
position: relative;
display: block;
width: 8rem;
height: 8rem;
margin: 20vh auto 1rem auto;
}
.loading-progress circle {
fill: none;
stroke: #e0e0e0;
stroke-width: 0.6rem;
transform-origin: 50% 50%;
transform: rotate(-90deg);
}
.loading-progress circle:last-child {
stroke: #1b6ec2;
stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
transition: stroke-dasharray 0.05s ease-in-out;
}
.loading-progress-text {
position: absolute;
text-align: center;
font-weight: bold;
inset: calc(20vh + 3.25rem) 0 auto 0.2rem;
}
.loading-progress-text:after {
content: var(--blazor-load-percentage-text, "Loading");
} <body>
<div id="app">
<div class="progress">
<div class="progress-bar progress-bar-striped progress-bar-animated"
role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100"
style="width: var(--blazor-load-percentage, 0%)">
<div class="loading-text"></div>
</div>
</div> .loading-text:after {
content: var(--blazor-load-percentage-text, "Loading");
}