index.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. Vue.use(Router)
  4. const KAIFAIN = 'kaifain'
  5. const JISHUIN = 'jishuin'
  6. const RE_IPV4 = /^(\d+.)+\d+$/
  7. const getServerHostname = ({ req }) => {
  8. const { host, referer } = req.headers
  9. let hostname = host.split(':')[0]
  10. if (RE_IPV4.test(hostname)) {
  11. hostname = referer && new URL(referer).hostname
  12. }
  13. return hostname
  14. }
  15. const filterAndRemapRoutesByScope = (routes, scope) => {
  16. return [
  17. ...routes
  18. .filter(r => r.path.startsWith('/' + scope))
  19. .map(r => {
  20. const clone = { ...r }
  21. clone.path = r.path.replace('/' + scope, '') || '/'
  22. if (r.name) {
  23. clone.name = r.name + '_$'
  24. }
  25. return clone
  26. }),
  27. ...routes
  28. ]
  29. }
  30. export function createRouter(ssrContext, createDefaultRouter, routerOptions) {
  31. const options = routerOptions || createDefaultRouter(ssrContext).options
  32. const hostname = ssrContext ? getServerHostname(ssrContext) : location.host
  33. return new Router({
  34. ...options,
  35. routes: fixRoutes(options.routes, hostname),
  36. })
  37. }
  38. function fixRoutes(defaultRoutes, hostname) {
  39. if (hostname && hostname.includes(KAIFAIN)) return kaifainRoutes(defaultRoutes)
  40. if (hostname && hostname.includes(JISHUIN)) return jishuinRoutes(defaultRoutes)
  41. return defaultRoutes
  42. }
  43. function kaifainRoutes(defaultRoutes) {
  44. return filterAndRemapRoutesByScope(defaultRoutes, KAIFAIN)
  45. }
  46. function jishuinRoutes(defaultRoutes) {
  47. return filterAndRemapRoutesByScope(defaultRoutes, JISHUIN)
  48. }