Next.js: 静的生成/ SSGの改善

䜜成日 2019幎11月25日  Â·  250コメント  Â·  ゜ヌス: vercel/next.js

抂芁

ペヌゞごずに静的生成ずサヌバヌ偎レンダリングの䞡方を実行するメ゜ッドを提䟛するこずにより、Next.jsが完党にハむブリッドになるこずを蚱可したす。

  • 2぀の新しいペヌゞごずのデヌタフェッチ方法

    • getStaticProps - next build時点で静的生成SSGにオプトむンしたす。

    • getServerSideProps -オンデマンドでレンダリングするサヌバヌ偎レンダリングSSRにオプトむンしたす。

  • 動的゜ヌスから䞀連のルヌトを静的に生成するための新しい方法SSG

    • getStaticPaths -静的生成SSGを実行するための動的ルヌトのパラメヌタヌのリストを返したす

このRFCは、APIの远加に぀いおのみ説明しおいたす。 すべおの新機胜は完党な䞋䜍互換性があり、段階的に採甚できたす。 このRFCは非掚奚を導入しおいたせん。

バックグラりンド

WebサむトたたはWebアプリケヌションを構築する堎合、通垞、静的生成SSGたたはサヌバヌ偎レンダリングSSRの2぀の戊略から遞択する必芁がありたす。

Next.jsでは、代わりに、䜿甚する戊略をペヌゞごずに遞択できるハむブリッドアプリケヌションを構築できたす。 Next.js 9以降、 getInitialPropsないペヌゞは静的に最適化され、 next build .htmlファむルずしお出力されたす。

ただし、特定のナヌスケヌスの静的ペヌゞを生成しながらデヌタフェッチを実行するこずをお勧めしたす。

たずえば、CMSたたはサむトのブログセクションからマヌケティングペヌゞを静的に生成したす。

その堎合、 getInitialPropsを䜿甚するず、SSRにオプトむンしたす。

Next.jsには珟圚next exportコマンドがあり、これによりアプリケヌションは完党にSSGになり、Next.jsのハむブリッドな性質が倱われたす。

next exportをgetInitialPropsず䞀緒に䜿甚するず、別の問題が発生したす。 getInitialPropsはビルド時に呌び出されたすがこれはすばらしいこずです、 next/linkを䜿甚しおペヌゞ間を移動するず、 next exportを䜿甚する代わりにgetInitialPropsがクラむアント偎ず呌ばれたす。 next export結果。

これは、デヌタ゜ヌスCMS / API゚ンドポむントがクラむアント偎の遷移で盎接呌び出されるこずも意味したす。デヌタ゜ヌスがダりンしおいる堎合、ペヌゞ間を移動するずきにクラむアント偎の遷移が䞭断したす。

SSGのヘビヌナヌザヌずHashiCorpのようなNext.jsのnext export @ jescalanに感謝ず協力し、2぀の新しいデヌタフェッチ方法を導入するための適切な制玄を広範囲に調査したした getStaticPropsずgetServerSideProps 。 ただし、動的ルヌトの静的ペヌゞを静的に生成するパラメヌタヌを提䟛する方法もありたす。 getStaticPaths ペヌゞごずのexportPathMap眮き換え。

これらの新しい方法には、SSGずSSRになるものが明確に区別されるため、 getInitialPropsモデルに比べお倚くの利点がありたす。

  • getStaticPropsは、ビルド時に静的に生成されるペヌゞをマヌクしたす next build実行しおいる堎合
  • getStaticPaths䜿甚するず、動的ルヌトのビルド時に生成するパラメヌタヌのリストを返すこずができたす。
  • getServerSidePropsは、すべおのリク゚ストでサヌバヌ偎でレンダリングされるペヌゞをマヌクし、サヌバヌを䜿甚するずきの珟圚のgetInitialProps動䜜に最も䌌おいたす。

これらのメ゜ッドを分離するこずで、TypeScriptを䜿甚しお入力できる正しいコンテキストオブゞェクトを提䟛するこずもできたす。 特定のレンダリング戊略を遞択するず、正しい倀が埗られたす。珟圚getInitialPropsでは、TypeScriptを䜿甚するずきにSSGずSSRで䜕が利甚できるかを掚枬する必芁がありたす。

さらに、これらのメ゜ッドを明瀺的にするこずで、さたざたなトレヌドオフをより明確に文曞化できるようになりたす。

実装

これらのメ゜ッドはすべお、ペヌゞコンポヌネントファむルの最䞊䜍であり、 getInitialPropsように、ネストするこずはできないこずに泚意しおください。

getStaticProps

getStaticPropsするず、ペヌゞはビルド時に静的にレンダリングされたすSSG。

この新しいメ゜ッドを䜿甚するず、 next build時点で.htmlファむルに静的に生成されるペヌゞのデヌタフェッチを実行できたす。

Next.jsは、 next build時点でgetStaticPropsの結果を保持するJSONファむルも自動的に生成したす。 これは、クラむアント偎のルヌティングに䜿甚されおいたす。

クラむアント偎がnext/linkたたはnext/routerを介しおルヌティングする堎合、Next.jsはこのJSONファむルをフェッチしお、ペヌゞをクラむアント偎にレンダリングするために必芁な小道具を取埗したす。

プロパティはpropsキヌで返されるため、将来的に他のオプションを導入できたす。

// pages/index.js

// getStaticProps is only called server-side
// In theory you could do direct database queries
export async function getStaticProps(context) {
  return {
    // Unlike `getInitialProps` the props are returned under a props key
    // The reasoning behind this is that there's potentially more options
    // that will be introduced in the future.
    // For example to allow you to further control behavior per-page.
    props: {}
  };
}

contextには次のものが含たれたす。

  • params -動的ルヌト䞊のパラメヌタ。

getStaticPaths

これは、動的ルヌトのgetStaticProps䜿甚量の拡匵です。

getStaticPathsは、 exportPathMapを持぀必芁性を眮き換え、ペヌゞごずに機胜したす。

以䞋のslugの䟋のように、動的パラメヌタを持぀URLのリストを静的に生成したい堎合があるためです。 Next.jsは、URLのリストを返すこずができるgetStaticPathsメ゜ッドを提䟛したす。 これはasyncメ゜ッドなので、CMSなどのデヌタ゜ヌスからそのリストをフェッチするこずもできたす。

// pages/blog/[slug].js

// `getStaticProps` gets a `params` object holding the dynamic parameters
// For `/blog/hello-world` it would look like `{ slug: 'hello-world }`
export async function getStaticProps({ params }) {
  return {
    props: {}
  };
}

// `getStaticPaths` allows the user to return a list of parameters to
// render to HTML at build time.
export async function getStaticPaths() {
  return {
    paths: [
      // This renders /blog/hello-world to HTML at build time
      { params: { slug: "hello-world" } }
    ]
  };
}

埌退する

倚くの堎合、ビルド時にアプリケヌション内のすべおの可胜なルヌトを事前にレンダリングしたくない堎合がありたすたずえば、数癟䞇の補品がある堎合。 このため、Next.jsは、ペヌゞがただ生成されおいない堎合に、デヌタなしのペヌゞのレンダリングであるfallbackペヌゞを自動的に生成したすロヌド状態を衚瀺できるようにしたす。

サヌビングの正確な動䜜は次のずおりです。

  • 着信リク゚スト

    • Next.jsは、ビルド時にパスが生成されたかどうかを確認したす

    • パスが生成された堎合



      • 盎接提䟛



    • パスが生成されなかった堎合



      • フォヌルバックを提䟛する


      • Next.jsは、ペヌゞデヌタを含むをバックグラりンドでレンダリングし、生成されたペヌゞのリストに远加したす


      • 同じパスぞの埌続のリク゚ストは、生成されたペヌゞを提䟛したす


      • これにより、ナヌザヌは垞に高速な゚クスペリ゚ンスを実珟し、高速ビルドず静的生成プロパティを維持しながら、サヌバヌレンダリングによるTTFBが遅くなるこずはありたせん。



ビルド時に生成されなかったパスが404になるようにしたい堎合は、 getStaticPathsからfallback: falseを返すこずでも可胜です。

// `getStaticPaths` allows the user to return a list of parameters to
// render to HTML at build time.
export async function getStaticPaths() {
  return {
    // Opt-out of the described fallback behavior
    fallback: false,
    paths: [
      // This renders /blog/hello-world to HTML at build time
      { params: { slug: "hello-world" } }
    ]
  };
}

getServerSideProps

getServerSidePropsを䜿甚する堎合、ペヌゞは静的に生成されずSSG、代わりにサヌバヌぞのすべおの芁求でオンデマンドでレンダリングされたすSSR。

Next.jsは、 getServerSidePropsを呌び出した結果を返すAPI゚ンドポむントも自動的に公開したす。 これは、クラむアント偎のルヌティングに䜿甚されおいたす。

クラむアント偎がnext/linkたたはnext/routerを介しおルヌティングする堎合、Next.jsはこの公開されたAPI゚ンドポむントをフェッチしお、ペヌゞをクラむアント偎にレンダリングするために必芁な小道具に倉換されるJSONデヌタを取埗したす。

この方法は珟圚のgetInitialPropsに最も䌌おいたすが、䞻な違いはgetServerSidePropsが垞にブラりザではなくサヌバヌ偎で実行されるこずです。 サヌバヌ偎のレンダリングたたはクラむアント偎のルヌティング時のAPIフェッチのいずれか。

getStaticProps同様に、プロパティはpropsキヌで返されたす。

// pages/index.js

// getServerSideProps is only called server-side
// In theory you could do direct database queries
export async function getServerSideProps(context) {
  return {
    // Unlike `getInitialProps` the props are returned under a props key
    // The reasoning behind this is that there's potentially more options
    // that will be introduced in the future.
    // For example to allow you to further control behavior per-page.
    props: {}
  };
}

contextには次のものが含たれたす。

  • params -動的ルヌトのパラメヌタ
  • req -HTTPリク゚ストオブゞェクト
  • res -HTTP応答オブゞェクト
  • query -ク゚リ文字列これに぀いおは完党にはわかりたせんが、おそらく必芁です

@ timneutkens 、 @ Timer 、 @ ijjk 、 @ lfadesによっお䜜成されたした。 @ rauchg 、 @ jescalanなどずのコラボレヌション🚀

最も参考になるコメント

Next.js 9.3では、次䞖代の静的サむト生成SSGサポヌトが安定版ずしおリリヌスされたした。

このリリヌスには、「プレビュヌモヌド」のサポヌト、たたは静的に事前レンダリングされたペヌゞをバむパスしお、蚱可されたナヌザヌに察しおオンデマンドでペヌゞをレンダリングする機胜も含た

あなたは私たちのブログ投皿でそれに぀いおもっず読むこずができドキュメントにアクセスしおください。

党おのコメント250件

export async function getStaticProps(context) {
  return {
    // Unlike `getInitialProps` the props are returned under a props key
    // The reasoning behind this is that there's potentially more options
    // that will be introduced in the future.
    // For example to allow you to further control behavior per-page.
    props: {}
  };
}

props内に含めるこずができるもの以倖の远加デヌタを返す必芁がある状況を確認するこずに興味がありたす。 「ペヌゞごずの動䜜をさらに制埡する」ずいうむンラむンの説明は少し曖昧でした。

ずおも面癜そう 圌はgetInitialProps代わりになるのでしょうか、それずも䞀緒になりたすか たずえば、私たちのナヌスケヌスでは、デヌタフェッチAPIは公共サヌビスです。 したがっお、クラむアント偎のナビゲヌションでは、クラむアントがAPIレむダヌを盎接呌び出すこずを期埅したすが、SSRではサヌバヌがそれを呌び出したす。 今埌、このナヌスケヌスは以前の方法で解決され続けるでしょうか

props内に含めるこずができるもの以倖の远加デヌタを返す必芁がある状況を確認するこずに興味がありたす。 「ペヌゞごずの動䜜をさらに制埡する」ずいうむンラむンの説明は少し曖昧でした。

必芁に応じお埌で拡匵できるように、メ゜ッドを将来的に校正するこずが重芁です。

ずおも面癜そう 圌はgetInitialProps代わりになるのでしょうか、それずも䞀緒になりたすか たずえば、私たちのナヌスケヌスでは、デヌタフェッチAPIは公共サヌビスです。 したがっお、クラむアント偎のナビゲヌションでは、クラむアントがAPIレむダヌを盎接呌び出すこずを期埅したすが、SSRではサヌバヌがそれを呌び出したす。 今埌、このナヌスケヌスは以前の方法で解決され続けるでしょうか

䞀般に、その動䜜にはいく぀かの欠点がありたす。たずえば、䞖界䞭の特定の領域からのりォヌタヌフォヌルのフェッチが遅くなる可胜性がありたす。 getServerPropsアプロヌチにより、応答をより効率的にキャッシュできたす。

これは本圓に面癜そうです かっこいいアむデア

しかし、展開に぀いお懞念がありたす...

Nowでホストしおいるず想像しおみたしょう。
最初のデプロむメントでは、アプリケヌション党䜓がデプロむメントに基づいお構築されるこずは明らかです。

次に、CMSの䞀郚のコンテンツを倉曎し、SSGペヌゞのみの再構築をトリガヌしようずしおいたすが、アプリケヌションコヌドは倉曎されおいたせん。

すぐにアラヌムが鳎りたす。この堎合、ビルドをトリガヌするず、次の2぀の解決策が考えられたす。

1すべおがキャッシュされるため、䜕も再構築されたせん。コヌドは倉曎されおおらず、䜕ずかされおいたせん。
2 --forceするず、「すべお」が再構築されたすが、SSGペヌゞの再構築のみが必芁でした。

_これらは単なる仮説であり、ビルドシステム自䜓に䟝存したす-Nextをどの皋床認識しおいるか_

これはおそらく他のホスティング゜リュヌションに圱響を䞎えるでしょう。

Next自䜓には.next/cacheたす...これはそれをどのように回避したすか

@joltmodeは、基本的に珟圚すべおの静的サむトゞェネレヌタヌに.next/cacheは、Nowでの展開間で保持され、再利甚されたす。 珟圚、この堎合、キャッシュ朜圚的にhttps://zeit.co/blog/serverless-pre-renderingでgetInitialPropsを䜿甚しおいる可胜性があるこずに泚意しおください。これは、サヌバヌレス関数で動的にレンダリングしおから、CDNにキャッシュしたす。動䜜はただ完党に正垞であり、 getServerPropsを䜿甚しおも匕き続き機胜したす。

本圓に玠晎らしく、顧客プロゞェクトでNextをどのように䜿甚しおいるかにうたく適合し、コピヌしたボむラヌプレヌトコヌドをいく぀か削陀したす。

考慮すべきこずの1぀は、getStaticPropsずgetServerPropsの名前です。これらが将来、{props}ずその他の朜圚的なオプションを返す堎合、* Propsは混乱したせんか たぶん、getStaticConfiguration、getStaticSetup、getStaticOptionsはもっず䞀般的でしょうか

@kibsの戻り倀は、垞に小道具の凊理方法に関連しおいたす。 ですから、ネヌミングは玠晎らしいimoです。

これは単に玠晎らしいです これは、プラむベヌトWebアプリずプロフェッショナルWebアプリの䞡方を開発しおいるずきに、私が最近持っおいた、たたは考えるこずができたすべおのナヌスケヌスずニヌズを解決しおいたす。 あなたは私が私自身のハむブリッドサむトゞェネレヌタヌを始めるのを劚げただけです、ありがずう

たた、新しいメ゜ッドが以前のgetInitialProps()およびexportPathMap()よりも優れおいるこずに関連するこずもできたす。これ

これを詊すのが埅ちきれたせん

補足最埌の䟋では、 getServerProps() contextパラメヌタがないようです。

補足最埌の䟋では、getServerPropsにコンテキストパラメヌタがないようです。

修理枈み

これは玠晎らしいですね TypeScriptナヌザヌの芳点から、ペヌゞコンポヌネントの静的メ゜ッドずしおgetStaticProps 、 getStaticPaths 、 getServerPropsかどうか疑問に思いたす珟時点ではgetInitialProps 。正しく入力/䜿甚するのが簡単になりたす。

const Page: NextPage<Props> = (props) => ...

// Explicit types needed here
export const getStaticPaths: NextGetStaticPaths<Params> = () => ...
export const getStaticProps: NextGetStaticProps<Props, Params> = (context) => ...
export const getServerProps: NextGetServerProps<Props> = (context) => ...

export default Page

// vs.

const Page: NextPage<Props, Params> = (props) => ...

// Static method types come from NextPage<Props, Params>
Page.getStaticPaths = () => ...
Page.getStaticProps = (context) => ...
Page.getServerProps = (context) => ..

export default Page

@herrstuckiこのアプロヌチの問題は、ツリヌシェむクが非垞に難しくなるこずです読むほが䞍可胜。 これは、䞍芁なコヌドがブラりザに送信されるこずを意味したす。

@timneutkensの良い点 しかし、別のファむルはさらに意味がありたせんか それずも、このような_確実に_ツリヌを揺るがすこずができるものですか

// This should all be removed in client-side code 

import {fetchQuery, queryTag} from 'big-data-fetching-lib';
const query = queryTag`...`
export const getStaticProps = async () => ({ props: await fetchQuery(query) })

// Only this should be included client-side
export default (props) => ...

@herrstuckiは確実にツリヌシェむクできたすが、別のファむルを

ずおも面癜そう 圌はgetInitialProps代わりになるのでしょうか、それずも䞀緒になりたすか たずえば、私たちのナヌスケヌスでは、デヌタフェッチAPIは公共サヌビスです。 したがっお、クラむアント偎のナビゲヌションでは、クラむアントがAPIレむダヌを盎接呌び出すこずを期埅したすが、SSRではサヌバヌがそれを呌び出したす。 今埌、このナヌスケヌスは以前の方法で解決され続けるでしょうか

䞀般に、その動䜜にはいく぀かの欠点がありたす。たずえば、䞖界䞭の特定の領域からのりォヌタヌフォヌルのフェッチが遅くなる可胜性がありたす。 getServerPropsアプロヌチにより、応答をより効率的にキャッシュできたす。

もちろんですが、ReactサヌバヌぞのRTTをたったく回避するこずに぀いお話しおいたす。 サヌバヌからのSSR出力がCDN /キャッシュサヌバヌプロキシにキャッシュされおいる堎合を考えおみたす。 これを、別のAPIレむダヌWeb /アプリ/すべおのクラむアントに共通を盎接呌び出すクラむアントナビゲヌションのデヌタフェッチず組み合わせるず、トラフィックの倚いシナリオでNext.jsサヌバヌレむダヌをそれほどスケヌルアップする必芁がなくなりたす。

りォヌタヌフォヌルフェッチのポむントは理解しおいたすが、消費者がNextサヌバヌをデヌタ゜ヌスではなくSSRレむダヌずしお扱うこずができるようにするず、スケヌリングのセットアップが倧幅に改善されたす。

ずおも面癜そう 圌はgetInitialProps代わりになるのでしょうか、それずも䞀緒になりたすか たずえば、私たちのナヌスケヌスでは、デヌタフェッチAPIは公共サヌビスです。 したがっお、クラむアント偎のナビゲヌションでは、クラむアントがAPIレむダヌを盎接呌び出すこずを期埅したすが、SSRではサヌバヌがそれを呌び出したす。 今埌、このナヌスケヌスは以前の方法で解決され続けるでしょうか

䞀般に、その動䜜にはいく぀かの欠点がありたす。たずえば、䞖界䞭の特定の領域からのりォヌタヌフォヌルのフェッチが遅くなる可胜性がありたす。 getServerPropsアプロヌチにより、応答をより効率的にキャッシュできたす。

もちろんですが、ReactサヌバヌぞのRTTをたったく回避するこずに぀いお話しおいたす。 サヌバヌからのSSR出力がCDN /キャッシュサヌバヌプロキシにキャッシュされおいる堎合を考えおみたす。 これを、別のAPIレむダヌWeb /アプリ/すべおのクラむアントに共通を盎接呌び出すクラむアントナビゲヌションのデヌタフェッチず組み合わせるず、トラフィックの倚いシナリオでNext.jsサヌバヌレむダヌをそれほどスケヌルアップする必芁がなくなりたす。

りォヌタヌフォヌルフェッチのポむントは理解しおいたすが、消費者がNextサヌバヌをデヌタ゜ヌスではなくSSRレむダヌずしお扱うこずができるようにするず、スケヌリングのセットアップが倧幅に改善されたす。

CDNが動的応答をサポヌトしおいる堎合、この新しい動䜜は、実際に完党な結果をCDNにキャッシュできるこずを意味するず誀解しおいるず思いたす。 これは、以前はgetInitialPropsでは確実に可胜ではありたせんでした。

@timneutkensカナリアで遊んで、 babel-plugin-prevalコヌドをgetStaticPropsに移怍しようずしたした。 fs問題が発生したした。

./pages/blog/ディレクトリの.mdファむルを読み取っおルヌプし、すべおの投皿を含むブログのむンデックスペヌゞを䜜成しようずしおいたす。

import React from 'react';
import Link from 'next/link';
import fs from 'fs-extra';

const Index = ({ posts }) => (
  <div>
    Hello World. <Thing msg="hello" />
    <Link href="/thing">
      <a>About</a>
    </Link>
    {posts.map(p => (
      <div key={p.title}>{p.title}</div>
    ))}
  </div>
);

Index.getStaticProps = async () => {
  const items = await fs.readdir('./pages/blog');
  items.forEach(path => /* .... do some stuff ... */ )
  return { props: { posts: items } };
};

export default Index;

このコヌドはこの゚ラヌに぀ながりたす

Module not found: Can't resolve 'fs' in '/Users/jared/Downloads/nextjs-typescript-template/node_modules/fs-extra/lib'

RazzleのIIRC、この゚ラヌはwebpackのファむルシステムスタブたたはその欠劂に関係しおいたす。 これをwebpack構成に远加するこずで、Razzleでこれを修正したこずがあるず思いたす。

node: {
  fs: "empty";
}

このnext.config.jsを詊したしたが、゚ラヌが消えるだけです。 fs / fs-extraが実際には機胜しないか、機胜し、おそらくパスが機胜しないように芋えたす私にはわかりたせん。 それに぀いお䜕か考えはありたすか

私の他の質問は、より䞀般的には、 getStaticPropsでむンポヌトずrequireを䜿甚するためのベストプラクティスが䜕であるず想像するかです。 私が間違っおいない堎合、䞊蚘のスニペットはReactにfs-extraでむンポヌトしようずしたすか??。 したがっお、むンポヌトをこのようにむンラむン芁求に倉曎する方がよいでしょうか

js Index.getStaticProps = async () => { const fs = require('fs-extra'); // only require when needed at SSG const props = await fs.readdir('./pages/blog'); return { props: { posts } }; };

CDNが動的応答をサポヌトしおいる堎合、この新しい動䜜は、実際に完党な結果をCDNにキャッシュできるこずを意味するず誀解しおいるず思いたす。 これは、以前はgetInitialPropsでは確実に可胜ではありたせんでした。

ああ、私はあなたが蚀っおいるこずを理解しおいるず思いたす。 それは、最初のSSR䞖代のgetServerPropsが䞀意の゚ンドポむントを䜜成するこずを意味したすかコンテンツアドレス可胜なハッシュで、おそらくURLで、CDNにキャッシュできる可胜性がありたすか これの唯䞀の欠点は、キャッシュがNext以倖のアプリandroid / iosずNextアプリの間で共有できないこずです。 さらに、倖郚デヌタ゜ヌスの堎合、キャッシュ制埡ディレクティブはアップストリヌムですが、ここではNextがデヌタの提䟛を担圓するため、生成されたデヌタ゚ンドポむント甚にAPIたたは小道具を指定する必芁がありたす。

@jaredpalmer https://github.com/zeit/next.js/issues/9524#issuecomment -558628066信頌できるツリヌシェむク可胜性に関する懞念を含むは、完党に別個にコンパむルされる別個のファむルを思いたす。クラむアントバンドルコヌド 䟋えば

pages/
    foo.js
    foo.data.js (<- exports getStaticProps etc.)

or:

pages/
    foo.js
pages-data/
    foo.js (<- exports getStaticProps etc.)

@jaredpalmerのツリヌシェむクは、カナリアではただ実装されおいたせん。

い぀ものように、すべおのこずをありがずう。 Next.jsは、䜜業するのに絶察的な喜びでした。前にも蚀ったように、ほがすべおの機胜リリヌスで、管理するコヌドベヌスのサむズを_瞮小_できたす。 すごい。

このRFCは、曞かれおいるように、倚くのアプリケヌションにすぐに圹立぀ため、批刀するのは難しいです。 ただし、同意するかどうかわからない1行に察凊したいず思いたす。

「 getStaticPathsは、 exportPathMapを持぀必芁性を眮き換え、ペヌゞごずに機胜したす。」

䞀郚のアプリケヌションでは、ビルド時にルヌトを知るこずが非珟実的たたは䞍可胜です。 いく぀かの䟋は次のずおりです。

  • ナヌザヌプロファむルペヌゞ
  • 補品ペヌゞ圚庫が急速に倉化する䌁業向け
  • 受泚詳现ペヌゞ

このようなペヌゞのルヌトはおそらく/entity-name/entity-idの圢匏になり、 router.push('/customers/[customerId]', '/customers/baer')ようなこずができるので、Nextの動的ルヌトは非垞にうたく機胜したす。 ただ問題がありたす。 Serve、Netlify、NGINXなどを䜿甚しおこれらのファむルを静的に提䟛する堎合は、ナヌザヌがペヌゞを曎新するずきに404を取埗しないように、䞀連のリダむレクトを生成する必芁がありたす。 exportPathMapが必芁です。

以䞋は、私が定期的に䜜業しおいるコヌドベヌスから、ほが珟状のたたコピヌされおいたす。

const buildServeConfig = redirects => {
  const config = {
    public: `dist`,
    trailingSlash: true,
    rewrites: redirects
  };

  const outputPath = `${__dirname}/serve.json`;

  fs.writeFile(outputPath, JSON.stringify(config, null, 2), err => {
    if (err) {
      throw err;
    }
    // eslint-disable-next-line no-console
    console.log(`Generated: ${outputPath}`);
  });
};

...

exportPathMap: function(defaultPathMap, { dev, outDir }) {
  const redirects = Object.entries(defaultPathMap)
    // No need to create a redirect rule for `/dirname/` or `/dirname/index.html`
    .filter(([url]) => url !== `/` && url !== `/index`)
    .map(([url, { page }]) => ({
      // Replaces /[customerId] with /:customerId
      source: url.replace(/]/g, ``).replace(/\[/g, `:`),
      destination: `${page}/index.html`
    }));

  // By default, the routes are sorted such that a route like `/order/:orderId`
  // comes before `/order/new`. Since the `:orderId` portion of `/order/:orderId` 
  // is a wildcard, the route `/order/new` will be a match and consider `new` 
  // as a value for `:orderId`. To get past this, we sort the redirects by the 
  // number of parameters in ascending order.
  const sortedRedirects = [...redirects].sort(
    (currentRedirect, nextRedirect) =>
      currentRedirect.source.split(`:`).length >
      nextRedirect.source.split(`:`).length
  );

  buildServeConfig(sortedRedirects);

  return defaultPathMap;
}

このRFCがAPIを非掚奚にしたり削陀したりしないこずを理解しおいたす。たた、ビルドディレクトリをトラバヌスするこずでこれらのリダむレクトをビルドできるこずも認識しおいるため、非掚奚になった堎合でも、優れた゚スケヌプハッチがありたす。 しかし、それは「 getStaticPathsの必芁性を取り陀く」わけではありたせん。

繰り返しになりたすが、このプロゞェクトの実行方法に配慮しおいただきありがずうございたす

getStaticProps / getStaticPathsずgetServerProps盞互に排他的ですか ぀たり、パヌツを事前レンダリングし、パヌツを動的にするこずは可胜でしょうか

ええ、1぀は静的生成で、もう1぀はサヌバヌ偎レンダリングです。

これにより、Nextに移行する前にGatsbyから芋逃しおいた倧きな問題の1぀が修正されたす。

モノリシック数癟kbsのJSONファむルがあり、そこからデヌタを取埗しお、ペヌゞを倉曎せずにレンダリングしたす。 Gatsbyでは、JSONファむルをGraphQLスキヌマにロヌドし、それに察しおク゚リを実行し、特定のペヌゞをレンダリングするために必芁なデヌタのみを取埗したした。 Nextでは、これを行うための最も簡単でクリヌンな方法はimport monolith from './monolith.json'であり、ナヌザヌはJSONファむル党䜓をダりンロヌドする必芁がありたす。

このRFC100はこのナヌスケヌスに察応し、Gatsbyが優れおいる領域でGatsbyず同等に近づくための次のステップをもたらしたす明らかに、GatsbyはランタむムSSRを実行できないため、静的ビルドタむムレンダリングに぀いおのみ説明したす

@ timneutkens 、RFCをありがずう

最近@rauchgず話し合ったNext.jsのナヌスケヌスがありたす。

Next.jsは、非垞にスムヌズなDXずいく぀かの劥圓なデフォルトを提䟛したす。 そのため、クラむアント偎でのみレンダリングされるアプリケヌションであるスマヌトTVアプリにNext.jsを䜿甚するこずに興味がありたす。

スマヌトTVアプリは、TVのブラりザ゚ンゞンによっお実行されるほが叀兞的なWebアプリです。

  1. アプリは、スタむル、スクリプト、画像、_index.html_、蚌明曞、TV構成ファむルのバンドルにパッケヌゞ化されおいたす。
  2. バンドルは、レビュヌのためにプラットフォヌムのアプリストアに送信されたす。
  3. バンドルはストアからアプリずしおむンストヌルされ、ナヌザヌによっお実行されたす。

重芁なのは、バンドルがTVデバむス自䜓によっお静的にホストされおおり、サヌバヌからロヌドされおいないこずです。 したがっお、SSRオプションは䜿甚できたせんNode.jsはこれらの目的で開発者に公開されたせん。 しかし、アプリ自䜓は動的ですたずえば、Netflix。

したがっお、静的WebサヌバヌによっおホストされおいるSPAを実行する必芁がありたす。

私が理解しおいるように、 getServerProps たたはgetInitialProps を完党にオプトアりトするず、SSRを回避するのに圹立ちたす。 しかし、クラむアントでの動的レンダリングはどうなりたすか そしお、この堎合のルヌティングはどうですか このRFCによるず、@ timneutkens 、

PS個別に議論する方がよいず思われる堎合は、このナヌスケヌスの問題を䜜成できたす。

@grushetsky別の問題を䜜成できたすか。 これは、RFCで議論されおいるものずはたったく異なる質問です👍

@timneutkensこのRFCの玄束は、私がNextに非垞に興奮したこずの1぀です。 明確にするために、 getInitialPropsもただ存圚したすよね

正しい@outdooricon - getInitialPropsは、圓面の間残りたす。

RFCによるず

このRFCは、APIの远加に぀いおのみ説明しおいたす。 すべおの新機胜は完党な䞋䜍互換性があり、段階的に採甚できたす。 このRFCは非掚奚を導入しおいたせん。

玠晎らしいRFC、これに非垞に興奮しおいたす

私は特定のナヌスケヌスに関連しおgetServerPropsに぀いお考えおいお、結果をキャッシュに入れおいたす。 これはAPI゚ンドポむントに倉換され、結果が小道具ずしおコンポヌネントに配信されるため、結果をRedux、GraphQLキャッシュなどのクラむアント偎の倖郚キャッシュに配眮する芏定の方法はありたすか

getInitialPropsは静的で非同期であるため、正しく理解しおいれば、Nextには、コンポヌネントを初めおレンダリングする前に、完了するのを埅぀機䌚がありたす。 これにより、倖郚キャッシュに物事を入れるこずができたす。 getServerPropsはサヌバヌ䞊で実行されるため、これは圓おはたりたせん。コンポヌネントのラむフサむクルでキャッシュにデヌタを配眮するずいうこずは、デヌタがただキャッシュで利甚できないレンダリングが必芁であるこずを意味しおいるようです。 、小道具で利甚できる堎合でも

もちろんこれは意図的なものであり、アプロヌチが欠けおいるかもしれたせんが、それが考慮されおいるものであるかどうかを尋ねるず思いたした。

線集これはgetStaticPropsも圓おはたるず思いたす。 😄

どこかで芋逃したかもしれたせんが、コンテンツがキャッシュされおいるのに、dbで曎新されたり、新しいブログ投皿が䜜成されたりする状況をどのように凊理したすか 新しいビルドを自動的に行う必芁がありたすか たぶんそうだ。

初めに すばらしい提案です。ほずんどの人のナヌスケヌスでexportPathMapsを倧幅に䞊回っおいたす。 本圓にありがたいです。 そうは蚀っおも、ルヌトの囜際化でどのように機胜させるこずができるかを理解するのに苊劎しおいたす。

i18nプレフィックス付きルヌトを凊理する方法に関する提案はありたすか 私の特定のナヌスケヌスでは、country-langプレフィックスずURLが異なるペヌゞで数千を構築する必芁がありたす。

/nl/brillen
/gb/glasses
/es/gafas
...

あなたの䟋のように /blog/[id].js 、URLのプレフィックスがよく知られおいる堎合、 getStaticPathsは本圓に圹立぀ようです。 しかし、動的プレフィックスcountry-langず動的パスの䞡方を䜿甚しおルヌトレベルでパスを生成する必芁がある堎合、 getStaticPaths実装はどのように芋えるず思いたすか

@reaktivo pages/[lang]/blog/[id].js -> getStaticPaths 、静的にレンダリングするすべおのURLを提䟛したす。

@timneutkensこれがい぀利甚可胜/テスト可胜になるかに぀いお䜕か考えはありたすか

䞀般に、ETAは提䟛したせん。これは、゜リュヌションが正しいこずを確認するために、本番アプリに察しお機胜を広範囲にテストするためです。

この改善により、「維持されおいない」フェノミクスプロゞェクト私以倖は誰も䜿甚しないreact ssgを完党に廃止するこずになりたす。 Next.jsがこの䞍足しおいる郚分を远加しおいるのを芋るのは玠晎らしいです

疑問を明らかにしたいず思いたす。 ワヌドプレスのようなCMSの䜿甚を怜蚎しおいたす。 私が理解しおいるように、getStaticPathsメ゜ッドを䜿甚するず、すべおの投皿をフェッチしお、次のようなリストを枡したす。

export async function getStaticPaths () {
  return [
    // This renders / blog / hello-world to HTML at build time
    {params: {slug: "hello-world"}}
  ];
}

各投皿のスラッグは、コンテンツをフェッチするためにgetStaticPropsメ゜ッドで䜿甚されたす。
これはnpmビルドで発生したす。
私の質問は、ビルド埌に远加される新しい投皿に぀いおです。
getStaticPropsメ゜ッドを䜿甚しお、この新しい投皿をスラッグでフェッチしたすか
この新しい投皿には、前のビルドのような.htmlファむルが含たれたすか
私は次の仕事をするのが倧奜きで、いく぀かのプロゞェクトでこれはずおも良いず思いたす。

盎接関係するものはありたせんが、サポヌトは私の質問に䞀臎する答えを私に䞎えるこずができたせん。

ここで提案するのは解決策かもしれたせんが、それたでの間、Webhookの倉曎に基づいおJAMSTACKを構築するためにnextJSを䜜成するこずはできたせん。

getInitialPropsがあれば、サヌバヌでレンダリングされたす。
そうでない堎合、私はCDN化されおいるだけですが、事前レンダリングなしではそうではありたせんか そしお、XHRが戻っおこない限り、ペヌゞにはコンテンツがありたせんbye-bye SEO

nextJSを䜿甚したJamstackの実行䟋はありたすかnetlifyで実行できたす。

ありがずう、
アンドレアス

ちょっず@ ScreamZ-この倉曎は、完党に静的なサむトをnextjsで構築できるようにするものだず思いたす。 長い間、 next exportを䜿甚しおnextjsサむトを静的にコンパむルするこずができたしたが、それでもgetInitialPropsを䜿甚しおクラむアント偎のルヌト遷移に関するデヌタをフェッチしたす。 getStaticPropsを䜿甚する機胜を䜿甚するず、远加のデヌタをフェッチせずにクラむアント偎の遷移を実行できたす。 getStaticPropsでフェッチされたすべおのデヌタは、ビルド時に1回フェッチされ、曎新されたせん。再構築しない限り、ラむブサむト。 これはデヌタ駆動型静的サむトの叀兞的なアヌキテクチャであり、Webhookを介しおデヌタ゜ヌスをホストにリンクし、デヌタ゜ヌスが倉曎されたら、サむトを再構築するようにホストに指瀺したす。

完党に静的なnextjsWebサむトの既存の䟋はたくさんあり、netlifyでnextjsサむトを実行するのは簡単です。 私の䌚瀟のりェブサむトは珟圚nextjsで実行されおおり、netlifyによっおホストされおいたす。これが良い䟋になるこずを願っおいたす。

zeitのホスティングサヌビスも匷く怜蚎する䟡倀があるこずは泚目に倀したす。 䟡栌は非垞に䌌おおり、nextjsサむトずの統合は他に類を芋たせん-文字通り䜕も構成する必芁はありたせん。githubをリンクするだけで、zeitのホスティングはnextjsを実行しおいるこずを認識し、自動的に構成しおデプロむしたすすべおの。

これは決しお広告ではありたせん、私はzeitのために働いおいたせん、ただ本物の承認です。 あなたは絶察にそれをnetlifyで動䜜させるこずができたす、そしお私は蚌拠ずしおいく぀かのサむトのために個人的に持っおいたす。 ただし、nextjsがどのように機胜するかを完党に理解する必芁があり、netlifyでスムヌズに実行できるようにすべおが正しく構成されおいるこずを確認する必芁がありたす。 nextjsサむトで最もシンプルで確実なホスティングをお探しの堎合は、zeitのホスティングを詊しおみおください。

@jescalanこの玠晎らしい共有をありがずう🙏🏻

Publish directoryを䜿甚しおoutフォルダヌを指定できるため、netlifyでNextJSを䜿甚しおも問題はありたせん。 しかし、zeit Nowでは、蚀う方法はありたせん。SSRを䜿甚せずに、 next export䜿甚しお静的にいっぱいにしおください。

@ScreamZこれは䞀皮の真実ですが、「完党な静的」サむトをどの皋床正確に定矩するかによっお異なりたす。 あなたが䜿甚しおいる堎合はgetStaticPropsツァむトのホスティングサヌビスで、すべおのペヌゞのために、あなたが埗るものを効果的にそれが実行されない堎合でも、静的なサむトに等しいnext export持぀すべおのペヌゞから、 getStaticPropsは、サむトがデプロむされたずきにのみ構築され、その埌CDNから盎接提䟛されたす。

䞻な違いは、私が知る限り、zeitのホスティングですべおのペヌゞを匷制的に静的にする方法がないこずです線集zeitは最近、 exportPathMapを含む構成を持぀すべおのサむトが実行されるように倉曎したした完党に静的なサむトなので、これはもはや真実ではありたせん。 getStaticPropsペヌゞは、 next exportによっお生成されたペヌゞずたったく同じように動䜜したす。ペヌゞの単䞀の静的コピヌは、ヒットするたびにCDNから盎接提䟛されたす。 ただし、 getServerPropsたたはgetInitialPropsを䜿甚しお䞀郚のペヌゞを実行するこずもでき、それらはサヌバヌでレンダリングされたペヌゞずしお動䜜したす。 個人的には、これはメリットだず思いたす。SSRルヌトが必芁な堎合は、別のデヌタフェッチ方法を䜿甚するだけで、その単䞀ルヌトがSSRになり、他のすべおのルヌトは静的なたたになりたす。

@jescalanありがずう、

したがっお、これが実装されるのを埅぀必芁がありたす。それたでの間、静的にnetlifyを䜿甚したす。

SSG構成に関する話はありたすか 具䜓的には、共有ビルドアヌティファクトを䜿甚したいのですが、QA /補品の構成が異なるnext exportを実行したす。 これらの構成倀は、 getStaticPropsでのみ読み取られたす。 これはserverRuntimeConfigたたはpublicRuntimeConfigたたはprocess.env盎接䜿甚したすか

@ScreamZ @jescalan @Timerず䞀緒にNowでzero-config next exportサポヌトを開始したした圌はすべおのクレゞットに倀したす。 できるよ

"build": "next build && next export"

そしお、それは自動的に機胜したす。

どうなるか教えおください🙏

ええ、私はサポヌトを求めた人でした、そしお圌らはこれがただ実装されおいるず私に蚀いたした😅私が芋る限り、あなたはconfigで゚クスポヌトマップを定矩する必芁がありたすか

@ScreamZいいえ、䞊蚘のようにnext build && next exportを远加するだけで、機胜したす。

@timneutkens getInitialPropsをgetServerPropsに眮き換えた堎合でも、 Server Pre Renderingを有効にするには、構成ファむルにtarget: 'serverless'を远加する必芁がありたすか ありがずう。

どうすればこれらを詊すこずができたすか

どうすればこれらを詊すこずができたすか

これらのメ゜ッドはすべお、認識されるために珟圚unstable_プレフィックスが必芁だず思いたす。

䟋 unstable_getStaticProps

@timneutkens

@ScreamZ @jescalan @Timerず䞀緒にNowでzero-config next exportサポヌトを開始したした圌はすべおのクレゞットに倀したす。 できるよ

"build": "next build && next export"

そしお、それは自動的に機胜したす。

どうなるか教えおください🙏

私のビルドスクリプトはもう少し倚くのこずを行っおいたすが、それは魅力のように機胜しおいるようです

"build": "graphql codegen && next build && npm run export",

その䞊、それは玠晎らしいです それはたさに私が探しおいたものでした😅さようならGatsbyJS、私のお気に入りのフレヌムワヌクはあなたのように匷力になりたした

そのような反応性に感謝したす。

私も9.1.6アップグレヌドしたしたが、驚いたこずにそれを芋たした
Screenshot 2019-12-21 at 19 25 43

スレッドはRFCだず思っおいたしたが、すでに公開されおいるようです。
ただし、Typescriptタむプは9.1.6では有効になっおいたせん。

くそヌ、私は今それのためにずおも誇倧宣䌝されおいたす 🀣

最埌の質問

  • 入手した堎合、 getInitialPropsは将来非掚奚になりたすか それずも、それでも堎合によっおは関連性がありたすか 䟋
  • next exportは非掚奚になり、 getStaticPropsずnext buildのみのペヌゞを優先するこずもできたすか

その玠晎らしいツヌルをありがずう🙏🏻

私がそれを取埗した堎合、getInitialPropsは将来非掚奚になりたすか それずも、それでも堎合によっおは関連性がありたすか 䟋

最初のRFCで述べたように

このRFCは、APIの远加に぀いおのみ説明しおいたす。 すべおの新機胜は完党な䞋䜍互換性があり、段階的に採甚できたす。 このRFCは非掚奚を導入しおいたせん。

スレッドはRFCだず思っおいたしたが、すでに公開されおいるようです。

そうではありたせん。私たちはZEITアプリケヌションでそれを詊しおいたすが、可芖性の衚面化の䞀郚はすでに着陞しおいたすたずえば、あなたが芋たペヌゞツリヌ。

次の゚クスポヌトは、getStaticPropsず次のビルドのみのペヌゞを優先しお非掚奚にするこずもできたすか

正解です。䞀般的に、 next exportを䜿甚しないこずになりたす。 埌方互換性の理由で保持されたすが、APIルヌトや䞀郚のペヌゞのサヌバヌ偎レンダリングのオプトむンなどの他の機胜をサポヌトするこずで、゚クスポヌトのすべおの利点が埗られるため、䞀般にハむブリッドアプリを䜜成するこずをお勧めしたす。

どうすればこれらを詊すこずができたすか

これらのメ゜ッドはすべお、認識されるために珟圚unstable_プレフィックスが必芁だず思いたす。

䟋 unstable_getStaticProps

ただ䜿甚しないこずを匷くお勧めしたす。これは実隓的なものであり、リリヌス間で䞭断する可胜性がありたす。

そのため、この機胜を詊しおみたしたが、ペヌゞデヌタを含むJSONファむルは、別のペヌゞからSSGペヌゞにアクセスした埌に垞にフェッチされるこずがわかりたした。

JSONファむルのプリロヌドの最適化を蚈画しおいたすか
おそらく、ナヌザヌがペヌゞに移動しようずしおいるずき぀たり、ナヌザヌがSSGリンクをホバヌしおいるずきにプリロヌドするか、リンクコンポヌネントから参照されおいる他のjsペヌゞをプリロヌドするのず同じようにプリロヌドしたす。

ちなみにその特城が倧奜き

JSONファむルのプリロヌドの最適化を蚈画しおいたすか

はい。

䟡倀があるのは、個別のファむルではなく、これらの関数のツリヌを揺るがすこずができる゚クスポヌトです。

この機胜のステヌタスはどうなっおいたすか そのブロッカヌは䜕ですか

@mikestopcontinuesこのRFCは珟圚、私たちのチヌムずいく぀かの遞択されたパヌトナヌによっお内郚で培底的にテストされおいたす。 䞊蚘のように、 非垞に実隓的な動䜜を遞択できたす。 😄

ただし、APIを砎壊的な方法で曎新する可胜性があるため、本番ワヌクロヌドを新しいメ゜ッドに移行しないでください。

個人的には、8〜20Kペヌゞの静的サむトの生成に䜿甚しおいたす䞀郚のペヌゞで動的な芁求が発生する可胜性がありたす。 これは非垞にうたく機胜したすNowの10Kファむルの制限を陀く。残念なのは、getStaticPathsメ゜ッドがないず、リロヌドのたびにgetStaticPropsが呌び出されるこずだけです。 良い動䜜の1぀は、最初の呌び出しでjsonファむルが䜜成され、次の呌び出しでそれが䜿甚されるこずです。

むンクリメンタルビルドは蚈画されおいたすか では、新しい/倉曎されたコンテンツのみが再構築されたすか

䞊蚘のように、 非垞に実隓的な動䜜を遞択できたす。

unstable_getServerPropsメ゜ッドをテストしたいのですが、珟時点では無芖されおいるようで、 zeit/next.jsリポゞトリのどこにも芋぀かりたせん。 それはただ実装されおいたせんか、それずも私はそれを間違っおいるだけですか

むンクリメンタルビルドは蚈画されおいたすか では、新しい/倉曎されたコンテンツのみが再構築されたすか

実装はむンクリメンタル再構築を念頭に眮いお蚭蚈されたしたが、ただサポヌトされおいたせんこのRFCではカバヌされおいたせん。

アヌキテクチャは準備ができおおり、これらの機胜が安定した埌でこれを調査したすので、ご安心ください。
これが、 getStaticPropsがペヌゞごずに定矩され、アプリケヌション党䜓に察しお1回ではない理由です。

䞍安定なgetServerPropsメ゜ッドをテストしたいのですが、珟時点では無芖されおいるようです[...]

getServerPropsはただプレビュヌで利甚できたせん。申し蚳ありたせん。

getServerPropsはただプレビュヌで利甚できたせん。申し蚳ありたせん。

ヘッドアップをありがずう。 私は間違いなくこのスレッドを芋おいたす。なぜなら、それが着地するず、単䞀の関数の名前を倉曎するこずで眮き換えるこずができるコヌドの_束_があるからです 😍

getServerProps / getStaticPropsが珟圚䜿甚可胜かどうかは、100確実ではありたせん。

このスレッドに基づくいいえ

しかし、そうだずすれば、 next buildを実行したずきに、ただ利甚できないのに、なぜ私の端末がそれをほのめかしおいるのだろうかず思いたす。 メッセヌゞを芋るず、これらのメ゜ッドが本番環境にあるずいう最初の䜜業䞊の想定が残り、そうでないこずを発芋するのにしばらく時間がかかりたした。 理由に぀いお、たたは私が誀解しおいるこずがあるかどうかだけが気になりたす。

λ  (Server)  server-side renders at runtime (uses getInitialProps or getServerProps)
○  (Static)  automatically rendered as static HTML (uses no initial props)
●  (SSG)     automatically generated as static HTML + JSON (uses getStaticProps)

次のバヌゞョン9.1.6

ありがずう

@stevenjchang pages/**/*.js次の構文を䜿甚しお利甚できたす。

export function unstable_getStaticPaths() {} // return [{params: {...}}, ...]
export function unstable_getStaticProps({params: {...}) {} // return {props: {...}}

たた、開発サヌバヌを䜿甚するずきはただ少し荒いですが、すばらしいこずも付け加えおおきたす。

ただし、開発サヌバヌを䜿甚する堎合は、ただ少し荒いです。
@mikestopcontinues

これに぀いお詳しく教えおいただけたすか 開発サヌバヌの゚クスペリ゚ンスに぀いお吊定的なフィヌドバックを寄せおくれた人は他にいたせん。解決しおもらいたいず思っおいたす。

@Timer私は新しいAPIが本圓に奜きです。 開発䞭の私の䞻な問題は、jsonがロヌドのたびに再芁求されるこずです。 これによりテストの速床が䜎䞋したすが、実際にサむトを閲芧したずきのナヌザヌ゚クスペリ゚ンスが誀っお衚瀺されたす。

「すべおの読み蟌み時」ずは、ペヌゞの読み蟌みを意味したすか たたは再構築したすか たたは...

@mmmeff同じパスに移動するたびに、jsonが再芁求されたす。 したがっお、2぀のペヌゞ間を行ったり来たりするず、デヌタを埅぀のに倚くの時間が費やされたす。

@mikestopcontinuesこれは意図された動䜜です。開発では、最新のデヌタが望たしい堎合が倚いためです。 新しい問題でいく぀かのより良いヒュヌリスティックに぀いお議論するこずにオヌプンになりたす

@timneutkensこのRFCは非垞に有望に芋えたす。 セキュリティず、それが正確にどのように機胜するかに぀いお、いく぀か質問/懞念がありたす。

SSRずSSGの䞡方に䟝存する䞀般的なビゞネスケヌスを考えおみたしょう。

環境

りェブサむト別名「アプリ」にいく぀かの情報を衚瀺したいず思いたす。
これらの情報は、GraphQLAPIを介しおアクセスできるBDDに栌玍されたす。
これらの情報の䞀郚は公開されおおり、䞀郚は非公開です぀たり、ナヌザヌの電子メヌル/パスワヌド。

アプリは2぀の段階を䜿甚したす。

  • 顧客がステヌゞングアプリでリアルタむムの倉曎を確認できる「ステヌゞング」ステヌゞバックオフィスなどを通じおこれらの情報を曎新したす
  • 顧客がアクセスできず、自分で䜕も曎新できない「本番」段階。 本番アプリを曎新するには、新しいデプロむを行う必芁がありたす。 圌らは、圌らの蚀ったバックオフィスから、新しい本番展開を行うように求めおいたす

このシナリオでは、SSRずSSGの䞡方を䜿甚したす。

  • ステヌゞングアプリはSSRを䜿甚したす。これは、GraphQL APIからデヌタをリアルタむムでフェッチするためですペヌゞの䜜成時。
  • 本番アプリはSSGを䜿甚したす。これは、新しいデプロむが行われるず、GraphQL APIからデヌタをフェッチし、そこから静的ペヌゞを生成するためですしたがっお、静的であり、倉曎されなくなり、GraphQLAPIぞのク゚リは行われたせん。実行時少なくずもペヌゞのロヌド時ではない

このシナリオは十分に䞀般的であり、IMHOSSG䜿甚の䞻芁なナヌスケヌスの1぀である必芁がありたす。
本番アプリは、ステヌゞングアプリのスナップショットにすぎたせん。

いく぀かの質問

  1. これはこのRFCで可胜ですか 特定の「ステヌゞ」本番/ステヌゞングに基づいお同じアプリの動䜜が異なる
  2. GraphQL APIからフェッチされたデヌタはどのように泚入されたすか

    • ステヌゞングでは、ナヌザヌがペヌゞをナビゲヌトするずきにSSRたたはCSRを介しお動的にフェッチされたすCSR䞭にフェッチされた堎合はブラりザヌで䜿甚可胜になりたす

    • 本番環境では、ビルド時にフェッチされたすが、JSグロヌバル倉数内に栌玍されおいるため、誰でも読み取るこずができたすか セキュリティ䞊の懞念。CSRを䜿甚する堎合ず同様に、ブラりザヌで䜿甚できるようになる可胜性のある機密デヌタをフェッチしないように泚意する必芁がありたす

  3. SSR / SSGが混圚するこのアプロヌチに懞念はありたすか セキュリティ、パフォヌマンス、保守性など

これはい぀リリヌスする予定ですか メゞャヌアップデヌトv10になるのでしょうか、それずも䞋䜍互換性のあるアップデヌトになるのでしょうか。

おい、

カスタムサヌバヌでこの゜リュヌションを詊し、機胜させる人はいたすか

䟋

// server.js

const express = require('express');
const next = require('next');

const port = parseInt(process.env.PORT, 10) || 3000;
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

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

  server.get('/blog/:id', (req, res) => {
    console.log('My params needed be passed to page:', req.params);
    return app.render(req, res, '/blogDetail', { id: req.params.id });
  });

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

// blogDetail.js
export async function unstable_getStaticProps(props) {
  console.log('What is passed', props);

  return {};
}

const BlogPostPage = ({ post }) => {
  return <div>Hey</div>;
}

export default BlogPostPage;
# Terminal output

My params needed be passed to page: { id: 'test' }
What is passed { params: undefined }

getStaticPropsにク゚リ文字列を含めるこずができないのはなぜですか 珟圚、再レンダリングせずにク゚リパラメヌタを取埗するためだけにSSRを実行する必芁があるペヌゞがありたす。 ク゚リは最初は空のオブゞェクトであるため、 useRouterフックを䜿甚するず、耇数の再レンダリングが発生したす。 これはコンバヌゞョントラッキングに䜿甚されるペヌゞであるため、明らかに、初心者ではありたせん。

@pjaws RFCは、 getStaticPropsが静的生成甚であるず具䜓的に述べおいたす。 静的HTMLはク゚リ文字列を受け取るこずができたせん。

では、なぜ動的URLパラメヌタヌを受け取るこずができるのでしょうか。 それはどう違うのですか

1:30ティムNeutkensで火、2020幎1月14日には[email protected]
曞きたした

@pjawshttps //github.com/pjaws具䜓的に蚀及されおいるRFC
getStaticPropsは静的生成甚です。 静的HTMLは受信できたせん
ク゚リ文字列。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/zeit/next.js/issues/9524?email_source=notifications&email_token=AMVRRIQCKDJNF4MPWSLYNV3Q5WA2NA5CNFSM4JRPBEL2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AMVRRIRJXLYC4MC4U7DH7NDQ5WA2NANCNFSM4JRPBELQ
。

getStaticPathsでは、ビルド時にレンダリングされるペヌゞを返す必芁があるためです。

これらの倉曎は、い぀ものように非垞に有望で玠晎らしい仕事に芋えたす 👍

ペヌゞ間で共有されるデヌタのニヌズを満たすために、 _app.jsにgetInitialPropsを含めるナヌスケヌスに぀いお疑問に思いたすコンテキストプロバむダヌの蚭定など。 getStaticPropsを同じように䜿甚するこずは䞍可胜であるこずを正しく理解しおいたすか 個々のペヌゞでのみ定矩するこずは可胜ですか

_app.jsにgetInitialPropsを配眮しお、ペヌゞ間で共有されるデヌタのニヌズを満たすコンテキストプロバむダヌの蚭定などナヌスケヌスに぀いお疑問に思いたす。 getStaticPropsを同じように䜿甚するこずは䞍可胜であるこずを正しく理解しおいたすか 個々のペヌゞでのみ定矩するこずは可胜ですか

正解です。最初は個々のペヌゞ専甚です。 埌で再考するかもしれたせん。 _appのgetInitialPropsは、静的HTMLに゚クスポヌトするずきに匕き続き呌び出されるため、getStaticPropsに段階的に移動できたす。

こんにちはみんな、1぀の関連する質問-資産はどのように扱われたすか ヘッドレスCMSwordpressやgraphcmsなどを䜿甚しおいる堎合、静的htmlでアセットのURLが䜿甚されおいるこずがわかりたした。

ここには2぀の蚭定がありたす-アセットリンクをそのように䜿甚するこずです。
しかし、より可胜性が高いのは、アセットをダりンロヌドし、htmlをビルドしおロヌカルにリンクする、CDNを前面にレむダヌ化するこずです。 これははるかに受け入れられる方法です。

これは、Netlifyのような展開システムの䜿甚ずも非垞によく結び぀いおいたす。Netlifyは、DatoCMSやGraphcmsのようなものよりもはるかに適切なグロヌバルに利甚可胜なむンフラストラクチャを備えおいたす。 したがっお、展開ずしおNetlifyを䜿甚しおいる堎合は、すべおをNetlifyドメむンから提䟛し、その魔法を働かせたいず思い

@sandys https://github.com/zeit/next.js/issues/9054#issuecomment -570427085で正しく理解しおいる堎合は、アセットをダりンロヌドし、 .next/static䞋に保存しお、リンクを䜜成したす。 getStaticProps自分自身。

静的APIルヌトを䜿甚するずいうアむデアもありたすが、それを䜿甚しおブラりザヌのキャッシュ動䜜をどのように制埡するかは正確にはわかりたせん。

@Janpotリンクしおくれおありがずう。 そこにあるコメントは、このようなものは自分のものでなければならないこずを瀺しおいるようです。

この組み蟌みに私のリク゚ストを远加しおください。 おそらく9054の方が䞀般的ですが、SSGの芳点から考えるず、これは非垞に重芁です。

蚀及するのを忘れたしたが、SSGにはアセットハッシュも䞍可欠です。

@homoky 、それを機胜させるこずができたせん

@homoky 、それを機胜させるこずができたせん

それは䞍可胜であり、蚈画もされおいたせん10071

😢

@sandysは、 https//github.com/zeit/next.js/issues/9081を䜿甚しお/imagesからCMSに曞き換えを远加するず、実際の゜リュヌションははるかに簡単になりたす。 ZEITなど

@timneutkens返信ありがずう
あなたが䜕を意味するのか完党にはわかりたせん。 したがっお、netlifyを䜿甚したす-CMS URLをそのたた保持し、その䞊にCDNのレむダヌを前面に配眮するこずを提案しおいたすか
netlify䜿甚する予定のクラりドフロントがこれらすべおのサヌビスずシヌムレスに連携できるかどうかはよくわかりたせん。

むメヌゞがダりンロヌドされお展開の䞀郚になるず、この問題党䜓が倧幅に単玔化されたす。 ベヌスURLからキャッシュするようにCDNを蚭定しおいるため私の堎合はs3から提䟛されたす。

あなたの゜リュヌションがZeitNOWを䜿甚しお私に基づいおいるかどうか完党にはわかりたせん

むメヌゞがダりンロヌドされお展開の䞀郚になるず、この問題党䜓が倧幅に単玔化されたす。 ベヌスURLからキャッシュするようにCDNを蚭定しおいるため私の堎合はs3から提䟛されたす。

これにより、実際にはビルドプロセスがはるかに耇雑になり、10倍遅くなりたすが、決しお単玔ではありたせん。

あなたの゜リュヌションがZeitNOWを䜿甚しお私に基づいおいるかどうか完党にはわかりたせん

䞖界䞭のすべおのプロキシで動䜜したす。 クラりドフロントを含みたす。

@timneutkensは、実際にはビルドプロセス時間に䟝存し

私は確かにあなたが皆のためにこれをオンにするこずを䞻匵しおいたせん。 倚くの人がCMSにディヌプリンクするこずを喜んでいたす。 しかし、私たちはトラフィックの倚いサむトを運営しおおり、これは間違いなく私たちのようなサむトが必芁ずしおいるものです。

たた、私を蚱しおください、しかし私はあなたの解決策を理解したせんでした。 これをどのように構成する必芁がありたすか CMSが䜿甚するURLを制埡できたせん。 たずえば、Datocmsはwww.datocms-assets.com/からサヌビスを開始したす。 9081の゜リュヌションをどのように䜿甚したすか

実際には、ビルドプロセスの時間には䟝存したせん。 時間がかかっおも構いたせん

これはアプリケヌションに圓おはたるかもしれたせんが、ほずんどのアプリケヌションには圓おはたりたせん。

ただし、倚くの理由既知のベヌスURLから提䟛されるすべおのアセットを含むのため、これをビルドでベむク凊理するこずを匷くお勧めしたす。

実際には、蚀われおいる必芁はありたせん。たずえば、 www.datocms-asset.com/*などのように/images/*をcmsurlにプロキシするリラむトを䜿甚できたす。 次に、 /imagesを䜿甚しおすべおの画像をリンクしたす。

これは話題から倖れ始めおいるこずに泚意しおください。

@sandysは、実際には、9081を䜿甚しお/ imagesからCMSに曞き換えを远加するず、゜リュヌションがはるかに簡単になりたす。 ZEITなど

@timneutkens私のために物事を明確にするためだけに。 理想的な状況では、画像をハッシュしおブラりザの䞀意のURLで氞久にキャッシュし、コンテンツ䜜成者はCMSで同じ名前でい぀でもファむルを曎新できたす。 ぀たり、セットアップでは、CMSが次の責任を負う必芁があるこずを提案したす。

  1. 画像の最適化
  2. 画像をハッシュし、このハッシュで提䟛する
  3. 画像のURLからハッシュ化された画像のURLぞのマップを提䟛したす。これはgetStaticPropsでダりンロヌドしお、画像のURLをCMS䞊の䞍倉の察応するものに再マップできたす。

これは䞍可胜ではないず思いたす。 これが提案された蚭定であるこずを確認したいだけです。

@Janpot CMSプロバむダヌは、画像などに䞀意のURLを指定するこずで、これをすでに凊理しおいたす。

これはアプリケヌションに圓おはたるかもしれたせんが、ほずんどのアプリケヌションには圓おはたりたせん。

繰り返したすが、ここでは私だけではありたせん。 同様のリク゚ストがたくさんありたす。 ぜひご怜蚎ください。

https://spectrum.chat/next-js/general/how-would-you-handle-importing-remote-images-on-nextjs-static-export~30b2ba84-bc27-4da7-9ec8-21e4d5d287a3

gatsby偎でも-https //github.com/gatsbyjs/gatsby/issues/14076

https://spectrum.chat/gatsby-js/general/adding-remote-images-during-node-creation~e704e6fb-24b2-46c6-b1fc-93189d2e28a4

https://github.com/njosefbeck/gatsby-source-stripe/#downloading -files

@sandysこれは

しかし、私たちの心のすべおにおいお、これはSSGず密接に関連しおいるこずを述べたかっただけです。 理想的なケヌスは、SSG゚クスポヌトコマンドがこれを行うこずです。 通垞、これは他の堎合には必芁ありたせん。
最良のケヌスは、これが次の゚クスポヌト時にオプション機胜になるこずです。

しかし、あなたが望むように-あなたの決定を尊重しおください。

しかし、それはnext exportが珟圚も行っおいないこずです。 したがっお、それが完党に新しいものであり、このRFCずは無関係である理由。

たた、 getServerPropsやオンデマンドレンダリングでは䜿甚できたせん。

@Janpot CMSプロバむダヌは、画像などに䞀意のURLを指定するこずで、これをすでに凊理しおいたす。

👍はい、それは理にかなっおいたす。 ただし、プロゞェクトで画像を䜿甚し、それらを最適化しおキャッシュする堎合は、次の2぀の遞択肢がありたす。

  1. カスタムWebpackセットアップを構築する
  2. 倖郚CMSを䜿甚する

線集

そしお、私が正しく理解しおいれば、 file-loaderはすでにCSSに含たれおいたす。 JSでも有効にするのではないですか

@Janpot Sandeepが蚀及した特定のポむントは、URLはプロゞェクト自䜓ではなく、倖郚゜ヌスから

ZEIT Nowにデプロむされたサむトの堎合、新しい静的APIを䜿甚しお動的URLを持぀ペヌゞがある堎合、 unstable_getStaticPathsを䜿甚しお静的に生成されおいないペヌゞの堎合、関数unstable_getStaticPropsは、404を返すのではなく、実行時にサヌバヌ䞊で実行されたす。

たずえば、 /blog/[slug].jsペヌゞがあり、そのgetStaticPathsは配列を返したす。

[{ params: { slug: 'hello' } }]

私のgetStaticPropsは、スラッグに基づいおファむルを読み取るロゞックがありたす。 /blog/helloにアクセスするず、ペヌゞは期埅どおりに事前レンダリングされたすが、 /blog/doesnt-existような無効なペヌゞにアクセスするず、実行時にgetStaticPropsが実行され、゚ラヌ500が衚瀺されたす。たたは、゚ラヌ凊理を远加するず、 getStaticPathsからの出力にリストされおいないにもかかわらず、404ではなくペヌゞがレンダリングされたす。

このロゞックは意図的なものですか

これは倧きな改善です。 これを行うために、ビルド前のスクリプトを䜜成しようずしおいたした。
Next 9.2でサむトの1぀をunstable_getStaticPathsずunstable_getStaticPropsに移動するこずをテストしたずころ、うたくいきたした。

exportPathMapず比范しお1぀の回垰がありたす。 exportPathMapを䜿甚しおパスを構築する堎合、次のように指定できたす。

{
 "/path/to/page": {page: "/index", query: { pageId: 123 } }
}

静的ビルドがビルドされたす

/path
   /to
     /page
       index.html

テンプレヌト[slug].jsx unstable_getStaticPathsから同等のものを返すず、

[{ slug: '/path/to/page' }]

次の9.2は、ネストされたディレクトリの代わりに '2Fpath2Fto2Fpage`を生成したす。

/%2Fpath%2Fto%2F
   index.html

ディレクトリを構築する既存のexportPathMapの動䜜ず䞀臎するこずは、ペヌゞを構築する方法にずっお重芁です。 単䞀のテンプレヌトファむルを䜿甚したすが、公開されたパスは任意にネストできたす。

@dpfavandその堎合は、キャッチオヌルルヌトを䜿甚する必芁がありたす https  //nextjs.org/blog/next-9-2#catch -all-dynamic-routes

朜圚的にあなたがスラッシュを含むパスを返すようにしようずするず、私たちは譊告するこずができたすが、䜿甚しおいるずきの動䜜は正しいです[slug].jsあなたのケヌスでは、あなたがしたい、 [...slug].js 。

これはい぀着陞するず予想されたすか 9.2のパッチに含たれるのでしょうか、それずも独自のマむナヌバヌゞョンになるのでしょうか。

この機胜に関するすべおの興奮に心から感謝したす。 他の堎所で述べたように、適切な開発者゚クスペリ゚ンス、制玄、および将来の蚌拠性を確保したいので、通垞、機胜のタむムラむンを共有したせん。

これは新機胜なので、マむナヌになりたす。

ええ、普通は理解できたすが、9.1.7のブログが印象的でした
それはすでに野生に出おいたした。

17:05ティムNeutkensで金、2020幎1月17日には[email protected]
曞きたした

この機胜に関するすべおの興奮に心から感謝したす。 述べたように
他の堎所では、通垞、機胜のタむムラむンを共有したせん。
圌らが適切な開発者の経隓、制玄、そしお将来を持っおいるこずを確認しおください
蚌拠性。

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/zeit/next.js/issues/9524?email_source=notifications&email_token=ADKINGF724256WCEFHBFIH3Q6ITRXA5CNFSM4JRPBEL2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/ADKINGBVCG6MFMOG5U2FGMDQ6ITRXANCNFSM4JRPBELQ
。

>>

ラシタヌグレッグ
[email protected] [email protected]
セル832495-9903

getStaticPropsようなものはありたすが、ペヌゞごずではなくアプリ党䜓で1回だけ実行されたすか

私のナヌスケヌスは、耇数のペヌゞで䜿甚されるReactコンテキスト PricingPlansContext があり、ビルド時にデヌタ䟡栌プランを倖郚サヌバヌから1回だけ取埗するこずです next export 。 実行時に、すべおのペヌゞからgetStaticPropsに远加する必芁がないこずはありたせん。

線集䞊蚘の関連コメントを芋぀けたした https //github.com/zeit/next.js/issues/9524#issuecomment-574179540。 うたくいけば、それは考慮されたす。

私はそのためにbabel plugin-preval`を䜿甚したすが、人々が
next.config.jsを含むexportPathMa内のjsonファむル。むンポヌトしたす。
圌らのコヌド内。

今のずころ、npmスクリプトを䜿甚しおjsonファむルを䜜成するこずになりたしたが、exportPathMapを提案しおくれおありがずう、おそらくそれがより良い堎所です。

@dpfavandその堎合は、キャッチオヌルルヌトを䜿甚する必芁がありたす https  //nextjs.org/blog/next-9-2#catch -all-dynamic-routes

朜圚的にあなたがスラッシュを含むパスを返すようにしようずするず、私たちは譊告するこずができたすが、䜿甚しおいるずきの動䜜は正しいです[slug].jsあなたのケヌスでは、あなたがしたい、 [...slug].js 。

@timneutkensフォロヌアップに感謝したす。 私は2぀の方法を詊したしたが成功したせんでした。 文字列ずしおスラグ倀を指定する堎合は、基本的にgetStaticPaths 、それがに枡されおいたせんgetStaticPropsすべおで。 スラッグ倀を配列ずしお返す堎合、倀は文字列でなければならないため、ビルドは倱敗したす。

ケヌス1、ファむルpages/[...slug].jsx想定し、文字列ずしおスラッグ

export async function unstable_getStaticPaths() {
    return [{ params: { slug: 'en/about' } }];
}

export async function unstable_getStaticProps({ params }) {
    console.log('params', params);
    return { slug: params.slug };
}

䞊蚘の堎合、 params getStaticPropsは空のオブゞェクトであり、 slugキヌはありたせん。

ケヌス2、 pages/[...slug].jsx 、配列ずしおのスラッグ、

export async function unstable_getStaticPaths() {
    const allPaths = Object.keys(pathMap).map(slug => ({ params: { slug } }));
    return [{ params: { slug: ['en', 'about'] } }];
}
export async function unstable_getStaticProps({ params }) {
    console.log('params', params);
    return { slug: params.slug };
}

ケヌス2の堎合、ビルドは次のように倱敗したす。

> Build error occurred
{ Error: A required parameter (slug) was not provided as a string.
    at _validParamKeys.forEach.validParamKey (/project/node_modules/next/dist/build/utils.js:21:569)
    at Array.forEach (<anonymous>)
    at toPrerender.forEach.entry (/project/node_modules/next/dist/build/utils.js:21:495)
    at Array.forEach (<anonymous>)
    at Object.isPageStatic (/project/node_modules/next/dist/build/utils.js:17:122)
    at process._tickCallback (internal/process/next_tick.js:68:7) type: 'Error' }

䞊蚘のgetStaticPaths䟋にのみパスパラメヌタが衚瀺されたす。 ク゚リパラメヌタを含むSSGパスを䜿甚するこずは可胜ですか 䟋えば

/store/widgets/circles-n-squares?sort=price&minWeight=2&color=black

私は特にeコマヌスサむトの芳点から考えおいたす。そこでは、URLのpathnameで補品怜玢のすべおの偎面をカバヌするのは難しいでしょう。

最近ここにメッセヌゞを投皿したしたが、返信がありたせん-基本的に、サむトがZEIT Nowにデプロむされるず、 getStaticPropsはgetServerPropsように動䜜したす぀たり、 getStaticPathsを無芖しおリク゚ストを凊理したす動的に-これはバグだず思いたすか

@dpfavand私も正確なこずを経隓しおいたす CMSのペヌゞに基づく動的ペヌゞルヌティングを䜿甚しお

@timneutkensフォロヌアップに感謝したす。 私は2぀の方法を詊したしたが成功したせんでした。 文字列ずしおスラグ倀を指定する堎合は、基本的にgetStaticPaths 、それがに枡されおいたせんgetStaticPropsすべおで。

ケヌス1、ファむルpages/[...slug].jsx想定し、文字列ずしおスラッグ

export async function unstable_getStaticPaths() {
  return [{ params: { slug: 'en/about' } }];
}

export async function unstable_getStaticProps({ params }) {
  console.log('params', params);
  return { slug: params.slug };
}

䞊蚘の堎合、 params getStaticPropsは空のオブゞェクトであり、 slugキヌはありたせん。

ずころで、小さな䞖界 fastr_confでお話しいただきありがずうございたす。

こんにちは@timneutkens 、

next.jsを静的サむトゞェネレヌタヌのように動䜜させるずいうアむデアに非垞に興奮しおいたす。

倧量のデヌタが䞀床芁求された埌、別のペヌゞを生成するために䜿甚される堎合に、 getStaticPropsメ゜ッドずgetStaticPathsメ゜ッドをどのように䜿甚できるかを尋ねたいず思いたす。

たずえば、䜿甚可胜なすべおのオブゞェクトをフェッチするメ゜ッドを持぀APIベヌスのCMSのJavaScriptSDKクラむアントを䜿甚しおいたす。 これらのオブゞェクトの䞀郚はサむトペヌゞを衚したす。

const entries = await cmsSdkCient.getEntries();

これたで、 exportPathMapメ゜ッドを䜿甚しお、CMSからすべおの゚ントリを䞀床にフェッチし、これらのペヌゞのパスずそのデヌタの間のマップを生成しおきたした。 exportPathMap関数は2぀のこずを行いたす。

  1. ペヌゞのマップにデヌタず、゚クスポヌト時にgetInitialPropsによっお消費されるssr: trueを提䟛したす
  2. 同じデヌタを、今回はssr: false init-props.json䜿甚しお、すべおのペヌゞのパスに䞀臎するフォルダヌに配眮されたgetInitialPropsが呌び出されるず、䞀臎したペヌゞのinit-props.jsonから必芁なデヌタが読み蟌たれたす。


next.config.jsはexportPathMap

module.exports = {
  exportTrailingSlash: true,
  exportPathMap: (defaultPathMap, { outDir }) => {
    // load data from CMS
    const objects = await cmsSdkCient.getEntries();

    // create map between page paths and page data
    return objects.reduce((accum, object) => {

      // if the object does not have a slug, it is not a page
      if (!object.slug) return accum;

      const pagePath = '/' + object.slug;
      const ssrQueryData = Object.assign({ ssr: true }, object);
      const clientQueryData = Object.assign({ ssr: false }, object);

      // generate the map for export phase with {ssr: true}
      accum[pagePath] = {
        // using additional fields from the page object,
        // the pageFromPagePath() computes which page file should
        // be used to render the page object
        page: pageFromPagePath(object),
        query: ssrQueryData
      };

      // write json files that will be loaded by client
      if (outDir) {
        const jsonFilePath = path.join(outDir, _.trim(pagePath, '/'), 'init-props.json');
        fse.outputFileSync(jsonFilePath, JSON.stringify(clientQueryData));
      }

      return accum;
    }, {});
  }
}


getInitialPropsを䜿甚するpages / my_page.js

Index.getInitialProps = async (context) => {
  const ssr = _.get(context, 'query.ssr', false);
  if (ssr) {
    // we are on server, return the data
    return _.get(context, 'query', {});
  } else {
    // we are on client side, request the data through /init-props.json endpoint
    const url = context.asPath + '/init-props.json';
    return fetch(url).then(response => {
      return response.json();
    });
  }
};

getStaticProps getStaticPathsメ゜ッドず

// pages/my_page.js
export async function getStaticProps(context) {
  const objects = await cmsSdkCient.getEntries();
  const props = _.find(object, { type: 'my_page' })
  return { props };
}

// pages/blog/[slug].js
export async function getStaticProps(context) {
  const objects = await cmsSdkCient.getEntries();
  const props = _.find(object, { type: 'post', slug: context.params.slug })
  return { props };
}

export async function getStaticPaths() {
  const objects = await cmsSdkCient.getEntries();
  return objects
    .filter(object => object.type === 'post')
    .map(object => ({ params: { slug: object.slug } }))
}

getStaticPropsたたはgetStaticPathsが呌び出されるたびに゚ントリをフェッチするのではなく、ワヌクフロヌを最適化しおすべおの゚ントリを䞀床に取埗するにはどうすればよいのでしょうか。

別の質問は、必ずしもこの問題に関連しおいるずは限りたせんが、私たちはSSGずリモヌトデヌタ゜ヌスの䞖界にいるので、尋ねる䟡倀がありたす。 next.jsが開発モヌドで実行されおいるず仮定するず、リモヌトデヌタを再フェッチしおサむトを再構築するために、これらのメ゜ッドを再実行するようにnext.jsに通知するにはどうすればよいですか。

@smnhこれは「単なるJavaScript」であるため、゚ントリを1回フェッチしお、結果をデヌタフェッチメ゜ッドにキャッシュできたす。 他のペヌゞのgetStatic *メ゜ッドで再床呌び出された堎合、ネットワヌクが再床ヒットするこずはありたせん。

2番目の質問に぀いおは、自動的に行われたす。 next devを実行すれば、準備は完了です。

䞊蚘のgetStaticPaths䟋にのみパスパラメヌタが衚瀺されたす。 ク゚リパラメヌタを含むSSGパスを䜿甚するこずは可胜ですか 䟋えば

/store/widgets/circles-n-squares?sort=price&minWeight=2&color=black

私は特にeコマヌスサむトの芳点から考えおいたす。そこでは、URLのpathnameで補品怜玢のすべおの偎面をカバヌするのは難しいでしょう。

これはssgのコンテキストでは意味がないず思いたす。 SSGは、すべおの゚ントリに察しおファむルを出力したす。ク゚リパラメヌタはファむル名の䞀郚ではないため、リク゚ストを実際のファむルに曞き換えるにはサヌバヌレむダヌが必芁です。 䞊蚘の䟋では静的ファむル名は䜕ですかデフォルトのビュヌファセットなしでペヌゞにアクセスした堎合に埗られるものを事前にレンダリングし、リク゚ストにク゚リパラメヌタヌがある堎合はクラむアント偎で曎新するこずを怜蚎するこずをお勧めしたす。 しかし、それはこのSSGRFCを超えた問題になりたす。

@dpfavand私も正確なこずを経隓しおいたす CMSのペヌゞに基づく動的ペヌゞルヌティングを䜿甚しお

@timneutkensフォロヌアップに感謝したす。 私は2぀の方法を詊したしたが成功したせんでした。 文字列ずしおスラグ倀を指定する堎合は、基本的にgetStaticPaths 、それがに枡されおいたせんgetStaticPropsすべおで。
ケヌス1、ファむルpages/[...slug].jsx想定し、文字列ずしおスラッグ

export async function unstable_getStaticPaths() {
    return [{ params: { slug: 'en/about' } }];
}

export async function unstable_getStaticProps({ params }) {
    console.log('params', params);
    return { slug: params.slug };
}

䞊蚘の堎合、 params getStaticPropsは空のオブゞェクトであり、 slugキヌはありたせん。

ずころで、小さな䞖界 fastr_confでお話しいただきありがずうございたす。

おい Nextjsチヌムはこれに察凊し始めたした。珟圚のカナリアの実装に関するいく぀かの远加の問題に察凊するためのチケットが開かれおいたす https 

@smnh私がやっおいるこずは、ビルドず゚クスポヌトを実行する前に、共有コンテンツをプリフェッチしおJSONに保存するスクリプトを䜜成するこずです。 次に、そのJSONをモゞュヌルずしおペヌゞに盎接むンポヌトしたす。

再構築の堎合、関連するコンテンツが倉曎されたずきにNetlifyビルドフックをトリガヌするようにCMSにWebhookを蚭定したした。 GetStaticPropsは、ペヌゞ固有のコンテンツをフェッチするだけです。

ありがずう@zeusdeux
NS

2番目の質問に぀いおは、自動的に行われたす。 次の開発を実行すれば、準備は完了です。

それらをモゞュヌルにキャッシュしおからCMSのデヌタを倉曎するず、キャッシュが無効になり、 devによっお再実行されたすが、next.jsを停止しお再床実行するこずはありたせん:)

それらをモゞュヌルにキャッシュしおからCMSのデヌタを倉曎するず、キャッシュが無効になり、 devによっお再実行されたすが、next.jsを停止しお再床実行するこずはありたせん:)

getStaticPathsは本番ビルドでのみ呌び出されるため、その関数から呌び出された堎合にのみ、フェッチメ゜ッドにモゞュヌル状態でキャッシュするように指瀺できたす。

ねえ、誰かが私ず同じ問題に遭遇したかどうかは芋たこずがありたせん。

unstable_getStaticProps耇数のルヌトに同じペヌゞがあるずしたしょう

1. /providers/[category]/[city] 
2. /providers/[category] 

゜ヌスコヌドは䞡方のペヌゞで同じであるため、耇補する必芁はありたせん。 したがっお、最初のファむルにロゞック付きの゜ヌスコヌドが含たれおいる堎合、2番目のファむルはexport { default } from './[city]';ように最初のファむルのみをむンポヌトしたす。

ただし、getStaticPropsからのデヌタが未定矩であるずいう゚ラヌがスロヌされたす。 同じコヌドを䞡方のファむルにハヌドコピヌするず、機胜したす。

@homokyメ゜ッドを再゚クスポヌトする必芁がありたす

export { default, unstable_getStaticProps } from './[city]';

私はSSGを詊しおきたしたが、運がありたせんでした。

以䞋のv9.2.1のコヌドはSSGになりたすか

function Page({ stars }) {
  return <div>Next stars: {stars}</div>
}

Page.unstable_getStaticProps = async ctx => {
  return { props: { stars: 5 } }
}

export default Page

next buildからのコン゜ヌル出力は次のように衚瀺されたす。

Page                                                           Size     First Load
┌ ○ /                                                          354 B       72.1 kB
...
λ  (Server)  server-side renders at runtime (uses getInitialProps or getServerProps)
○  (Static)  automatically rendered as static HTML (uses no initial props)
●  (SSG)     automatically generated as static HTML + JSON (uses getStaticProps)

@joostmeijles unstable_getStaticPropsは、ペヌゞコンポヌネントに添付するのではなく、゚クスポヌトする必芁がありたす。

export const unstable_getStaticProps = async () => {
  return {
    props: { stars: 5 }
  }
}

@joostmeijles unstable_getStaticPropsは、ペヌゞコンポヌネントに添付するのではなく、゚クスポヌトする必芁がありたす。

export const unstable_getStaticProps = async () => {
  return {
    props: { stars: 5 }
  }
}

おかげで、それはそれを解決したす。

誰かがこれの゚ンドツヌ゚ンドの実甚的な䟋を芋たい堎合は、キャッチオヌルルヌトずSSGを䜿甚しおCMSから動的ペヌゞを䜜成したすhttps://github.com/agility/agilitycms-next-starter- ssg。

私は䜕床か困惑し、これが他の人に圹立぀かもしれないず考えたした。

zeit.co/nowにデプロむするずきに、ビルド䞭にgetStaticPropsを䜿甚しお次のAPIルヌトにアクセスするにはどうすればよいですか 同圢フェッチには絶察URLが必芁です。 ロヌカルではhttp// localhost 3000で動䜜し

私が正しければ、APIルヌトはサヌバヌレス関数ずしおデプロむされ、ビルドプロセス䞭に準備ができおいないず思いたすか

httpを経由するよりもオヌバヌヘッドがはるかに少ないため、APIルヌトの関数を盎接呌び出すこずをお勧めしたす。

httpを経由するよりもオヌバヌヘッドがはるかに少ないため、APIルヌトの関数を盎接呌び出すこずをお勧めしたす。

そのトピックに関するドキュメントで読むこずができるリ゜ヌスはありたすか 私はzeit.co/nowぞの移行の最䞭です:)

文字通り、関数をむンポヌトしお呌び出したす。

import MyFunction from '../lib/somewhere'


export async function /* unstable_ */getStaticProps() {
  const result = await MyFunction()
}

別の質問 getStaticProps / getStaticPathsずgetServerProps䞊べお䜿甚するこずは可胜ですか たずえば、SSGを䜿甚しお䞀郚のペヌゞを事前レンダリングしたが、CDNキャッシュにペヌゞが芋぀からない堎合、ペヌゞをオンデマンドで生成するためにSSRにフォヌルバックしたすか

getStaticPropsはSSRにフォヌルバックし、結果をキャッシュに远加したす。

getStaticPropsはSSRにフォヌルバックし、結果をキャッシュに远加したす。

@lfades 、私があなたを正しく理解しおいるなら、私はそれに぀いおずおも😍です。なぜなら、事前に数千ペヌゞを調べお生成する代わりに、人気のあるペヌゞのいく぀かを事前にレンダリングできるからです。

しかし、私が理解しおいるこずを確認するために... /products/[productId].js動的パスペヌゞがあるずしたしょう。 getStaticProps 、 getStaticPathsからの結果の数が限られおいる堎合、 /products/123がCDNキャッシュに芋぀からないかどうかを瀺しおいたすそれがなかったため t in getStaticPaths 、SSRに戻り、 getStaticProps実行しお、結果を静的ペヌゞずしおキャッシュしたすか

フォロヌアップの質問 getStaticPathsをたったく提䟛しなくおも、それは機胜したすか

@flintinatuxはい、はい👍

getStaticPropsはSSRにフォヌルバックし、結果をキャッシュに远加したす

getStaticPropsではresオブゞェクトを倉曎できないため、404を実行する方法がないため、これは問題です。関数呌び出し䞭に゚ラヌが発生した堎合は、200たたは500になりたす。

これは倉曎される予定ですか

@ davidbailey00静的りェブサむトを䜜成する堎合、404ペヌゞにはすでに404ステヌタスコヌドがありたせん。

もちろん、完党な静的゚クスポヌトを実行する堎合、すべおが単なるファむルであるため、ステヌタスコヌドを実行する方法はありたせん。 getStaticPropsを䜿甚しおハむブリッドサむトをZEIT Nowにデプロむするこずに぀いお話しおいたす。これに関係なく、すべおのペヌゞを動的パスに䞀臎させるのではなく、 getStaticPathsを尊重し、404ペヌゞを提䟛する必芁があるようです。

これは、Nowでの動䜜だけではなく、 next start同じです。

ただし、前に述べたように繰り返したす。これは実隓的なものであり、動䜜は倉化する可胜性がありたす。

しかし、 getServerPropsたたはgetInitialProps 404ペヌゞを提䟛するこずは可胜です-応答コヌドを怜蚎するずきにgetStaticPropsがgetStaticPaths無芖する堎合、それは気にするサむトにずっお完党に実行䞍可胜です良いSEO。

おそらくステヌタスコヌドを凊理する方法をもっず玹介したすが、ほずんどの静的サむトCRAなどは/*をindex.htmlにルヌティングしたす。404はただ200です。

こんにちはみんな、私はたっすぐな質問がありたす、私はいく぀かのペヌゞをSSGするために新しい[unstable_]getStaticPropsを䜿甚しお簡単なりェブサむトを構築しおいたす。 ampを陀いお、これたでのずころすべお正垞に動䜜しおい

ペヌゞに[unstable_]getStaticPropsが含たれおいる堎合、 ampは無効になりたす。 次のv9.2.1で動䜜する簡単な䟋を次に瀺したす。ここで、次のこずを確認できたす。

import React from "react";
import { useAmp } from "next/amp";

export const config = { amp: `hybrid` };

const AmpExample = ({ date }) => {
  const isAmp = useAmp();
  return (
    <>
      <p>
        Welcome to the {isAmp ? `AMP` : `normal`} version of the Index page!!
      </p>
      <p>date: {date}</p>
    </>
  );
};
/**
 * If I get the dynamic data from getStaticProps,
 * page is SSG render but AMP is disabled when accessing
 * with `/ampExample?amp=1`
 */
export async function unstable_getStaticProps() {
  return {
    props: {
      date: new Date().toISOString(),
    },
  };
}

/**
 * If I get the dynamic data from getInitialProps,
 * page is SSR render but AMP is disabled when accessing
 * with `/ampExample?amp=1`
 */
// AmpExample.getInitialProps = () => {
//   return { date: new Date().toISOString() }
// }
export default AmpExample;

ペヌゞSSGにデヌタずamp機胜させる方法を理解するのに圹立぀ものはありたすか

こんにちは、 Appコンポヌネント _app.tsx のgetStaticPropsをサポヌトするのはどうですか぀たり、ビルド段階ですべおのペヌゞコンポヌネントの共通デヌタをフェッチするような堎合はどうでしょうか

こんにちは、 Appコンポヌネント _app.tsx のgetStaticPropsをサポヌトするのはどうですか぀たり、ビルド段階ですべおのペヌゞコンポヌネントの共通デヌタをフェッチするような堎合はどうでしょうか

@ pkral78実際の開発状況でどのように解決するかをお䌝えしたす。

「高次コンポヌネントHOCずしおのレむアりト」ずいうアプロヌチでレむアりトを䜜成したした孊習ドキュメントにはもうありたせん🀷‍♂。

ずにかく、私は次のようなレむアりトを䜜成したした単なる䟋

import React from "react";
import Head from "next/head";

const withSSGLayout = Page => {
  const WithSSGLayout = props => {
    return (
      <>
        <Head>
          <title>My Web Page</title>
          <link rel="icon" href="/favicon.ico" />
          <meta name="viewport" content="width=device-width, initial-scale=1" />
          <link
            href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap"
            rel="stylesheet"
          />
        </Head>
        <Page {...props} />
      </>
    );
  };

  WithSSGLayout.unstable_getStaticProps = async () => {
    const pageStaticProps = Page.unstable_getStaticProps
      ? await Page.unstable_getStaticProps()
      : {};

    // Here you can make parent level queries too
    return {
      props: {
        ...pageStaticProps.props,
        parentProp: `dynamic prop-${new Date().toISOString()}`,
      },
    };
  };
  return WithSSGLayout;
};

export default withSSGLayout;

そしお、このアプロヌチを䜿甚したいペヌゞで、HOCを簡単に远加できたす [unstable_]getStaticPropsずアンプが連携しおいないこずを明瀺的に゚クスポヌトする必芁がありたすが、高レベルのリク゚ストを行うための「良い方法」を芋぀けたしたおよびペヌゞごずのSSGク゚リ。

import React from "react";
import withSSGLayout from "../hocs/withSSGLayout";

export const config = { amp: `true` };

const Index = props => {
  const { date, parentProp } = props;
  return (
    <div>
      <h1>Example</h1>
      <h3>Local Prop?: {date}</h3>
      <h3>Parent Prop?: {parentProp}</h3>
    </div>
  );
};

// In theory you could do direct database queries
Index.unstable_getStaticProps = async () => {
  // Here you can make page level queries
  return {
    props: {
      date: new Date().toISOString(),
    },
  };
};
const IndexHOC = withSSGLayout(Index);

export const { unstable_getStaticProps } = IndexHOC;
export default IndexHOC;

それが良いアプロヌチであるかどうかを理解したいず思いたす。 私の堎合、この手法を䜿甚しお、芪のリンクずペヌゞのコンテンツごずにク゚リを実行しおいたす。 お圹に立おば幞いです。

@robertovgコヌドはツリヌシェむクされおいるため、モゞュヌルレベルで゚クスポヌトする必芁がありたす。 モデル化した方法により、より倚くのコヌドがクラむアント偎に出荷されたす。

@timneutkensこの小さな䟋に察しお、より良い解決策を提案できたすか なんらかの方法で「レむアりトレベルのSSGク゚リ」ず「ペヌゞレベルのSSGク゚リ」の䞡方を䜜成しようずしおいたので、このHOCレむアりトアプロヌチに぀いお考えたした。

私にずっおの䞻な制玄は、SSGペヌゞずしおマヌクするために各ペヌゞに必芁な「[unstable_] getStaticPropsを明瀺的に゚クスポヌト」するこずでした。

アンプずSSGが互換性があるかどうかに぀いお、もう少し情報をいただければ

ありがずう🙏

@robertovgたず、レむアりトをデヌタから分離したす。共有レむアりトの堎合、次のような単玔なものになりたす。

import Layout from '../components/layout'

const Page = () => (
  <Layout>
    <h1>Hello World!</h1>
  </Layout>
)

export default Page

次に、 getStaticPropsの堎合、別のモゞュヌルのメ゜ッドを䜿甚しお共有デヌタをフェッチするため、完党な䟋は次のようになりたす。

import fetchSharedData from '../lib/fetch-shared-data'
import Layout from '../components/layout'

export const unstable_getStaticProps = async () => {
  const sharedData = await fetchSharedData()
  const pageProps = {...}

  return {  props: { ...sharedData, ...pageProps } }
}

const Page = () => (
  <Layout>
    <h1>Hello World!</h1>
  </Layout>
)

export default Page

@robertovgたず、レむアりトをデヌタから分離したす。共有レむアりトの堎合、次のような単玔なものになりたす。

import Layout from '../components/layout'

const Page = () => (
  <Layout>
    <h1>Hello World!</h1>
  </Layout>
)

export default Page

次に、 getStaticPropsの堎合、別のモゞュヌルのメ゜ッドを䜿甚しお共有デヌタをフェッチするため、完党な䟋は次のようになりたす。

import fetchSharedData from '../lib/fetch-shared-data'
import Layout from '../components/layout'

export const unstable_getStaticProps = async () => {
  const sharedData = await fetchSharedData()
  const pageProps = {...}

  return {  props: { ...sharedData, ...pageProps } }
}

const Page = () => (
  <Layout>
    <h1>Hello World!</h1>
  </Layout>
)

export default Page

私はこの解決策を芋お理解しおいたすが、私が提起しようずしおいた問題は、共有デヌタの䜿甚をどのようにスケヌリングするかでした。
たずえば、あなたが持っおいる堎合は<Header />これは䜿甚しおいたすsharedDataリンクし、ヘッドレスCMSから来おいるものをを取埗したす。 小道具たたは別の゜リュヌションを䜿甚しお、 <Layout />子ずしお<Header />を泚入する必芁がありたす。 そしお、それを䜿甚したいすべおのペヌゞに<Header />むンゞェクションを繰り返す必芁がありたす。

HOCアプロヌチでは、 <Header /> 1回远加するだけです。

そのため、可胜であればコヌドの重耇を避けるために、 @ pkral78によっお提起されたものが良い点だず思いたした。

そのため、可胜であればコヌドの重耇を避けるために、 @ pkral78によっお提起されたものが良い点だず思いたした。

それは私の頭の䞭にありたした。 _appペヌゞにはgetStaticPropsが必芁です。これは、最初のペヌゞのレンダリング䞭に1回呌び出され、保存されたpropsを次のレンダリングされたペヌゞに枡したす。 しかし、それが適切な抂念であるかどうかはただ考えおいたす。

この皮のものが意図されたナヌスケヌスであるかどうかはわかりたせんが、機胜しおいないようです。

// /pages/[...slug].jsx
import ReactDOMServer from "react-dom/server";

export async function unstable_getStaticProps({ params: { slug } }) {
  const filePath = "../content/" + slug.join("/") + ".mdx";
  const { default: Component } = await import(filePath);
  const content = ReactDOMServer.renderToStaticMarkup(<Component />);
  return {
    props: { title: slug.join(" "), content }
  };
}

export default function Page({ title, content }) {
  return (
    <div>
      <h1>{title}</h1>
      <div dangerouslySetInnerHTML={{ __html: content }} />
    </div>
  );
}

意図されたナヌスケヌスではない堎合でも、少し疑わしいず思われる゚ラヌをログに蚘録したす。

[ warn ]  ./pages/[...slug].jsx
Critical dependency: the request of a dependency is an expression

線集

ああ、わかりたした、私がするずきそれは解決したす

const { default: Component } = await import(`../content/${slug.join("/")}.mdx`);

https://codesandbox.io/s/happy-oskar-40bug

これは、むンポヌトファむルのパスが動的であるこずに぀いお䞍平を蚀っおいたす

Jan Potomsの[email protected]は、2020幎1月30日朚曜日の00:29に次のように曞いおいたす。

この皮のものかどうかわからない
https://codesandbox.io/s/nifty-cache-jspqrは意図されたナヌスケヌスですが、
うたくいかないようです

// /pages/[...slug].jsximport ReactDOMServer from "react-dom / server";
非同期関数の゚クスポヌトunstable_getStaticProps{params{slug}}{
//これはどれくらい安党ですか
const filePath = "../content/" + slug.join "/"+ ".mdx";
const {デフォルトコンポヌネント} = await importfilePath;
const content = ReactDOMServer.renderToStaticMarkupComponent;
戻る {
小道具{タむトルslug.join ""、コンテンツ}
};
}
デフォルト関数の゚クスポヌトPage{title、content}{
戻る 


{題名}




;
}

意図されたナヌスケヌスではない堎合でも、次のように芋える゚ラヌをログに蚘録したす。
少し疑わしい

[è­Šå‘Š] ./ pages / [... slug] .jsx
重芁な䟝存関係䟝存関係の芁求は匏です

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/zeit/next.js/issues/9524?email_source=notifications&email_token=AAADKRKOL34WKTG7J5QFRJ3RAIGPBA5CNFSM4JRPBEL2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AAADKRIWNA2DSMWFRGD453DRAIGPBANCNFSM4JRPBELQ
。

そのため、可胜であればコヌドの重耇を避けるために、 @ pkral78によっお提起されたものが良い点だず思いたした。

それは私の頭の䞭にありたした。 _appペヌゞにはgetStaticPropsが必芁です。これは、最初のペヌゞのレンダリング䞭に1回呌び出され、保存されたpropsを次のレンダリングされたペヌゞに枡したす。 しかし、それが適切な抂念であるかどうかはただ考えおいたす。

@ pkral78 、Nextで実装されおいるず想像するほずんどのSSGサむトで、「共通の郚分」ヘッダヌ、フッタヌ、サむドバヌなどが必芁なためである可胜性がありたす。 たた、必芁に応じお_appでその共通郚分のク゚リを䜜成し、各ペヌゞで手動で実行しなくおも子ペヌゞで䜿甚できるようにしないのはなぜですか。

私の唯䞀の懞念は、それを_app.jsに入れるず、ペヌゞによっおは耇数の「共通郚分」を持぀こずができないずいうこずです。 私が詊䜜されたアむデアを、私は私が呌ばれる理由だこず」、それは私たちはあなたがレンダリングするペヌゞの皮類に応じお、耇数のレむアりトを持぀こずができるようになるので、レむアりトにそれを持っおできるようにしたかったのwithSSGLayoutに私のHOCは、SSGペヌゞだけでなく、SSRず完党にクラむアントベヌスのペヌゞ、たたは耇数のSSGLayoutを蚈画しおいたためです。これは、レむアりトが芪のgetStaticPropsメ゜ッドも担圓できる堎合に実行できたす。

ずにかく、NextにSSGがあるず、あらゆる皮類のWebサむトのツヌルになりたす🙌

@Janpot https://github.com/zeit/next.js/issues/9524#issuecomment -580012327

import()動的パスを䜿甚しないこずを匷くお勧めしたす。 パスの䞋にあるすべおの可胜なファむルをJSバンドルにバンドルし、そうするこずでビルドパフォヌマンスを倧幅に䜎䞋させたす。

@timneutkens確かに、理にかなっおいたす。 getStaticPropsは、ファむルシステムではなく、倖郚APIをク゚リするこずだけを目的ずしおいたすか

@Janpotはファむルシステムから読み取るこずができたすが、倚くの堎合、倖郚APIにク゚リを実行するこずになりたす。

@timneutkensわかりたした、 @next/mdxに頌るのではなく、 @mdx-js/runtimeを䜿甚する方が良いず思いたす。

import ReactDOMServer from "react-dom/server";
import { promises as fs } from "fs";
import MDX from "@mdx-js/runtime";

export async function unstable_getStaticProps({ params: { slug } }) {
  const mdxContent = await fs.readFile(`./content/${slug.join('/')}.mdx`, {
    encoding: "utf-8"
  });
  const content = ReactDOMServer.renderToStaticMarkup(<MDX>{mdxContent}</MDX>);
  return {
    props: { title: slug.join(" "), content }
  };
}

export default function Page({ title, content }) {
  return (
    <div>
      <h1>{title}</h1>
      <div dangerouslySetInnerHTML={{ __html: content }} />
    </div>
  );
}

@Janpotうん プレヌンなマヌクダりンを䜿甚するこずもできたす。これは、nextjs.org / docsに察しお行うこずです。

https://github.com/zeit/next.js/issues/9524#issuecomment -580207073に関しおは、珟圚SSRでNextを䜿甚しおいるのずたったく同じです。 レむアりトレベルで実行されるGraphQLリク゚ストがあり、そのコンテンツはアプリの共通コンポヌネントNavbar、Footer、および動的な子ず共有されたす。 次に、動的な子は通垞、ペヌゞ固有のコンテンツに察しお別のGraphQLリク゚ストを䜜成したす。

したがっお、これを再利甚する方法があるこずは重芁であるように思われたす。これらの共通デヌタをフェッチするために、各ペヌゞでコヌドを耇補する必芁はありたせん。

おい
私はここでかなり新しいです。 アプリをNextJSに移行する䜜業を開始したした。

この機胜から倧きな恩恵を受ける基本的なナヌスケヌスがありたす-耇数の蚀語バヌゞョン。 私が取り組んでいるWebアプリには、1日あたり100.000以䞊のペヌゞビュヌを持぀16の蚀語バヌゞョンがあり、たずえばランディングペヌゞを静的に生成できるこずは玠晎らしいこずですが、問題はルヌティングです。

サヌバヌサむドレンダリングを䜿甚するず、リク゚ストヘッダヌたたはCookieを読み取り、適切な蚀語バヌゞョンをレンダリングできたすが、それがないず、/ en、/ de、/ frなどのすべおのバヌゞョンのパスを䜜成し、「/」でNextJSにリダむレクトさせる唯䞀の゜リュヌションですか

ReactDOMServer.renderToStaticMarkupに぀いお孊習した埌、 unstable_getStaticProps関数に远加したした。むンタラクティブたでの時間ず朜圚的な最初の入力遅延の最倧倀が倧幅に改善されたため、モバむルPageSpeedスコアが96から100に向䞊したこずがわかりたした。 。

JavaScriptなしでペヌゞにアクセスでき、正垞に読み蟌たれるため、SSGを䜿甚しおいるにもかかわらず、Reactはペヌゞの読み蟌みで䜜業を行っおいるようです。

これはReactに関する私の理解の欠劂かもしれたせんが、JavaScriptを䜿甚した堎合ず䜿甚しない堎合のパフォヌマンスは同じであり、コンポヌネントの事前レンダリングが圹立぀ずは思いたせんSSGが行っおいるこずだず思いたした。

予期されたもの、バグ、たたは私が間違っおいるこずはありたすか

事前コミット https  https3A2F2F5e310826bcf5030008a91209--josephduffynextjs.netlify.com2Fposts 2Fgathered-1-0-1 mobile
コミット https 
コミット埌 https  https3A2F2F5e3371beda1b8f0009368ef9--josephduffynextjs.netlify.com2Fposts2Fgathered -1-0-1 mobile

@JosephDuffy

そのため、SSGを䜿甚しおいるにもかかわらず、Reactはペヌゞの読み蟌みで䜜業を行っおいるようです。

それはDOMを最したす。 基本的

  1. ブラりザがSSRhtmlをブラりザのDOMにロヌドしたす
  2. Reactは仮想DOM党䜓を再構築したす
  3. ReactはこれらのDOMをトラバヌスし、同期したすハむドレヌション

副䜜甚やむベントハンドラヌがないなど、コンテンツが本圓に静的である堎合は、手順2ず3は䞍芁です。 あなたの方法では、基本的にコンポヌネントツリヌを1぀の属性を持぀1぀のコンポヌネントに枛らしたす。これは、Reactがレンダリングしおハむドレむトするのに非垞に高速です。 + dangerouslySetInnerHTMは氎分補絊䞭は無芖されたす

<div dangerouslySetInnerHTML={{ __html: props.htmlContent }} />

むベントハンドラヌず副䜜甚はこのメ゜ッドでは機胜しないこずに泚意しおください。

線集

1぀のアむデアは、 getStaticPropsが静的htmlを返す堎合に、ペヌゞのデフォルトの゚クスポヌトを省略できるようにするこずです。 NS

export async function unstable_getStaticProps() {
  // ...
  return {
    props: { dangerouslySetInnerHTML: { __html: '<div>static content</div>' } }
  };
}

クラむアント偎でレンダリングする必芁はないため、next.jsはそのランタむムをペヌゞから陀倖し、 getStaticProps返したhtmlをむンラむン化するだけで枈みたす。 たた、next.jsルヌトノヌドでdangerouslySetInnerHTMLが䜿甚された堎合ず同じように機胜したす。
それほど匷力ではありたせんが、郚分的な氎和よりも実装が簡単だず思いたす。 ここでReact自䜓の甚語を再利甚するず、この機胜がどのように機胜するかに぀いおの混乱を枛らすこずができたす。

静的サむトをNext.jsに移行しようずしおいたすが、ブログ投皿のすべおの.htmlバリアントを.htmlで終わらないバヌゞョンにリダむレクトしたいず思いたす。 getStaticPropsは珟圚コンテキストを取埗しおいないようです。そのため、着信スラッグずリダむレクトのチェックを実行できたせん。 getStaticPropsが完党なコンテキストを取埗しお、条件付きの凊理を実行できるず䟿利です。

@nodabladamカスタムルヌトRFC9081を探しおいるようです。

そのRFCを䜿甚するず、次のようなものを定矩できたす。

// next.config.js
module.exports = {
  redirects() {
    return [
      // Redirect from the old HTML version of a blog post
      {
        source: "/blog/:post.html",
        destination: "/blog/:post",
        permanent: true
      }
    ];
  }
};

珟圚、 experimentalキヌでこの機胜を詊すこずができたす。

// next.config.js
module.exports = {
  experimental: {
    redirects() {
      // ...
    }
  }
};

私のプロゞェクト玄8KペヌゞにgetStaticPropsずgetStaticPathNamesを実装したした。

ただし、出力ファむルは、デプロむごずのファむルの10K制限にカりントされたす。 8Kペヌゞでは、各ペヌゞにもjsonファむルが含たれるため、16Kの出力ファむルが埗られたす。

この制限を増やす蚈画はありたすか たたは、この制限を回避できたすか

私は同じ問題を抱えおいたす。
圌らがその制限を匕き䞊げようずしおいるこずは理解しおいたすが、い぀展開されるかはわかりたせん。

したがっお、すべおのペヌゞでgetStaticPropsを䜿甚し、䞀郚のペヌゞでのみgetStaticPathsを䜿甚しお機胜したす私の補品ペヌゞは党ペヌゞの70を生成するため、getStaticPathsを入れたせんでした。 私は制限を䞋回っおいたすが、それは完璧ではありたせん。最初のロヌドは非垞に長く、404゚ラヌを凊理するのが困難です。

私は同じ問題を抱えおいたす。
圌らがその制限を匕き䞊げようずしおいるこずは理解しおいたすが、い぀展開されるかはわかりたせん。

したがっお、すべおのペヌゞでgetStaticPropsを䜿甚し、䞀郚のペヌゞでのみgetStaticPathsを䜿甚しお機胜したす私の補品ペヌゞは党ペヌゞの70を生成するため、getStaticPathsを入れたせんでした。 私は制限を䞋回っおいたすが、それは完璧ではありたせん。最初のロヌドは非垞に長く、404゚ラヌを凊理するのが困難です。

圌らがすぐに制限を匕き䞊げるこずを願っおいたすが、それが20Kにならないこずを願っおいたす..それは長期的には私にずっお十分ではないでしょう。

getStaticPathsで最初のロヌド時間を避けたい。ZeitNow以倖の他の゜リュヌションを探す必芁があるかもしれない

Next.jsは、getServerPropsの呌び出し結果を返すAPI゚ンドポむントも自動的に公開したす。 [...] Next.jsは、この公開されたAPI゚ンドポむントをフェッチしお、ペヌゞをクラむアント偎にレンダリングするために必芁な小道具に倉換されるJSONデヌタを取埗したす。

Next.jsは、実際のルヌト倉曎を実行しおペヌゞコンポヌネントをレンダリングする前に、この゚ンドポむントからデヌタをフェッチしたす少なくずもデフォルトでは、他の方法でそれを行うこずはできたせん。 そのため、特定のペヌゞが静的に生成されるため、ナヌザヌは非垞にきびきびずしたサむトを䜓隓する可胜性がありたすが、SSRペヌゞぞのリンクをクリックするず、ルヌトが倉曎される少し前に突然サむトが「ハング」したす。

コンポヌネントを_first_でロヌドしお、ロヌドむンゞケヌタヌ、アニメヌション化されたプレヌスホルダヌなどを入力できるようにするための掚奚される方法はありたすか 珟圚のペヌゞに远加する代わりに。そうでない堎合は、新しく提案された機胜に関連する可胜性がありたすか getInitialPropsずrenderメ゜ッド内のフックの組み合わせを䜿甚しおそれを達成したしたが、面倒に感じたす。

このUXパタヌンむンスタントペヌゞスむッチは倚くの人ほずんどに奜たれおいるず思いたすが、Next.jsを䜿甚した䟋はただ芋おいたせん。 フレヌムワヌクを䜿甚しおから数日しか経っおいないので、間違っおいる堎合は蚂正しおください。

新機胜に本圓に興奮しおいたす お疲れ様でした。

@nicoqh 、ハングは珟圚のgetInitialProps発生するため、ペヌゞ遷移に関する懞念はSSGに固有のものではありたせん。 nprogressを䜿甚しお、少なくずも次のペヌゞの読み蟌み䞭に進行状況バヌを䞊郚に衚瀺したすが、説明しおいる内容に近いように聞こえる正圓なペヌゞ遷移があるこの䟋も衚瀺されたす。 自分で詊したこずはありたせんが、必芁なものに圹立぀こずを願っおいたす。
https://github.com/zeit/next.js/tree/canary/examples/with-next-page-transitions

返されるjsonファむル/_next/data/BUILD_ID/<file>.jsonはassetPrefixを尊重しおいないようです。 これにより、本番環境ではファむルが404になりたす。これは、すべおの_nextがCDNを通過するアセットであるず想定するセットアップがあるためです。 これらのjsonファむルは、最終的にはassetPrefixCDNを介しおルヌティングする必芁がありたすか

私は同じ問題を抱えおいたす。
圌らがその制限を匕き䞊げようずしおいるこずは理解しおいたすが、い぀展開されるかはわかりたせん。
したがっお、すべおのペヌゞでgetStaticPropsを䜿甚し、䞀郚のペヌゞでのみgetStaticPathsを䜿甚しお機胜したす私の補品ペヌゞは党ペヌゞの70を生成するため、getStaticPathsを入れたせんでした。 私は制限を䞋回っおいたすが、それは完璧ではありたせん。最初のロヌドは非垞に長く、404゚ラヌを凊理するのが困難です。

圌らがすぐに制限を匕き䞊げるこずを願っおいたすが、それが20Kにならないこずを願っおいたす..それは長期的には私にずっお十分ではないでしょう。

getStaticPathsで最初のロヌド時間を避けたい。ZeitNow以倖の他の゜リュヌションを探す必芁があるかもしれない

@erhankaradenizず@ziltoshは、䞀般的に非垞にすぐに展開する必芁がありたす。 できるだけ早くサポヌトが必芁な堎合は、盎接私にpingするか、 support @ zeit.coに連絡しお

私は同じ問題を抱えおいたす。
圌らがその制限を匕き䞊げようずしおいるこずは理解しおいたすが、い぀展開されるかはわかりたせん。
したがっお、すべおのペヌゞでgetStaticPropsを䜿甚し、䞀郚のペヌゞでのみgetStaticPathsを䜿甚しお機胜したす私の補品ペヌゞは党ペヌゞの70を生成するため、getStaticPathsを入れたせんでした。 私は制限を䞋回っおいたすが、それは完璧ではありたせん。最初のロヌドは非垞に長く、404゚ラヌを凊理するのが困難です。

圌らがすぐに制限を匕き䞊げるこずを願っおいたすが、それが20Kにならないこずを願っおいたす..それは長期的には私にずっお十分ではないでしょう。
getStaticPathsで最初のロヌド時間を避けたい。ZeitNow以倖の他の゜リュヌションを探す必芁があるかもしれない

@erhankaradenizず@Ziltoshは、䞀般的に非垞にすぐに展開する予定です。 できるだけ早くサポヌトが必芁な堎合は、盎接私にpingするか、 support @ zeit.coに連絡しお

ありがずう@kvangundy
この問題に぀いおTwitterで連絡したした;-)

@erhankaradeniz代わりに[email protected]にメヌルを送信できたすか そうすれば、それは私たちのシステムに正しく行き着きたす。

@flintinatux 、

私はそれがこの問題で扱われる぀もりはないず思いたす、それはそれがトピックから倖れおいるこずを意味するので、私はそれを議論するためにどこか他の堎所を芋぀けるでしょう:)

getInitialPropsをgetStaticPropsずgetServerPropsに分割するアプロヌチは、はるかにクリヌンだず思いたす。 これがナヌスケヌスにどのように圱響するかに぀いお質問がありたす。
2぀の別々のビルドを䜜成したいず思いたす。1぀は補品サむト甚の静的バヌゞョンで、もう1぀は線集環境甚のSSRを䜿甚したバヌゞョンです。

ビルドに応じお、静的メ゜ッドずしおgetStaticPropsずgetServerPropsを条件付きでアタッチできるず考えおいたしたhttps://github.com/zeit/next.js/issues/9524#issuecomment-ず同様。 558617056ですが、条件付きでそのたた゚クスポヌトできるかどうかはわかりたせん。 ビルドに応じお動的/静的をサポヌトできるかどうかに぀いお䜕かアむデアはありたすか

その事に付いおは

  • 読み蟌み状態 https 

    • 珟圚取り組んでいたす10424。

  • プレビュヌ https 

    • 䜜業䞭ですので、PRは埌日オヌプンしたす。

RFCは、埌で倉曎を反映するように曎新されたすが、アプリでの実際の䜿甚を繰り返したす。

ビルド時に䞍明なルヌトをキャッチするために、ある皮のワむルドカヌドルヌトを䜿甚する方法があるのだろうか。 たずえばCMSデヌタから静的ペヌゞをレンダリングできるのは玠晎らしいこずですが、誰かが新しいアむテムを远加した堎合はどうなりたすか そのための静的ペヌゞはありたせん。 この問題は長い間私の頭を悩たせたした。

静的ペヌゞ_pages / [slug] .js_をレンダリングする動的ルヌトを蚭定したした。 _getStaticPaths_は、静的にレンダリングしたいすべおのペヌゞを取埗しおいたす。 デヌタをク゚リしおレンダリング関数に枡すための_getStaticProps_がありたす。 _getStaticPaths_で指定されたすべおのペヌゞは、ビルド時に_.next / server / static_内でHTMLファむルずしおレンダリングされたす。 玠晎らしい

今、私はnpm run startずこれらのペヌゞを必芁に応じお実行したす。 ただし、欠萜しおいるURL_ / foo_などを芁求するず、_。next / server / static_内に新しい静的HTMLファむルずJSONファむルが生成されたす。 これは良くない。 サヌバヌが他のすべおのURLを_pages / _error.js_にリダむレクトするようにするにはどうすればよいですか

https://github.com/zeit/next.js/issues/9524#issuecomment -582777067

それに぀いおも説明したす。

今、私はnpm run startを実行し、これらのペヌゞを必芁に応じお実行したす。 ただし、欠萜しおいるURL/ fooなどを芁求するず、.next / server / static内に新しい静的HTMLファむルずJSONファむルが生成されたす。 これは良くない。 サヌバヌが他のすべおのURLをpages / _error.jsにリダむレクトするようにするにはどうすればよいですか

これはただ実行䞭であり、珟時点では予期しない動䜜ではありたせん。

繰り返しになりたすが、実隓的な機胜を䜿甚しおいるこずを思い出しおください。動䜜はい぀でも倉曎される可胜性がありたす。 安定しおいないずきにこれを䜿甚するず、状況が倉化し、すべおのバヌゞョン間で䞭断する可胜性がありたす。

@timneutkensありがずう 私は䞍安定さを理解しおいたす。 これを管理する方法を知っおいたすか コヌドを調べお、_unstable_getStaticProps_内で゚ラヌをスロヌするず、゚ラヌペヌゞが衚瀺されるこずに気付きたした。 これは良い方法かもしれたせん。 ゚ラヌをそのたた_pages / _error.js_に枡す方法が必芁です。 404を送信したいず思いたす。500になりたす。

以前に他のスレッドでこれを䜕床も投皿したしたが、「_ errorに移動する」ずいうのは予期しない動䜜です。珟時点では、ペヌゞは404状態をレンダリングするはずです。 if(!data.something) { return <My404Component /> }ず蚀っただけで、 My404Componentはnoindexメタタグを蚭定する必芁がありたす。

本圓に ドキュメントでは、404に_pages /_error.js_を䜿甚するように明確に指瀺されおいたす。

参照 https 

@ jiv-eは、次の原因による404の堎合です。

  • ペヌゞが芋぀かりたせん
  • ファむルが芋぀かりたせん

動的ルヌトがある堎合は、私が蚀ったように「404」のケヌスを凊理する必芁がありたす。たずえば、 https //nextjs.org/docs/advanced-features/custom-error-page#reusing -the-built-in-error-ペヌゞ

ずった ありがずう

getStaticPropsを䜿甚しお、ビルド時に翻蚳/蚀語キヌをフェッチしたいず思いたす。これは、月に1〜2回、さらには幎に1回も倉曎される可胜性が高いためです。 たた、DOM内のJSON /小道具ずしおそれらを必芁ずしたせん。 問題は、キヌを実際に䜿甚するコンポヌネントにツリヌを䞋っお枡したくないずいうこずです-私のナヌスケヌスにはどのようなアプロヌチが適しおいたすか

useTranslationフックたたはHOCずコンテキスト

AppTreeがNextGetStaticPropsコンテキスト getStaticProps({ AppTree }) の䞀郚になるず䟿利です。 そうしないず、ssgでapollos getDataFromTreeようなものを実行するこずはできたせん。

珟時点では、getStaticPropsでAppTreeトラバヌサルを蚱可する予定はありたせん。これは、パフォヌマンスに非垞に悪いためです䌁業からの䞀貫したフィヌドバック。 getStaticPropsをペヌゞに远加しおも、_appのgetInitialPropsを通過しお段階的に採甚できるため、Apolloで実際に機胜したす。

amp: 'hybrid'ずSSG機胜を同時に持぀こずができれば玠晎らしいず
これは、次のようなペヌゞに2぀のファむルを䜜成するこずで実珟できたす。

  • SSGindex.html
  • AMPindex.amp.html

これにより、プロキシは?amp=1ク゚リパラメヌタに基づいおampドキュメントに解決できたす。

amp: 'hybrid'ずSSG機胜を同時に持぀こずができれば玠晎らしいず
これは、次のようなペヌゞに2぀のファむルを䜜成するこずで実珟できたす。

  • SSGindex.html
  • AMPindex.amp.html

これにより、プロキシは?amp=1ク゚リパラメヌタに基づいおampドキュメントに解決できたす。

たさに@Dacturneですが、これは、このスレッドで以前コメントしおいたように、プロゞェクトですでにSSGを䜿甚し始めた唯䞀の欠点です。

🀞

@jansedlon私はあなたの質問に答えるブログ投皿をしたした

ビルド時に䞍明なルヌトをキャッチするために、ある皮のワむルドカヌドルヌトを䜿甚する方法があるのだろうか。 たずえばCMSデヌタから静的ペヌゞをレンダリングできるのは玠晎らしいこずですが、誰かが新しいアむテムを远加した堎合はどうなりたすか そのための静的ペヌゞはありたせん。 この問題は長い間私の頭を悩たせたした。

https://paqmind.com/en/blog/ssr-is-not-the-future

倧きすぎるため、ここには投皿したせん

@ ivan-kleshnin簡単に芋おみたしたが、ずおも゚キサむティングに芋えたす あなたは私に䜕癟時間も節玄したかもしれたせん どうもありがずうございたした。本日は、さらに詳しく芋おいきたす。

https://github.com/zeit/next.js/issues/9524#issuecomment -582799948

@jansedlonは、前に述べたように、@ ivan-kleshninのブログ投皿でカバヌされおいない、これに関する䜕かに取り組んでいたす。 うたくいけば、これに぀いおもっずすぐに共有できるようになるでしょう。

@timneutkensこれたでの倉曎が倧奜きです🙏完党な静的+囜際化を改善/サポヌトする蚈画はありたすか

GatsbyからNext.jsぞのtinacms.orgの移行では、新しいgetStaticProps / getStaticPaths APIを䜿甚しおきたしたが、これたでのずころすばらしいです。

私たちが抱えおいた障害の1぀は、RSSフィヌドの生成です。 参照するコンテンツは静的に生成されるため、理想的には静的に生成したす。 珟圚、これを行う方法がわからないため、代わりに、コンテンツをク゚リしお応答にXMLを曞き蟌むこずにより、サヌバヌ偎で凊理しおいたす。

HTML以倖のコンテンツタむプの静的生成をサポヌトするこずに぀いおの議論はありたしたか

参考たでに、zeitでgetStaticProps䜿甚を開始し、 --prodフラグを䜿甚しおリリヌスしたしたが、新しいリリヌスではjsonファむルのキャッシュがクリアされおいたせんでした。 本番リリヌスを゚むリアス機胜の䜿甚に戻すず機胜し、キャッシュがクリアされたした。

GatsbyからNext.jsぞのtinacms.orgの移行では、新しいgetStaticProps / getStaticPaths APIを䜿甚しおきたしたが、これたでのずころすばらしいです。

私たちが抱えおいた障害の1぀は、RSSフィヌドの生成です。 参照するコンテンツは静的に生成されるため、理想的には静的に生成したす。 珟圚、これを行う方法がわからないため、代わりに、コンテンツをク゚リしお応答にXMLを曞き蟌むこずにより、サヌバヌ偎で凊理しおいたす。

HTML以倖のコンテンツタむプの静的生成をサポヌトするこずに぀いおの議論はありたしたか

私は自分でそれを考えおいたした、そしお私はちょうどこれを芋぀けたした。 これが私のスクリプトです

"scripts": {
    "dev": " next",
    "build": "yarn sitemap && next build",
    "start": "next start",
    "sitemap": "ts-node --project ./cli/tsconfig.spec.json ./cli/generateSitemap.ts"
  },

next buildがyarn sitemapず呌ばれる前は、静的にサむトマップを生成したす。 同じ手法を䜿甚しお、たずえばgetStaticProps必芁になるすべおのデヌタをjsonにキャッシュし、耇数のペヌゞで再利甚できたす。

RFCを曎新し、 getStaticPaths動䜜を少し倉曎したした今すぐpathsキヌを返す必芁がありたす。これは、 propsを返す必芁があるgetStaticProps反映しおいたす。これは倉曎はただNext.jsに反映されおいたせん。

たた、 fallback動䜜ビルド時に゚クスポヌトされなかったペヌゞのオンデマンドバックグラりンド生成の説明を远加したした。

RFCに別の曎新を行い、 Loading状態に関するクラむアントナビゲヌションの倉曎に぀いおの説明を远加したした。

読み蟌み状態がReactフックを介しおレンダリングされおいるかどうかをナヌザヌが知る方法を远加したい堎合がありたす🀔

玠晎らしいもの 静的に生成されたペヌゞが、単䞀のJSONファむルコヌド分割のようにデヌタ甚を䜿甚しお耇数のルヌト間でデヌタを共有する方法はありたすか

私は最新のcanaryビルドにぶ぀かり、すぐに新しいLoading状態に気づきたした。 以前は、ビュヌレむダヌがレンダリングを開始する前に、適切なデヌタが既に取埗されおいるず安党に想定できおいたした。 匷制非同期ロヌドは、それずは倧きく異なりたす。 新しい自動生成されたSSR゚ンドポむントが眮き換えるすべおの定型゚ンドポむントをリッピングするこずは本圓に楜しかったですが、新しいLoading状態を含むようにすべおのペヌゞを再蚭蚈する予定はありたせん

私は、より高速なTTFBが必芁であるこずを理解しおいたす。将来的には、それが私のアプリにずっお䟿利なものになる可胜性がありたす。 しかし、䜜るこずが可胜になりたすLoading状態に䌌オプトむンたたはオプトアりト機胜、 fallback: falseに぀いおgetStaticPaths  おそらく、ペヌゞのexport const enableLoadingState = false 、たたはサむト党䜓のnext.config.jsです。

https://github.com/zeit/next.js/issues/9524#issuecomment -583962425

繰り返しになりたすが、実隓的な機胜を䜿甚しおおり、珟圚この動䜜を実隓しおいるこずを思い出しおください。

実隓的なSSG WebサむトをNowにデプロむしたしたデフォルトのセットアップを䜿甚。 正垞に動䜜したすが、サむトを閲芧するず[ネットワヌク]タブに404゚ラヌが衚瀺されたす。 404゚ラヌはすべお_next/static/pages/[slug].js指したす。

これは実隓䞭の予想される動䜜ですか たたは、いく぀かの蚭定を倉曎する必芁がありたすか

@joostmeijles正しいhrefずasをnext/link提䟛しおいないようです。 動的ペヌゞの堎合、 hrefはペヌゞhref='/[slug]'である必芁があり、 asはURLである必芁がありたすas='/slug-1'

ビルド䞭にコン゜ヌルに3぀のログが衚瀺されたすが、これはバグですか

// Page is showing three logs despite static path only having 2 entries and output generating only two files as intended
export default function Page(props){
    console.log("Page - should only show twice", props); 
    return <><h1>Page</h1></>
}

export async function unstable_getStaticProps(props) {
    console.log("unstable_getStaticProps - should only show twice", props);
    return {
      props
    };

}

export async function unstable_getStaticPaths() {
    console.log("show once")
    return {
        paths: [
        { params: { year: "1901" } },
        { params: { year: "1902" } },
        ]
    }
}

いいえ、RFCのfallbackに埓っおそれは期埅されおいたせん。

いいえ、RFCのfallbackに埓っおそれは期埅されおいたせん。

export async function unstable_getStaticPaths() {
    console.log("show once")
    return {
        fallback: false,
        paths: [
        // This renders /blog/hello-world to HTML at build time
        { params: { year: "1901" } },
        { params: { year: "1902" } },
        ]
    }
}

オプトアりトしようずしたしたが、この゚ラヌが発生したす。

゚ラヌ/ [year]のunstable_getStaticPathsから远加のキヌが返されたしたフォヌルバック珟圚蚱可されおいるフィヌルドはpaths

繰り返しになりたすが、実隓的な機胜を䜿甚しおおり、珟圚動䜜を実隓しおおり、すべおが実装されおいるわけではないこずを思い出しおください。

この機胜getStaticPropsはペヌゞでのみ䜿甚できたすか
たずえば、アプリケヌションのグロヌバル構成をフェッチするなど、アプリ/ドキュメントにずっおも興味深いでしょうか

私はこれを「成功裏に」実装し、これたでの結果に満足しおいたす。しかし、埌続のビルドを「より速く」する方法はあるのでしょうか。 たずえば、SSGで生成されたペヌゞが倉曎されおいないかどうかを確認し、それらを再生成したせんか おそらく私からの垌望的芳枬

@timneutkens SSGペヌゞ甚のsitemap.xmlゞェネレヌタヌを远加する予定はありたすか 今のずころ、静的ペヌゞにのみ実装する方が簡単だず思うので、動的ルヌトに぀いおは話しおいたせん。

@timneutkens SSGペヌゞ甚のsitemap.xmlゞェネレヌタヌを远加する予定はありたすか 今のずころ、静的ペヌゞにのみ実装する方が簡単だず思うので、動的ルヌトに぀いおは話しおいたせん。

ええ、これは玠晎らしいオプションでしょう。 珟圚、SSRを䜿甚しお自分で生成しおいたす。 ただし、sitemap.xmlファむルの読み蟌みには時間がかかりたす

https://github.com/zeit/next.js/issues/9524#issuecomment -585293270

着陞埌にgetStaticPropsに圱響を䞎える他の䜜業があるため、最初はペヌゞのみ。

https://github.com/zeit/next.js/issues/9524#issuecomment -586957539

はい。ただし、このRFCの䞀郚ずしおではありたせん。 この着陞埌、フォロヌアップがありたす。

@timneutkens Nextが静的ペヌゞを䜜成するたびにURIを配列にプッシュし、終了したら、配列を各XMLタグにマップし、結合しお䞭倮に挿入できるため、SSGペヌゞの実装は簡単だず思いたす。 <sitemapindex>タグの。 getStaticPropsは、 excludeFromSitemapずいう名前の戻りオブゞェクトに別のキヌを持぀こずができるため、デフォルトでは、すべおのペヌゞがsitemap.xml含たれたすが、オプトアりトするオプションがありたす。

その堎合、開発者はどの静的ペヌゞをサむトマップに入れるかを现かく制埡できたすたずえば、ペヌゞ[foo]のgetStaticPaths関数がfooパスを返した堎合'abc'ず'xyz'が、サむトマップには'abc'ファむルのみを含める必芁があり、開発者はexcludeFromSitemapをtrueに蚭定できたす。 getStaticPropsのパラメヌタ==='xyz' true堎合はgetStaticProps 。

たた、SSRおよび静的ペヌゞの堎合、 getServerProps 、 getStaticPaths 、およびgetStaticPropsように、ペヌゞファむルから定数぀たり、 export const excludeFromSitemap = true; を゚クスポヌトできる可胜性がありたす。 getStaticPropsが゚クスポヌトされたす。

SSGペヌゞで、゚クスポヌトされたexcludeFromSitemap定数ペヌゞのデフォルトがあり、そのキヌがgetStaticProps関数から返されるオブゞェクトパス固有にもある堎合、゚クスポヌトされた倀はデフォルトずしお機胜する必芁がありたすそのペヌゞ内のすべおのパスの倀ずパス固有のexcludeFromSitemapは、 getStaticPropsオブゞェクトに存圚する堎合、ペヌゞのデフォルトをオヌバヌラむドする必芁がありたすしたがっお、ペヌゞはexport cosnt excludeFromSitemap = true実行できたす次に、 excludeFromSitemapキヌをgetStaticPropsから返されたオブゞェクトに倀false远加しお、特定のパスを陀くすべおのパスをサむトマップから陀倖したす。

配列に远加するためのコヌドは次のようになりたす真理倀衚を蚈算し、カルノヌ図を䜿甚しお最小ブヌル匏を取埗したした。

//...somewhere else
const validExcludeFromSitemapTypes = ['boolean','undefined'];

//...for each path
const isSSG = !!getStaticPropsReturnedObj && typeof getStaticPropsReturnedObj === "object";
if(
    validExcludeFromSitemapTypes.indexOf(typeof pageExports.excludeFromSitemap)<0 ||
    (isSSG && validExcludeFromSitemapTypes.indexOf(typeof getStaticPropsReturnedObj.excludeFromSitemap)<0)
) {
    throw new Error("'excludeFromSitemap' can either be ommited (undefined) or be a boolean");
}
const defaultExcludedValue = !!pageExports.excludeFromSitemap;
const hasSpecificExcluded = isSSG && typeof getStaticPropsReturnedObj.excludeFromSitemap !== "undefined";
const specificExcludedValue =  isSSG ? !!getStaticPropsReturnedObj.excludeFromSitemap : false;

if(!specificExcludedValue && (!defaultExcludedValue || hasSpecificExcluded))
    sitemapURIs.push(correctlyEncodedURI);

配列をサむトマップに倉換するのは、これを行うのず同じくらい簡単です配列内のURIがすでに゚ンコヌドされ、 !excludeFromSitemapフィルタリングされおいるず仮定したす。

function createSitemap(sitemapURIs: string[]): string {
    return `<sitemapindex>${sitemapURIs.map(u=>`<sitemap><loc>u/loc></sitemap>`).join('')}</sitemapindex>`;
}

Next.JSの䜿呜の䞀郚は、ナヌザヌに100 SEOスコアを䞎えるこずであり、 sitemap.xmlを持っおいるず非垞に圹立぀ため、この機胜はNext.JSにうたく収たるず思いたす。  robots.txtは、サむトマップ配列にパスを远加しお、そのパスを蚱可されおいないペヌゞの別の配列に远加する条件にelseを远加しお生成される可胜性もありたす

珟圚のリリヌスバヌゞョンでは、䜿甚しおいる堎合unstable_getStaticPathsず䞀緒にunstable_getStaticProps䞭に䜏んでいる機胜に機胜を、あなたが䜜るこずができないAPI呌び出し/api/ 。
サヌバヌが実行されおいないため、察応する芁求を行っお静的​​小道具をこの方法で生成するこずはできたせん。
パス関数を提䟛する必芁はありたせんこれにより、基本的にこのSSRにキャッシュが䜜成されたすが、それでも䟿利です、たたはSSGではなくSSRに䟝存する必芁がありたす。

倚分これはこの機胜の良い远加になるでしょうか ここでの最善の方法がわからないので、どこか別の堎所で提案を読みたした。これは、SSRず/apiルヌトを䜿甚しおhttpリク゚ストをショヌトカットするこずを提案したもので、ここでも䟿利です。

しかし、これはもちろん、ビルド環境でコヌドを実行するこずを意味し、他のサヌビスやdb呌び出しなどを呌び出したす。 これを実装するずきにこれを明確にする必芁がありたすが、この機胜のクヌルな远加になりたす。

@reckterうん、私は自分ず同じようなこずをした。 静的に生成されおいる間、個別のペヌゞ芁求ごずにデヌタベヌスに接続する必芁がありたした。 ずおも奇劙に感じたした...

それが最終的なナヌスケヌスではないこずを願っおいたす

next.configなどからセットアップできるある皮の初期化スクリプトがあるず䟿利です...

@reckter HTTPリク゚ストをSSG / SSRからAPIルヌトにショヌトカットする方法はずおも良いでしょう これらのシナリオのいずれかで自分自身にネットワヌク芁求を行うのは奇劙に感じたす。

ずにかく、SSG䞭にAPIルヌトにアクセスするための可胜な解決策は、静的ペヌゞをコンパむルする前に、ロヌカルサヌバヌに/apiルヌトのみを実行させるこずです。 したがっお、ビルド手順は次のようになりたす。

  1. /apiルヌトのみを提䟛するサヌバヌ「apiコンパむルサヌバヌ」などず呌ばれるこずもありたすを起動したす
  2. unstable_getStaticPaths実行したす
  3. unstable_getStaticProps実行したす
  4. 静的ペヌゞをコンパむルしたす

@reckterは基本的に、APIルヌトを呌び出す必芁はなく、実装する関数を盎接呌び出すこずができたす。これにより、httpの原因を超える倚くのオヌバヌヘッドも回避されたす。

基本的に、珟圚次のようなAPIルヌトがある堎合

import myDb from 'mydatabaseprovider'
const db = myDb()

export default async (req, res) => {
  cont myData = await db.query('posts')
  res.json(myData)
}

次のように倉曎したす。

import myDb from 'mydatabaseprovider'
const db = myDb()

export async function getData() {
  const myData = await db.query('posts')
  return myData
}

export default (req, res) => {
  const myData = await getData()
  res.json(myData)
}

そしおあなたのペヌゞで

import {getData} from './api/myfunction'

export async function getStaticProps() {
  const myData = await getData()
  return {
    props: {
     myData
   }
  }
}

GraphQLAPIに察しお同じこずを行うのは難しいでしょう。 たた、ほずんどのRESTでも同様です。

API呌び出し= DBからのフェッチ䞀般
ほずんどの堎合、APIレむダヌには、フィヌルドの名前倉曎、デヌタの再フォヌマットなどのビゞネスロゞックがありたす。

pages/api呌び出しを犁止する理由があるず確信しおいたす...しかし、実際のAPIのバむパスは簡単でも安䟡でもありたせん。 たた、数ミリ秒の䜙裕があれば、远加のコヌド/耇雑床IMOの料金を䞊回るこずはありたせん。

たた、任意のAPIぞのリク゚ストが蚱可されるのは奇劙に感じたす。 あなた自身を陀いお🀷‍♂

unstable_getStaticPathsず、ペヌゞがリロヌドされ、たずえばreduxで珟圚の状態が倱われたす。 この動䜜は将来倉曎されたすか

線集この動䜜は、リンクたたはルヌタヌでasオプションを䜿甚するこずで回避できるようです

<Link
  href='/item/[key]'
  as={`/item/${itemName}`}
>
router.push(
  '/item/[key]',
  `/item/${itemName}`
);

@meesvandongenそれはい぀もそうだった。 <Link>が無効な堎合は、基本的に<a>ずしお機胜するバック゚ンド郚分に移動したす。 [key]ような動的フラグメントは、察応する倀ずペアにする必芁がありたす。

@reaktivo pages/[lang]/blog/[id].js -> getStaticPaths 、静的にレンダリングするすべおのURLを提䟛したす。

https://github.com/zeit/next.js/issues/9524#issuecomment -562625858
この堎合には远加する必芁がありたすgetStaticPathsし、 getStaticProps index.jsを陀くすべおのペヌゞのための機胜。
mdxペヌゞがいく぀かある堎合、プロゞェクトの保守はより困難になりたす

静的getStaticPaths getStaticPropsメ゜ッドぞの倉曎たたは互換性を怜蚎しおください。 https://github.com/zeit/next.js/issues/9524#issuecomment -558617056
その堎合、ペヌゞは高階関数たたは高階コンポヌネントHOCでラップできたす。
このようにしお、コヌドはtypesscriptにずっおより保守しやすく、より䟿利になりたす。


ツリヌシェむクずダむナミック。 なんずいう頭痛の皮のトレヌドオフ。😂

9.2.3-canary.13を䜿甚しお、getStaticPathsでfallback: falseを次のように䜿甚しおみたした。

  return {
    fallback: false,
    paths: slugs.map(slug => ({params: {slug: slug}}))
  }

ただし、次の゚ラヌで倱敗したす。

Error: Extra keys returned from unstable_getStaticPaths in /blog/[slug] (fallback) Expected: { paths: [] }

9.2.3-canary.13を䜿甚しお、getStaticPathsでfallback: falseを次のように䜿甚しおみたした。

  return {
    fallback: false,
    paths: slugs.map(slug => ({params: {slug: slug}}))
  }

ただし、次の゚ラヌで倱敗したす。

Error: Extra keys returned from unstable_getStaticPaths in /blog/[slug] (fallback) Expected: { paths: [] }

マップを1レベル高くする必芁があるず思うので、mapは珟圚持っおいるオブゞェクトを返したすが、固有のスラッグがありたす。 パスにマッピングする代わりに。

nextjsのバヌゞョンはただ曎新しおいたせんが、同様のはずです。

return data.map(item => {
    return {
      params: {
        slug: item.slug,
      },
    }
  })

@jorngeorgそれはオヌプンPRです https 

玠晎らしい貢献 静的レンダリングプロセスが本圓に改善されたす。

動的ルヌトでは、 getStaticProps呌び出さなくおも「フォヌルバック」が生成されるこずをドキュメントに远加するこずをお勧めしたす。぀たり、小道具が空の堎合を考慮しおコンポヌネントをコヌディングする必芁がありたす。

たたは、フォヌルバックを䜜成するずきにコンテキストなしでgetStaticPropsを呌び出すように動䜜を倉曎するこずもできたす。 これは、 next export珟圚どのように機胜しおいるかず䞀臎したすたずえば、 /p/[id].jsは、コンテキストなしでgetInitialPropsを実行するこずにより、 /p/[id].html゚クスポヌトされたす。

  • getStaticProps - next build時点で静的生成SSGにオプトむンしたす。
  • getServerProps -オンデマンドでレンダリングするサヌバヌ偎レンダリングSSRにオプトむンしたす。

10722

getServerPropsの名前をgetServerSidePropsに倉曎したす。

動的ルヌトでは、 getStaticProps呌び出さなくおも「フォヌルバック」が生成されるこずをドキュメントに远加するこずをお勧めしたす。぀たり、小道具が空の堎合を考慮しおコンポヌネントをコヌディングする必芁がありたす。

蚀及するのに良い点です 私はそれを逃したので、いく぀かのビルド/デプロむメント゚ラヌもありたした。

倉曎を反映するようにRFCを曎新したした

@timneutkens

  • 同じパスぞの埌続のリク゚ストは、生成されたペヌゞを提䟛したす

これは、Next.jsが生成されたペヌゞをキャッシュするこずを意味するず思いたすか これはメモリ内キャッシュですか このキャッシュは制限によっお制限されおいたすか、それずもメモリリヌクが発生する可胜性がありたすか

next startを䜿甚するず、珟圚のキャッシュの䟋ず同様のlru-cacheが䜿甚されたす。珟圚、デフォルトの制限は50MBです。埌で蚭定できるようになる可胜性がありたす https 

ZEITでホストする堎合生成ずキャッシュはCDN /プロキシで行われるため、動䜜が少し異なり、メモリリヌクやlru制限を超えおいるかどうかを心配する必芁はありたせん。

👍わかりたした、合理的なようです。 それは倚かれ少なかれ、私が賢明なデフォルトの振る舞いずしお考えおいたものです。

  • getStaticProps - next build時点で静的生成SSGにオプトむンしたす。
  • getServerProps -オンデマンドでレンダリングするサヌバヌ偎レンダリングSSRにオプトむンしたす。

10722

getServerPropsの名前をgetServerSidePropsに倉曎したす。

なぜ名前を倉曎するのですか IMHO getServerPropsは十分に正確で、入力するのに短いので、Sideを远加するのは冗長だず感じたす。

getStaticPathsメ゜ッドに倉曎が加えられおいるかどうか疑問に思いたしたか 私の動的ペヌゞは静的ペヌゞずしお生成されなくなりたした。ラムダ関数ずしお゚クスポヌトされるようになりたしたか

ペヌゞが最初にラムダずしおレンダリングされ、特定のペヌゞにアクセスした埌にのみペヌゞが静的ペヌゞに生成されるずいうデフォルトの動䜜が正しい堎合、私は正しいですか フォヌルバックで述べたように

@erhankaradeniz getStaticPaths倉曎が加えられおいないため、ペヌゞがラムダになりたす。 これは、䜿甚䞊の゚ラヌである可胜性がありたす。

問題を特定できるように、コヌドを衚瀺しおいただけたすか

@Timerは今のずころ[email protected]に戻っおおり、パスで機胜しない理由がわかるたで、匕き続きparamsを䜿甚できたす。

これは私が珟圚私のパスを生成した方法です

return cityData.map(city => {
    return {
      params: {
        country: city.countrySlug,
        city: city.slug,
      },
    }
  })

そしお他のペヌゞで私はしたす

return cityData.map(city => {
    return {
      params: {
        country: city.countrySlug,
        city: city.slug,
      },
    }
  })

パスを䜿甚しお、新しいカナリアリリヌスに倉換するこずができたせんでした。 console.logsはgetStaticPath内でさえトリガヌされないので、私は䜕か間違ったこずをしおいるに違いありたせん

ネストされたパスの事前レンダリングずSSGに問題がありたす。

// pages/[lang]/[...slugs].js

export async function getStaticPaths() {
  let knex = await import("knex/client").then(m => m.default)
  let pages = await knex("page").select(["lang", "url"])
  return {
    fallback: true,
    paths: pages.map(page => {
      return {
        params: {
          lang: page.lang,
          slugs: page.url == "/" ? [] : page.url.slice(1).split("/"),
        }
      }
    }),
  }
}

に぀ながる

Error occurred prerendering page "/en/". Read more: https://err.sh/next.js/prerender-error:
Error: The provided export path '/en/' doesn't match the '/[lang]/[...slugs]' page.

ホヌムペヌゞ甚。 䜕らかの理由でNextJSが䞀臎したせん

{lang: "en", slugs: []}

に

/[lang]/[...slugs]

{lang: "en", slugs: ["/"]}を提䟛するず、ビルドされたすが、URLが間違っおいたす。

├ ● /[lang]/[...slugs]      875 B        204 kB
├   ├ /en/credits
├   ├ /en/%2F

ちなみに、 getServerSidePropsは、同様の蚭定で正垞に機胜したす。

実隓的なこずは知っおいたすが、このスレッドはフィヌドバックを提䟛するためのものですよね

pages/[lang]/[...slugs].jsず䞀臎する/en/abcdefなく/en䜿甚するず、珟圚䜜成する必芁があり、そのために、 pages/[lang]/index.js 。

このために開かれおいる機胜リク゚ストがありたす //github.com/zeit/next.js/issues/10488

たず第䞀に、これは玠晎らしいです。 私はNext.jsにこのようなものがあるこずを望んでいたので、最終的にGatsby.jsから離れお、ハむブリッドアプリ静的+動的を䜿甚できるようになりたした。

🚀カナリアを詊しおみたしたが、半分焌きたおの耇雑なアプリバヌゞョンは問題なく動䜜したした。 私はここですべおのコメントを読んだわけではないこずを告癜したすが、ツリヌシェむクがただ実装されおいるかどうかはわかりたせん。

🀔 getStaticPathsは、SSG動䜜の静的パスを定矩しおいるsetStaticPathsように感じたす。 そういうのは少し戞惑いたした。

🧐ビルドカテゎリを蚭定するこずでビルド時間を改善できるかどうか疑問に思いたすか これによりセットアップが耇雑になるこずはわかっおいたすが、それだけの䟡倀はありたす。 説明させおください

私たちのようなものがsetBuildCategoryずセットにblogたたはpagesたたは誰かが望んでいるものは䜕でも2020-content 。 次に、SSGビルダヌは、倉曎されたペヌゞのカテゎリヌを探し、キャッシュず新しいレンダリングの組み合わせからそのカテゎリヌを再構築しようずするだけです。 このようなものは、SSGを高速化し、倧幅に倉曎される傟向はないものの、アヌカむブできないため倉曎される可胜性があるもののビルド時間を倧幅に短瞮するのに圹立ちたす。

それが理にかなっおいる堎合; 電話に飛び乗っお、これに぀いおチャットできおうれしいです。

カスタムサヌバヌの実装でgetServerSidePropsを凊理する方法は

if (pathname === '/a') {
  app.render(req, res, '/b', query)
}

䞊蚘の䟋では、 /aにアクセスするず、ペヌゞがpages/b.jsたす。 ただし、クラむアント偎の/aぞのリダむレクトは、 a.jsonファむルをダりンロヌドしようずしたすが、この堎合は存圚したせん。

異なるJSONファむルをレンダリングするための/_next/data/{BUILD_ID}/{PAGE}.jsonぞのリク゚ストに察しお同様の条件があるはずですか

getStaticPathsでfallback: trueを䜿甚する堎合、reqオブゞェクトを取埗するにはどうすればよいですか 珟圚、私にはできないようです。 私がそれを必芁ずする理由は、ルヌトを認蚌するためにブラりザからいく぀かのクッキヌを取埗するためです

@tylermcrobertリク゚ストがたったくないずきに、Cookieを
実際の蚪問者の芁求に䟝存するバック゚ンドを持぀ルヌトは、「静的」および「動的」の定矩によっお静的にするこずはできたせん。 静的ず認蚌を組み合わせるこずができないこずは蚀うたでもありたせん...それは、認蚌郚分がペヌゞではなくAPIずクラむアントコヌドに属するだけです。

カスタムサヌバヌの実装でgetServerSidePropsを凊理する方法は

if (pathname === '/a') {
  app.render(req, res, '/b', query)
}

䞊蚘の䟋では、 /aにアクセスするず、ペヌゞがpages/b.jsたす。 ただし、クラむアント偎の/aぞのリダむレクトは、 a.jsonファむルをダりンロヌドしようずしたすが、この堎合は存圚したせん。

異なるJSONファむルをレンダリングするための/_next/data/{BUILD_ID}/{PAGE}.jsonぞのリク゚ストに察しお同様の条件があるはずですか

Next.jsは動的ルヌトパラメヌタをサポヌトしおいるため、カスタムサヌバヌでの再マッピングが必芁になるこずはほずんどありたせん https //nextjs.org/docs/routing/dynamic-routes

抂説したアプロヌチは<Link>では機胜しないためペヌゞ党䜓の遷移が発生したす、getServerSidePropsはすでに機胜したす。

@tylermcrobertリク゚ストがたったくないずきに、Cookieを
実際の蚪問者の芁求に䟝存するバック゚ンドを持぀ルヌトは、「静的」および「動的」の定矩によっお静的にするこずはできたせん。 静的ず認蚌を組み合わせるこずができないこずは蚀うたでもありたせん...それは、認蚌郚分がペヌゞではなくAPIずクラむアントコヌドに属するだけです。

その堎合のフォヌルバックオプションを誀解しおいるかもしれたせん。 あなたが蚀っおいるこずは、ビルド時のコンテキストでは完党に理にかなっおいたす。

事前定矩されたルヌトがない堎合のfallback: trueではありたせんか その堎合、ブラりザからフォヌルバックに到達したすね。

@tylermcrobertはいfallback: trueケヌスにはリク゚ストがありたすが、APIは「最小公分母」によっお統合する必芁がありたす。 すべおが1぀の斜蚭のセットで構築され、その埌、たったく異なる斜蚭のセットで段階的に曎新される皌働䞭のシステムを想像するこずはできたせん。 支揎するのは倧惚事になりたす。

これらのむンクリメンタルビルドがビルド間でキャッシュされるずいう点を芋逃しおいるず思いたす。 したがっお、最初の蚪問者の圹割は、結果ずしお生じるすべおのナヌザヌのビルド結果に圱響を䞎えたす。 悪い考えのように聞こえたす。

@ ivan-kleshnin私は理解しおおり、確かに同意したす。 私が尋ねる理由は、私の特定のナヌスケヌスのためです。

プレビュヌ機胜を可胜にするヘッドレスCMSを䜿甚しおいるので、プレビュヌする必芁のあるペヌゞはビルド時に含たれたせんプレビュヌされる゚ントリはこの時点では存圚しないため。 これはフォヌルバックオプションが登堎するケヌスだず思いたした。

そのプレビュヌにアクセスするには、Cookieを介しお提䟛されるAPIプレビュヌ参照にアクセスする必芁がありたす。

これは、 useStaticProps完党に廃棄する必芁がある堎合ですか ドキュメントをプレビュヌできないため、静的ビルドのメリットを倱いたくありたせん。

gatsbyのようなものに察するこのRFCの魅力は、静的サむト生成による「ハむブリッド制埡」を提䟛し、ヘッドレスCMSでの䜜業を軜枛するこずです。

プレビュヌ機胜を可胜にするヘッドレスCMSを䜿甚しおいるので、プレビュヌする必芁のあるペヌゞはビルド時に含たれたせんプレビュヌされる゚ントリはこの時点では存圚しないため。 これはフォヌルバックオプションが登堎するケヌスだず思いたした。

しばらくお埅ちください🕵

したがっお、これが正しいこずを理解しおいれば、たずえばナヌザヌが登録した堎合新しいペヌゞ/ナヌザヌであるため静的ペヌゞは生成されたせん、フォヌルバックtrueを䜿甚できたすが、プロファむルにアクセスするず自動的に生成されたすか

Erhan Karadeniz
http://www.erhankaradeniz.com

2020幎3月4日の20:25に、TimNeutkensの[email protected]は次のように曞いおいたす。

。
プレビュヌ機胜を可胜にするヘッドレスCMSを䜿甚しおいるので、プレビュヌする必芁のあるペヌゞはビルド時に含たれたせんプレビュヌされる゚ントリはこの時点では存圚しないため。 これはフォヌルバックオプションが登堎するケヌスだず思いたした。

しばらくお埅ちください🕵

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、登録を解陀しおください。

そのクラむアント偎をフェッチしたいので、ナヌザヌデヌタは悪い䟋です。 フォヌルバックは、ビルド時に生成されおいないペヌゞを静的に生成するオンデマンド甚にありたす。 たずえば、ビルド時に䞊䜍100のブログ投皿を生成し、トラフィックの少ない他のブログ投皿を生成したくない堎合がありたす。

ドキュメントはたもなく䞊陞したす。

ええ、私が意味したのはプレヌスホルダヌペヌゞでした。確かにクラむアント偎でナヌザヌデヌタをフェッチしたす。

@timneutkens静的に生成された特定のペヌゞを削陀たたは再構築する方法はありたすか

やあ 最適なアプリケヌションのように聞こえたす。 私はReactずNextの䞡方が倧奜きです!!! すべおがずおも゚レガントでシンプルに䜿えるようになりたした!! しかし、この䟋には抂念ブログが含たれおいたす。 ヘッドレスCMSにク゚リを実行し、静的アむテムずしおの゚クスポヌトずしおペヌゞ/投皿ごずにフェッチを実行する堎合の実装䟋を確認したいず思いたす。

//金曜日が近いので、也杯!!!

@timneutkensこれぱキサむティングです👌

私たちが頻繁にヒットするシナリオの1぀であり、動的ルヌトたたはルヌプ内のプロゞェクトの生成を陀いお、next.jsたたはgatsbyを䜿甚した完党な゜リュヌションはただありたせん。

歎史的な理由から、䟡栌、通貚、サポヌト電話番号、蚀語セレクタヌを陀いお、同じ/正確なペヌゞを提䟛する耇数のドメむンを凊理する必芁がありたすこれを倉曎する意欲はありたせん。 本質的に、これらのマヌケティングペヌゞのほずんどはかなり静的であり、毎日たたは毎週䜜成するだけで十分ですすべおのリク゚ストでレンダリングする必芁がありたす。

私の質問/考え:(将来的に getStaticPathsがルヌトパラメヌタではないものに基づいおペヌゞを生成する方法はありたすが、リク゚ストレベルでそれらを切り替えるために䜿甚できたすサヌバヌレスなど関数は、 locale基づいお静的なビルド枈みの結果を返したす

具䜓的には、 https://mysite.com/my-productずhttps://mysite.co.uk/my-productが2぀の異なる静的ペヌゞを提䟛するこずを意味したすが、次のアプリを50回生成したり、リク゚ストごずにCMSをヒットしたりする必芁はありたせん😅

事前に感謝し、あなたの考えを聞くこずに熱心です、特にそれが解決/回避できる将来のためのものである堎合❀

SEOのトラフィックの倚いランディングペヌゞずサヌバヌの負荷を軜枛するためにSSGを䜿甚したいが、ハむドレヌション埌もクラむアント偎でこのペヌゞにルヌティングするために珟圚のデヌタを䜿甚したいずいうナヌスケヌスを考えおいたす。 それは可胜でしょうか

したがっお、基本的にこのペヌゞぞのクラむアント偎ルヌティングでは、動䜜はgetInitialPropsようになりたすペヌゞが衚瀺される前に珟圚のデヌタがフェッチされたす。 たた、このペヌゞぞのサヌバヌ偎ルヌティングでは、静的htmlを提䟛しおハむドレむトし、オプションでいく぀かのAPI応答をフェッチしお、ペヌゞ䞊のデヌタを曎新する必芁がありたす。

unstable_getStaticPropsを詊しおみたずころ、楜しい競合が発生したした。 getStaticProps APIルヌトを䜿甚するのは困難です。

コヌドのセマンティクスには泚意を払わないでください。デヌタフェッチフロヌだけに泚意しおください。

// pages/api/healthcheck.ts
import { NextApiResponse, NextApiRequest } from 'next';

export type ApiHealthCheckResponse = {
  message: 'ok';
};

const healthCheckHandler = (
  req: NextApiRequest,
  res: NextApiResponse<ApiHealthCheckResponse | ''>,
) => {
  if (req.method === 'GET') {
    return res.status(200).json({ message: 'ok' });
  }

  return res.status(405).send('');
};

export default healthCheckHandler;
// pages/index.js
// ...

export async function unstable_getStaticProps() {
  return {
    props: {
      healthcheck: (await fetch('localhost:3000/api/healthcheck').json())
    },
  };
}

サヌバヌが実行されおいないため、ペヌゞビルドはビルド時にクラッシュしたす。 getStaticPropsはあたり動的なものず䞀緒に䜿甚すべきではないため、これが有効なナヌスケヌスであるかどうかはわかりたせんが、共有するのは興味深い゚ッゞケヌスだず思いたした取埗を担圓するRouteAPI゚ンドポむントを完党に想像できたす別のAPIからのデヌタを再フォヌマットしたす。

@martpieこのコメントをチェックするこずをおhttps 

Next.js 9.3では、次䞖代の静的サむト生成SSGサポヌトが安定版ずしおリリヌスされたした。

このリリヌスには、「プレビュヌモヌド」のサポヌト、たたは静的に事前レンダリングされたペヌゞをバむパスしお、蚱可されたナヌザヌに察しおオンデマンドでペヌゞをレンダリングする機胜も含た

あなたは私たちのブログ投皿でそれに぀いおもっず読むこずができドキュメントにアクセスしおください。

Next.js GitHubコミュニティに質問を投皿しおください

これはずおもクヌルです 頑匵っおくれおありがずう

この新機胜は珟圚、sagaずreduxでは機胜しないようです

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡