You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React项目本地运行正常但build后部署卡在加载状态问题排查

React构建部署后卡在加载界面问题排查

问题描述

我有一个简易React项目,可从Mongo表查询信息并在页面展示,设置了加载状态以显示spinner和提示文本。本地执行yarn start运行正常,但执行yarn build并部署输出文件后,页面卡在加载界面,且控制台仅输出部分console.log内容,未执行全部代码。请问构建流程哪里出现了问题?

项目代码

import React, { useEffect } from "react";
import { ZOHO } from "./vendor/ZSDK";
import {
  BrowserRouter as Router,
  Routes,
  Route,
  Link,
  NavLink,
  Redirect,
  withRouter,
} from "react-router-dom";
import JiraTable from "./components/JiraTable";
import CircularProgress from "@mui/material/CircularProgress";
import Typography from "@mui/material/Typography";
import Paper from "@mui/material/Paper";

function App() {
  console.log("INITIALIZING");

  const [zohoContactId, setContactId] = React.useState("");
  const [usrEmail, setUsrEmail] = React.useState("");

  const [isLoaded, setIsLoaded] = React.useState(false);
  const [error, setError] = React.useState(null);

  useEffect(() => {
    async function init() {
      console.log("BEFORE PAGELOAD");
      try {
        await ZOHO.embeddedApp.on("PageLoad", function (data) {
          console.log("PageLoad", data);
          console.log(data);

          //Custom Business logic goes here
          let entity = data.Entity;
          let recordID = data.EntityId;

          // Set data we want from CRM into props
          ZOHO.CRM.API.getRecord({ Entity: entity, RecordID: recordID })
            .then((data) => {
              console.log(data);

              setContactId(data.data[0].id);
              setUsrEmail(data.data[0].Owner.email);

              console.log(usrEmail);
              setIsLoaded(true);
            })
            .catch((e) => console.log(e));
        });

        console.log("AFTER PAGELOAD");
        return await ZOHO.embeddedApp.init();
      } catch (e) {
        console.log(e);
      }
    }
    init();
  }, []);

  const ContentLoader = () => {
    // handle rendering conditionally based on AJAX response
    if (error) {
      // API Data Error State: render the error state
      return <div>Error</div>;
    } else if (!isLoaded) {
      // API Data Not Loaded: render the loading progress spinner
      return (
        <div align="center">
          <CircularProgress />
          <Typography variant="h2"> Loading data....</Typography>
        </div>
      );
    } else {
      // API Data Loaded Succesfully:
      // render the completed interface with data loaded, triggered by the state update of isLoaded and !error (no error)
      return <JiraTable custId={zohoContactId} usrEmail={usrEmail} />;
    }
  };

  return (
    <Router>
      <div className="App">
        <Paper>{ContentLoader()}</Paper>
      </div>
    </Router>
  );
}

export default App;

相关截图

Yarn Build Output

yarn build output

本地正常运行截图

本地正常运行截图

问题排查与修复方案

1. ZOHO SDK事件监听的异步处理错误

ZOHO.embeddedApp.on("PageLoad")是事件注册方法,并非Promise,不能用await修饰。这会导致代码执行顺序混乱,可能ZOHO.embeddedApp.init()在监听注册完成前就执行,PageLoad事件无法被正确触发,进而isLoaded永远不会被设为true,页面卡在加载状态。

修复代码:

async function init() {
  console.log("BEFORE PAGELOAD");
  try {
    // 去掉await,直接注册事件监听
    ZOHO.embeddedApp.on("PageLoad", function (data) {
      console.log("PageLoad", data);
      let entity = data.Entity;
      let recordID = data.EntityId;

      ZOHO.CRM.API.getRecord({ Entity: entity, RecordID: recordID })
        .then((data) => {
          console.log(data);
          setContactId(data.data[0].id);
          setUsrEmail(data.data[0].Owner.email);
          setIsLoaded(true);
        })
        .catch((e) => {
          console.log(e);
          setError(e); // 错误时更新error状态,避免页面一直加载
        });
    });

    console.log("AFTER PAGELOAD");
    await ZOHO.embeddedApp.init();
  } catch (e) {
    console.log(e);
    setError(e); // 捕获init阶段的错误
  }
}

2. 未处理API错误状态

原代码中ZOHO.CRM.API.getRecord的catch仅打印错误,未更新error状态,导致即使API请求失败,页面也会一直停留在加载界面,无法反馈错误信息。修复时需在catch中调用setError(e),让页面显示错误状态。

3. 生产环境资源路径与权限问题

  • 检查./vendor/ZSDK是否在构建后被正确打包:React生产构建会压缩静态资源,若SDK文件路径错误或未被正确引入,会导致ZOHO对象未定义,代码执行中断。可尝试将SDK改为CDN引入,或确认public目录下的资源路径配置。
  • 部署环境权限验证:本地开发环境可能在ZOHO的信任列表中,但部署后的域名可能未被ZOHO授权,导致API请求被拦截(CORS错误或权限拒绝)。需在ZOHO后台添加部署域名到允许列表。

4. React状态更新的异步性问题

原代码中console.log(usrEmail)在setUsrEmail后立即执行,此时usrEmail状态尚未更新,属于React状态异步更新的正常现象,但不影响功能。若需打印更新后的状态,可添加useEffect监听:

useEffect(() => {
  console.log(usrEmail);
}, [usrEmail]);

内容的提问来源于stack exchange,提问作者user3569450

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:15:37