102
佐藤 竜之介(Ryunosuke SATO) Sapporo.js 東京Node学園祭 2013 Node.js を選ぶとき 選ばないとき 2013.10.26

Node.js を選ぶとき 選ばないとき

Embed Size (px)

DESCRIPTION

東京Node学園祭2013 での発表資料です。

Citation preview

Page 1: Node.js を選ぶとき 選ばないとき

佐藤 竜之介(Ryunosuke SATO)Sapporo.js東京Node学園祭 2013

Node.js を選ぶとき選ばないとき

2013.10.26

Page 2: Node.js を選ぶとき 選ばないとき

提供

Sapporo.js

Community for people who like JavaScript.

Page 3: Node.js を選ぶとき 選ばないとき

自己紹介

Page 4: Node.js を選ぶとき 選ばないとき

@tricknotesI am a software developer who love JavaScript and Ruby.

http://tricknotes.hateblo.jp/

Page 5: Node.js を選ぶとき 選ばないとき

I love OSS

Page 6: Node.js を選ぶとき 選ばないとき

I am a contributerof Ember.js

Page 7: Node.js を選ぶとき 選ばないとき
Page 8: Node.js を選ぶとき 選ばないとき

Sapporo.jshttp://sapporojs.org/

Page 9: Node.js を選ぶとき 選ばないとき

/* * advertising * * !!Important!! *

Page 10: Node.js を選ぶとき 選ばないとき

2013.11.30JavaScript 道場http://connpass.com/event/3674/

Page 12: Node.js を選ぶとき 選ばないとき

https://idobata.ioIdobata

Page 13: Node.js を選ぶとき 選ばないとき

*/

Page 14: Node.js を選ぶとき 選ばないとき

よろしくお願いします

Page 15: Node.js を選ぶとき 選ばないとき

佐藤 竜之介(Ryunosuke SATO)Sapporo.js東京Node学園祭 2013

Node.js を選ぶとき選ばないとき

2013.10.26

Page 16: Node.js を選ぶとき 選ばないとき

今日の話

私が “web アプリケーション” を作るときに、Node.js を選んだ場面、選ばなかった場面があります

そのときの背景を交えつつ、 Node.js と Rails を比較し Node.js の適切な使い所について考察

します

Page 17: Node.js を選ぶとき 選ばないとき

Why Rails?

Page 18: Node.js を選ぶとき 選ばないとき

Node.js ライブラリには Ruby / Rails の影響を受けているものが多い

なので、有意義な比較ができそう

* Rails(generator)<-> yeoman* Sinatra <-> Express* Sprockets <-> Mincer* Rails <-> Sails

Page 19: Node.js を選ぶとき 選ばないとき

対象者

* Node.js 以外の選択肢を知らない方* Node.js をあまり使ったことがない方

Page 20: Node.js を選ぶとき 選ばないとき

注意

早く快適にアプリケーションを開発する、ということに主眼を置いて考察していきます

パフォーマンスやサーバリソースなどの優先順位は低めです

Page 21: Node.js を選ぶとき 選ばないとき

さて、みなさんが “web アプリケーション” を作りはじめるとき、どういう基準でその手段を選ぶでしょうか?

Page 22: Node.js を選ぶとき 選ばないとき

Node.js の場合

Page 23: Node.js を選ぶとき 選ばないとき

Node.js での web アプリケーション開発について確認してみましょう

Page 24: Node.js を選ぶとき 選ばないとき

http://nodejs.org/

Page 25: Node.js を選ぶとき 選ばないとき

まずは素の状態で始めてみる

var http = require('http');

http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');}).listen(1337, '127.0.0.1');

console.log('Server running at http://127.0.0.1:1337/');

$ curl http://localhost:1337Hello World

Page 26: Node.js を選ぶとき 選ばないとき

Node.js の基本的な仕組みを理解するには大事な一歩

でも、これだけだとまだまだ簡単には作れそうにない

Page 27: Node.js を選ぶとき 選ばないとき

実際にはもっと複雑なアプリケーションを作ることになるでしょう

複雑さに立向うためにライブラリを使う

Page 28: Node.js を選ぶとき 選ばないとき

http://expressjs.com/

Page 29: Node.js を選ぶとき 選ばないとき

例えば、 express を使ってみる

var express = require('express');var app = express();

app.get('/', function(req, res){ res.send('Hello World');});

app.listen(3000);

Page 30: Node.js を選ぶとき 選ばないとき

express はとてもシンプル

コアが大きくないし、拡張も簡単

ただ、自由度が高いために整理するのに工夫が必要

Page 31: Node.js を選ぶとき 選ばないとき

確かに、express だと、学習コストは低いかもしれない

学習コスト?開発速度を維持するコスト?

どっちが大事?

もうすこし大きなフレームワークを好むひともいるかもしれない

Page 32: Node.js を選ぶとき 選ばないとき

http://sailsjs.org/

Page 33: Node.js を選ぶとき 選ばないとき

データベースとつなげればいいんじゃなくて、ドメインロジックの管理も適切に行いたい...!!

model 周りが貧弱* 関連を扱えない

* マイグレーションがない

そこまで大きな手助けしてくれるフレームワークではないのでは...?

Page 34: Node.js を選ぶとき 選ばないとき

最初に大長編 Gruntfile.js を生成する

デフォルトで上手いことやってほしい

生成されたコードはバージョンアップに追従するのが面倒

Page 35: Node.js を選ぶとき 選ばないとき

http://gruntjs.com/

Page 36: Node.js を選ぶとき 選ばないとき

contlib で様々なタスクが配布されているのはありがたい

but...

Page 37: Node.js を選ぶとき 選ばないとき

設定を毎回書くのは手間

grunt.loadNpmTasks('grunt-contrib-coffee');

grunt.initConfig({ coffee: { compile: { files: { 'result.js': 'source.coffee' } } } });

Page 38: Node.js を選ぶとき 選ばないとき

もっと、スムーズに開発を進めたい...!!

Page 39: Node.js を選ぶとき 選ばないとき

Rails の場合

Page 40: Node.js を選ぶとき 選ばないとき

* CoffeeScript や Sass のコンパイル* asset ファイルの minify, concat* digest hash の付与

Grunt 使ってやりたくなるようなことは、デフォルトでやってくれる

Asset pipeline

Page 41: Node.js を選ぶとき 選ばないとき

Asset pipeline

//= require jquery//= require underscore////= require app

* application.js

application.js にリクエストを投げると、すべて連結して取得できる

ビルド時には minify + digest が付与される

Page 42: Node.js を選ぶとき 選ばないとき

ビルドタスク

そもそもデフォルトで入っている

$ rake asset:precompile

Page 43: Node.js を選ぶとき 選ばないとき

* jquery-rails* underscore-rails* moment-rails ...

assets のパスが追加される、だけ静的なファイルをリポジトリに含めなくてOK

js のライブラリの管理

Page 44: Node.js を選ぶとき 選ばないとき

* validation* relation* migration* ドメインロジックの管理

ActiveRecord

Page 45: Node.js を選ぶとき 選ばないとき

一本の道があるということの良い所

Page 46: Node.js を選ぶとき 選ばないとき

その道に沿うように他のライブラリが成長していく

Rails に乗る形で、まとまった単位の機能を提供するライブラリが多い

* 画像アップロード -> carrierwave* 認証管理 -> devise* OAuth provider -> doorkeeper

やりたいことを実現するまでの手数が少ない

Page 47: Node.js を選ぶとき 選ばないとき

ちょっと基本に立ち返る

Page 48: Node.js を選ぶとき 選ばないとき

そもそも、Node.js と Rails ではスタートが違う

Page 49: Node.js を選ぶとき 選ばないとき

“Evented I/O for V8 javascript.”

あくまで、非同期 IO の環境

web 開発以外でも活躍している

Page 50: Node.js を選ぶとき 選ばないとき

http://nodeos.github.io/

Page 52: Node.js を選ぶとき 選ばないとき

“Web development that does’t hurt”

web 開発のためのフレームワーク

7 年かけて環境が整備されてきている

Page 53: Node.js を選ぶとき 選ばないとき

言語(仕様)

言語(実装)

ライブラリ

フレームワーク

Page 54: Node.js を選ぶとき 選ばないとき

Rails が開発効率に重点を置いているので、使いやすいのは納得できる

Node.js では、まだその大きさのフレームワークは出てきてなくて、 小回りが効くライ

ブラリが多い

Page 55: Node.js を選ぶとき 選ばないとき

Node.js にも、 道を敷いてくれるようなフレームワークがあるとよいの...?

そうでもない、ような...

Page 56: Node.js を選ぶとき 選ばないとき

私の例

Page 57: Node.js を選ぶとき 選ばないとき

自分の例①

->

Page 58: Node.js を選ぶとき 選ばないとき

http://nothub.org/NotHub

Page 59: Node.js を選ぶとき 選ばないとき

NotHub

* GitHub のイベントをリアルタイムに通知する Chrome Extension* 受け取るイベントを設定可能* public なリポジトリ限定

Page 60: Node.js を選ぶとき 選ばないとき

よくある使い方

* ライブラリのバージョンアップを早く知りたい* 自分のリポジトリが star されたのを知りたい* 興味があるハッカーの活動を知りたい

Page 61: Node.js を選ぶとき 選ばないとき

Crawler

GitHub API

Chrome Extension

Publisher

Redis

crawlPub

Sub

Page 62: Node.js を選ぶとき 選ばないとき

最初は Ruby で書き始めたが、パフォーマンスでなくて Node.js で書き直した

* GitHub の API をとにかく叩く必要があった* Ruby でマルチスレッド処理するのは意外と面倒* Ruby で非同期書くのも手間

Page 63: Node.js を選ぶとき 選ばないとき

そもそも、Rails が得意な分野ではない

Page 64: Node.js を選ぶとき 選ばないとき

通知の部分は単純な push 通知なので、 Socket.IO がフィットした

Page 65: Node.js を選ぶとき 選ばないとき

当時は Grunt の開発が始まったばかりChrome Extension をパッケージしたい

ビルドタスクは Rake

今だと Grunt を使うかも

Page 66: Node.js を選ぶとき 選ばないとき

自分の例②

->

Page 67: Node.js を選ぶとき 選ばないとき

http://starseeker.so/starseeker

Page 68: Node.js を選ぶとき 選ばないとき

* GitHub の followings の star を daily メールでお知らせする web アプリ* リアルタイムじゃなくてアーカイブ

starseeker

Page 69: Node.js を選ぶとき 選ばないとき

* 良さそうなライブラリを知る手がかりに!!* 朝、仕事を始める前に hot なリポジトリをチェック

よくある使い方

Page 70: Node.js を選ぶとき 選ばないとき

GitHub API

Crawler

Web Application

MongoDB

PostgreSQL

crawlsave

read

Page 71: Node.js を選ぶとき 選ばないとき

* Crawl したデータを MongoDB へ* MongoDB なら Node.js と思って書き始めたが...* ユーザ管理とか OAuth 周りが意外と面倒* Rails でやることに

Page 72: Node.js を選ぶとき 選ばないとき

Crawl する部分は Node.js

Page 73: Node.js を選ぶとき 選ばないとき

メール配信も、Rails がいい感じにフィットした

* html/text の multipart メール* html とのコード共有

Page 74: Node.js を選ぶとき 選ばないとき

両方ともそれぞれに良さがあるので、それぞれに適切な場面がある!!

<->

Page 75: Node.js を選ぶとき 選ばないとき

よくある誤解集

Page 76: Node.js を選ぶとき 選ばないとき

これだけで選択するのはまだ早い

Page 77: Node.js を選ぶとき 選ばないとき

‘‘クライアントとサーバの言語統一できて開発がはかどる

Page 78: Node.js を選ぶとき 選ばないとき

* DOM を扱う JavaScript と、ネットワーク、 ドメインロジックを扱う JavaScript は違う* 確かに言語は統一できるけど、思考の スイッチングコストは発生する

Page 79: Node.js を選ぶとき 選ばないとき

// DOMjQuery('form').trigger(‘form’);

// Node.jsstream.emit('fetch’, data);

イベント発火だけでも結構違う

Page 80: Node.js を選ぶとき 選ばないとき

‘‘ クライアントとサーバでロジックの共有がスムーズにできる

Page 81: Node.js を選ぶとき 選ばないとき

* サーバ側でもクライアント側でも使いたい ロジックはそこまでないのでは...?* utility 的な関数群だと、ありえるかも * underscore.js など既存のライブラリ を使いましょう

Page 82: Node.js を選ぶとき 選ばないとき

互換性のあるコードを維持するのは結構手間

var exports = typeof(module) === 'undefined' ? this : module.exports;

exports.method = function() { // ...};

関数定義の工夫

Page 83: Node.js を選ぶとき 選ばないとき

互換性のあるコードを維持するのは結構手間

array.every(function() { // ...}); fn.bind(this);

対象ブラウザで使えないメソッドのチェック

Page 84: Node.js を選ぶとき 選ばないとき

‘‘簡単にスケールできる

Page 85: Node.js を選ぶとき 選ばないとき

* 採用するアーキテクチャに依存する* Node.js を使っていてもある程度想定して おかないと、スケール出来ない設計になってしまう

Page 86: Node.js を選ぶとき 選ばないとき

Node.js 以外でもある程度は課金で解決できることもある

Page 87: Node.js を選ぶとき 選ばないとき

‘‘バージョン間の互換性が高い

Page 88: Node.js を選ぶとき 選ばないとき

* Node.js の API 自体は安定している* しかしバージョンアップしたら意外と動かなくなる (パフォーマンス劣化/メモリリークしていることも)* 拡張ライブラリは全く動かなくなる場合もある

Page 89: Node.js を選ぶとき 選ばないとき

‘‘サーバを API 化すれば、JSON を返すだけのサーバでOK

Page 90: Node.js を選ぶとき 選ばないとき

* ドメインロジックの管理のしやすさは ライブラリに依存する* サーバのデータをすべてクライアントに送れない 場合が多々あるので、その制御が必要 * OAuth の認証トークン * 行動履歴 * ...

Page 91: Node.js を選ぶとき 選ばないとき

‘‘ リアルタイム通信=

Socket.IO

Page 92: Node.js を選ぶとき 選ばないとき

* WebSocket* Server-Sent Events* XHR polling

* Socket.IO* Pusher ...

リアルタイム通信の手段はたくさんある

Page 93: Node.js を選ぶとき 選ばないとき

リアルタイムを扱わない部分とのバランスも考慮に入れる必要がある

Page 94: Node.js を選ぶとき 選ばないとき

まとめ

Page 95: Node.js を選ぶとき 選ばないとき

実際はこれに運用周りの話が加わってくるので、もっと複雑

サービスの性質、規模やパフォーマンスによって、落とし所はまた違ってくる

Page 96: Node.js を選ぶとき 選ばないとき

Node.js は大変素晴らしいけど、適切に選択する必要がある

Node.js 以外の文化も踏まえた上でNode.js を選択できると選択の幅が広がるのでは

いざというときに移行する判断ができるのも大事

Page 97: Node.js を選ぶとき 選ばないとき

で、これは常に変わっていくので、バランスを見極めながら選択するんですかねー

* エコシステム* ライブラリ* 自分の作ろうとしているもの

答えはない

Page 98: Node.js を選ぶとき 選ばないとき

for more information...

Page 99: Node.js を選ぶとき 選ばないとき

http://webtech-walker.com/archive/2013/09/middleman_vs_grunt.html

静的サイト開発ツールとしてのMiddlemanとGrunt

Page 100: Node.js を選ぶとき 選ばないとき

http://wazanova.jp/post/63449778024/node-js-ui

Node.jsをサーバサイドのUIレイヤに限定するのか?

Page 101: Node.js を選ぶとき 選ばないとき

http://wazanova.jp/post/64057743910/mvc-gogaruco-2013

ダブルMVCの意味するところ [GoGaRuCo 2013]

Page 102: Node.js を選ぶとき 選ばないとき

http://www.flickr.com/photos/sakura-kame/479871795/

快適なweb開発を!