SMARTCAMP Engineer Blog

スマートキャンプ株式会社(SMARTCAMP Co., Ltd.)のエンジニアブログです。業務で取り入れた新しい技術や試行錯誤を知見として共有していきます。

SPAをSimpleHTTPServerでテストしたい!

f:id:tkgwy:20190215184739j:plain

BigQuery大好き瀧川です!

最近弊社ではVue.jsを使ってSPA(SinglePageApplication)!という構成がよく使われています。

普段の開発だとwebpack-dev-serverを利用していて、手軽だしホットリロードもサポートされているし特に不自由なく運用できています。

でも、例えばWebpackでのproductionビルドをテストしたい、生成された静的ページにアクセスしたいということがちょこちょこあるんですよね。

大体いままで静的ページのテストをするときにはPythonのSimpleHTTPServerを使っていたけど、SPAの場合はチョット工夫が必要だった...😣ということをメモとして書いておきます!

そもそもSimpleHTTPServerって?🤔

俗に言うPython製のワンライナーWebサーバです。

Webサーバというとapacheやnginxが有名だと思いますが、今回のテスト等でちょっと動かすにはハードルが高いですよね。

このSimpleHTTPServerはPythonの標準でモジュールに組み込まれており、以下のようにワンライナーで実行することができます。 これで実行したディレクトリがWebサーバーにホスティングされるようになります。

とても簡単ですね!

python2の場合

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

python3の場合

$ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

SPAでSimpleHTTPServerを使ったときの問題点😥

SPAで開発する多くの場合にRouterライブラリを利用することと思います。

Vue.jsだとvue-router、Reactだとreact-routerあたりを使って、ページ遷移を実装しているのではないでしょうか。

そのときに問題になるのがURLです。

弊社ではVue.jsを使っているので、vue-routerの仕様を例に上げると以下のように記載されています。

vue-router のデフォルトは hash モード です - 完全な URL を hash を使ってシミュレートし、 URL が変更された時にページのリロードが起きません。 その hash を取り除くために、ページのリロード無しに URL 遷移を実現する history.pushState API を利用したルーターの history モード を使うことができます。

噛み砕くと、デフォルトでは http://localhost:8000/#/login のようにパスに # がついてしまうけど、HTML5の仕様を使ったhistoryモードだと http://localhost:8000/login のようにできますということですね。

ただこのhistoryモードで、SimpleHTTPServerを使うと...

f:id:smartcamp:20190215152831p:plain

loginというファイルを探しにいってしまいますね...

解決 🤗

こちら参考にさせていただきました(https://gist.github.com/martijnvermaat/4bec9bcc37d965e43879) thx!

SimpleHTTPServerをHookしてSPAのHistoryモードに対応した状態のサーバを起動するスクリプトが以下になります!(Python3を普段使いしているので両方書いてあります)

SimpleHTTPServer for SPA

そこまで複雑ではないですがロジックを簡単に説明すると、 GETリクエストを受けた際にURLのドメイン部以降を取り出して、それに対応するファイルが存在しなければindex.htmlにredirectする ようになっています。

SimpleHTTPServerでリクエストをさばく役目を持つ、SimpleHTTPRequestHandlerを継承して上記ロジックを間に挟んだHandlerを、BaseHTTPServerに渡すことで実現しています!

おわり 😚

こちらのスクリプトをPATH通したりすぐ呼び出せるように整備しておけば、いざというときに役立つのではないでしょうか。

「SPA界だとこれでやるのが定石だろ」みたいなことがあれば教えていただけると嬉しいです!