Routing 优先级

如果两个页面的路由都匹配同一个 URL,那么会发生路由冲突:vite-plugin-ssr 必须决定应该渲染哪个页面

路由字符串冲突时,vite-plugin-ssr 从最具体到最模糊中选择第一个路由。例如:

  1. /about/team (最具体:它只匹配单个路由)
  2. /about/@path (一般具体:它匹配 /about/company/about/vision, ...)
  3. /about/* (模糊: 它匹配 /about/some/nested/path)
  4. /* (最模糊:它匹配所有 URL)

更多示例请参考 resolvePrecedence/route-strings.spec.ts.

当文件系统路由、路由字符串和路由函数之间发生冲突时,vite-plugin-ssr 按以下顺序选择第一个路由

  1. 路由函数,返回高正优先级数(例如 99)
  2. 路由函数,返回低正优先级数(例如 1)
  3. 文件系统路由
  4. 路由字符串,静态(即没有 @param,例如 /about/company
  5. 路由函数,返回无优先级数(或 0)
  6. 路由字符串,参数化 (即使用 @param 分段,例如 /product/@productId/product/*
  7. 路由函数,返回低负优先级数(例如 -1)
  8. 路由函数,返回高负优先级数(例如 -99)

Example (4) + (6) + (7):

// product/list.page.route.js
export default "/product";
// product/item.page.route.js
export default "/product/@productId";
// product/catch-all.page.route.js
export default (pageContext) => {
  if (!pageContext.urlPathname.startsWith("/product/")) return false;
  return {
    precedence: -1,
    pageContext: {
      // E.g. redirect `/product/wrong/url` to `/product`
      redirectTo: "/product",
    },
  };
};
URL                           MATCHES                                    WINNER
==================            ===================================        ======
/product/42                   product/item.page.route.js      (6)        ⬅️
                              product/catch-all.page.route.js (7)
URL                           MATCHES                                    WINNER
==================            ===================================        ======
/product                      product/list.page.route.js      (4)        ⬅️
                              product/catch-all.page.route.js (7)
URL                           MATCHES                                    WINNER
==================            ===================================        ======
/product/wrong/url            product/catch-all.page.route.js (7)        ⬅️

4: 路由字符串,静态(即没有 @param,例如 /about/company

6: 路由字符串,参数化 (即使用 @param 分段,例如 /product/@productId/product/*

7: 路由函数,返回低负优先级数(例如 -1)

Example (1) + (4):

// admin.page.route.js
export default "/admin";
// login.page.route.js

export default (pageContext) => {
  if (pageContext.user === null) {
    return {
      precedence: 99,
    };
  }
  return false;
};
URL                   pageContext.user       MATCHES                       WINNER
======                ================       =======================       ======
/admin                null                   login.page.route.js (1)       ⬅️
                                             admin.page.route.js (4)
URL                   pageContext.user       MATCHES                       WINNER
======                ================       =======================       ======
/admin                'brillout'             admin.page.route.js (4)       ⬅️

1: 路由函数,返回高正优先级数(例如 99)

4: 路由字符串,静态(即没有 @param,例如 /about/company

更多示例请参考 resolvePrecedence/overall.spec.ts.