[Next] 三.next自定義服務(wù)器和路由

next 服務(wù)端渲染

實(shí)際上,next 一直都是執(zhí)行的服務(wù)端渲染.npm start執(zhí)行的是 next 自帶的服務(wù)器來(lái)運(yùn)行你的應(yīng)用.next 是支持自定義服務(wù)器的,同時(shí)能夠支持現(xiàn)有的路由和模式,你可以在此基礎(chǔ)上添加一些自己的需求.

新建/server.js

const express = require("express");
const next = require("next");
const dev = process.env.NODE_ENV !== "production"; //判斷是否開(kāi)發(fā)環(huán)境
const app = next({ dev }); //創(chuàng)建一個(gè)next的app
const handle = app.getRequestHandler(); //請(qǐng)求處理

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

    //用來(lái)進(jìn)行簡(jiǎn)化路徑匹配
    server.get("/b/:currentBookId", (req, res) => {
      const actualPage = "/book/[currentBookId]";
      const queryParams = { currentBookId: req.params.currentBookId };
      app.render(req, res, actualPage, queryParams);
    });

    server.get("*", (req, res) => {
      return handle(req, res);
    });

    server.listen(6776, err => {
      if (err) throw err;
      console.log("> Ready on http://localhost:6776");
    });
  })
  .catch(ex => {
    console.error(ex.stack);
    process.exit(1);
  });

其中 app 有 next(opts: object)創(chuàng)建而來(lái)

  • dev(bool)是否在開(kāi)發(fā)模式下啟動(dòng) Next.js-默認(rèn) false
  • dir(string)項(xiàng)目所在的位置-默認(rèn)'.'
  • quiet(bool)隱藏包含服務(wù)器信息的錯(cuò)誤消息-默認(rèn) false
  • conf(object)與您要使用的對(duì)象相同 next.config.js-默認(rèn){}

同時(shí)修改 package.json 中的配置

"server:dev": "node server.js",
"server:start": "NODE_ENV=production node server.js",

解決使用路由隱藏 as 會(huì) 404 的問(wèn)題

問(wèn)題在這

例如

<Link href={`/book/${item.id}`} as={`/b/${item.id}`}>

然后在npm run dev的情況下,我們使用 next 默認(rèn)的服務(wù)器.頁(yè)面在使用 as 的時(shí)候起了一個(gè)縮寫(xiě)路徑名稱,這種情況在第一次進(jìn)入是正常匹配的,但是刷新就會(huì) 404,原因在于服務(wù)器目前并不清楚 b 代表的是什么路徑.

而在 server.js 中就添加了關(guān)于 b 的縮寫(xiě)匹配

//用來(lái)進(jìn)行簡(jiǎn)化路徑匹配
server.get("/b/:currentBookId", (req, res) => {
  const actualPage = "/book/[currentBookId]";
  const queryParams = { currentBookId: req.params.currentBookId };
  app.render(req, res, actualPage, queryParams);
});

此時(shí)我們npm run server:dev開(kāi)啟自定義服務(wù)器,打開(kāi)頁(yè)面進(jìn)入縮寫(xiě)路徑,我們刷新發(fā)現(xiàn)頁(yè)面會(huì)保留.

之后npm run dev命令可以拋棄了

多路徑頁(yè)面

next 默認(rèn)會(huì)將 pages 下的 js 文件創(chuàng)建出對(duì)應(yīng)的路徑.我們起了路由別名,并且通過(guò)自定義路由讓路由的別名生效.但是我們?cè)俅屋斎?book/[currentBookId],發(fā)現(xiàn)依舊可以匹配到同樣的頁(yè)面,造成一個(gè)頁(yè)面擁有的 2 個(gè)及以上的路徑.這可能會(huì)導(dǎo)致 SEO 和 UX 問(wèn)題

我們通過(guò)設(shè)置 useFileSystemPublicRoutes 來(lái)禁用默認(rèn)路由

// next.config.js
module.exports = {
  useFileSystemPublicRoutes: false,
}

重啟打開(kāi)網(wǎng)站,book/[currentBookId]就會(huì)直接 404 了.

useFileSystemPublicRoutes 禁用來(lái)自 SSR 的文件名路由.客戶端路由仍然可以訪問(wèn)這些路徑,需要攔截 popstate來(lái)配置客戶端也禁用.

動(dòng)態(tài) assetPrefix

有時(shí)候我們需要?jiǎng)討B(tài)路由,比如根據(jù)基于請(qǐng)求更改 assetPrefix,這時(shí)候我們需要使用 app.setAssetPrefix

server.get("*", (req, res) => {
    if (req.headers.host === "my-app.com") {
    app.setAssetPrefix("http://cdn.com/myapp");
    } else {
    app.setAssetPrefix("");
    }
    return handle(req, res);
});

禁用 X-Powered-By

Next.js 將添加 x-powered-by 到請(qǐng)求標(biāo)頭中。這個(gè)是由語(yǔ)言解析器或者應(yīng)用程序框架輸出的寺酪。這個(gè)值的意義用于告知網(wǎng)站是用何種語(yǔ)言或框架編寫(xiě)的酱酬。

直接禁用它

// next.config.js
module.exports = {
  poweredByHeader: false,
}

Doc

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜀踏,一起剝皮案震驚了整個(gè)濱河市须妻,隨后出現(xiàn)的幾起案子督怜,更是在濱河造成了極大的恐慌异希,老刑警劉巖眶掌,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挡育,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡朴爬,警方通過(guò)查閱死者的電腦和手機(jī)即寒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人母赵,你說(shuō)我怎么就攤上這事逸爵。” “怎么了凹嘲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵师倔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我周蹭,道長(zhǎng)趋艘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任凶朗,我火速辦了婚禮瓷胧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棚愤。我一直安慰自己搓萧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布遇八。 她就那樣靜靜地躺著,像睡著了一般耍休。 火紅的嫁衣襯著肌膚如雪刃永。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天羊精,我揣著相機(jī)與錄音斯够,去河邊找鬼。 笑死喧锦,一個(gè)胖子當(dāng)著我的面吹牛读规,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燃少,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼束亏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了阵具?” 一聲冷哼從身側(cè)響起碍遍,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阳液,沒(méi)想到半個(gè)月后怕敬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帘皿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年东跪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虽填,死狀恐怖丁恭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卤唉,我是刑警寧澤涩惑,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站桑驱,受9級(jí)特大地震影響竭恬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熬的,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一痊硕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧押框,春花似錦岔绸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至兑徘,卻和暖如春刚盈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挂脑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工藕漱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崭闲。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓肋联,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刁俭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橄仍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容