Как упомянул @Nico, мы можем подойти к решению с вдохновляющим примером custom-server
в репозитории Next.js
.
Структура страницы будет такой: page->[topic]
Нам нужно проверить внутри server.js
любой входящий запрос с URL
, который начинается с символа @
, для этого мы получим помощь regular expressions
внутри express.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()
// this will match all the URLs that start with @
// e.g. @computer, @hello
server.get('/@*', (req, res) => {
return app.render(req, res, '/[topic]', req.query)
})
server.all('*', (req, res) => {
return handle(req, res)
})
server.listen(port, err => {
if (err) throw err
console.log(`> Ready on http://localhost:${port}`)
})
})
Это просто координирует запросы, которые начинаются с компонента @
до [topic]
, как и раньше, как при обработке других маршрутов.
Внутри компонента для client-side
это так просто:
<Link href="/[topic]" as=`@${topicString}`/>
Вы можете получить topicString
по-разному, например, используя query
внутри getInitialProps