LoginSignup
0
1

More than 3 years have passed since last update.

JavaScriptのテストとかに使えるローカルWebサーバをGoで作る。

Posted at

p5.jsでも再開しようと考えた。

でもウェブサーバ上でないとちょっと都合が悪い。github pagesとかでも良いのだけども踏み込んだことをしようとするとちょっと面倒。
ついでにHTML5コンテンツを配布するなどというケースを考えるとウェブサーバをローカルに立てればいいという単純な話でもないし。

Goなら簡単にWebサーバが作れる。

そんな話を聞きかじって作ってみた。
実はかなり前に作ったものなので当時組み込んだ踏み込んだ仕組みがいろいろ入っていて複雑になっていた。
そこでちょっとこそぎ落としてシンプルにした。

ソース

simpleWebServer.go
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
    "os"
    "strings"
    "time"
    //"math/rand"
    //"golang.org/x/net/websocket"
    //"io"
)

func handler(w http.ResponseWriter, r *http.Request) {
    path := ""
    ct := ""
    fmt.Fprintf(os.Stdout,r.URL.Path + " \n");

    if r.URL.Path == "/" {
        path = "/index.html"
    } else {
        path = r.URL.Path
    }

    ctm := map[string] string {
        ".html":"text/html;charset=utf-8",
        ".css":"text/css",
        ".js":"text/javascript",
        ".png":"image/png",
        ".jpg":"image/jpg",
        ".ico":"image/x-icon",
        ".mp3":"audio/mpeg",
        ".aac":"audio/aac",
        ".woff":"font/x-woff",
        ".otf":"application/x-font-otf",
    }
    ct = ctm[ path[strings.LastIndex(path,"."):]]

    w.Header().Set("Content-Type",ct)
    ci,_ := ioutil.ReadFile( "." + path )
    w.Write(ci)
}

func main() {
    running := true
    http.HandleFunc("/", handler)
    go func() {
        http.ListenAndServe(":8080", nil)
    }()
    fmt.Fprint(os.Stdout,"server start\n");

    /*
    http.Handle("/echo",websocket.Handler(EchoHandler))
    err := http.ListenAndServe(":8088",nil)
    if err != nil {
        fmt.Fprint(os.Stdout,"websocket err")
    }
    rand.Seed(time.Now().UnixNano())
    */

    for running {
        time.Sleep(500 * time.Millisecond)
    }
}

// webSocket test
//func EchoHandler(ws *websocket.Conn) {
//  io.Copy(ws,ws)
//}

WebSocketの処理をコメントアウトしてある。
このgoのスクリプトはウェブサーバ兼アプリケーションサーバとして動作するということです。
これに加えてアセットをバイナリ化して組み込む処理も入っていたのだけれどもそこは省きました。

主に使いそうなMIMEタイプには対応しましたが必要あれば追記してもらえればいいとおもいます。SVGとかあたりは対応しても良いような気もしますよね。

悩む部分。

HTML5でウェブページであることを完全無視してウェブブラウザはフロントエンドだとみなしたとします。
そこでブラウザを限定しちゃいますFireFoxとかChromeとか。
そこまではいいんですが、プログラムの知識がそれほど豊富ではない人にとってシェルとかコマンドプロンプトというのは恐怖の対象のようです。

そこで希望としてはGUIを伴って動作してほしい。
しかし環境に依存しないGoで利用できるGUIライブラリをわたしは知りません(一応GO-SDL2はマルチプラットフォームですがクロスコンパイルが少しややこしいしGUIとしてはちょっと手間がかかる気もします)

もうひとつはブラウザを自動起動したい。
一応そういうモジュールも存在しているにはいるんですが、利用者が標準に指定しているブラウザが起動したはずです。
またEXECなどで動作させる場合Windowsは決まった場所にソフトが存在するわけではないでしょうから確実に起動できるとは限りません。

といったところでこのあたりの2点。どうにかしたいところです。
要するにこの2点に引っかかったので過去に悩んだままGoからフェードアウトしたわけです。

ひとまずはわからないとかいわずに説明通りに動かせ!というスタンスでそのあたりに目をつむったまま進行するつもりですがなにか良い解決策を知っている方はぜひ教えてほしいところです。

つづくー。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1