Skip to content

router ่ทฏ็”ฑ โ€‹

hash ่ทฏ็”ฑ โ€‹

ไธ€็งๅธธ่ง็š„ๅ‰็ซฏ่ทฏ็”ฑๆŠ€ๆœฏ๏ผŒไธป่ฆ็”จไบŽๅ•้กตๅบ”็”จ๏ผˆSPA๏ผ‰ใ€‚ ๅฎƒไฝฟ็”จ URL ็š„ hash ้ƒจๅˆ†๏ผˆๅณ # ๅŽ้ข็š„้ƒจๅˆ†๏ผ‰ๆฅ่กจ็คบไธๅŒ็š„้กต้ขๆˆ–่ง†ๅ›พใ€‚

ๅŽŸ็† โ€‹

  • Hash ้ƒจๅˆ† URL ไธญ #ไน‹ๅŽ็š„้ƒจๅˆ†็งฐไธบ hashใ€‚ ๆ”นๅ˜ hash ไธไผšๅฏผ่‡ด้กต้ข้‡ๆ–ฐๅŠ ่ฝฝ๏ผŒไฝ†ไผš่งฆๅ‘ hashchange ไบ‹ไปถใ€‚

  • Hash ่ทฏ็”ฑ ๅˆฉ็”จ hash ็š„ๅ˜ๅŒ–ๆฅๅฎž็ŽฐไธๅŒ่ง†ๅ›พ็š„ๅˆ‡ๆข๏ผŒไปŽ่€Œๅฎž็Žฐๅ•้กตๅบ”็”จ็š„ๅฏผ่ˆชใ€‚

js
www.test.com/#/a
// ็›ดๆŽฅ่ต‹ๅ€ผไนŸๅฏไปฅ
location.hash = "/b";

www.test.com/#/b

// ็›‘ๅฌ hash ๅ˜ๅŒ– hashchange
window.addEventListener(
  "hashchange",
  function (e) {
    console.log(e, "The hash has changed!");
  },
  false
);

history ่ทฏ็”ฑ โ€‹

ๅˆฉ็”จ HTML5 History API ๅฎž็Žฐ็š„ๅ‰็ซฏ่ทฏ็”ฑๆŠ€ๆœฏ๏ผŒไธป่ฆ็”จไบŽๅ•้กตๅบ”็”จ๏ผˆSPA๏ผ‰ใ€‚

ไธŽ Hash ่ทฏ็”ฑไธๅŒ๏ผŒHistory ่ทฏ็”ฑไธไฝฟ็”จ URL ็š„ hash ้ƒจๅˆ†๏ผŒ่€Œๆ˜ฏๅˆฉ็”จ pushState ๅ’Œ replaceState ๆ–นๆณ•็›ดๆŽฅๆ“ไฝœๆต่งˆๅ™จ็š„ๅކๅฒ่ฎฐๅฝ•๏ผŒๅ…่ฎธๆˆ‘ไปฌๅˆ›ๅปบๆ›ด็พŽ่ง‚ๅ’Œ่ฏญไน‰ๅŒ–็š„ URLใ€‚

js
history.pushState(state, title, url); // ่ทณ่ฝฌ
history.replaceState(state, title, url); // ๆ›ฟๆขๅฝ“ๅ‰็š„่ฎฐๅฝ•

history.back();
history.forward();
history.go(n);

// ็›‘ๅฌ
window.addEventListener("popstate", function (e) {
  console.log(e);
});

history ๅˆทๆ–ฐ้กต้ข 404 โ€‹

url ่ฏทๆฑ‚ๆœชๅŒน้…ๅˆฐๅฏนๅบ”็š„้™ๆ€่ต„ๆบๆˆ– api ๆŽฅๅฃ

js
// ่งฃๅ†ณ๏ผšๆœๅŠก็ซฏ ่Žทๅ–ไธๅˆฐ่ต„ๆบ ๅฐ† url ้‡ๅฎšๅ‘ๅˆฐๆ น็›ฎๅฝ•
const express = require("express");
const path = require("path");
const app = express();
const port = 3000;

// ่ฎพ็ฝฎ้™ๆ€ๆ–‡ไปถ็›ฎๅฝ•
app.use(express.static(path.join(__dirname, "public")));

// ๆ•่Žทๆ‰€ๆœ‰ๆœชๅŒน้…็š„่ทฏ็”ฑ๏ผŒ่ฟ”ๅ›ž index.html
app.get("*", (req, res) => {
  res.sendFile(path.join(__dirname, "public", "index.html"));
});

app.listen(port, () => {
  console.log(`Server is running at http://localhost:${port}`);
});

Released under the MIT License.