çŸåšã post/:id
ã«ãŒãã§åé¡ãçºçããŠãããã³ã³ããŒãã³ããæ£åžžã«ã¬ã³ããªã³ã°ããåã«ã次ã«404
ããŒãžããã©ãã·ã¥ãããŸãã æåã¯ã post/id
ããŒãžãã¢ããªã®ç¶æ
ãfilter
ãã§ãã¯ããŠãããããããã¯reduxé¢é£ã®åé¡ã ãšæããŸãããæµ
ãã«ãŒãã£ã³ã°ã䜿çšããŠè¡šç€ºããå¿
èŠãããã³ã³ããŒãã³ãã¯ã©ãã§ãããŸããŸããã
Slackãã£ãã«ã§ããã«ã€ããŠè©±ãåã£ãåŸãåããã°æçš¿ãååŸããå¥ã®APIåŒã³åºããè¿œå ããŸããããåãåé¡ãçºçããŠããããšãããã«ããããŸããã ç§ã¯ãããå°ãªããšã1人ã®ä»ã®éçºè ã«èµ·ãã£ãããšãç¥ã£ãŠããã®ã§ã誰ããç§ãæ£ããæ¹åã«åããããšãã§ãããã©ããçåã«æã£ãŠããŸããïŒ ç§ã¯æ¬¡ã«æ§ç¯ãããã®å人çãªããŒããã©ãªãªãå®æãããããšããŠããŸãã
以äžã«ãäœãèµ·ãã£ãŠããããæ£ç¢ºã«ç¢ºèªã§ããŸãã ç¹å®ã®æçš¿ãã¬ã³ããªã³ã°ããããã³ã«ç¹æ» ãã404ãé€ããŠããã¹ãŠãA1ã«èŠããŸãã
ç§ãåŸãã¡ãªããã¯éæ¹ããªããã®ã§ããããã®ãããªå°ããªåé¡ãããã€ããããå°ãæžæããŸããð€ã ãšã«ãããç§ãè¿œå æ å ±ãæäŸã§ãããã©ããç§ã«ç¥ãããŠãã ããã ããããšãð
åãåé¡+1
ãªã³ã¯ã³ã³ããŒãã³ãããã®URLã«ã©ã®ããã«ã¬ã³ããªã³ã°ããŠããŸããïŒ <Link href="/post/1">
ãŸãã¯<Link href="/post?id=1" as="/post/1">
ãŸããïŒ
çŸåšãç§ã¯<Link prefetch href={
/ blog / } />
ãŸãã éå»ã«<Link prefetch href={
/ blog / } as={
/blog/${x.id} } />
ãè©ŠããŸããããããäžåºŠæ¥ç¶ããŸããã ãŸã åãåé¡ããããŸãã
ããªãã®href
ãšas
å°éå
·ã¯ãåãã§ãã£ãŠã¯ãªããŸããhref
ããªããæã£ãŠããå Žåã¯ãå®éã®URLã§ããpages/blog.js
ããŠãã¯ãšãªãšããŠIDãåãåããŸãhref
ã¯/blog?id=${x.id}
href
å¿
èŠãããã as
ã¯ããã®å Žåã¯/blog/${x.id}
ããªãã«ã¹ã¿ã ãªURLã§ãã
@sergiodxaãã®ã³ãŒããé 眮ããŸããã
<Link href={`/blog?id=${x.id}`} as={`blog/${x.id}`}>
<a>Read Post</a>
</Link>
ããã§ãURLã«id
ãè¿œå ããªãããã¯ãªãã¯ãããã³ã«/blog
ããŒãžãåã¬ã³ããªã³ã°ãããŸãã
@tgrecojsãã®ã³ãŒãã¹ãããããã圹ã«ç«ãŠ
const href = `/journal?home=${this.state.article.path[0]}&articlePath=${this.state.article.path[1]}&file=${this.state.article.path[2]}`
const as = `/journal/${this.state.article.path[0]}/${this.state.article.path[1]}/${this.state.article.path[2]}`
https://www.someURL.com/journal/articlePath/morePath/evenMorePath
ãšããŠã¬ã³ããªã³ã°ãããŸã
ãã¹ãã©ã®ããã«æ©èœããããç解ããŠããŸã@ugiacomanããã¯ç§ã®åé¡ã§ã¯ãããŸããã ç§ã®æåã®ã¬ããŒãã§èŠãããšãã§ãããªããç§ã¯åããã°æçš¿ã«ããŸãããã²ãŒãããŠããŸãããåé¡ã¯ãã®å¥åŠãª404
ãšã©ãŒã§ãã
@tgrecojsãµã³ãã«ãªããžããªhttps://github.com/sergiodxa/next-custom-query ïŒãããã€æžã¿ïŒhttpsïŒ //next-custom-query.now.sh/blogïŒãäœæããŸãããããã§ã䜿çšæ¹æ³ã確èªã§ããŸããåèªã¿èŸŒã¿ãªãã®ã«ã¹ã¿ã URLãšãäžèšã®next/link
ã³ã³ããŒãã³ãã䜿çšãã404ã
@sergiodxaããããšãããããŸãïŒ ç§ã¯ã¡ããã©ããããã§ãã¯ã¢ãŠãããç§ãçŸåšpingããŠãããã®ã§ããã°ãŒã°ã«ããã¬ãŒAPIã«ããã€ãã®éåæåŒã³åºããè¿œå ããŸããã 以äžã«ãã«ãŒããžã®ç§»åæ¹æ³ã瀺ããŸãããããŒã¿ãæ£ããèªã¿èŸŒãŸããŠããŸããã
gifãåé€ããŸãã
çŸåšããã®åé¡ã¯ãç§ã®æåã®ã³ã¡ã³ãã«ç€ºãããŠãããã®ãšã¯å°ãç°ãªããã®åé¡ã®è€è£œã§ãã ç§ãæåã«ãã®åé¡ã«ééãããšããããã¯ç§ãreduxã䜿çšããŠããŠãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãpost/id
ããŒãžãåŒãç¶ãã§ããªãããã ãšæããŸããã ããã«ãããäœæããã¢ããªã«çµ±åããã®ãšåãããã«ãæçš¿ããšã«æ°ããAPIåŒã³åºããçµ±åããããšã«ãªããŸããããããã§ãåãåé¡ãçºçããŠããããšãããããŸããã
ç§ã¯ããªãã®ãªããžããªããã©ãŒã¯ããã®ã«ããã€ãã®åé¡ã«ééããŠããŸããð¬ããªãã¯ããã§ç§ã®ã³ãŒããèŠã€ããããšãã§ããŸã-> https://github.com/tgrecojs/next-custom-query-async ã ããªããèããŠããããšãç§ã«ç¥ãããŠãã ããïŒ ð
ãããžã§ã¯ãããã©ãŒã¯ãããšãusageLimitsãšã©ãŒã¡ãã»ãŒãžã§åããšã©ãŒãçºçããã®ã§ã400ãååŸããŠããããã§ãã ãããããããããªãããã®ãšã©ãŒãåãåã£ãŠããçç±ã§ãã
Okã ææ¥ããå°ã調æ»ããŸãããåé¡ãéãããšãã«æçš¿ããåç»ã/blog/:id
ã«ãŒãã§APIãªã¯ãšã¹ããè¡ã£ãŠããªãããšãææããããšæããŸãã 代ããã«ã /blog
ã«ãŒãé·ç§»ã§åéãããreduxã¹ãã¢ããã®æçš¿ããã£ã«ã¿ãªã³ã°ããŠããããããã®åé¡ã«å°éããçç±ã«ã¯ãªããŸããã§ããã reduxã¹ãã¢ãšé¢ä¿ããããšæã£ãã®ã§2çªç®ã®APIåŒã³åºãïŒ blog/:id
å
ã§è¡ãããïŒã®ã¿ãå®è£
ããŸããããåããšã©ãŒãçºçããŸããããããã¯ç§ã®ã³ãŒãã®çŸåšã®å®è£
ã§ã¯ãããŸããã
åããã°ãçºçããããšã«æ°ã¥ãããããã«ãAPIåŒã³åºãã1ã€ã ã䜿çšããããã«åãæ¿ãïŒ /blog
ïŒãå¿
èŠãªããã°æçš¿ãIDã§ãã£ã«ã¿ãªã³ã°ããŸããã
@sergiodxa䜿çšå¶éã§ã¯ãªãããšã確èªã§ããŸãã id
ãåžžã«/blog/:id
ã«ãŒãã«æ£ããæž¡ããããšã¯éããªãããšãããããŸã...åãåã£ã400
ãšã©ãŒãæ·»ä»ããŸããã id
ãæªå®çŸ©ã§ãããïŒãã®å ŽåïŒãšã©ãŒãçºçããã®ã¯ãã®ãããšæãããŸãã
以äžã«å¥ã®ãããªãå«ããŸããã ãªãããããã®ããã«æ¯ãèãã®ãã«ã€ããŠäœãèãã¯ãããŸããïŒ ãã®ãªããžããªå
ã®<Link />
ã¿ã°ãå€æŽããŠããŸãããããŸã åé¡ããããŸãð¬ã
ç¹°ãè¿ãã«ãªããŸãããäžã®ãããªã¯ãäœæãããµã³ãã«ãªããžããªïŒ https://github.com/sergiodxa/next-custom-queryïŒå ã§ãšã©ãŒãåçŸããŠããããšã瀺ããŠã
ãŸããã«ã¹ã¿ã ã«ãŒããªãã§404ãç¹æ»
ããŸãã 次ã®ã³ãŒãã䜿çšããŠã pages/
å
ã®orders.js
ãšãããã¡ã€ã«ãäœæããŸãã
import { Component } from 'react';
class Orders extends Component {
render() {
return (
<div>
<h2>My Orders</h2>
</div>
)
}
}
export default Orders;
ããªãé倧ãªåé¡ã®ããã§ãð
ç§ã¯ãããè€è£œããããšããŸããããURLã®æ«å°Ÿã«ã¹ã©ãã·ã¥ãããããã /orders
移åãããšã404ã¯è¡šç€ºãããŸãããã /orders/
ã次ã®ããã«è¡šç€ºãããŸããã³ã³ãã³ãã®åã«404ãç¹æ»
ããŸããããã¯ãéçºã¢ãŒããšæ¬çªã¢ãŒãã®ããããã§çºçããŸãã
ãããããã¯æ¢ç¥ã®åé¡ã§ãã https://github.com/zeit/next.js/issues/1189
æ«å°Ÿã®ã¹ã©ãã·ã¥ãåå ã§åé¡ãçºçããªãã£ãã®ã§ãäœãä»ã®ãã®ãå¿ èŠã§ãããïŒ
ã³ãŒãã«ããã€ãã®å€æŽãå ãã2ã€ã®ç°ãªãããŒãžã§ã³ããããã€ããŸããã1ã€ã¯prefetch
ã䜿çšãããã1ã€ã¯äœ¿çšããŸããã ã©ã¡ãã®ã¢ããªã±ãŒã·ã§ã³ãpost/:id
ã«ãŒããæ£åžžã«ããŒãã§ããªãããšã«æ³šæããŠãã ããã
ãªã³ã¯ã§prefetch
ã䜿çšãããšãåããã°æçš¿ã®ãªã³ã¯ãã¬ã³ããªã³ã°ãããšãã«Page Does Not Exist Error
ã¹ããŒãããããšã«æ°ã¥ããŸããã 以äžã«ç§ã®ã³ã³ãœãŒã«ã®ã¹ã¯ãªãŒã³ã·ã§ãããèŠãããšãã§ããŸãã
ããªãã§ããã䜿çšããªãå Žåãäžèšã®ãšã©ãŒã¯çºçããªããªããŸãããã¢ããªã±ãŒã·ã§ã³ã¯ã¬ã³ããªã³ã°ãããŸããã ãã®åé¡ãæåã«æçš¿ãããšããç§ã®ã³ã³ããŒãã³ãã¯post/:id
ã³ã³ããŒãã³ãããšã«ããã°ãåæåããŠããã ãã以æ¥ãåã
ã®æçš¿ãã¬ã³ããªã³ã°ãããããšã¯ãããŸããã
ãã®åé¡ã®èšºæã«åœ¹ç«ã€æ å ±ãããã«æäŸã§ãããã©ããæããŠãã ããã ð€
@tgrecojsç§ã¯ã»ãŒåãåé¡ãæ±ããŠããŸãã prefetch
ã¯ç§ã®åé¡ã解決ããŸãã
ç§ãåŸãæ¯ãèãã¯æ¬¡ã®ãšããã§ãïŒ
ãããåé¡ã®ãããã°ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãïŒ
è¿œå æ
å ±ïŒããŒãv6.10.3
ãChrome Version 60.0.3112.90
ç·šéïŒããªããã¡ãããããã¹ãã§ããããã«ã¢ããªããããã€ããŸããhttps://datahub.now.sh/ ãããã¯ãã®æ¯ãèãããããªã³ã¯/ @ [username]ã§ã
@ Theo-ãã®next / linkã®hrefã¯user?id=1
ã代ããã«/user?id=1
ãè©Šãããšãã§ããŸããïŒ ç§ã¯Next.jsãã«ååŸããããšããŠããã®ã§ã404ã ãšæã/current/path/user?id=1
ã®ä»£ããã«/user?id=1
ããããŒãžããªããŒããããšãã«ãããæ£åžžã«åäœããŸãã®ã§ããµãŒãã®ã¬ã³ããªã³ã°ã
ããããã
@tgrecojsåãç¹æ» 404ã®åäœããããŸããã ç§ã®å Žåãã¯ã©ã€ã¢ã³ãã§ã¯æ©èœããªãã£ãç°å¢å€æ°ãã€ãŸã404ãšã®ãªã³ã¯ããããŸãããããµãŒããŒã§ã¯æ©èœããŠããŸããã https://medium.com/the-tech-bench/next-js-environment-variables-d2f6ea1a1dcaã§è§£æ±ºããŸãã
@andreaskeller hmmmokç§ã¯ããããã§ãã¯ããŸãã ããããšãããããŸã!!! çŸåšãã¢ããªããµãŒããŒã¬ã³ããªã³ã°ã®å Žåã«ã®ã¿ã.envå€æ°ã䜿çšããŠããŸãã dotenvã䜿çšããŠCSRãŸãã¯SSRã確èªããé«æ¬¡ã³ã³ããŒãã³ãããããŸãããããSSRã®å Žåã¯ãããã°æçš¿ããã°ã«èšé²ããããã«å¿ èŠãªé¢æ°ããã£ã¹ãããããŸãã
ãããç§ã¯ãã§ã«å€æ°ãæ£åžžã«æ©èœãããŠããŸãã BLOGGER_API_KEY
ãååŸããHOCã䜿çšããŠ/blog
ã«ãŒããã¬ã³ããªã³ã°ããŠããã®ã§ããããã®äŸã§æ©èœããŠããŸã...ç§ã®/post/:id
ã®åããŒãžã¯äœã䜿çšããŠããŸããç°å¢å€æ°ã
ããå°ãæãäžããã€ããã§ããããŸãããã°ç§ã¯ããã®åºã«éããããšãã§ããŸãïŒ
ããã§ã®åé¡ã®ã»ãšãã©ã¯ä¿®æ£ãããŠããããã§ãã ãã®åé¡ã«ãåãçµã¿ãŸãhttps://github.com/zeit/next.js/issues/1189
ãããéããŸãã ããããã³ã¢ã§äœããããå¿ èŠãããå Žåã¯ãç§ã«ç¥ãããŠãã ããã
@sergiodxaæšå€ã®äŒè©±ã«ãããšãç§ã¯èªåã®åé¡ã瀺ã
ä¿®æ£ãããŠããŸããã
ç§ã¯åãåé¡ãæ±ããŠããŸãããã«ã¹ã¿ã ã«ãŒãããããŸããã /pages/pipeline.tsxãããã/ pipeline /ã404ãç¹æ» ããŠããéã/ pipeline urlã¯åé¡ãªãæ©èœãããgetInitialPropsããåŒã³åºããã«ããŒãžãèªã¿èŸŒãããšããŸãïŒãµãŒããŒäžã§ã¯404ã ã£ãããã§ãïŒã
@ ex3ndrããã§åé¡ã解決ãããã©ããã¯
https://github.com/zeit/next.js#disabling -file-system-routing
次ã«ãã«ã¹ã¿ã ã«ãŒãããããããåã«fileSystemããã«ããããšããå¯èœæ§ããããŸãã
@moaxacaç¬èªã®ã«ã¹ã¿ã ã«ãŒãã£ã³ã°ãå¿ èŠã ã£ãã®ã§ãåãæ¹æ³ã§è§£æ±ºããŸããã次ã®ã«ãŒãã£ã³ã°ãå®å šã«ç¡å¹ã«ããŸããã
ãã®åé¡ãçºçããŠããŸãã @moaxacaã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ã«ã¯ããŸãLink
ã³ã³ããŒãã³ãã䜿çšããããšpushRoute
ã¡ãœããã䜿çšããããšãéžæããŸããã
åºæ¬çãªäŸïŒ
import { connect } from 'react-redux'
import { Router } from '../routes'
// ----
export default class Link extends React.Component {
handleClick(evt, url) {
evt.preventDefault()
Router.pushRoute(url)
}
render() {
const { url, title } = this.props
return (
<a href={ url} onClick={ (evt) => this.handleClick(evt, url) }>{title}</a>
)
}
}
ããã¯ãããç解ããŠããããã§ããšã©ãŒãç¹æ» ããŠããŸããã ããããããã¯å°ãæã£åãæ©ãæããããŸãã
åé¡ãä¿å
以åã«åãåé¡ãçºçãã解決ããããšãã§ããŸããã ExpressãµãŒããŒã®ã»ããã¢ããã䜿çšããŠããŸãã æ£ããããŒãžã«ããŒãããåã«404ããŒãžãç¹æ» ããçç±ã¯ãããŒãžã¹ã©ãã°ãã³ã³ããŒãã³ãåãšäžèŽããªãããã§ããããšãããããŸããã
ãã®ã³ãŒãããããšã404ãç¹æ» ããŸãã
server.get('/search', (req, res) => {
const actualPage = '/search_results'
const queryParams = { filters: req.query }
app.render(req, res, actualPage, queryParams)
})
/search
ãšç§ã®actualPage
å€ãç°ãªãããšã«æ³šæããŠãã ããã
ã³ã³ããŒãã³ããšactualPage
å€ãã search
ããããŒãžã¹ã©ãã°ãšåãã«å€æŽãããšã404ãã©ãã·ã¥ãæ¶ããŸãã 以äžã®äœæ¥ã³ãŒããåç
§ããŠãã ããã
server.get('/search', (req, res) => {
const actualPage = '/search'
const queryParams = { filters: req.query }
app.render(req, res, actualPage, queryParams)
})
çŸåšãäž¡æ¹ãšã/search
ãŸãã
ç§ã®è±èªã®äººã«ç³ãèš³ãããŸããã
next.config.js
useFileSystemPublicRoutes
ããããã£ã確èªããããšããå§ãããŸãã falseã®å Žåã¯ãserver.jsã§ãã¹ãŠã®ã«ãŒããã³ãã©ãŒãèªåã§å®çŸ©ããå¿
èŠãããããšãæå³ããŸãã
ããã«ãããç¹æ» ãã404ãä¿®æ£ãããŸãã
<Link href="/somepage?id=value" as="/somepage/value">
server.get("/somepage/:id", (req, res) => {
return app.render(req, res, "/maps", { id: req.params.id })
})
const { id } = this.props.url.query
ã ãããããã«äžåºŠã ãçããã«ã¯ïŒ
href
=> pages
ãã£ã¬ã¯ããªå
ã®ãã¹+ã¯ãšãªæåå
as
=>ãã©ãŠã¶ã®URLããŒã«è¡šç€º
äŸïŒ
/products/:id
ãšããURLããããŸã
pages/product.js
äœæããŸããexport default class extends React.Component {
static async getInitialProps({query}) {
console.log('SLUG', query.slug)
return {}
}
render() {
return <h1>The product page</h1>
}
}
/products/:id
ã«pages/product.js
ããã³æäŸid
ã®äžç°ãšããŠã query
getInitialPropsã§ïŒserver.get("/products/:slug", (req, res) => {
return app.render(req, res, "/product", { slug: req.params.slug })
})
next/link
ã䜿çšããŸãã<Link href="/product?slug=something" as="/products/something">
href
ãšas
ãæ瀺çã«æå®ããå¿
èŠãããçç±ã¯ãNext.jsãã¯ã©ã€ã¢ã³ãåŽã®ä»ã®ããŒãžãèªèããªãããã§ãã ãã¹ãŠã®ããŒãžã®ãããã§ã¹ããã¯ã©ã€ã¢ã³ãåŽã«éä¿¡ããããã§ã¯ãªããåŸç¶ã®ã«ãŒãã¯é
延èªã¿èŸŒã¿ãããŸããããã¯ã¹ã±ãŒã©ãã«ã§ãã
ãã¹ãŠã®ã«ãŒãã®äºåå®çŸ©ããããããã§ã¹ããéä¿¡ããããšã«ããã href
ãšas
æäŸãæœè±¡åããã³ãã¥ããã£ããã±ãŒãžããããŸãããããè¡ããªãããããã¹ãŠã®å¯èœãªã«ãŒãã®å®å
šãªãããã§ã¹ããéä¿¡ããªãããšããå§ãããŸããããã¹ã±ãŒã©ãã«ã§ã
https://github.com/fridays/next-routes
ãŸããã¬ã³ããªã³ã°404ã¯Next.jsã®ããã©ã«ãã®åäœã§ã¯ãªããªã£ãããšã«ã泚æããŠãã ããã 代ããã«ããŸãŒã³æ©èœã®ããŒãžããªããŒãããŸãã
ãã£ã ã«æè¬ããŸããå®å šã«æ確ãªèª¬æïŒ
@timneutkens
ãªã³ã¯ã®hrefãšasã®å Žåã å¥ã®å€ãæž¡ããŸãã href
ã®å€ãšas
ã®å€ãååŸããã«ã¯ã©ãããã°ããã§ããã
ãã¢ããã¹ãããŸãã req.params.slugã¯as
ã®å€ã«ãªããšæããŸãã 次ã«ãã©ãããã°href
ã®å€ãååŸã§ããŸããã
@timneutkensããªãã¯ç§ãæã£ãç§ã®åé¡ãäœæéèŠåŽããŠæ€çŽ¢ãããããããªãïŒD
ãªã³ã¯ã³ã³ããŒãã³ãããã®URLã«ã©ã®ããã«ã¬ã³ããªã³ã°ããŠããŸããïŒ
<Link href="/post/1">
ãŸãã¯<Link href="/post?id=1" as="/post/1">
ãŸããïŒ
ãããããã¥ã¡ã³ãã«å ¥ããå¿ èŠããããŸãã ïŒåã³ïŒ
@sergiodxa
ã ãããããã«äžåºŠã ãçããã«ã¯ïŒ
href
=>pages
ãã£ã¬ã¯ããªå ã®ãã¹+ã¯ãšãªæåå
as
=>ãã©ãŠã¶ã®URLããŒã«è¡šç€ºäŸïŒ
/products/:id
ãšããURLããããŸã
pages/product.js
äœæããŸããexport default class extends React.Component { static async getInitialProps({query}) { console.log('SLUG', query.slug) return {} } render() { return <h1>The product page</h1> } }
- ExpressãŸãã¯ãã®ä»ã®ãµãŒããŒãžã®ã«ãŒããè¿œå ããŸããããã¯SSRã®å Žåã®ã¿ã§ãã ããã¯äœãã©ããªããšãURLã®ã«ãŒãã§ãã
/products/:id
ã«pages/product.js
ããã³æäŸid
ã®äžç°ãšããŠãquery
getInitialPropsã§ïŒserver.get("/products/:slug", (req, res) => { return app.render(req, res, "/product", { slug: req.params.slug }) })
- ã¯ã©ã€ã¢ã³ãåŽã®ã«ãŒãã£ã³ã°ã§ã¯ã次ã®ããã«
next/link
ã䜿çšããŸãã<Link href="/product?slug=something" as="/products/something">
href
ãšas
ãæ瀺çã«æå®ããå¿ èŠãããçç±ã¯ãNext.jsãã¯ã©ã€ã¢ã³ãåŽã®ä»ã®ããŒãžãèªèããªãããã§ãã ãã¹ãŠã®ããŒãžã®ãããã§ã¹ããã¯ã©ã€ã¢ã³ãåŽã«éä¿¡ããããã§ã¯ãªããåŸç¶ã®ã«ãŒãã¯é 延èªã¿èŸŒã¿ãããŸããããã¯ã¹ã±ãŒã©ãã«ã§ãããã¹ãŠã®ã«ãŒãã®äºåå®çŸ©ããããããã§ã¹ããéä¿¡ããããšã«ããã
href
ãšas
æäŸãæœè±¡åããã³ãã¥ããã£ããã±ãŒãžããããŸãããããè¡ããªãããããã¹ãŠã®å¯èœãªã«ãŒãã®å®å šãªãããã§ã¹ããéä¿¡ããªãããšããå§ãããŸããããã¹ã±ãŒã©ãã«ã§ãhttps://github.com/fridays/next-routes
ãŸããã¬ã³ããªã³ã°404ã¯Next.jsã®ããã©ã«ãã®åäœã§ã¯ãªããªã£ãããšã«ã泚æããŠãã ããã 代ããã«ããŸãŒã³æ©èœã®ããŒãžããªããŒãããŸãã
次ã®ãããªãªã¹ãããããŒã®é
åãããªãå Žåã«ã§ããããšïŒ
[
home: '/home',
about:'/about',
post: 'post/:post_id?'
]
ã
次ã«ã as's
å€ããååŸããŸãããã href
ã©ãã§ããïŒ ããããšã
ããªãã¯äœã䜿ã£ãŠããå Žåã¯router.push()
ã§ã¯ãªã<Link>
ã©ã®ããã«ããªããåãçµæãåŸãããšãã§ããŸããïŒ
@justinmchaseç§ã¯ã¡ããã©åãåé¡ãæ±ããŠããŸããã ãŸã è¡ã£ãŠããªãå Žåã¯ã次ã®ã«ãŒã¿ãŒã®ããã¥ã¡ã³ãã確èªããŠãã ããã
ããªãã¯ãããRouter.push(url, as, options)
ãšããŠäœ¿ãããšãã§ããŸãïŒ
Router.push('/post/[pid]', '/post/abc')
@timneutkens ZEIT.nowã§next.jsã¢ããªããã¹ããããã®ã§ãããExpressãµãŒããŒãå®è¡ãããªãã·ã§ã³ããããŸããã ç§ã¯ä»ç§ã®ããããªURLã倱ãã param=value¶m=value
ããå®è¡ã§ããŸãããããããšãå¥ã®æ¹æ³ããããŸããïŒ ã»ã«ãžãªãæçš¿ããäŸã¯ææã«èŠããŸãã
åçã«ãŒããè©ŠããŸããããã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ãå£ããŠã次ã®ãããªãªã³ã¯ã衚瀺ãããŸãã
<Link href={`/integration?slug=${slug}`} as={`/integration/${slug}`}>
httpïŒ// localhost ïŒ8080 / _next / static / development / pages / Integration.jsã404not foundãè¿ããããããŒãžå šäœããªããŒããããããã«ãªããŸããã
@timneutkens ZEIT.nowã§next.jsã¢ããªããã¹ããããã®ã§ãããExpressãµãŒããŒãå®è¡ãããªãã·ã§ã³ããããŸããã ç§ã¯ä»ç§ã®ããããªURLã倱ãã
param=value¶m=value
ããå®è¡ã§ããŸãããããããšãå¥ã®æ¹æ³ããããŸããïŒ ã»ã«ãžãªãæçš¿ããäŸã¯ææã«èŠããŸãã
åçã«ãŒãçšã®ã«ã¹ã¿ã ãµãŒããŒã¯å¿ èŠãããŸãããhttpsïŒ//nextjs.org/docs/routing/dynamic-routesãåç §ããŠ
@timneutkensè¿
éãªè¿ä¿¡ããããšãããããŸããåçã«ãŒããè©ŠããŸããããã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ãå£ããŸãïŒæŽæ°ãåç
§ïŒã éçºã¢ãŒãã®package.jsonã¹ã¯ãªããã§next
ããŠããŒã«ã«ã§å®è¡ããŠããŸãã
ã³ãŒãã§pages/integration/index.js
ãã次ã®ã³ãŒãã§pages/integration/[slug].js
ããŠãåé¡ã解決ããŸããã
import ProductDetailPage from './index'
export default ProductDetailPage
æŠèª¬ããããšãè¡ãæ£ããæ¹æ³ã¯ã pages/integration/[slug].js
ãäœæããããšã§ãã
ãããŠã次ã®ããã«ãªã³ã¯ããŸãã
<Link href={`/integration/[slug]`} as={`/integration/${slug}`}>
ããã«ã¡ã¯ç§ããããåŒã¶ãšããªãç§ã¯å°ããããšãã§ããŸã
Router.push( '/about?id=1234','/about')
IDãååŸã§ããã䜿çšããŠããããŒãžã¯[... index] .jsã§ããããã¯ãã«ããã€ãããã¯ãã£ãããªãŒã«ããŒãžã§ããããã€ãããã¯ã§ã¯ãªãä»ã®ããŒãžã«ç§»åãããšãcar.jsã®äŸã§æ£ããæ©èœããŸãã Vehicle.jsã«ããã·ã¥ããŸãã
ãã€ãããã¯ãã£ãããªãŒã«ããŒãžã«ããã·ã¥ããŠIDããã¹ã¯ããããã§ãååŸã§ããããè¯ãæ¹æ³ã¯ãããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
ã ãããããã«äžåºŠã ãçããã«ã¯ïŒ
href
=>pages
ãã£ã¬ã¯ããªå ã®ãã¹+ã¯ãšãªæååas
=>ãã©ãŠã¶ã®URLããŒã«è¡šç€ºäŸïŒ
/products/:id
ãšããURLããããŸãpages/product.js
äœæããŸãã/products/:id
ã«pages/product.js
ããã³æäŸid
ã®äžç°ãšããŠãquery
getInitialPropsã§ïŒnext/link
ã䜿çšããŸããhref
ãšas
ãæ瀺çã«æå®ããå¿ èŠãããçç±ã¯ãNext.jsãã¯ã©ã€ã¢ã³ãåŽã®ä»ã®ããŒãžãèªèããªãããã§ãã ãã¹ãŠã®ããŒãžã®ãããã§ã¹ããã¯ã©ã€ã¢ã³ãåŽã«éä¿¡ããããã§ã¯ãªããåŸç¶ã®ã«ãŒãã¯é 延èªã¿èŸŒã¿ãããŸããããã¯ã¹ã±ãŒã©ãã«ã§ãããã¹ãŠã®ã«ãŒãã®äºåå®çŸ©ããããããã§ã¹ããéä¿¡ããããšã«ããã
href
ãšas
æäŸãæœè±¡åããã³ãã¥ããã£ããã±ãŒãžããããŸãããããè¡ããªãããããã¹ãŠã®å¯èœãªã«ãŒãã®å®å šãªãããã§ã¹ããéä¿¡ããªãããšããå§ãããŸããããã¹ã±ãŒã©ãã«ã§ãhttps://github.com/fridays/next-routes
ãŸããã¬ã³ããªã³ã°404ã¯Next.jsã®ããã©ã«ãã®åäœã§ã¯ãªããªã£ãããšã«ã泚æããŠãã ããã 代ããã«ããŸãŒã³æ©èœã®ããŒãžããªããŒãããŸãã