React `use` hūka resursu pārvaldība: resursu dzīves ciklu optimizācija maksimālai veiktspējai | MLOG | MLOG

Paskaidrojums:

2. piemērs: WebSocket savienojumu pārvaldība

Šis piemērs demonstrē, kā pārvaldīt WebSocket savienojumu, izmantojot "use" hūku un pielāgotu resursu ietinēju.

            import React, { useState, useEffect, use } from 'react';

const createWebSocketResource = (url) => {
  let socket;
  let status = 'pending';
  let messageQueue = [];
  let listeners = [];

  const connect = () => {
    return new Promise((resolve, reject) => {
      socket = new WebSocket(url);

      socket.onopen = () => {
        status = 'connected';
        resolve();
        // Send queued messages
        messageQueue.forEach(msg => socket.send(msg));
        messageQueue = [];
      };

      socket.onerror = (error) => {
        status = 'error';
        reject(error);
      };

      socket.onmessage = (event) => {
        listeners.forEach(listener => listener(event.data));
      };

      socket.onclose = () => {
        status = 'closed';
        listeners = []; // Clear listeners to avoid memory leaks
      };
    });
  };

  const promise = connect();

  return {
    read() {
      use(promise);
    },
    send(message) {
      if (status === 'connected') {
        socket.send(message);
      } else {
        messageQueue.push(message);
      }
    },
    subscribe(listener) {
      listeners.push(listener);
      return () => {
        listeners = listeners.filter(l => l !== listener);
      };
    },
    close() {
        if (socket && socket.readyState !== WebSocket.CLOSED) {
            socket.close();
        }
    }
  };
};

function WebSocketComponent({ url }) {
  const socketResource = createWebSocketResource(url);
  // Suspend until connected
  socketResource.read();
  const [message, setMessage] = useState('');
  const [receivedMessages, setReceivedMessages] = useState([]);

  useEffect(() => {
    const unsubscribe = socketResource.subscribe(data => {
      setReceivedMessages(prevMessages => [...prevMessages, data]);
    });
    return () => {
        unsubscribe();
        socketResource.close();
    };
  }, [socketResource]);

  const sendMessage = () => {
    socketResource.send(message);
    setMessage('');
  };

  return (
    
setMessage(e.target.value)} />
Received Messages:
    {receivedMessages.map((msg, index) => (
  • {msg}
  • ))}
); } function App() { return ( Connecting to WebSocket...
}> ); } export default App;

Paskaidrojums:

3. piemērs: Failu apstrādātāju (File Handles) pārvaldība

Šis piemērs ilustrē resursu pārvaldību ar "use" hūku, izmantojot NodeJS failu apstrādātājus (Šis piemērs darbosies tikai NodeJS vidē un ir paredzēts, lai demonstrētu resursu dzīves cikla koncepcijas).

            // This example is designed for a NodeJS environment

const fs = require('node:fs/promises');
import React, { use } from 'react';

const createFileHandleResource = async (filePath) => {
  let fileHandle;

  const openFile = async () => {
    fileHandle = await fs.open(filePath, 'r');
    return fileHandle;
  };

  const promise = openFile();

  return {
    read() {
      return use(promise);
    },
    async close() {
      if (fileHandle) {
        await fileHandle.close();
        fileHandle = null;
      }
    },
    async readContents() {
      const handle = use(promise);
      const buffer = await handle.readFile();
      return buffer.toString();
    }
  };
};


function FileViewer({ filePath }) {
  const fileHandleResource = createFileHandleResource(filePath);
  const contents = fileHandleResource.readContents();

  React.useEffect(() => {
    return () => {
      // Cleanup when the component unmounts
      fileHandleResource.close();
    };
  }, [fileHandleResource]);

  return (
    

File Contents:

{contents}
); } // Example Usage async function App() { const filePath = 'example.txt'; await fs.writeFile(filePath, 'Hello, world!\nThis is a test file.'); return (
); } export default App;

Paskaidrojums:

Papildu tehnikas: Kļūdu robežas (Error Boundaries), resursu koplietošana (Resource Pooling) un servera komponentes

Papildus pamata piemēriem, "use" hūku var kombinēt ar citām React funkcijām, lai ieviestu sarežģītākas resursu pārvaldības stratēģijas.

Kļūdu robežas: Gracioza kļūdu apstrāde

Kļūdu robežas ir React komponentes, kas notver JavaScript kļūdas jebkurā vietā to bērnu komponenšu kokā, reģistrē šīs kļūdas un parāda aizstājējinterfeisu, nevis sagrauj visu komponenšu koku. Izmantojot "use" hūku, ir ļoti svarīgi ietīt savas komponentes ar kļūdu robežām, lai apstrādātu iespējamās kļūdas datu ielādes vai resursu inicializācijas laikā.

            import React, { Component } from 'react';

class ErrorBoundary extends Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI.
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    // You can also log the error to an error reporting service
    console.error(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return 

Something went wrong.

; } return this.props.children; } } function App() { return ( Loading...
}> ); }

Resursu koplietošana: resursu atkārtotas izmantošanas optimizēšana

Dažos gadījumos bieža resursu izveide un iznīcināšana var būt dārga. Resursu koplietošana (pooling) ietver atkārtoti lietojamu resursu kopas uzturēšanu, lai samazinātu resursu izveides un iznīcināšanas izmaksas. Lai gan "use" hūks pats par sevi neīsteno resursu koplietošanu, to var izmantot kopā ar atsevišķu resursu koplietošanas implementāciju.

Apsveriet datu bāzes savienojumu kopu. Tā vietā, lai katram pieprasījumam izveidotu jaunu savienojumu, jūs varat uzturēt jau izveidotu savienojumu kopu un tos atkārtoti izmantot. "use" hūku var izmantot, lai pārvaldītu savienojumu iegūšanu un atbrīvošanu no kopas.

(Konceptuāls piemērs - implementācija atšķiras atkarībā no konkrētā resursa un koplietošanas bibliotēkas):

            // Conceptual Example (not a complete, runnable implementation)

import React, { use } from 'react';
// Assume a database connection pool library exists
import { getConnectionFromPool, releaseConnectionToPool } from './dbPool';

const createDbConnectionResource = () => {
  let connection;

  const acquireConnection = async () => {
    connection = await getConnectionFromPool();
    return connection;
  };

  const promise = acquireConnection();

  return {
    read() {
      return use(promise);
    },
    release() {
      if (connection) {
        releaseConnectionToPool(connection);
        connection = null;
      }
    },
    query(sql) {
      const conn = use(promise);
      return conn.query(sql);
    }
  };
};

function MyDataComponent() {
  const dbResource = createDbConnectionResource();

  React.useEffect(() => {
    return () => {
      dbResource.release();
    };
  }, [dbResource]);

  const data = dbResource.query('SELECT * FROM my_table');
  return 
{data}
; }

React Servera komponentes (RSC): dabiskā "use" hūka mājvieta

"use" hūks sākotnēji tika izstrādāts React Servera komponentēm. RSC tiek izpildītas uz servera, ļaujot jums ielādēt datus un veikt citas servera puses darbības, nesūtot kodu uz klientu. Tas ievērojami uzlabo veiktspēju un samazina klienta puses JavaScript pakotņu izmērus.

RSC ietvaros "use" hūku var izmantot, lai tieši ielādētu datus no datu bāzēm vai API, neizmantojot klienta puses ielādes bibliotēkas. Dati tiek ielādēti serverī, un rezultātā iegūtais HTML tiek nosūtīts uz klientu, kur React to hidratē.

Izmantojot "use" hūku RSC, ir svarīgi apzināties RSC ierobežojumus, piemēram, klienta puses stāvokļa un notikumu apstrādātāju trūkumu. Tomēr RSC var kombinēt ar klienta puses komponentēm, lai izveidotu jaudīgas un efektīvas aplikācijas.

Labākās prakses efektīvai resursu pārvaldībai ar "use"

Lai maksimāli izmantotu "use" hūka priekšrocības resursu pārvaldībā, ievērojiet šīs labākās prakses:

Biežākās kļūdas un kā no tām izvairīties

Lai gan "use" hūks piedāvā daudzas priekšrocības, ir svarīgi apzināties iespējamās kļūdas un to, kā no tām izvairīties.

Secinājums: "use" hūka pieņemšana optimizētām React aplikācijām

React "use" hūks ir nozīmīgs solis uz priekšu resursu pārvaldībā React aplikācijās. Vienkāršojot asinhrono datu apstrādi, automatizējot resursu tīrīšanu un nevainojami integrējoties ar Suspense, tas dod izstrādātājiem iespēju veidot veiktspējīgākas, uzturējamākas un lietotājam draudzīgākas aplikācijas.

Izprotot pamatkoncepcijas, izpētot praktiskus piemērus un ievērojot labākās prakses, jūs varat efektīvi izmantot "use" hūku, lai optimizētu resursu dzīves ciklus un atraisītu pilnu jūsu React aplikāciju potenciālu. Tā kā React turpina attīstīties, "use" hūkam neapšaubāmi būs arvien nozīmīgāka loma resursu pārvaldības nākotnes veidošanā React ekosistēmā.