reactjs - 如何有条件地在反应路由器中导入组件
问题描述
目前我正在将我所有的组件导入到我的 App.js 文件中,然后使用反应路由器来制作看起来像这样的东西......
const App = () => {
return(
<Elements stripe={stripePromise}>
<Router>
<Banner />
<Navbar />
<Switch>
<UnPrivateRoute path="/" exact component={Home} />
<UnPrivateRoute path="/signup" exact component={Signup} />
<UnPrivateRoute path="/login" exact component={Login} />
<Route path="/contact-us" exact component={Contact} />
<Route path="/refund-policy" exact component={RefundPolicy} />
<Route path="/privacy-policy" exact component={PrivacyPolicy} />
<Route path="/terms-of-use" exact component={TermsOfUse} />
<PrivateRoute path='/dashboard' exact roles={['pro']} component={Dashboard} />
{/* ANOTHER 30 ROUTES */}...
<Route path="*" component={NoMatch} />
</Switch><Footer />
</Router>
</Elements>
)
}
我现在已经部署了我的应用程序,加载时间很糟糕,我的包大小约为 9MB,我正在尝试解决加载时间问题,因为它们导致我的“无法访问此网站”错误用户有时。
根据我的阅读,有没有办法有条件地导入这些组件,以便它们仅在用户访问相关页面时加载?这会显着增加我网站的初始加载时间吗?这些是我在网上看到的实现的方法,但我不确定是否是我需要的?
import("./math").then(math => {
console.log(math.add(16, 26));
})
and
<Route
exact
path="/"
component={
loading
? () => <div></div>
: () => Home
}
/>
and
const Home = lazy(() => import('./routes/Home'));
const About = lazy(() => import('./routes/About'));
const App = () => (
<Router>
<Suspense fallback={<div>Loading...</div>}>
<Switch>
<Route exact path="/" component={Home}/>
<Route path="/about" component={About}/>
</Switch>
</Suspense>
</Router>
);
这些都是我需要的吗?
解决方案
懒加载!!您可以延迟加载组件。
这是相同的文档。
https://reactjs.org/docs/code-splitting.html
但是,您的 9MB 生产版本是可疑的。确保您正在为生产环境而不是开发环境构建。如果您的项目是使用 Create React Appnpm run build
构建的,则会在项目的 build/ 文件夹中创建您的应用程序的生产版本。还要确保您的图像和其他媒体文件没有为此添加。有时我们使用图像作为获取,但我们需要为 Web 调整它们以减少渲染时间和包大小。
更新:
更新我的答案,以便对更多人有用。打开您的网站chrome
并在developer tool
开放Lighthouse
中。在那里选择性能并生成报告。您可以查看所有建议以及可以改进的地方。在你的情况下有很多。
更新2
由于您有很多图像,因此延迟加载图像是一个好主意。您不能像延迟加载组件一样延迟加载图像。您可以创建一个单独的可重用组件来延迟加载图像。此链接可以帮助您朝着这个方向前进。
https://levelup.gitconnected.com/lazy-loading-images-in-react-for-better-performance-5df73654ea05
但是,如果您已经看到上次更新的屏幕截图,您仍然需要减小图像和 gif 的大小。
推荐阅读
- spring-boot - Spring Boot 2.3.4:JwtValidators.createDefaultWithIssuer(String) 的错误?
- flask - Flask RESTful API 部署在 Heroku 上并具有依赖项
- javascript - Jquery 在点击时做一些事情
- java - Lombok 在编译类中创建获取和设置,但不是在 Eclipse 2020-09 中生成的源
- python - 更新面板没有效果
- python - 使用 WSL 从浏览器连接到 localhost 时出现问题
- spring-boot - 从 Swagger 3.0 UI 中删除 ModelAndView
- canvas - Scaling Matter.js 画布会中断鼠标拖动
- php - 如何在 PHP 中显示“用户在多少天前访问了一个网站”
- python - 缺失值的插补和除法