一個網頁伺服器範本,把靜態前端(預設是 NextJS)打包後,跟後端(Golang)一起打包成一個可執行檔
$ make doctor
$ make dep
$ make dev
$ make build
- 輸出只有一個靜態編譯的可執行檔,可以到處帶著走
- 開發模式下,前後端都有 hotreload(前端是 nextjs 自帶、後端是用 nodemon 監看)
- 最小化 docker image size
- 幫你整合好 api 路由和 static files 的路由了
- 完善的 Makefile,包含相依性安裝、開發模式、打包全部都在裡面(詳情請看
make help
) - 高度可客製化,修改
backend/build.sh
和frontend/build.sh
就可以更改前後端編譯配置
Note
前端使用的包管理器是 pnpm,如果你不喜歡,請自行修改 Makefile
和 frontend/build.sh
,但我還是強烈推薦 pnpm,他真的很棒!
前端雖然預設是 nextjs,但是你只要修改 frontend/build.sh
,把最終的靜態檔案放到 frontend/out
,接著理論上 make build
時就會幫你把檔案包進去了
Warning
我沒實驗過,如果有人成功歡迎回報
後端的資料夾比較複雜一點,首先,先來看 main.go
main.go 定義了一個函式 run(addr string) error
,裡面會用 gin 開啟一個 http server,並依照開發/發布模式設定好靜態檔案的路由(下面會說明)。正常情況下你不需要動到 main.go
後端就是拿來放 API 的啦!按照我的設計,新增 API 全部都是放在 backend/api/
目錄下,你可按照 API endpoint 再去細分 backend/api/user/
、backend/api/post/
之類的,總之,看你開心~
靜態頁面根據編譯變數 Mode
會在 debug 模式和 release 模式有不同的表現。debug 模式下會全部轉發給 :3001,也就是 nextjs;在 release 模式下,會開啟一個 fileserver,根目錄是用 go embed 嵌入的 /static
。
backend/main.go
中定義了四個編譯變數,他們會在 backend/build.sh
中塞值進去,分別是
- Mode:
"debug"
或是"release"
- Version:git tag 的版本
- CommitHash:執行
backend/build.sh
時的 git commit hash - BuildTime:執行當下時間
你可以執行編譯完的可執行擋 ./main -v
看這些訊息
$ make doctor
會檢查你的執行環境有沒有執行各項 make target 所需要的執行擋,他還會告訴你如果少了某個執行擋,什麼 target 可能無法運作
$ make dep
$ make depFrontend
$ make depBackend
dep 系列的 target 會安裝相依套件,make dep
會自動執行 make depFrontend
和 make depBackend
$ make dev
$ make devFrontend
$ make devBackend
make devFrontend
會執行 npm run dev
,make devBackend
會用 nodemon 監看 backend/
目錄,並在有檔案更改時重新執行 go run .
。make dev
會把當下的 tmux panel 垂直分割,左邊是 backend server,右邊是 frontend 的 dev server。如果你沒有用 tmux,可以修改 Makefile 中 dev
target,改成
dev:
make devBackend& ; make devFrontend
這樣就不需要 tmux 了,不過 stdout 會全部混在一起,比較不好看。
$ make build
$ make buildFrontend
$ make buildBackend
build 系列會執行各自的 build.sh,詳細做了什麼請看 build.sh 了解。另外,如果不是用 make build
一次執行的話,請先執行 make buildFrontend
再執行 make buildBackend
。
$ make format
format 會執行 gofmt
和 prettier
把前後端的程式碼整理一遍
- add Action to build automatically
docker image ?- add descripton of make command