alitajs / alita

A React framework based on umi.
https://alitajs.com
MIT License
792 stars 87 forks source link

keepalive+ Navigate 会内存泄漏(解法: 不要 return Navigate) #482

Closed chentianxin closed 1 year ago

chentianxin commented 1 year ago

demo test_keepalive.zip

问题

  1. keepalive+wrappers会内存泄漏
  2. keepalive使用配置/^\/$/首页路径为(/)没有生效 会导致一直renderer,部分配置如下
    // keepalive
    keepalive: [
    /^\/$/, // 'home page
    '/profile', // profile page
    ],
    // routes
    {
    path: '/',
    component: '@/pages/index',
    },
xiaohuoni commented 1 year ago

Untitled 第 2 点,没问题的,你在 render 里面打印肯定都会有日志,要看你的 dom 有没有被保持才对。

import { Header, Page, Content } from '@alita/flow';
import { useIsLogged } from '@/valtio/profile';
import { useClientLoaderData } from 'alita';
import { useState } from 'react';

export async function clientLoader() {
  const { Data } = await Promise.resolve({ Data: 123 });
  return Data;
}

export default function HomePage() {
  const isLogin = useIsLogged();
  console.log(isLogin);
  const clientLoaderData = useClientLoaderData();
  console.log('index renderer', clientLoaderData);
  const [count, setCount] = useState(0);
  return (
    <Page>
      <Header onClick={() => setCount(count + 1)}>Index Page Header</Header>
      {count}
      <Content>
        Index Page Content
        <div>clientLoader data {clientLoaderData.data}</div>
      </Content>
    </Page>
  );
}
chentianxin commented 1 year ago

clientLoader好像有重新请求,clientLoader是进页面就请求,还是挂载前请求一次呢 我觉得如果页面keepalive的话 clientLoader只会执行一次吧 直到页面unmountd,重新load才会请求

xiaohuoni commented 1 year ago

问题1,你最终返回了 Navigate 被保持住了,所以会一直重定向,我也没想好改怎么处理,你可以先这么改下,我再想想。

export default function AuthWrapper() {
  if (useIsLogged()) {
    return <Outlet />;
  } else {
    setTimeout(() => {
      history.push('/login');
    }, 10);
    return <Outlet />;
  }
}
chentianxin commented 1 year ago

好的 谢谢

问题1,你最终返回了 Navigate 被保持住了,所以会一直重定向,我也没想好改怎么处理,你可以先这么改下,我再想想。

export default function AuthWrapper() {
  if (useIsLogged()) {
    return <Outlet />;
  } else {
    setTimeout(() => {
      history.push('/login');
    }, 10);
    return <Outlet />;
  }
}
xiaohuoni commented 1 year ago

clientLoader好像有重新请求,clientLoader是进页面就请求,还是挂载前请求一次呢 我觉得如果页面keepalive的话 clientLoader只会执行一次吧 直到页面unmountd,重新load才会请求

那就是 keepalive 和 clientLoader 一起使用的问题了。我还没用过 clientLoader ,找个时间试验下。

xiaohuoni commented 1 year ago

image

会监听路由变化,重新请求。

chentianxin commented 1 year ago

image

会监听路由变化,重新请求。

好吧 那就算我用错特性了

xiaohuoni commented 1 year ago

好吧 那就算我用错特性了

感觉是 umi bug,我去看看。讲道理,做了判断,应该不会重复请求的。

xiaohuoni commented 1 year ago

clientLoader 重复请求的修复 https://github.com/umijs/umi/pull/9960

xiaohuoni commented 1 year ago

@chentianxin 被保持的页面,不能 return Navigate,这个要在写法上规避,程序上找不到点能做这个事情。