react框架next.js學(xué)習(xí)之API?路由篇詳解
正文
next.js 作為最熱門的 react 框架,不過(guò)這么久了好像國(guó)內(nèi)使用率一直不太高。最近在研究做個(gè)小項(xiàng)目正好做下筆記,有興趣的可以一起來(lái)學(xué)習(xí)。
next.js 首頁(yè)標(biāo)榜的 12 個(gè)特性之一就是 API routes,簡(jiǎn)單的說(shuō)就是可以 next.js 直接寫 node 代碼作為后端服務(wù)來(lái)運(yùn)行。因此我們可以直接使用 next.js 直接維護(hù)一個(gè)全棧項(xiàng)目,聽(tīng)起來(lái)很香的樣子。
使用方式
next.js 中使用文件路徑作為路由,所以在 API routes 中也是一樣,一般的頁(yè)面文件我們會(huì)放在 pages 下,而 API routes 文件我們則需要放在 pages/api 下,emmm,其實(shí)我覺(jué)得這個(gè)設(shè)計(jì)有點(diǎn)奇怪,為啥不是在外層增加一個(gè) server 或者 api 的文件夾呢,放在 pages 下面感覺(jué)怪怪的。而請(qǐng)求時(shí),需要請(qǐng)求對(duì)應(yīng)的 /api/ 下的文件地址,emmm,好吧,真的挺奇怪的。
所以我們要新增一個(gè) API 只需要在 pages/api/ 目錄下新建一個(gè)文件即可。
API 路由匹配
而 API 的文件命名有三種方式:
pages/api/route.js
pages/api/route/[param].js
pages/api/route/[...slug].js
第一種很好理解,就是會(huì)處理發(fā)送到 /api/route 的請(qǐng)求,第二種會(huì)接受來(lái)自 /api/route/xxxx 的請(qǐng)求,并將 xxxx 作為參數(shù)放到 param 中,而第三種則是會(huì)接收所有的到 /api/route/ 下的請(qǐng)求,比如 /api/route/a/b/c 等。
當(dāng)請(qǐng)求過(guò)來(lái)進(jìn)行匹配時(shí), next.js 將會(huì)按照從上到下的優(yōu)先級(jí)來(lái)匹配應(yīng)該處理的路由,比如上面三個(gè)文件同時(shí)存在,那么發(fā)送到 /api/route 的請(qǐng)求將會(huì)從被第一個(gè)文件所處理,而 /api/route/a 的請(qǐng)求會(huì)被第二個(gè)文件所處理,剩余的請(qǐng)求才會(huì)進(jìn)入第三個(gè)文件中處理。
API 處理
而在處理文件中,會(huì)調(diào)用默認(rèn)的導(dǎo)出函數(shù)來(lái)處理請(qǐng)求:
export default function handler(req, res) {
res.status(200).json({ foo: 'bar' });
}
如上代碼表示請(qǐng)求的響應(yīng)體 http 狀態(tài)碼為 200,響應(yīng)體中是一段 json。
除了 nodejs 原生中包含的一些屬性和方法外,next 還在 res 中擴(kuò)展了以下幾個(gè)常用的方法:
res.status(code)響應(yīng)的http狀態(tài)碼res.json(body) json響應(yīng)體res.send(body)其它響應(yīng)體,可以是string、object、Bufferres.redirect([status,] path)重定向res.revalidate(urlPath)重新進(jìn)行校驗(yàn)
而在 req 中則擴(kuò)展了以下幾個(gè)常用屬性:
req.cookies請(qǐng)求包含的cookiesreq.query請(qǐng)求的query參數(shù)req.body請(qǐng)求體
是不是很熟悉,沒(méi)錯(cuò)就是 express.js 的一些功能。
API 配置
除了 export 默認(rèn)的處理函數(shù)處理請(qǐng)求外,還可 export 一個(gè) config 對(duì)象來(lái)配置:
export const config = {
api: {
// 請(qǐng)求體處理
bodyParser: {
sizeLimit: '1mb'
},
// 響應(yīng)體的大小限制
responseLimit: '8mb',
// 用于指定請(qǐng)求是否被外部服務(wù)處理,這個(gè)暫時(shí)還沒(méi)搞清楚是怎么工作的,等研究完了再來(lái)更新
externalResolver: true
}
};
邊緣計(jì)算支持
此外,next.js 的 API routes 還支持最近很火的邊緣計(jì)算,不過(guò)邊緣計(jì)算的運(yùn)行時(shí)和 node 運(yùn)行時(shí)差異較大,需要注意改動(dòng)。由于暫時(shí)對(duì)這方面沒(méi)有研究,不做過(guò)多深入。
自定義 API
除了默認(rèn)的請(qǐng)求處理,還可以借助外部 server 來(lái)處理請(qǐng)求,比如 graphql:
import { createServer } from '@graphql-yoga/node';
const typeDefs = /* GraphQL */ `
type Query {
users: [User!]!
}
type User {
name: String
}
`;
const resolvers = {
Query: {
users() {
return [{ name: 'Nextjs' }];
}
}
};
const server = createServer({
schema: {
typeDefs,
resolvers
},
endpoint: '/api/graphql'
});
export default server;
注意點(diǎn)
另外需要注意的是,如果配置了 pageExtensions,API 文件的命名也會(huì)受影響。
還有如果同時(shí)存在 pages/api/route/[param].js 和 pages/api/route/[param1].js 不知道會(huì)發(fā)什么什么,回頭有空試試。
總結(jié)
使用 next.js 的 API routes,我們可以直接在項(xiàng)目中編寫 nodejs 后端代碼,輕松完成全棧開(kāi)發(fā)。
再多說(shuō)幾句,經(jīng)過(guò)這么多年的發(fā)展,前后端終于分離了,然而最近幾年,前端又開(kāi)始干起后端的活,夢(mèng)回 php、jsp。古人云的好:風(fēng)水輪流轉(zhuǎn),前后不分家。
以上就是react框架next.js學(xué)習(xí)之API 路由篇詳解的詳細(xì)內(nèi)容,更多關(guān)于react框架next.js API路由的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
react實(shí)現(xiàn)一個(gè)優(yōu)雅的圖片占位模塊組件詳解
這篇文章主要給大家介紹了關(guān)于react如何實(shí)現(xiàn)一個(gè)還算優(yōu)雅的占位模塊圖片組件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
react?路由權(quán)限動(dòng)態(tài)菜單方案配置react-router-auth-plus
這篇文章主要為大家介紹了react路由權(quán)限動(dòng)態(tài)菜單方案react-router-auth-plus傻瓜式配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
使用React?Hooks模擬生命周期的實(shí)現(xiàn)方法
這篇文章主要介紹了使用React?Hooks模擬生命周期,本文舉例說(shuō)明如何使用 hooks 來(lái)模擬比較常見(jiàn)的 class 組件生命周期,需要的朋友可以參考下2023-02-02
React根據(jù)當(dāng)前頁(yè)面路由進(jìn)行自動(dòng)高亮示例代碼
要根據(jù)當(dāng)前頁(yè)面路由自動(dòng)高亮頂部菜單項(xiàng),可以使用 React Router 的 useLocation 鉤子來(lái)獲取當(dāng)前路徑,并根據(jù)路徑動(dòng)態(tài)設(shè)置菜單項(xiàng)的高亮效果,本文給大家介紹了一個(gè)完整的示例,展示如何根據(jù)當(dāng)前頁(yè)面路由自動(dòng)高亮頂部菜單項(xiàng),需要的朋友可以參考下2024-07-07
React合成事件及Test Utilities在Facebook內(nèi)部進(jìn)行測(cè)試
這篇文章主要介紹了React合成事件及Test Utilities在Facebook內(nèi)部進(jìn)行測(cè)試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Shopee在React?Native?架構(gòu)方面的探索及發(fā)展歷程
這篇文章主要介紹了Shopee在React?Native?架構(gòu)方面的探索,本文會(huì)從發(fā)展歷史、架構(gòu)模型、系統(tǒng)設(shè)計(jì)、遷移方案四個(gè)方向逐一介紹我們?nèi)绾我徊讲降貪M足多團(tuán)隊(duì)在復(fù)雜業(yè)務(wù)中的開(kāi)發(fā)需求,需要的朋友可以參考下2022-07-07
詳解如何在React中優(yōu)雅的使用addEventListener
這篇文章主要為大家詳細(xì)介紹了如何在React中優(yōu)雅的使用addEventListener,文中的示例代碼簡(jiǎn)潔易懂,對(duì)大家學(xué)習(xí)React有一定的幫助,需要的可以參考一下2023-01-01

