2017-09-10 1 views
0

클라이언트와 서버를 완전히 분리하고자하므로 vue init webpack my-project으로 vuejs 프로젝트를 만들었습니다. 이 프로젝트에서 나는프로덕션 환경의 vue-router

이 내 routes.js 파일입니다 ..이 /user/SOMEID 같은 특수 경로를 포함 (내 모든 라우팅 VUE 라우터를 사용하고 있습니다 :

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) 
}) 
+0

열려는 URL을 제공하십시오. 나는 Vue 경로를 사용하는 대신 Go 경로 (물론 하나가 빠진 경로)에 액세스하려고한다는 느낌이 들었습니다. – Alex

+0

@Alex 슬프게도 URL을 제공 할 수 없습니다 (로컬에서 테스트하기). 당신이 말하는 것은 의미가 있습니다. 그렇다면 왜 localhost : 8080을 열고 App.components.home 페이지를 볼 수 있습니까? (다른 vue 구성 요소를 참조하는 데 문제가 없음)? – fisker

답변

1

내가 틀릴 수도 있지만, 어쩌면 당신이 방문하고자하는 노선에서 해결됩니다 Go http 서버에있는 서버.

vue-router 초기화에서 mode: 'history'을 제거하여 기본값이 hash (브라우저에서 라우트가 해결됨)이되도록 설정할 수 있습니다. this 링크를 참조하십시오.

+0

오 와우,이 작품 (나는 Alex도 심판이었던 것 같아요) .. 한 가지 문제는 불행히도 정말 '해시'모드를 사용하는 경우 나타나는'/ # /'를 없애고 싶습니다. 이것이 어떻게 달성 될 수 있는지 알고 있습니까? (오늘 밤 당신의 답을 해결책으로 표시 할 것입니다.) – fisker

+0

어떻게해야할지 모르겠지만, 유일한 방법은'mode : 'history''를 사용하는 것입니다, 그러면 서버는 라우트를 처리 할 수 ​​있도록 구성되어야합니다 정확히. (당신이 웹팩을 사용할 때처럼). 어쨌든, 내가 만든 API와 상호 작용하는 vue.js에서 응용 프로그램을 만들었습니다. 그리고 내 방식대로 가지 않는 한 해시 기호가있는 것이 좋다고 생각합니다. :) – srf

+0

하지만 매우 일반적이라고 생각합니다. 사용자가 수동으로 URL을 입력 할 수 있습니다. 'reddit.com/r/worldnews' - ​​히스토리 모드를 사용하지 않으면이 사용자는 Go에 의해 렌더링 된 404 페이지로 리디렉션됩니까? 이 문제를 해결할 솔루션이 있습니까? 아니면이 사용자를 무시합니까? (내 경우에는 사용자가 URL 단축키와 상호 작용하는 방식으로 사용자가 상호 작용할 수있는 항목을 만들고 있기 때문에 불가능합니다.) – fisker

관련 문제