Вью-роутер в производстве (обслуживающий с Go)

Я хотел бы полностью разделить клиент и сервер, поэтому я создал проект vuejs с vue init webpack my-project, В этом проекте я использую vue-router для всей моей маршрутизации (включая специальные пути, например /user/SOMEID..

Это мой файл rout.js:

import App from './App.vue'

export const routes = [
  {
    path: '/',
    component: App.components.home
  },
  {
    path: '/user/:id',
    component: App.components.userid
  },
  {
    path: '*',
    component: App.components.notFound
  }
]

Когда я запускаю приложение, используя npm run dev все работает отлично. Теперь я готов к развертыванию в облаке, поэтому я запустил npm run build, Поскольку мне нужно использовать HTTP-сервер, я решил использовать Go и для этого... это мой файл Go:

package main

import (
    "fmt"
    "github.com/go-chi/chi"
    "github.com/me/myproject/server/handler"
    "net/http"
    "strings"
)

func main() {
    r := chi.NewRouter()

    distDir := "/home/me/code/go/src/github.com/me/myproject/client/dist/static"
    FileServer(r, "/static", http.Dir(distDir))

    r.Get("/", IndexGET)

    http.ListenAndServe(":8080", r)
}

func IndexGET(w http.ResponseWriter, r *http.Request) {
    handler.Render.HTML(w, http.StatusOK, "index", map[string]interface{}{})
}

func FileServer(r chi.Router, path string, root http.FileSystem) {
    if strings.ContainsAny(path, "{}*") {
        panic("FileServer does not permit URL parameters.")
    }

    fs := http.StripPrefix(path, http.FileServer(root))

    if path != "/" && path[len(path)-1] != '/' {
        r.Get(path, http.RedirectHandler(path+"/", 301).ServeHTTP)
        path += "/"
    }
    path += "*"

    r.Get(path, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fs.ServeHTTP(w, r)
    }))
}

Я могу загрузить домашнюю страницу (App.components.home) где все работает (CSS, изображения, переводы, вызовы и ответы с сервера).. но когда я пытаюсь открыть другие маршруты, которые должны привести к 404 или загрузить пользователя, я просто получаю ответ 404 page not found в незашифрованном виде (не компонент vue notFound, который он должен отображать)..

Есть идеи что я делаю не так и как это исправить?


Изменить: это другая часть настройки маршрутизатора в файле main.js:

const router = new VueRouter({
  mode: 'history',
  base: __dirname,
  routes
})

new Vue({
  el: '#app',
  router,
  i18n,
  render: h => h(App)
})

1 ответ

Решение

Возможно, я ошибаюсь, но, возможно, маршруты, которые вы пытаетесь посетить, разрешаются на сервере (на вашем HTTP-сервере Go).

Вы можете попробовать удалить mode: 'history' в вашей инициализации Vue-маршрутизатора, так что по умолчанию hash режим (маршруты будут разрешены в браузере). пожалуйста, смотрите эту ссылку.

Другие вопросы по тегам