next.js 源码解析 - getStaticProps、getStaticPaths 篇

😂 好久前写了关于 getStaticPropsgetStaticPaths 的内容,然而半年过去了源码解析就一直忘记了,不久前有人提醒才想起来,补下坑。

本文主要是解读下 getStaticPropsgetStaticPaths 相关的源码,不了解这两个 API 的建议先看下之前的文章再看。👀

getStaticProps

首先 getStaticProps 是应用于 SSG 场景,我们先看下 packages/next/server/render.tsx 中相关的代码:

const isSSG = !!getStaticProps;
const pageIsDynamic = isDynamicRoute(pathname);

if (isSSG && !isFallback) {
   
    let data: UnwrapPromise<ReturnType<GetStaticProps>>;

    try {
   
        data = await getStaticProps!({
   
            ...(pageIsDynamic ? {
    params: query as ParsedUrlQuery } : undefined),
            ...(isPreview ? {
    preview: true, previewData: previewData } : undefined),
            locales: renderOpts.locales,
            locale: renderOpts.locale,
            defaultLocale: renderOpts.defaultLocale
        });
    } catch (staticPropsError: any) {
   
        // ....
    }
    // ...
}

isFallback 可以先不管。可以看到 getStaticProps 同样可以为异步函数,而是否为 SSG 就是由是否存在 getStaticProps 函数来决定的,SSG 场景下的 pageIsDynamic 则必须配合 getStaticPaths 使用,可以看到 getStaticProps 会接收几个参数:

  • params 是在动态页面的路由参数
  • previewDatapreview: preview 模式的相关数据
  • locales, localedefaultLocale 多语言相关参数

执行完成后 getStaticProps 的返回值会被放入 pageProps 中。

再看看 invalidKeys 相关部分,除了 revalidatepropsredirectnotFound 外别的属性都会被视为非法。

const invalidKeys = Object.keys(data).filter(
    key => key !== 'revalidate' && key !== 'props' && key !== 'redirect' && key !== 'notFound'
);

if (invalidKeys.includes('unstable_revalidate')) {
   
    throw new Error(UNSTABLE_REVALIDATE_RENAME_ERROR);
}

if (invalidKeys.length) {
   
    throw new Error(invalidKeysMsg('getStaticProps', invalidKeys));
}

然后还有关于 notFoundredirect 的处理:

if ('notFound' in data && data.notFound) {
   
    if (pathname === '/404') {
   
        throw new Error(`The /404 page can not return notFound in "getStaticProps", please remove it to continue!`);
    }

    (renderOpts as any).isNotFound = true;
}

if ('redirect' in data && data.redirect && typeof data.redirect === 'object') {
   
    checkRedirectValues(data.redirect 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值