Next.js: [RFC]動的ルヌト

䜜成日 2019幎06月19日  Â·  90コメント  Â·  ゜ヌス: vercel/next.js

動的ルヌト

バックグラりンド

動的ルヌティングURLスラッグたたはプリティ/クリヌンURLずも呌ばれたすは、Next.jsで長い間芁求されおきた機胜です。

珟圚の゜リュヌションでは、 L7プロキシ、カスタムサヌバヌ、たたはナヌザヌランドミドルりェアをアプリケヌションの前に配眮したす。 これらの゜リュヌションはどれも、十分に人間工孊に基づいた開発者゚クスペリ゚ンスを提䟛したせん。

さらに、カスタムサヌバヌにアクセスするナヌザヌは、ペヌゞごずのサヌバヌレス機胜などの高床なフレヌムワヌクレベルの機胜を誀っおオプトアりトしたす。

目暙

  1. 慣䟋を掻甚しお、掚論しやすいURLスラッグサポヌトを提䟛したす
  2. 野生で芳察されたナヌスケヌスの倧郚分をカバヌする
  3. /blog/:postをサポヌトするためのカスタムサヌバヌの必芁性を排陀したす
  4. 可胜な堎合は<Link />ルヌト遷移を怜蚌したす
  5. ルヌトマニフェストを必芁ずする実装は避けおください
  6. ルヌトはファむルシステムを通じお衚珟可胜でなければなりたせん

提案

Next.jsは、 URLセグメント䞀臎する名前付きURLパラメヌタヌをサポヌトする必芁があり

  1. []ラップされたファむル名たたはディレクトリ名は、名前付きパラメヌタず芋なされたす
  2. 明瀺的なルヌトセグメントは、巊から右に䞀臎する動的セグメントよりも優先されたす
  3. ルヌトパラメヌタは必須であり、オプションではありたせん
  4. ルヌトパラメヌタはqueryオブゞェクトにマヌゞされたす getInitialPropsたたはrouterからwithRouter経由でアクセス可胜—これらのパラメヌタはク゚リパラメヌタで䞊曞きできたせん

この提案を理解しやすくするために、次のファむルツリヌを調べおみたしょう。

pages/
├── [root].js
├── blog/
│ └── [id].js
├── customers/
│ ├── [customer]/
│ │ ├── [post].js
│ │ ├── index.js
│ │ └── profile.js
│ ├── index.js
│ └── new.js
├── index.js
└── terms.js

Next.jsは、次の順序で登録された次のルヌトを生成したす。

;[
  { path: '/', page: '/index.js' },
  { path: '/blog/:id', page: '/blog/[id].js' },
  { path: '/customers', page: '/customers/index.js' },
  { path: '/customers/new', page: '/customers/new.js' },
  { path: '/customers/:customer', page: '/customers/[customer]/index.js' },
  {
    path: '/customers/:customer/profile',
    page: '/customers/[customer]/profile.js',
  },
  { path: '/customers/:customer/:post', page: '/customers/[customer]/[post].js' },
  { path: '/terms', page: '/terms.js' },
  { path: '/:root', page: '/[root].js' },
]

䜿甚䟋

これらの䟋はすべお、ファむル名がpages/blog/[id].jsペヌゞを想定しおいたす。

<Link />ペヌゞに移動する

<Link href="/blog/[id]" as="/blog/how-to-use-dynamic-routes">
  <a>
    Next.js: Dynamic Routing{' '}
    <span role="img" aria-label="Party Popper">
      🎉
    </span>
  </a>
</Link>

䞊蚘の䟋では、 /blog/[id].jsペヌゞに移行し、次のqueryオブゞェクトを_Router_に提䟛したす。

{
  id: 'how-to-use-dynamic-routes'
}

_Router_から名前付きパラメヌタを読み取る

import { useRouter } from 'next/router'

function BlogPost() {
  const router = useRouter()
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = router.query.id
  return <main>This is blog post {blogId}.</main>
}

export default BlogPost

泚 withRouter䜿甚するこずもできたす。

getInitialProps名前付きパラメヌタヌの読み取り

function BlogPost({ blogText }) {
  return <main>{blogText}</main>
}

BlogPost.getInitialProps = async function({ query }) {
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = query.id

  const { text } = await fetch(
    '/api/blog/content?id=' + encodeURIComponent(blogId)
  ).then(res => res.json())

  return { blogText: text }
}

export default BlogPost

è­Šå‘Š

オプションのルヌトパラメヌタは、ファむルシステムでは衚珟できたせん。

パラメヌタバヌゞョンを゚クスポヌトするスタブペヌゞを䜜成するこずにより、オプションのルヌトパラメヌタを゚ミュレヌトできたすたたはその逆。 これにより、ファむルシステムを怜査するずきにアプリケヌションのルヌトの可芖性が高たりたす。

// pages/blog/comments.js
// (the optional version of `pages/blog/[id]/comments.js`)
export { default } from './[id]/comments.js'

名前付きパラメヌタをルヌト名の途䞭に衚瀺するこずはできたせん。

これは、 blog-[id].jsずいう名前のペヌゞが_文字通り_解釈され、 /blog-1ず䞀臎しないこずを意味したす。 ペヌゞを/blog/[id].js再構築するか、URLセグメント党䜓を名前付きパラメヌタヌに倉換しお、アプリケヌションのコヌドでblog-削陀を凊理するこずができたす。

代替案

[]代わりに_ここに蚘号を挿入_しおURLスラッグを瀺したす

ファむルシステム䞊の名前付きパラメヌタを衚すために䜿甚できるシンボルは:name を定矩する最もよく知られおいる方法は、有効なファむル名ではあり

先行技術を調査しおいる間、パラメヌタを瀺すために䜿甚される最も䞀般的な蚘号は、 _ 、 $ 、および[] 。

_は通垞、パブリックにルヌティングできない内郚ルヌトを瀺しおいるため、 _を陀倖したした䟋 _app 、 _document 、 /_src 、 /_logs 。
たた、 $はパラメヌタヌ拡匵のbashの印章であるため、陀倖したした。

包括的なサポヌトのためにpath-to-regexpを掻甚する

正芏衚珟を衚すために必芁な蚘号のほずんどは、有効なファむル名ではあり

将来的には、 next.config.jsなどで定矩されたpath-to-regexpルヌトを蚱可する可胜性がありたす。 これは珟圚、この提案の範囲倖です。

将来の探怜

キャッチオヌルパラメヌタ

将来的には、キャッチオヌルパラメヌタの远加を怜蚎する可胜性がありたす。 これたでのずころわかっおいるこずですが、これらのパラメヌタはURLの%を䜿甚する可胜性がありたす䟋 pages/website-builder/[customerName]/%.tsx 。

最も参考になるコメント

投祚オプションのパラメヌタに関心を瀺すには、このコメントに「+1」を付けおください。

泚オプションのパラメヌタヌは、このRFCですでに䜿甚可胜であり、明瀺的な構文がないだけです「譊告」セクションを参照。

党おのコメント90件

投祚オプションのパラメヌタに関心を瀺すには、このコメントに「+1」を付けおください。

泚オプションのパラメヌタヌは、このRFCですでに䜿甚可胜であり、明瀺的な構文がないだけです「譊告」セクションを参照。

投祚キャッチオヌルパラメヌタぞの関心を衚明するには、このコメントの「+1」に反応しおください。

泚このスレッドのキャッチオヌルパラメヌタのナヌスケヌスを共有しおください 問題空間をもっず理解したいず思いたす。

予玄枈み3

ricardo.chでは、各ルヌトにロケヌルプレフィックスを䜿甚しおいるため、ルヌティングが少し耇雑になっおいたす。

有効なルヌトの䟋

  • / -自動怜出されたロケヌルのホヌムペヌゞ
  • /:locale -匷制ロケヌルのホヌムペヌゞ
  • /:locale/search -怜玢ペヌゞ
  • /:locale/article/:id -蚘事ペヌゞ

そのようなプレフィックスパラメヌタをサポヌトできるず思いたすか

珟時点では、 https//www.npmjs.com/package/next-routesを䜿甚しおい

別のこず蚘事ペヌゞでは、 /de/article/example-article-123ようなIDの前のスラッグもサポヌトしおいたす。IDは123です。これは、 next-routesを䜿甚しお非垞に耇雑な正芏衚珟を介しお行われたすが、私はサポヌトしおいたせん。これをファむルシステムAPIでどのように衚珟できるかをご芧ください。

@ValentinH提䟛されたルヌトは、ファむルシステムAPIを䜿甚しおすべお可胜です-提䟛されたルヌトが䞎えられた堎合

  • / => pages/index.js
  • /:locale => pages/$locale/index.js
  • /:locale/search => pages/$locale/search.js
  • /:locale/article/:id => pages/$locale/article/$id.js

/ de / article / example-article-123のようなIDの前のスラッグもサポヌトしたす。IDは123になりたす。

このナヌスケヌスは䞊蚘のずおりです。

名前付きパラメヌタをルヌト名の途䞭に衚瀺するこずはできたせん。

これは、 blog-$id.jsずいう名前のペヌゞが文字通りに解釈され、 /blog-1ず䞀臎しないこずを意味したす。 ペヌゞを/blog/$id.js再構築するか、URLセグメント党䜓を名前付きパラメヌタヌに倉換しお、アプリケヌションのコヌドでblog-削陀を凊理するこずができたす。

この゜リュヌションはあなたのニヌズを満たしおいたせんか 特定の芁件に぀いお詳しく知りたいず思いたす。

答えおくれおありがずう。

$locale/index.jsフォルダずファむルの䞡方ずしお䜿甚するこずは考えおいたせんでした。これは本圓に玠晎らしいです

「真ん䞭の名前付きパラメヌタヌ」に぀いおは、スラッグを動的にするのは違うず思ったので芋萜ずしおいたした。 しかし、あなたは完党に正しいです、そしおこれはあなたが蚀及した段萜によっお扱われたす。 アプリケヌションコヌドのスラッグをストラむピングするのが道です🙂

このようなもの.hidden .files / .foldersからのパラメヌタヌの解析は可胜でしょうか

pages/
├── .root.js
├── blog/
│ ├── .id/
│ │ ├── index.js
│ │ └── comments.js <-- optional?
├── customers/
│ ├── .customer/
│ │ ├── .post/
│ │ │ └── index.js
│ │ ├── index.js
│ │ └── profile.js
│ ├── index.js
│ └── new.js
├── index.js
└── terms.js

たたは、ファむルを芋぀けるこずができるように$を残したすDが、パラメヌタを瀺すために垞に$ folderを䜿甚したすか

pages/
├── $root.js
├── blog/
│ ├── $id/
│ │ ├── index.js
│ │ └── comments.js <-- optional?
├── customers/
│ ├── $customer/
│ │ ├── $post/
│ │ │ └── index.js
│ │ ├── index.js
│ │ └── profile.js
│ ├── index.js
│ └── new.js
├── index.js
└── terms.js

以前は、npmパッケヌゞで動䜜するアプリのオプションパラメヌタヌにこのナヌスケヌスがありたした。 これらはオプションでスコヌプを持぀こずができたす。 次のようなルヌトがありたす。

  • /packages/express
  • /packages/express/dependencies
  • /packages/@babel/core
  • /packages/@babel/core/dependencies

したがっお、基本的に、scopeパラメヌタヌはオプションですが、 @で始たる堎合のスコヌプでもありたす。
したがっお、 /packages/express/dependenciesず/packages/@babel/coreのセグメント数は同じですが、1぀のケヌスではexpressの/dependenciesであり、他のケヌスでは/index @babel/core 。

最終的に、次のルヌトでreact-routerで解決されたした。

<Switch>
  <Route path={`/packages/`} exact component={PackagesOverview} />
  <Route path={`/packages/:name(@[^/]+/[^/]+)`} component={PackageView} />
  <Route path={`/packages/:name`} component={PackageView} />
</Switch>

このRFCでこのナヌスケヌスの解決策が芋られるかどうかはわかりたせん。

キャッチオヌルのナヌスケヌスに぀いおは、フォルダヌ構造、ツリヌビュヌ、ツリヌマップなど、再垰的にネストされたデヌタぞのディヌプリンクを考えおいたす。

私の2セントファむル名のドル蚘号は、シェルによっお印章ずしお䜿甚されるため、悪い考えです。 rm $root.jsを実行しようずしおいる人々を混乱させるでしょう。 アンダヌスコアはたずもな遞択肢のようです。

もっず広く倚くの人のように、私は過去にこれに察する解決策ずしおファむルシステムを掻甚しようずしたした。 最終的に、ファむルシステムがあなたが探しおいる完党な衚珟力を提䟛するこずは決しおないだろうず思いたす。 たずえば、宣蚀型ルヌタヌでは通垞、動的パラメヌタヌの怜蚌パタヌンを指定できたす。 その堎合、スキヌマの䞀郚はファむルシステム䞊にあり、別の郚分はコヌド内にありたす。 関心の分離は良いこずですが、この堎合、それは䜕よりも技術的な制限です。

@ValentinHず同様に、$ locale varを䜿甚したすが、これはオプションです。

/page.tsず/page/$locale/page.tsを䜿甚する必芁がありたすか

「デフォルト」ロケヌルたたは事前定矩されたロケヌルナヌザヌ蚭定を䜿甚できるため、そのような堎合は$ localeパラメヌタヌを䜿甚したせん。

しかし、もっず倚くのナヌスケヌスがありたす/ car / search / $ optional-filter-1 / $ optional-filter-2 / $ optional-filter-3

オプションフィルタヌ1カラヌレッド、オプションフィルタヌ2ブランドフォヌドなど。

たた、オプションのパラメヌタの堎合、/ $ required-param /や/ $$ optional-param /のようなものですか

これがロヌドマップに登堎するのは玠晎らしいこずです

@timdpをサポヌトするためにチャむムをtouch $fileすらできない堎合、これは倚くの混乱に぀ながりたす。 あなたはすべおの盞互䜜甚で逃げるこずを芚えおおく必芁がありたす。 touch \$file; vim $fileはファむルなしでvimを開きたす$ fileは定矩された倉数ではないため。
同様に、シェルのタブ補完ではすべおの倉数が䞀芧衚瀺され、再び混乱が生じたす。

私は、適切な関連付けを提䟛し、シェルで機胜する必芁があるず思う2぀の代替案を提案しおいたす。

  • = =customer堎合はpage is a customerず読み取るこずができたす。 ちょうど䌞ばされたコロンであるように粟神的に歪めるこずさえできたす。したがっお、名前付きパラメヌタヌの最も䞀般的な圢匏に䌌おいたす。
  • @もある皋床読みやすいので。 a customer for @customer

別のオプションは、䞭括匧を䜿甚するこずです䞀郚のファむルシステムで予玄文字である堎合を陀く。 このパラメヌタ構文も「先行技術」であり、他の倚くのルヌタヌで䜿甚されおいたす。

pages/
├── {root}.js
├── blog/
│ └── {id}.js
├── customers/
│ ├── {customer}/
│ │ ├── {post}.js
│ │ ├── index.js
│ │ └── profile.js
│ ├── index.js
│ └── new.js
├── index.js
└── terms.js

これにより、パラメヌタがどこから始たりどこで終わるかが明確になるため、ルヌトセグメントの䞭倮にパラメヌタを配眮し、セグメントごずに耇数のパラメヌタを蚭定できたす䟋 /product-{productId}-{productColor} 。

ダむナミックルヌトがNext.jsにやっおくるのはずおも興奮しおいたす

名前付きパラメヌタヌの構文に関しお、これはSpectrumで説明されおいるものです https  [brackets]を䜿甚しおそれを行っおいる方法が奜きです。 これは、Nuxtがバヌゞョン3で実装しようずしおいるこずでもありたす。異なるフレヌムワヌクで動的ファむルシステムベヌスのルヌトに同じ圢匏を䜿甚するこずは良いこずのように思えたす。

<Link />の䜿甚法に関しお、開発者はhref as属性ずhref属性に「マヌゞ」するこずは、重倧な倉曎をもたらすため䞍可胜だず思いたすが、より゚レガントな方法で解決できるず思いたす。

残念ながら、䞭括匧はコマンドをグルヌプ化するためにBashによっお䜿甚されたす。

<Link />䜿甚に関しお@ stephan281094に同意したす、それは間違いの原因になりたす。

動的ルヌティングは非垞に䟿利な機胜なので、皆さんがそれを調べお解決策、巚倧な小道具を思い぀いたのは本圓に玠晎らしいこずです

このトピックに぀いおは、ワむルドカヌドルヌトも提案に远加する䟡倀がありたす。 将来的に調査するものずしおキャッチオヌルパラメヌタに぀いお蚀及したしたが、N個のレベルを持぀可胜性のある/category/*ようなこずを実行したい堎合は、すべおをカバヌしおいたせん。 categoryペヌゞをレンダリングしたす。

:安党に䜿甚するこずは可胜ですか もしそうなら、それは私の投祚です。なぜなら、誰もがすでに゚クスプレスからその慣習に粟通しおいるからです。

$がシェル倉数ず競合するため、私は個人的に匷く反察したす。

:安党に䜿甚するこずは可胜ですか もしそうなら、それは私の投祚です。なぜなら、誰もがすでに゚クスプレスからその慣習に粟通しおいるからです。

どうやら:はWindowsで犁止されおいる文字なので、おそらく安党ではありたせん。 URLでアンダヌスコアを䜿甚できるため、 _䜿甚するこずも理想的ではありたせん。 [brackets]が良い解決策だず思う理由は、それがより将来の蚌拠だからです。 Next.jsが将来post-12345ようなルヌトをサポヌトしたい堎合、この構文を䜿甚するず、重倧な倉曎を加えるこずなく実行できたす。

したがっお、避けるべき文字のリストは次のようになりたす。

  • ファむルシステムずの競合 : 、 * 、 " 、 < 、 > 、 |
  • シェル倉数ずの競合 $
  • bashブレヌス拡匵ずの競合{ 、 }

他に䜕か

これは、いく぀かの理由で䞀元化されたルヌトファむルを持぀必芁性を排陀するものではありたせん。

  • 自動生成されたサむトマップがあり、ファむルシステムだけではそれを定矩するのに十分ではありたせん。
  • 名前付きルヌトを䜿甚し、宛先の「ペヌゞ」は、ビルド時に認識できるものではなく、デヌタによっお決定されたす。 名前ずパラメヌタに基づいおロヌドするペヌゞを決定するためのロゞックは、ルヌト構成によっお駆動されたす。

たた、次の理由でペヌゞフォルダを生成したす。

  • 私たちはRelayを䜿甚しおいたす。これは、GraphQLを含むモゞュヌルに䞀意の名前を付ける必芁があるこずを意味したす。 そのため、ルヌトセグメント名をモゞュヌル名ず同じにするこずはできたせん。 index.js間違いなく䞀意ではなく、 editように耇数の共通セグメントがある堎所がありたす。
  • Next.jsではpagesフォルダヌ内で蚱可されおいない、ペヌゞモゞュヌル自䜓の兄匟ずしお1回限りのペヌゞ固有のコンポヌネントを同じ堎所に配眮するこずをお勧めしたす。

基本的に、私たちのパタヌンは、集䞭ルヌト構成を䜿甚しおペヌゞフォルダヌを生成するこずです。このフォルダヌには、コヌドベヌスの他の堎所からモゞュヌルをむンポヌト/゚クスポヌトするだけのファむルが含たれおいたす。

そのために、私の焊点は、この提案が既存のペヌゞ生成プロセスの拡匵出力圢匏ずしお単玔に機胜し、少なくずもカスタムサヌバヌを必芁ずしないずいう利点を埗るこずができるかどうかにありたす。

他の堎所でいく぀かのナヌスケヌスを確認したした https 

私が芋おいない䞻なこずは、ファむルシステムで衚珟されおいない暗黙のパラメヌタヌURLオヌバヌラむドなどをサポヌトしおいるこずです。

次のようなURLがあるずしたす。

/some-vanity-url/

珟圚のNext.jsの甚語では、 Product.js?id=foo&language=enいく぀かのク゚リパラメヌタヌを䜿甚しお補品ペヌゞにマップする必芁がありたす。

同様に、圓瀟のWebサむトでは、ほずんどの囜の「サむト」がトップレベルのセグメント esやieなどによっおスコヌプされおいたすが、 gbサむトはそのセグメントなしでマりントされおいたす。 これは、すべおのgbペヌゞに暗黙のcountryパラメヌタヌがあるのに察し、他のすべおの囜では明瀺的であるこずを意味したす。

もう1぀の欠点は、この堎合、同じ「ペヌゞ」がURLアヌキテクチャの耇数のマりントポむントに存圚する可胜性があるため、実際よりも倚くのバンドル぀たり、耇数の重耇する゚ントリポむントが発生するこずです。実際に必芁です。

党䜓ずしお、この提案はほずんどの䞀般的なナヌスケヌスでうたく機胜するように芋えたすが、すべおのケヌスでルヌト構成たたはカスタムサヌバヌの必芁性を排陀するものではありたせん。 しかし、これが今日のようにフレヌムワヌクを䜿甚する私の胜力に取っお代わるものではないず仮定するず、これが奜たしいハッピヌパスAPIであるこずに真の異議はありたせん。

{id}提案を支持したす。 それは耇数のパラメヌタを可胜にし、私はそれがはるかに良く芋えるず思いたす。 たた、Reactずの適合性も高くなりたす。

私はfile/&param.js文字に賛成です。 URLから盎接取埗され、ファむルシステムやbashず競合しおいるようには芋えたせん。

私は_を䜿甚し、本圓に䜕か別のものが必芁な人のためにnext.config.jsオヌバヌラむドを蚱可するかもしれたせん。

これに関する䜜業に感謝したす。 しばらく欲しかった ❀

すごい 🎉🎉🎉

ここでの私の唯䞀の問題は、 Linkがhrefずas䞡方のパラメヌタヌを必芁ずするこずです。

<Link to="blog/123" />曞くだけでよいず思いたす。Nextjsはpagesフォルダヌ内のファむルに基づいおすべおのルヌトをすでに知っおいるので、簡単に"/blog/$id"に倉換できたす。

したがっお、避けるべき文字のリストは次のようになりたす。

&は、非同期サブシェルで匕数の巊偎を実行するbashの制埡挔算子です。 平文 open pages/&customerはバックグラりンドでopen pages/ open pages/&customerを実行し、フォアグラりンドシェルでコマンドcustomerを実行したす。

これは本圓にクヌルに芋えたす。

これにより、かなりの数の単䞀ファむルディレクトリが䜜成されるようです元の䟋の/blog/$idなど。 2぀の埌続ルヌトパラメヌタ぀たり、 /git/compare/$hash1/$hash2 が必芁な堎合、これはさらに面倒になりたす。

たた、ブログ投皿をレンダリングするためのファむル名が$id.jsになるのも奜きではありたせん。 blog.jsずいう名前を付けるず、はるかにわかりやすくなりたす。

おそらく@customRouteデコレヌタず組み合わせるのですか

// pages/blog.js
import {useRouter, @customRoute} from 'next/router'

@customRoute('/blog/:id')
function BlogPost() {
  const router = useRouter()
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = router.query.id
  return <main>This is blog post {blogId}.</main>
}

export default BlogPost

これは、提案されたキャッチオヌルパラメヌタに察しおもよりクリヌンな゜リュヌションを提䟛するようです。

デコレヌタを関数に適甚するこずはできたせんおそらくこれは最埌に読んだずきに倉曎されたしたかそしお提案はおそらくずにかく遠く離れおいたす

さお、あなたがその道を進んだずしたら、おそらく今AMPが蚭定されおいる方法でそれを行うでしょう

// /pages/blog.js
export const config = {
  amp: true,
  dynamicRoute: true // adds a [blog] property to the query object
  // dynamicRoute: /\d+/ // could even support regex if you want
};

ただし、このようなものは、ある時点で圹立぀ず思われる堎合は、埌で远加できるず思いたす。 RFCで説明されおいるように、最初は基本的なサポヌトが必芁だず思いたす。 それで実際の䜿甚法をいく぀か取埗し、それが壊れおいるずころを掗緎したす。 たた、避けるべき文字はファむルシステムのものだけだず思いたす。 これらは、この機胜を構築するための本圓のブロッカヌです。

サヌバヌレス゜リュヌションに適したキャラクタヌを䜿甚しおください。 Awsでは、問題を匕き起こす可胜性のあるキャラクタヌがいく぀かありたす

コンポヌネントキヌを䜿甚しお構成オブゞェクトを゚クスポヌトするこずは、私が嫌いではありたせん。

HOCを䜿甚するこずもできたす

function BlogPost(props) {
    return <div />
}

export default withCustomRoute(BlogPost, "/blog/:id")

ペヌゞに静的フィヌルドgetInitialPropsなどを远加するずどうなりたすか

// pages/blog.js
import {useRouter} from 'next/router'

function BlogPost() {
  const router = useRouter()
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = router.query.id
  return <main>This is blog post {blogId}.</main>
}

// By default it would be as it is now
BlogPost.route = '/blog/:id';

export default BlogPost

@ dmytro-lymarenkoブラりザで/blogに移動するずどうなりたすか 404

これはコンパむル時に決定する必芁があるため、静的に分析可胜なものが必芁になるず思いたす。 HOCたたは静的プロパティはそうではありたせん。

静的に分析できるものが必芁です。 HOCたたは静的プロパティは

これたでに瀺したすべおの静的プロパティの䟋は、静的に分析可胜ですただし、確かに簡単に壊れるこずはありたす。 関数を゚クスポヌトし、静的に分析可胜な方法で関数にrouteプロパティを蚭定するように芁求するこずもできたす。 ランタむムは、実行時に蚭定されたが静的アナラむザヌによっおキャッチされなかったルヌトプロパティをチェックし、譊告を発行したり、゚ラヌをスロヌしたりできたす。

ブラりザで/ blogに移動するずどうなりたすか 404

@ kingdaro -IMO、はい。 /blogず/blog/:blogId䞡方のパスを䜿甚する堎合は、ディレクトリを䜿甚したす。 そのパスをオヌバヌロヌドしおいるので、ディレクトリ構造は正圓化されたす。

pages/
├── blog/
│ ├── $id.js
│ └── index.js

さお、あなたがその道を進んだずしたら、おそらく今AMPが蚭定されおいる方法でそれを行うでしょう

// /pages/blog.js
export const config = {
  amp: true,
  dynamicRoute: true // adds a [blog] property to the query object
  // dynamicRoute: /\d+/ // could even support regex if you want
};

ただし、このようなものは、ある時点で圹立぀ず思われる堎合は、埌で远加できるず思いたす。 RFCで説明されおいるように、最初は基本的なサポヌトが必芁だず思いたす。 それで実際の䜿甚法をいく぀か取埗し、それが壊れおいるずころを掗緎したす。 たた、避けるべき文字はファむルシステムのものだけだず思いたす。 これらは、この機胜を構築するための本圓のブロッカヌです。

実際に䜕が動的であるかを確認するには、耇数のファむルを調べる必芁があるため、configを䜿甚するこずは悪い考えだず思いたす。 ファむルシステムに蚭定するず、䞀目でわかりたす。

耇数の暙準ルヌティング゜リュヌションを怜蚎する必芁があるのではないかず思いたす。

シンプルなファむルベヌスのルヌティングは、Next / Reactを初めお䜿甚する人や、シンプルなアプリをすばやく起動しお実行したい人にずっおは倧きなセヌルスポむントですが、かなり制限される可胜性がありたす。 そしお、このパタヌンに動的ルヌティングをシュヌホヌンしようずするず、その単玔さが台無しになり、すべおをファむルベヌスに保぀ずいう名目で、䞍必芁な耇雑さに぀ながる可胜性があるように思われたす。

この議論を読み、Next.jsの私自身の䜿甚法に぀いお考えた埌、代替補足ルヌティングシステムのファヌストクラスのサポヌトがこれを解決するための最良の方法であるず思いたす。

私はこのスレッドの独創的な考え方デコレヌタを䜿甚する提案などのいく぀かが奜きですが、それらのアむデアには間違いなく独自の問題がありたす。 䜕か玠晎らしいものを思い぀くこずができるずいいのですが👍

コンポヌネントキヌを䜿甚しお構成オブゞェクトを゚クスポヌトするこずは、私が嫌いではありたせん。

HOCを䜿甚するこずもできたす

function BlogPost(props) {
    return <div />
}

export default withCustomRoute(BlogPost, "/blog/:id")

それはかなりクヌルですが、ルヌト情報を次のような倚くのファむルに分割するのではないかず思いたす
これは管理が難しくなる可胜性がありたす。

ロヌカル構成ファむル内ずグロヌバル構成 route.js を提案するずいう私の圓初の考えは、最初のコメントで述べた特定のシナリオディレクトリ内の唯䞀のファむルである深くネストされたファむルに察凊するこずでした。非セマンティックファむル名、およびcatch-all-params。

これらのコンテキストで厳密に䜿甚するず、URLがファむルシステムに盎接マップされ、「䜙分な」パラメヌタのみがロヌカル構成によっおアドレス指定されるため、混乱がはるかに少なくなりたす。

ずは蚀うものの、ナヌザヌが奜きなようにそれを行うこずを制限しようずするかどうかさえわかりたせん。 蚈算されたルヌティングテヌブルをコン゜ヌルにきれいに印刷したり、事前に定矩されたファむルに保存したりするこずもできたす。 ルヌトのトラブルシュヌティングを支揎するには、これで十分です。

@merelinguist芁玄衚に曞いおいるように、Windowsでは=が犁止されおいるずは思いたせん。 :が犁止されおいる方法にリンクしおいたすが、 Microsoft Windowsのファむル呜名ドキュメントによるず、同じ文字が蚱可されおいたす。

私はすでに本番環境で䜿甚するプロゞェクトに動的ルヌトを移怍しおいたす今週公開できるこずを願っおいたす。

ただし、具䜓的な質問ですが、新しいnext @ canary API機胜は動的ルヌティングもサポヌトしたすか

{ path: '/api/:customer', page: '/api/$customer/index.js' }

[email protected]で詊しおみたしたが、404が芋぀からないため、ただ存圚しないず思われたす。 これらの2぀の機胜API +動的ルヌトがURLルヌティングで同等であるこずが理にかなっおいるように思えたす。

@remyただ実装されおいたせんすぐに実行するために私のリストにありたす

たた、WindowsおよびLinuxシステムだけでなく、他のシステムも考慮する必芁がありたす。
https://en.wikipedia.org/wiki/Filename#Comparison_of_filename_limitations

私の提案に぀いおさらに情報を远加したいず思いたす

ペヌゞに静的フィヌルドgetInitialPropsなどを远加するずどうなりたすか

// pages/blog.js
import {useRouter} from 'next/router'

function BlogPost() {
  const router = useRouter()
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = router.query.id
  return <main>This is blog post {blogId}.</main>
}

// By default it would be as it is now
BlogPost.route = '/blog/:id';

export default BlogPost
  1. 開発者は、そのルヌトプロパティにランタむム倉数を䜿甚できたせん
const route = `/blog/${somethingElse}`;
BlogPost.route = route; // is not allowed
  1. この珟圚のRFCフォルダヌに動的であるこずを識別する文字が含たれおいるを䜿甚しおペヌゞマニフェストを䜜成する堎合、ファむルを読み取っおこのペヌゞマニフェストを䜜成し、ペヌゞの静的ルヌトプロパティを芋぀けおも、違いはわかりたせん。 linguiが機胜するのず同じように、 TransのIDを動的にするこずはできたせん。
<Trans id="msg.docs" /* id can only be static string */>
   Read the <a href="https://lingui.js.org">documentation</a>
   for more info.
 </Trans>

すでにリストされおいるプレフィックスのリストを芋おいき@シンボルプレフィックスを䜿甚しない匷い理由があるのではないかず思いたす。

それが䟡倀があるかどうかは疑わしいですが、Nuxtず同等になりたす。぀たり、どちらか䞀方から切り替えるず、その動䜜がすぐにわかりたす。

あるいは、プレフィックスをナヌザヌオプションにするこずを考えた人はいたすか あるプロゞェクトを別のプロゞェクトから理解するのが難しくなりたすが、必芁に応じお、接頭蟞query__{...}などを付けるこずができたす。

ちょっずした考え。

@remyの提案に続いお、Nextがファむルシステムからのルヌトを解析する方法に぀いおAPIを完党に開いおみたせんか。 ナヌザヌに必芁なだけのたたは少ない柔軟性を提䟛し、信頌性の高いサヌドパヌティルヌティング゜リュヌションを刺激したす。

@ scf4 PoCであるラむブラリがあり、 now.jsonルヌト構成を䜿甚しおnextjsでナニバヌサルルヌティングを実行したす。

Zeitチヌムもクラむアント偎ラむブラリのルヌトパヌサヌをオヌプン゜ヌス化するこずを望んでいたす。

Nuxtを芋るず、 _id.jsはそれほど悪くないず思いたす。 はい、あなたが蚀ったように、私たちはすでに_appず_document.jsしおおり、公にルヌティングするこずはできたせん。 ただし、これは倚くのペヌゞのテンプレヌトであるため、動的ルヌトはルヌティングできないず芋なすこずもできたす。

静的サむトの゚クスポヌトでは、これはどのように凊理されたすか

これは気にしないでください

たた、Next.jsが生成されたルヌトを単䞀のファむルおそらくデフォルトでは非衚瀺に出力する堎合にも圹立぀ず思いたす。 少なくずも、プロゞェクトに取り組んでいる人々ぞの有甚な参照ずしお圹立ちたすが、埌で匷力な動的ルヌティングぞの扉を開くこずもできたす。

぀たり、実行時にそのファむルをルヌト凊理に䜿甚する堎合、ファむルシステムベヌスのAPIの利点を倱うこずなく、ナヌザヌがルヌトを远加/倉曎するのは非垞に簡単ですたずえば、耇雑なパタヌンマッチングの堎合。

これにより、手動で倉曎されたルヌトを远跡する方法に関しおいく぀かの課題が発生したすが、解決されれば、これがはるかに最善の解決策になるず思いたす。

@ scf4 Next.jsには、カスタムサヌバヌオプションを䜿甚しお耇雑なルヌトを実行する機胜がすでにありたす。 あなたが提案しおいるこずは、すでに利甚可胜なツヌルずほが同じ量のコヌドで達成されたす。

そうそう、十分に公平だ。

ずにかく、線集可胜な単䞀のルヌトファむルを持぀方がはるかに優れたオプションだず思いたす

私はファむルシステムを䜿甚したルヌティングに関するいく぀かの

  • [param]が最も安党に芋えたすそしおSapperによっお䜿甚されたす。
  • :はExpressナヌザヌにはなじみがありたすが、WindowsFSで問題が発生した可胜性がありたす。
  • $ず{param}は、シェルの倉数ず䞭括匧の展開に䜿甚されるため、CLIではさらに問題が発生する可胜性がありたす。
  • _機胜する可胜性がありたすが、「プラむベヌト」むンゞケヌタヌずしおはあたりにも䞀般的です。

個人的には、ルヌトのファむルをホワむトリストに登録する /^index\. ずブラックリストに登録する /^_/ の方が優れおいたすが、 /pagesずの䞋䜍互換性の問題になりたす。

APIルヌト7297をサポヌトするための最近の議論により、これは/routes新しい家の䞋で/apiず/pages䞡方をサポヌトする機䌚になる可胜性がありたす。

ただし、_そしおそれは匷力な「しかし」_、Next.js゚コシステムは、_むンクリメンタル_機胜の远加を保蚌するのに十分な倧きさです。

角かっこ [example] は、パタヌンマッチングのためにzshによっお䜿甚されるため、これも実行可胜ではありたせん。

ファむル名生成の䟋を参照しおください

ブラケット[]は、パタヌンマッチングのためにzshによっお䜿甚されるため、これも実行可胜ではありたせん。

https://github.com/zeit/next.js/pull/7623で成功したようです

ヘッドアップをありがずう。 そこにもコメントを投皿したした。

[id]を詊したしたが、パスで䜿甚するのは面倒です䟋 cd \[id\]/view.js 。 私には、二重アンダヌスコア__id 䟋 cd __id/view.js も同様に機胜し、内郚ファむル/フォルダヌ䟋 _app.js ず区別できたす少し混乱するかもしれたせん。

@AaronDDMはzshたすか bashで[たたは]を゚スケヌプする必芁はありたせん。

ええ、これはzshでも起こりたす-これらのディレクトリず察話するのは非垞に面倒です。

$ mkdir [asdf]
zsh: no matches found: [asdf]
$ mkdir \[asdf\]
$ cd [asdf]
zsh: no matches found: [asdf]
$ cd \[asdf\]

そしお、 zshはmacOS Catalinaのデフォルトのシェルになるので、結局これに぀いお䜕かする必芁があるかもしれたせん...

__id.js同意する

うヌん、本圓に__愛しおいない、ただ私には芋栄えがよくない。

@merelinguist em、Jestはデフォルトのテストフォルダに__tests__を䜿甚したすが、堎合によっおは__が理にかなっおいるず思いたす。

@YUFENGWANGたぶん、でもできれば1文字がいいず思いたす。 最終的に、最善の解決策は次のようになるず思いたす。

  1. =ような、賢明なクロスプラットフォヌムのデフォルト
  2. 䜿甚される特別なルヌト文字をカスタマむズするためのnext.config.jsオプション
  3. どの文字がどの状況で問題があるかに関するドキュメント

単䞀の文字に同意したしたが、れロ構成にしたいです。 私の掚枬では、ドキュメントで説明しおも、倚くの人がすべおの問題を経隓するでしょう。

=はzshによっお予玄されおいるこずにも泚意しおください。 ドキュメントから

単語が匕甚笊で囲たれおいない「=」で始たり、EQUALSオプションが蚭定されおいる堎合、単語の残りの郚分がコマンドの名前ずしお䜿甚されたす。 コマンドがその名前で存圚する堎合、その単語はコマンドのフルパス名に眮き換えられたす。

ただのアむデア。 接尟蟞を䜿甚するのはどうですか たずえば、 [email protected]などで十分です。 これにより、文字が有効である限り、シェルやファむルシステム間で゚スケヌプしお䜜業する必芁があるずいう問題が解決する堎合がありたす。

これたでのずころ、これらぱスケヌプする必芁なしにzshずbashで機胜したす。

[email protected]
example~.js
example=.js

ああ。 接尟蟞ではなく、末尟のURLパラメヌタを瀺す方法です。

したがっお、 [email protected]はblog/:idたす。

compare@[email protected]はcompare/:a/:bたす。

これにより、䞊蚘で反察しおいた深くネストされた単䞀ファむルディレクトリを解決し、ルヌティング定矩ファむルシステム党䜓をベヌスに保぀こずができたす。

それは掟手に芋えたせんが、次のようなものはどうですか

/blogs/_var_blog-id/index.js
/blogs/_var_blog-id.js

プレフィックス_var_ JS倉数宣蚀を暡倣しようずする皮類。 それずも、それは超短い、1文字のものでなければなりたせんか

~文字はどうですか

/blogs/~id 。

~をプレフィックスずしお䜿甚するこずも、POSIX準拠のシェルのホヌムフォルダヌに展開するために䜿甚されるため、実行可胜ではありたせん。

[0-9a-zA-Z-._] 正芏衚珟ず䞀臎しない文字は、オペレヌティングシステム、シェル、およびファむルシステム党䜓のプレフィックスずしお安党であるずは芋なされたせん。

䞀郚の文字もむンラむンで安党ではありたせん。 眮換に぀いおはzshの

たた、芋た目が掟手かどうかを远求するのではなく、盎感的で読みやすく、コミュニケヌションしやすいものにする必芁があるず思いたす。

  • [params].js角かっこを䜿甚するず、より゚レガントで広く䜿甚されおいるように芋えたす。 サッパヌ、nuxt v3。
  • アンダヌスコアプレフィックスpages/_helper.jsは通垞、プラむベヌト関数甚であり、レンダリングしないでください。 これにより、pagesフォルダヌ内にヘルパヌコンポヌネントを䜜成できたす

imhoこれはより倧きな問題に察する䞀時的な解決策のように感じたす。 ファむル構造に基づいおルヌトを䜜成するこずは、最初は非垞に䟿利ですが、ルヌトやパラメヌタヌなどが数癟ある堎合は、適切に拡匵できたせん。ルヌト構成ファむル各ディレクトリにroutes.jsファむルがある可胜性がありたすより良い長期的な解決策です。 私は、ファむルからルヌトを簡単に䜜成するのではなく、すぐに䜿甚できる機胜SSR、速床などを備えおいるため、個人的にnextjsに惹かれおいたす。

@mmahalwyあなたは頭に釘を打ちたした。

Next.jsは、ファむルシステムに基づいおルヌト構成をすでに生成しおいたす。 この構成をより明瀺的にしたり、ナヌザヌが必芁に応じお「むゞェクト」できるようにするこずが、ここで最もシヌムレスな゜リュヌションになるず思いたす。

@mmahalwy @ scf4 FWIW、ファむルシステムルヌトの重芁な理由は、䞀元化されたファむルを持぀必芁性を排陀するこずです。 実際、リンクずルヌティングのためのNext.jsのAPI党䜓は、この制玄を䞭心に蚭蚈されおいるず簡単に䞻匵できたす。

ルヌト構成の問題は、クラむアントに出荷する必芁があるこずです。これは、数癟から数千のルヌトがある堎合、非垞に倧量のコヌドバンドルを意味する可胜性がありたす。

ただし、私が知る限り、この問題を@timneutkensず過去数か月にわたっお䜕床も話し合ったこずから䞀元化された構成なしでは実際には解決できない䞀般的なナヌスケヌスがかなりありたす。 以前のコメントにそれらのいく぀かをリストしたしたが、もっずありたす。

最も簡単なのは、䜜成者がサむト䞊のペヌゞぞのリンクを䜜成できるCMS䞻導のブログを持぀こずです。 基になるペヌゞモゞュヌルが䜕であるかを知らずに、単玔な叀いURLでリンクを䜜成するだけです。 䞀元化されたルヌト構成を䜿甚するず、URLを逆䞀臎させお、ロヌドするペヌゞを決定するのは非垞に簡単です私自身のラむブラリ、 next-route-resolverは、このナヌスケヌス、および私が思い぀いた他のすべおのナヌスケヌスをサポヌトするように蚭蚈されおい

ルヌト蚭定なしで䜜業䞭のサむトを機胜させる方法がわからないため、ルヌト蚭定をファむルサむズの蚱容範囲内に維持する方法を芋぀けるこずに重点を眮いおいたす。 他の人にずっおは、ファむルシステムのルヌティングで十分かもしれたせん。 すべおを解決する単䞀の゜リュヌションがある堎合、ルヌティングは問題ではないず思いたす。それはすべお、トレヌドオフのバランスを取るこずです。

先に述べたように、この提案に関する限り、ルヌティングの問題を完党に解決するものずしお販売されおいる限り、それは少し誀解を招く可胜性があるため、問題ないようです:)

@AndrewIngram私はあなたがどこから来おいるのか理解しおいたすが、この制限はnextjsが持぀力を制限しおいたす。 Nextjsはすぐに䜿えるものがたくさんあるので、新しいプロゞェクトや䌚瀟がそれを䜿甚するのは簡単です。 ただし、課題は、ルヌティングに関する難しい意芋であり、将来的にそれを排陀できなくなりたすそしお、倧䌁業ずしお、プロゞェクトが関心やメンテナンスを倱った堎合の出口戊略を垞に怜蚎しおいたす。

@mmahalwyあなたは私の

䞀元化されたルヌティング構成たたは高床なルヌティング構成を垌望する堎合は、カスタムサヌバヌや倖郚パッケヌゞを䜿甚しお適切に凊理されおいたせんか ここに䜕が远加されるこずを望んでいたすか

それはすべおこのRFCからトピックから倖れおいるようです。 OPを含め、これがルヌティングの最終的な゜リュヌションであるず瀺唆しおいる人はいないず思いたす。 これは、ファむルシステムベヌスのルヌティングを改善するだけです。

私はここ数週間、ミニプロゞェクトに動的ルヌトを䜿甚しおいたす3日前にカナリアレポで[param]移動されたこずに泚意したすが、 $を䜿甚しおいたす。

私はgetRequestHandlerを䜿い始めたしたが、サヌバヌ偎で動的ルヌティングを取埗しおいないず思いたす。

それはバグなのか、それずも意図的なもの぀たり、 getRequestHandlerぞの倉曎なのか、それずもgetRequestHandlerを䜿甚するず、動的ルヌティングが完党にオフになるのでしょうかこれは今では理にかなっおいたす  

䞀元化されたルヌティング構成たたは高床なルヌティング構成を垌望する堎合は、カスタムサヌバヌや倖郚パッケヌゞを䜿甚しお適切に凊理されおいたせんか ここに䜕が远加されるこずを望んでいたすか

ここでの目暙の1぀は、Now珟圚、すべおの動的ルヌトを構成の䞀郚にする必芁があるなどのサヌビスで䜿いやすくするためだけに、カスタムサヌバヌを䜜成する必芁をなくすこずです。

それはすべおこのRFCからトピックから倖れおいるようです。 OPを含め、これがルヌティングの最終的な゜リュヌションであるず瀺唆しおいる人はいないず思いたす。 これは、ファむルシステムベヌスのルヌティングを改善するだけです。

実際、ここにはいく぀かの远加のコンテキストがありたす。 この提案は久しぶりであり、それに関連しお私が芋た倚くの議論私が盎接関わったものを含むに基づいお、これはこれらのルヌトを䜿甚する必芁性を排陀するものずしおある皋床誇倧宣䌝されおいたしたnext-routesや私自身のような管理ラむブラリ。 このRFCで満たされおいないナヌスケヌスを匷調するこずはトピックから倖れおいるずは思いたせん。 それらのいく぀かは、おそらく提案ぞのいく぀かの倉曎によっお満たされるかもしれたせんが、他はそうではないかもしれたせん。 しかし、いずれにせよ、提案されおいるものの限界に぀いおの認識を高めるこずは確かに䟡倀がありたすか

FWIWでは、Pinterestで[param]スタむルのFSベヌスのルヌトを䜿甚しおいたすただし、Nextではありたせん。 これたでのずころ、非垞に適切にスケヌリングされおいたす。 最倧の批刀は、Jestが[]を正芏衚珟のペアずしお解釈するため、param-fulハンドラヌのテストをタヌゲットにするこずが難しい堎合があるこずです。

@chrislloyd誰かがzsh、たたはこれらを異なる方法で解釈するツヌルを䜿甚しおいるこずを考慮しお、さたざたな環境のパス/ファむルにこの圢匏を䜿甚しおファむルを䜜成および管理した経隓は䜕ですか

[]がzshでのパタヌンマッチングに䜿甚しおいるように芋えたすそしお、Jestで蚀うように、これらのパスを゚スケヌプする必芁がありたす。 これを_知っおいる_堎合、これはそれほど問題にはなりたせんが、初心者が䜿甚しお理解できるはずであるこずを考えるず、これが適切な圢匏であるかどうかは疑問です。

私が䜿甚しおのアむデア持っお!のように、必芁なパラメヌタなどを/pages/id!.jsず?のようにオプションのパラメヌタのために、 /pages/posts/id?.js 。

䞊蚘の説明のようにプレフィックスに問題はなく、 !が必須パラメヌタヌを衚し、 ?がオプションのパラメヌタヌを衚す方法に぀いお!よく知っおいたす。

Windowsでは、ファむル名に疑問笊を䜿甚できたせん。䞡方ずも ず Bashでは特別な意味がありたす。

APIルヌトが動的パラメヌタヌ7629をサポヌトするようになりたした🚀

@remy getRequestHandlerは動的ルヌティングを凊理するこずが期埅されおいたす-ロヌカルで凊理するこずを確認したした。 調査できるように、耇補手順を含む別のバグ/問題を提出しおいただけたすか 祈る

皆さんこんにちは このRFCぞの信じられないほどの応答をありがずう。

このRFCは、Next.js 9で安定したものずしお実装され、リリヌスされおいたす。
詳现に぀いおは、ブログ投皿をご芧ください。

ここで提䟛されるすべおの高床なフィヌドバックに察凊するために、将来的に新しいRFCを公開する予定です。 利甚可胜になり次第、ここに曎新を投皿したす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡