19
PythonとJavaScriptで作る Reactiveなウェブサイト 株式会社アカリ 山下 陽介

S14 t3 yosuke_yamashita

Embed Size (px)

Citation preview

Page 1: S14 t3 yosuke_yamashita

PythonとJavaScriptで作る Reactiveなウェブサイト

株式会社アカリ 山下 陽介

Page 2: S14 t3 yosuke_yamashita

弊社

• 2006年創業

• ウェブ制作とCG制作、ウェブアプリを使った新規ビジネスなど

• 人材募集中

• なにとぞよろしくお願いします

Page 3: S14 t3 yosuke_yamashita

Reactiveなウェブサイト

• あらゆる状態変化にシームレスに対応

• javascriptを駆使して実装

• シングルページアプリケーションなどとも呼ばれる

• 企業のウェブサイトにも必要に応じて導入されてもいいのでは?

• 開発上の利点も?

こんな風なものを実現するのに 興味を持っていただければ幸いです

Page 4: S14 t3 yosuke_yamashita

Pythonサイド(バックエンド)

• Djangoを使う • Django Rest Frameworkを使ってAPIを作る • WebSocketにはtornadoを導入

Page 5: S14 t3 yosuke_yamashita

Djangoやウェブフレームワークの役割をざっくり説明

Browser

<a href=“/test”>TEST</a>

Django Databasedef test(request): … html = “<html><body>…” # HTMLレンダリングして返す return HttpResponse(html)

保存 更新 削除など

取得など

新しいURLリクエスト

レスポンス (次のページのコード)

<html> <head></head> <body>…</body> </html>

ページごとにpythonのdefを用意して、新しいhtmlをブラウザに返す ブラウザはhtmlをレンダリングする。を繰り返す

Page 6: S14 t3 yosuke_yamashita

API化したときの動き

Browser<script> $.ajax(“/test”)… </script>

Django Databasedef test(request): … data = {“users”:users} # dictやlistをそのまま # JSONにして返す return Response(data)

保存 更新 削除など

取得など

APIリクエスト

レスポンス (dictをjsonにしたデータ)

{“users”: [ {“name”:”A”, age:20} …

]}

javascriptでjsonデータを受け取る。 javascriptは必要に応じて部分的にhtmlを書き換える、を繰り返す

Page 7: S14 t3 yosuke_yamashita

Django APIの展開

APIJS

desktop app

JS iOS

JS website

swift iOS

android java

C/C++などで書いたコードはウェブサイトでは基本使えません。asm.jsを使うとものにより可能だけど、コンパイルにてこずるのと、コンパイル結果が10mbを超えてしまうというデメリットあり

Objective C++

Python Module

Native Addon

Native Addon

JNI

Page 8: S14 t3 yosuke_yamashita

API化のメリット

• 呼び出すプラットフォームが増える

• jsonによる少ないレスポンス量

• クライアント側の資源を生かせて、サーバーに低負荷

• DjangoでViewを書く工数とコード行数が減少

• フロントエンドとバックエンドのコード依存を最小に留める

• html / cssのコードが比較的、散らばらない

• 余った時間はデザインの実現に費やせる

デメリット

• フロントエンドでやることが増えるので、フロントエンドのコードがとにかく煩雑になりやすい、保守不能なコードになりがち

Page 9: S14 t3 yosuke_yamashita

そこで、しんどいフロントエンドの コーディングを少しでもベターにするために javascriptをレビューしてみます

Page 10: S14 t3 yosuke_yamashita

最近のjavascript

• ES6からclass構文、アロー関数など記述ルールが刷新されて少し親切に。※babelというコンパイルツールが必要

• coffeescript, typescriptなど中間言語もいろいろ

• Electron、NW.js、Ionic…アプリを作れるツールも多々

• node.jsとの戦い

Page 11: S14 t3 yosuke_yamashita

this.callApi(“/loadUsers”) .map((data) => data.users) .subscribe( (users) => this.users.concat(users), (err) => console.error(err), () => console.log(“done”) );

javascript Python

Reactive Extensionsを使ったAPIコールの雰囲気(流しそうめんのイメージでコーディングしています)。コールバック関数の散在を防ぐ ※Rxpyというのもあります

def loadUsers(request): users = User.objects.filter(…).fetchall() data = UserSerializer(users).data return Response({“users”:data})

Pythonはとても簡単 これまでhtmlに覆って出力していた手順が、これだけでjsonとしてクライアントに渡せる

モダンなAPIコール

Page 12: S14 t3 yosuke_yamashita

this.users.push({ name: “User A”, age: 24 });

• User X : 35歳 • User Y : 50歳 • User Z : 2歳 • User A : 24歳

ブラウザ表示

jqueryを使ってDOMを操作していたコードが不要になってきた。 データ配列に追加、削除、編集するだけでhtmlが自動更新される。 Virtual DOMという概念が導入されレンダリングがスピードアップ

モダンなHTMLバインディング

Page 13: S14 t3 yosuke_yamashita

こんなことを実現させてくれる javascriptのフレームワークや ライブラリにも目を通してみます

Page 14: S14 t3 yosuke_yamashita

有名なjavascriptフレームワークを一部紹介

backbone.js (Jeremy Ashkenas作) やりたいことは自分で実装する。1ページのライブラリ。自由度の高さ。同作者のcoffeescriptも併用すると少ない行数で快適にコーディングできた

react.js (facebook) htmlバインディングが実装されている。fluxの登場でfacebookのような複雑なUIを大人数で設計しやすそう

angular2 (google (microsoft)) rxjsを標準装備して、angular.jsより動作も早くなった感じ。記述はtypescriptかjavascriptかdart

他多数

Page 15: S14 t3 yosuke_yamashita

Flux

※Fluxは設計手法です。

manager class

classclass class

classclass class

これまでのMyコード

イベントやSingletonを駆使するも コードは散在しがち 自由に書けすぎた

ユーザアクション、html描画、APIコールの実行順序と依存関係を綺麗に整理できる

Action Dispatcher Store

View

API

Fluxのフロントエンド設計

Page 16: S14 t3 yosuke_yamashita

全体の感じ

tornado Django API

Service

StoreViewAction

Backend

Frontend

auth

message

requestresponsemessagepush

Page 17: S14 t3 yosuke_yamashita

学習に役立ったもの

TodoMVC.com react.js + flux Reactive Extensions angular2

javascript

pythonDjango tutorial https://docs.djangoproject.com/en/1.9/intro/tutorial01/ Django Rest Framework http://www.django-rest-framework.org/

Page 18: S14 t3 yosuke_yamashita

ぜひ素敵なウェブサービスを作ってみてください! もしくは、一緒に作りましょう!

あと、最後に…

Page 19: S14 t3 yosuke_yamashita

2016年8月 渋谷イメージフォーラムにて公開!

映画「フォトグラファーズ・イン・ニューヨーク」

※前売り券発売中

いいね! https://www.facebook.com/akarifilmsco/

(Pythonのおかげで公開実現しました)

<広告>