iOSDC Japan 2021 のパンフレット記事「Webブラウザで動くSwift Playgroundを作ろう」を実際にやってみた。
- 多くのプログラミング言語にはWebで動作するPlaygroundが提供されている。
- Swiftには公式のWeb Playgroundが提供されていない。
- サーバーサイドSwiftとWebプログラミングの技術を使って自分で作れる。
- 不特定多数が使うWebサービスを公開する、となるととても大変。
- ローカル環境でアクセスできるWebアプリケーションを作る。
- Webアプリケーションの世界にもUIフレームワークがある。
- 基本設計
- 画面を左右に2分割する。コードエディタと結果表示。
- コードを実行するRunボタンを置く。
- フレームワーク
- TwitterのBootstrapを使用する。
index.html
を作って、BootstrapのStarter Templateをコピーペースト。- 記事のコードになるよう
title
とbody
を変更。 - ブラウザで表示確認。
- Swiftのシンタックスハイライトに対応したエディタコンポーネントを置く。
- Ace:とっつきやすい。今回はこれを使う。
- CodeMirror:バージョンアップで仕組みが変わったので注意。
- Monaco Editor:高機能。やや難しい。
- エディタコンポーネントのロード。
- ライブラリはCDN経由で配布されている。
- Embedding Ace in Your Siteのcdnjsからコピーペースト。
- エディタコンポーネントを配置。
- 記事のコードのとおり。
- ブラウザで表示確認。
- ターミナル風に表示するコンポーネントを置く。
- Xterm.jsを使う。
- コンポーネントのロード。
- xterm CDN by jsDelivrを使う。
- 上記サイトのcssフォルダをクリックすると
xterm.css
が表示されるので、そこからコピーペースト。 xterm.min.js
も同様にコピーペースト。
- コンポーネントを配置。
- 記事のコードのとおり。
- ブラウザで表示確認。
- バックエンド
- コードエディタに入力されたコードを受け取り、実行結果を返す。
- 言語
- サーバーサイドSwift
- フレームワーク
- Vapor
- 他はメンテナンスが停止しており、現在は事実上唯一の選択肢。
- VaporのCLIツールをインストール(Homebrew)。
- Vaporプロジェクト作成、Xcodeで開く。
- Hello, worldのとおり。
- 依存するSwift Packageのダウンロードが行われるので待つこと。
routes.swift
を記事のコードのとおり実装する。- POSTで受け取ったコードを実行して標準出力に出すもの。
- Xcodeでビルド、実行。
- cURLで動作確認。
curl -X POST "http://localhost:8080/run" -H 'Content-Type:application/json' --data '{"code":"print(\"Hello World!\")"}'
- 記事では、GitHubのサンプルコードを参照とのこと。
- 結合手順
- バックエンド
- POSTに対して、JSONでレスポンスを返す。
- localhostに接続したときに
index.html
の内容を返す。
- フロントエンド
- Runボタンで入力コードをPOSTして、レスポンスで受け取った出力内容を表示する。
- バックエンド
routes.swift
- POSTで返す型を
String
でなくContent
準拠の型にする。
- POSTで返す型を
- cURLで動作確認。
- JSONが返ってくればOK。
Public
ディレクトリを作ってindex.html
をそこに入れる。configure.swift
Public
ディレクトリを使う。
routes.swift
- GETに対して
index.html
を返す。
- GETに対して
- 動作確認
- Xcodeではなく
swift run
で実行する。 - ブラウザで
http://localhost:8080
を開く。 - フロントエンドが表示できればOK。
- Xcodeではなく
index.html
- Runボタンの処理をする
script
タグを追加する。 - エディタの内容をPOSTする。
- レスポンスから出力結果を取り出して結果表示エリアに出す。
- Runボタンの処理をする
- 動作確認
- Xcodeではなく
swift run
で実行する。 - ブラウザで
http://localhost:8080
を開く。 - Swiftコードを書いてRunボタンを押し、結果が表示されればOK。
- Xcodeではなく
- 任意のコードが実行できるので公開しては危険。
- 実行環境を使い捨てのコンテナに閉じ込める。