在 react (Node.JS) 中使用繁重/耗时的函数

Posted

技术标签:

【中文标题】在 react (Node.JS) 中使用繁重/耗时的函数【英文标题】:Working with heavy/time-consuming functions in react (Node.JS) 【发布时间】:2021-08-30 20:54:06 【问题描述】:

晚上好,我有一个 React 项目,当用户打开页面时,应用程序开始创建 2048 RSA 密钥对。如何确保页面不会“崩溃”,也就是说,它会留在后台,并且在创建密钥时我会通知用户一切就绪。

            const navigate = useNavigate();
            const [keyStatus, setKeyStatus] = useState('Em processamento... (É normal que a pagina parece ter crashado! Por favor espere!)');
            const [pubKey, setPubKey] = useState('');
            const [privKey, setPrivKey] = useState('');
            const [genState, setGenState] = useState(0);
            function exitModal()
                modal.setModal(true);
            
            async function downloadPrivKey() 
                if(genState === 1)
                    await api.post('/savePublicKey', 
                        publicKey: pubKey
                    ).then(function(response)
                        fileDownload(privKey, 'private.key', 'text/plain');
                        setGenState(2);
                    ).catch(function ()
                        navigate('/',  replace: true );
                    );
                
            
useEffect(() => 
    async function startGenerationKeys() 
        const keysWorker = new Worker();
        keysWorker.postMessage("start");
        keysWorker.onmessage = (e) => 
            setPrivKey(e.data.privKey);
            setPubKey(e.data.pubKey);
            setKeyStatus('Pronta para download!');
            setGenState(1);
        ;
    
    startGenerationKeys();
, []);
         return (
                <Container>
                    <PageTitle>Criação das chaves</PageTitle>
                    <InstructionText>Você irá precisar da sua chave privada para poder usar a plataforma!</InstructionText>
                    <AlertText>Em caso de perda da sua chave não será possivel recuperar as suas passwords pessoais!</AlertText>
                    <AlertText>Não se esqueça de transferir a sua chave!</AlertText>
                    <AlertText>Não feche este separador durante a criação das chaves!</AlertText>
                    <InstructionText>Estado das chaves: keyStatus</InstructionText>
                    <BtnsZone>
                        <BtnBox isClicable=genState !== 0 ? true : false onClick=downloadPrivKey>
                            <FaDownload size=15 color="#FFF" />
                            <BtnText>Descarregar chave privada</BtnText>
                        </BtnBox>
                        <BtnBox isClicable=genState === 2 ? true : false>
                            <MdNextWeek size=20 color="#FFF" />
                            <BtnText>Prosseguir para a plataforma</BtnText>
                        </BtnBox>
                    </BtnsZone>
                    <BtnBox isClicable=true isAlone=true onClick=exitModal>
                        <ImExit color="#FFF" size=22 />
                        <BtnText>Terminar sessão</BtnText>
                    </BtnBox>
                </Container>
            );

网络工作者:

        import NodeRSA from 'node-rsa';

    export default onmessage = function() 
        const keysPair = new NodeRSA( b: 4096 );
        const pubKey = keysPair.exportKey('public').replace(/(\r\n|\n|\r)/gm,"");
        const privKey = keysPair.exportKey('private');
        postMessage(
            pubKey,
            privKey
        );
    

【问题讨论】:

这个组件的 jsx 是什么样的? 好的,我将我的 jsx 组件添加到问题中。 你研究过网络工作者吗? 使用 WebWorker,页面似乎崩溃了,包括来自 Google Chrome 的“页面未回答”的警告。 您似乎没有正确使用工人。您需要显示 Worker 的来源——如果这是通常的 Worker() 构造函数,则需要将工作代码 URL 传递给它。 【参考方案1】:

我不是在谈论与页面交互。我是说检查组件内部的状态并基于它做一些事情。举个例子。

在useEffect下返回之前

if(keyStatus !== "Pronta para download!") return <div>Loading..</div>

设置为等待密钥准备好下载?

编辑

我认为一旦你弄清楚了网络工作者的东西,这将起作用。基本上,您只需加载屏幕显示,直到状态更新说密钥已准备好下载。您可以添加一些 ui 微调器以使屏幕显示移动。以便最终用户知道正在发生的事情并且网站没有崩溃。

【讨论】:

感谢您的帮助,但问题在于浏览器在处理密钥对的创建时会阻塞(不允许您与页面交互)。有时用户被重定向到 root / 在这种情况下,IF 内部的内容已加载,但即使使用 webWorker,页面似乎也会崩溃,包括来自 Google Chrome 的“页面未回答”的警告。

以上是关于在 react (Node.JS) 中使用繁重/耗时的函数的主要内容,如果未能解决你的问题,请参考以下文章

nodejs是单线程还是多线程

react.js在服务器端渲染有啥好处?渲染是怎么个流程

如何在 node.js 中导入 font-awesome 以在 react.js 中使用?

使用 node.js 和 react.js 客户端启动一个 firebase 功能项目

Node.js - 在终端中显示 ESLint 错误,如 create-react-app

如何在同一个存储库中使用 React.js 和 Node.js