【问题标题】:Serve React build files from two different static build directories从两个不同的静态构建目录提供 React 构建文件
【发布时间】:2020-10-01 00:00:53
【问题描述】:

我目前正在创建一个反应网页,使用 starlette 作为我的网络服务器框架,它连接我的数据库并提供 API。为了改进代码分离和不必要的文件加载,我将我的页面分成两个单独构建的反应页面。一个用于验证前的登录页面,一个用于验证完成且用户拥有有效令牌后的主页。这样做的问题是,两个响应网页都将 GET 请求作为示例发送到:/static/js/2.91da4595.chunk.js

我想知道在查找静态文件时是否可以更改 react 将请求发送到的位置。因此,例如,我的登录页面将改为 /otherstatic/js/2.91da4595.chunk.js

可能有一种更优雅的方法可以达到我想要的目的,所以请随意使用不同的方法。如果需要任何进一步的解释或代码,请告诉我,我可以将其添加到这篇文章中。

【问题讨论】:

    标签: reactjs webpack webserver create-react-app starlette


    【解决方案1】:

    您可能需要进行代码拆分。阅读here了解更多信息。

    对您的应用进行代码拆分可以帮助您“延迟加载”用户当前需要的内容,从而显着提高应用的性能。虽然您没有减少应用中的总代码量,但您避免了加载用户可能永远不需要的代码,并减少了初始加载期间所需的代码量。

    我假设你使用了react-router-dom,所以这里有一个简单的实现:

    import React, { Suspense } from 'react';
    import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom';
    
    const HomePage = React.lazy(() => import('./HomePage'));
    const LoginPage = React.lazy(() => import('./LoginPage'));
    
    function MyApp() {
      const [auth, setAuth] = React.useState({
        isLoading: true,
        isAuthenticated: false,
        data: null,
      })
    
      React.useEffect(() => {
        const checkAuth = () => {
          // call setAuth here
        }
    
        checkAuth()
      }, [])
    
      const MyRoute = ({ component: Component, authorized: false, ...rest }) => (
        <Route
          {...rest}
          render={props => {
            if (auth.isLoading) return null
            if (authorized) { // Home page access
              return auth.isAuthenticated
                ? <Component {...prop} />
                : <Redirect to="/login" />
            } else { // Login page access
              return !auth.isAuthenticated
                ? <Component {...prop} />
                : <Redirect to="/" />
            }
          }}
        />
      )
    
      return (
        <BrowserRouter>
          <Suspense fallback={<div>Loading...</div>}>
            <Switch>
              <MyRoute path="/login" component={LoginPage} authorized={false} />
              <MyRoute path="/" component={HomePage} authorized={true} />
            </Switch>
          </Suspense>
        </BrowserRouter>
      );
    }
    

    【讨论】:

    • 感谢您的回复。正如您所怀疑的那样,我正在使用 react-router-dom,这是一个更优雅的解决方案。然而,这个项目的主题是安全性。在代码隔离方面有两个构建会更安全吗?我知道这两个端点仍然可用,但需要身份验证的端点在没有令牌的情况下将无法访问任何数据。这是否具有同等或更高的安全性?
    • 不。 React 应用静态文件应该是公开的。你需要在你的 react 应用中处理授权和非授权的路由。请参阅我更新的答案以了解存档策略。
    • 太好了,我已经实现了类似的受保护路由组件!感谢您对代码拆分的快速回复和良好建议!
    • 很高兴它有帮助:)
    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2014-02-11
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    相关资源
    最近更新 更多