【发布时间】:2020-08-18 23:43:58
【问题描述】:
TLDR:我的加载动画(用 JS 编写)在我的 Webpack 包加载时不会播放,这违背了加载动画的目的。我正在寻找一种方法让两者同时发生。
我正在构建一个网页,其主体是一个 React 应用程序,编译成一个越来越大的 Webpack 包。 (我知道我应该跳上延迟加载火车;目前,该捆绑包只是一个单一的登录页面。)我为该页面实现了一个加载动画,该动画在一系列 SVG 帧上循环,并且很长一段时间以来,它都有效看似完美,但添加一个 Redux 商店似乎已经把它推到了边缘。 现在,每当我重新加载页面时,动画在加载包时冻结大约 10 秒,然后才开始播放,就像 React 应用程序调用加载器的回调并且动画淡出一样。
这是我页面的大致结构:
<head>
<!--Meta info-->
<script>/*Handles favicon color based on light/dark mode preference of browser*/</script>
<!--Stylesheets-->
<script>/*Handles debug info for React DevTools*/</script>
</head>
<body>
<div id="loader-container">
<div id="loader">
<div id="loader-text"><!--Contains splash text that's meant to cycle over time--></div>
<div id="loader-character-container"><!--Contains SVG whose contents are meant to cycle over time--></div>
</div>
<script id="run-load-animation">/*Handles SVG and text animation*/</script>
<div id="root"><!--Where React will do all of its rendering--></div>
<script src="bundle.js" onload="bundleLoaded(event)"></script>
</body>
#run-load-animation 是在加载 bundle.js 时应该运行的内容。
我尝试过的:
- 我将原来在该脚本中使用的
setInterval更改为requestAnimationFrame,但这并没有什么不同。 - 如果我在应该启动动画的代码行之前和之后放置打印语句,那么在它们被打印之间似乎有大约 10 秒的延迟,在此期间动画不会播放。那里根本不应该有任何延误。
- 我用一个无限运行的
setInterval替换了我原来的加载动画脚本,它只打印一条消息。它发送到控制台的消息显示在加载bundle.js时相同的大约 10 秒暂停。这让我相信不是我的动画逻辑有问题。
基于this handy article on the HTML page load lifecycle,看起来不可避免的事情正在发生:在加载bundle.js 时,所有其他脚本都停止运行。正如那篇文章所建议的那样,我在bundle.js 的脚本标签上尝试了async 和defer,但没有运气。鉴于 JS 是单线程的,我担心除了使用纯 CSS 动画或 GIF 之外别无他法,但我正在寻找更好的选择。
有什么方法可以确保我的 JS 代码在 bundle.js 加载时继续运行动画脚本?
【问题讨论】:
标签: javascript html reactjs asynchronous webpack