nextjs服务器组件加载可以延迟吗?

6bc51xsx  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(196)

我目前正在开发一个可能成为SaaS应用程序的个人项目。该应用程序目前在前端使用firebase身份验证,使用nextJs 13+。我已经保护好了所有需要的组件。
问题是,我已经用go编写了我的后端,我只希望我的API端点可以被登录的用户访问。我知道有一个SDK可以通过向后端传递uid或token来检查用户是否经过身份验证。但是我的fetch在服务器组件上是异步的,当onAuthStateChanged被firebase更新时,nextjs已经从服务器获取了带有数据的HTML,这意味着当fetch被初始调用时,内部用户状态为null。
flow:layout.tsx component loads -> fetch in page.tsx -> loading state:true -> onAuthStateChanged(用户是授权的并且能够看到 Jmeter 板或被重新路由以登录)->加载状态:false ->显示初始加载时的 Jmeter 板。
还有其他方法可以让它工作,例如使用客户端组件。但我更愿意深入研究
示例代码布局:

export default function Layout({children}: {children: React.ReactNode}) {
    const router = useRouter();
    const [loading, setLoading] = useState(true);
    const setUser = useAuthStore((state) => state.setUser);
    
    useEffect(() => {
        const unsubscribe = onAuthStateChanged(auth, (data) => {
            if (data === null) {
                router.push('/');
                return;
            }
            setLoading(false);
            setUser({
                email: data.email
            });
        });

        return () => {
            unsubscribe();
        };
    }, [loading]);

    return (
        <htmllang="en">
            <body >
                {loading ? (
                    <Loading/>
                ) : (
                    <>{children}</>
                )}
            </body>
        </html>
    );
}

page.tsx:

async function DashBoard() {
    const data = await getExternalAPI(); // call fetch function
    const user = useAuthStore.getState().user; 

    console.log(user);
    return (<div></div>)
    }
mi7gmzs6

mi7gmzs61#

Next.js中的延迟加载通过减少呈现路由所需的JavaScript量来帮助提高应用程序的初始加载性能。它允许您延迟客户端组件和导入库的加载,并且仅在需要时将它们包含在客户端包中。

相关问题