详解 Next.js 中的数据预取和缓存技巧

前言

Next.js 是一个 React.js 应用程序框架,它能让你使用 React 进行服务端渲染和代码分割,从而优化页面加载性能和用户体验。在 Next.js 中,数据预取和缓存是提高性能和效率的重要手段,本文将详细介绍 Next.js 中的数据预取和缓存技巧,并提供相应的示例代码。

数据预取

在 Next.js 中,可以通过 getServerSideProps 或 getStaticProps 函数来进行数据预取,这两个函数可以直接返回的是包含数据的 JavaScript 对象,也可以是一个 Promise,其中 resolve 的值是包含数据的 JavaScript 对象。这样,你就可以在组件渲染之前得到数据,从而避免不必要的等待。

getServerSideProps

getServerSideProps 用于在服务器端进行数据预取,它在每个请求时被调用,可以返回一个包含数据的 JavaScript 对象,这些数据可以在组件内部使用。使用此函数时,你可以执行服务器端渲染,并确保在渲染 HTML 之前获取到数据。例如,下面的示例代码会获取页面的标题和内容,这些数据可以在组件内部使用:

export async function getServerSideProps({ params }) {
    const page = await fetchPage(params.id);
    return {
        props: {
            pageTitle: page.title,
            pageContent: page.content
        }
    };
}

function Page({ pageTitle, pageContent }) {
    return (
        <div>
            <h1>{pageTitle}</h1>
            <div>{pageContent}</div>
        </div>
    );
}

export default Page;

getStaticProps

getStaticProps 用于在构建时进行数据预取,它会在构建时执行一次,并将构建结果缓存到磁盘上,这样可以大幅减少请求响应时间,提高整个应用程序的性能。使用此函数时,你可以轻松地预取静态数据,并将其作为 props 传递给组件。例如,下面的示例代码会从数据库中获取页面的标题和内容,这些数据可以在组件内部使用:

export async function getStaticProps({ params }) {
    const page = await fetchPage(params.id);
    return {
        props: {
            pageTitle: page.title,
            pageContent: page.content
        }
    };
}

function Page({ pageTitle, pageContent }) {
    return (
        <div>
            <h1>{pageTitle}</h1>
            <div>{pageContent}</div>
        </div>
    );
}

export default Page;

数据缓存

在 Next.js 中,也可以通过数据缓存来提高应用程序性能。下面介绍几种常用的数据缓存技术。

Cache-Control

在 HTTP 响应头中设置 Cache-Control 可以控制缓存策略,当我们设置 Cache-Control: max-age=3600 时,意味着浏览器可以在 3600 秒内重用这个资源。

在 Next.js 中,我们可以使用 HTTP Headers Middleware 来设置 Cache-Control,例如下面的示例代码:

const express = require("express");
const next = require("next");
const port = process.env.PORT || 3000;
const isDev = process.env.NODE_ENV !== "production";
const app = next({ dev: isDev });
const handle = app.getRequestHandler();

app.prepare().then(() => {
    const server = express();

    server.use((req, res, next) => {
        res.setHeader("Cache-Control", "public, max-age=31536000, immutable");
        next();
    });

    server.all("*", (req, res) => {
        return handle(req, res);
    });

    server.listen(port, (err) => {
        if (err) throw err;
        console.log(`> Ready on http://localhost:${port}`);
    });
});

上述代码会在浏览器中设置 Cache-Control: public, max-age=31536000, immutable,意味着资源在 1 年内不会被变更或重载。

Memory Cache

Memory Cache 是内存缓存技术,它可以快速地存储和查询数据,但是缓存的生命周期可能很短,应用程序需要在内存资源有限的情况下合理利用这些资源。Next.js 内置了 lru-cache 模块,可以轻松地实现内存缓存。例如下面的示例代码:

const LRU = require("lru-cache");

const cache = new LRU({
    max: 100 * 1000 * 1000, // 存储的最大数据量
    maxAge: 1000 * 60 * 60 // 数据在缓存中的有效期,单位为毫秒
});

async function getData() {
    const key = "data_key";
    const cachedData = cache.get(key); // 先在缓存中查找数据

    if (cachedData) {
        return cachedData;
    } else {
        const freshData = await fetchData();
        cache.set(key, freshData); // 将新数据放入缓存中
        return freshData;
    }
}

async function fetchData() {
    // ...
}

export default getData;

上述代码中,cache 是一个 LRU 实例,max 属性用于设置最大存储容量,maxAge 属性用于设置数据在缓存中的有效期。getData 函数会尝试从缓存中获取数据,如果缓存中没有数据,则调用 fetchData 函数获取新数据,然后将新数据保存到缓存中,下次调用时直接从缓存中返回数据。

External API Cache

Next.js 应用程序可能涉及到一些外部 API,为了避免频繁调用这些 API,可以在应用程序中使用外部 API 缓存。例如下面的示例代码:

const axios = require("axios");
const LRU = require("lru-cache");

const cache = new LRU({
    max: 100 * 1000 * 1000, // 存储的最大数据量
    maxAge: 1000 * 60 * 60 // 数据在缓存中的有效期,单位为毫秒
});

async function fetchData() {
    const key = "data_key";
    const cachedData = cache.get(key); // 先在缓存中查找数据

    if (cachedData) {
        return cachedData;
    } else {
        const freshData = await axios.get("https://api.example.com/data");
        cache.set(key, freshData); // 将新数据放入缓存中
        return freshData;
    }
}

export default fetchData;

上述代码中,cache 是一个 LRU 实例,max 属性用于设置最大存储容量,maxAge 属性用于设置数据在缓存中的有效期。fetchData 函数会尝试从缓存中获取数据,如果缓存中没有数据,则调用 axios.get 函数获取新数据,然后将新数据保存到缓存中,下次调用时直接从缓存中返回数据。

总结

Next.js 是一个强大的 React.js 应用程序框架,其提供了丰富的数据预取和缓存技术,可以极大地提高应用程序的性能和效率。本文详细介绍了 Next.js 中的数据预取和缓存技巧,包括 getServerSideProps、getStaticProps、Cache-Control、Memory Cache 和 External API Cache 等常用技术,同时提供了相应示例代码,希望能够对你的前端开发工作有所指导和帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65922dc2eb4cecbf2d710d23


纠错反馈