SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
ServerSide
ES6 
(๑╹◡╹๑)ノ
timakin / @timadayon
こんにちはこんにちは!
Profile:
- DeNA入社1年目
- エンジニア
- github: timakin
- blog: timakin.log
およそ8 9ヶ月ほど
リブセンス(様)
にはお世話になりました
Twitter: @timadayon
idも画像も違う。
気分で下手に
変えていいもんじゃない。
[某所での初タスク]
JavaScriptでのちょっとしたDOM操作
僕が取った手段
getElementById(..)
onClick= hoge()
jQueryってものがあってな。
リブセンス様、その節はほんとうに
温かい目で見守ってくださって
ありがとうございました。
ほんっとに死ぬほど感謝してます。
時は流れましたが…
今日は
一部ES6の紹介と、
フロントエンドではなく、
サーバーサイドの言語として
ES6を実際に使ってみたときの話。
• Block scoping
• Classes (strict mode only)
• Collections
• Typed arrays
• Generators
• Binary and Octal literals
• Object literal extensions
• Promises
• New String methods
• Symbols
• Template strings
• Arrow Functions
ES6 features ship with
Node.js by default(v4.2.1)
• Block scoping
• Classes (strict mode only)
• Collections
• Typed arrays
• Generators
• Binary and Octal literals
• Object literal extensions
• Promises
• New String methods
• Symbols
• Template strings
• Arrow Functions
ES6 features ship with
Node.js by default(v4.2.1)
実際手元で触ってて
気になったのは
これくらい…
• Block scoping
• 変数のスコープ、定数化
• letで宣言された変数は、その変数が定義されたブロックにスコープ
が限定される。
• constで定数化。
function varTest() {
var x = 31;
if (true) {
var x = 71; // same variable!
console.log(x); // 71
}
console.log(x); // 71
}
function letTest() {
let x = 31;
if (true) {
let x = 71; // different variable
console.log(x); // 71
}
console.log(x); // 31
}
const MY_FAV = 7;
// this will fail silently in Firefox and
Chrome (but does not fail in Safari)
MY_FAV = 20;
// will print 7
console.log("my favorite number is: " +
MY_FAV);
// trying to redeclare a constant throws an
error
const MY_FAV = 20;
// the name MY_FAV is reserved for constant
above, so this will also fail
var MY_FAV = 20;
• Promises
• 非同期処理でメソッドを繋げる時、コールバック地獄を回避しつつ、
メソッドチェーンで書くことのできる子。
• もともとES6どうこうの前に結構使われてた。
function timeout(duration = 0) {
return new Promise((resolve, reject) => {
setTimeout(resolve, duration);
})
}
var p = timeout(1000).then(() => {
return timeout(2000);
}).then(() => {
throw new Error("hmm");
}).catch(err => {
return Promise.all([timeout(100),
timeout(200)]);
})
• Classes (strict mode only)
• 目玉商品。JavaScriptで(他の言語と同じような)クラスがかけ
るよ。
• 最高だよ。もうprototypeとか書かなくて済むよ。
• 書かなくて済むけど、prototypeの糖衣構文です。
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a
noise.');
}
}
class Dog extends Animal {
speak() {
console.log(this.name + ' barks.');
}
}
• Arrow Functions
• 関数型っぽいfunctionの書き方、レキシカルなthis(thisの参照
先が、意図に反してグローバルオブジェクトになって、「あれ?こ
のインスタンスのプロパティ更新されないぞ?」「値が入ってない
ぞ?」というようなことにならない。そのメソッドが呼び出される
オブジェクトの中に閉じている状態)を簡単に扱える。
• というかthisが自動で関数にbindされる
function Person(){
this.age = 0;
setInterval(() => {
this.age++; // |this| properly refers to
the person object
}, 1000);
}
var p = new Person();
• Generators (Function)
• イテレーターを簡単に作れる特殊な関数。任意のタイミングで処理
を止められる。オブジェクト自身が今どこまで処理を進めたか覚え
ておき、next()メソッドを使って止めたところから先の処理を再度
実行する。
• 特に用事がなかったので僕は使いませんでした。
function* anotherGenerator(i) {
yield i + 1;
yield i + 2;
yield i + 3;
}
function* generator(i){
yield i;
yield* anotherGenerator(i);
yield i + 10;
}
var gen = generator(10);
console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
実際に使ってみた例
モバイルの勉強がてら、
SwiftでNewsアプリ(笑)を作ってたんですが、
SwiftTaskというSwift版Promise実装
みたいなやつが、マルチリクエスト用途で使いにくくて、
「いっそNodeでAPI置いて、
モバイルが叩くエンドポイントは
1つに統一しよう…どうせ分化する予定だったし」
と思った。
その際に、ちょうどNode v4.0.0の
io.jsとNode.js統合があったので、
じゃあもうES6に置き換えようと決めた。
(途中まではES5でした)
具体例
コントローラー部分
"use strict";
const _ = require('underscore');
const express = require('express');
const router = express.Router();
const newsCollectionModel = require('../
models/newsCollection.model');
router.get('/', (req, res) => {
let newsCollection = new
newsCollectionModel();
newsCollection.get(req, (items) => {
res.json({
response: items
});
});
});
モデル部分
class News {
constructor(props) {
this.title = props.title;
this.url = props.url;
this.origin = props.origin;
this.image_uri = props.image_uri;
this.created_at = props.created_at;
}
...
}
_convertNewsModelToObject(items) {
return _.flatten(items).map((item) => item.toObject());
}
get(req, cb) {
let promises = _.map(urls[req.query.country],
(url) => { return fetch(url, (res) => { return
res.body.items }) });
Promise.all(promises)
.then((items) => _.flatten(items) )
.then((items) => this._filterFeedlyItemsByImageExistance(items) )
.then((items) => this._createNewsModelCollectionByFeedly(items) )
.then((items) => this._convertNewsModelToObject(items) )
.then((items) => this._sortByCreatedAt(items) )
.then((items) => cb(items), (err) => console.error(err.stack) );
}
• Arrow Functionによってコールバック関数に
使う文字数を減らせて、視覚的に健康。コントロー
ラーだと多用するので結構変わりますよ。
• 特にモデルクラスだと思いますが、
constructorとそれ以外のメソッドを同じ
class内の記述としてかけるので、包含関係を意
識しやすいです。(prototypeを使って別々に
書かなきゃいけない頃とは違い、ちゃんと一個の
クラスとして書けてる感じがします)
• underscore.jsとArrow functionの合わせ
技で、軽いビジネスロジックなら1行で済ませる
ことができました。(underscore初見の人か
らすると邪魔っぽいので、ここは要検討)
• まとめて複数のAPIをコールするときとか、
request用のpromiseインスタンスを作る
メソッドを汎用の関数として用意しておく。
• Promise.allで一気に結果を取得した後、
then(…).then(…)で、綺麗に値をフィルター
/加工できます。
• requireした結果を格納してる変数を誤って
更新しないように、全部constで持っておく
と安全。
• package.jsonにnodeのバージョンを記載
しておけば、herokuで最新版が動かせるので、
すぐ試せます。webpackとかいらない。
以下要検討の課題
• APIから返ってきた値のフィルタリングの処
理を、条件ごとに別関数に分けた。
• が、関数の数を減らそうと思うとthenの中
身が地獄になり、関数の数を増やせばthen
の中身は1行で済んでも、関数が増えすぎて
地獄になるか、underscoreで読みにくく
なるか、という板挟みだった。苦肉の策とし
てメソッド名を長くして中身の処理を命名か
ら推測しやすくした。
• 短く書けるからって調子乗ったら死にました。
(これはES6ではなく完全に僕の問題です)
• modulesがない…実装はよ…
• とはいえrequire50倍速という もあるし、
別にもうmodule.exportsで事足りる。
• Strong ModeかStrict Modeか迷って、
中途半端にStrict Mode使ってましたが、
Strong Modeで移行すればよかった。。
ともあれ、サーバーサイドの
言語として非常に使い勝手がいいです。
expressも軽量だから
書き換えがしやすいです。
フロントエンドでES6使うことが
多いですが、ES6のシンタックスだけ
速習したいなら、サーバーサイドから
入ったほうがいいと思います。
Node最新バージョン入れたらすぐ
動くのと、フロントエンド
フレームワークの激流に気を取られず、
シンタックスの学習に
集中できるからです。
おわり。

Weitere ähnliche Inhalte

Was ist angesagt?

TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
Akira Inoue
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
なおき きしだ
 

Was ist angesagt? (20)

JavaScript基礎勉強会
JavaScript基礎勉強会JavaScript基礎勉強会
JavaScript基礎勉強会
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
モダンJavaScript環境構築一歩目
モダンJavaScript環境構築一歩目モダンJavaScript環境構築一歩目
モダンJavaScript環境構築一歩目
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編
 
JavaScript入門-基礎編
JavaScript入門-基礎編JavaScript入門-基礎編
JavaScript入門-基礎編
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
 
これからのJavaScriptの話
これからのJavaScriptの話これからのJavaScriptの話
これからのJavaScriptの話
 
むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
 
Google Gears データベースの基礎
Google Gears データベースの基礎Google Gears データベースの基礎
Google Gears データベースの基礎
 
⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1
 
⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1
 
1周遅れのScala入学 #nds41
1周遅れのScala入学 #nds411周遅れのScala入学 #nds41
1周遅れのScala入学 #nds41
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
Integral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common LispIntegral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common Lisp
 
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことJavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなこと
 
大規模なJavaScript開発の話
大規模なJavaScript開発の話大規模なJavaScript開発の話
大規模なJavaScript開発の話
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』
 

Andere mochten auch

Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Takuya Ueda
 

Andere mochten auch (9)

Excelの話
Excelの話Excelの話
Excelの話
 
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
 
Wysiwig on Rails
Wysiwig on RailsWysiwig on Rails
Wysiwig on Rails
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版
 
Concept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized ApplicationConcept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized Application
 
アルゴリズム取引のシステムを開発・運用してみて分かったこと
アルゴリズム取引のシステムを開発・運用してみて分かったことアルゴリズム取引のシステムを開発・運用してみて分かったこと
アルゴリズム取引のシステムを開発・運用してみて分かったこと
 
実世界の人工知能@DeNA TechCon 2017
実世界の人工知能@DeNA TechCon 2017 実世界の人工知能@DeNA TechCon 2017
実世界の人工知能@DeNA TechCon 2017
 
キーワード駆動テストチュートリアルハンズアウト.03.06
キーワード駆動テストチュートリアルハンズアウト.03.06キーワード駆動テストチュートリアルハンズアウト.03.06
キーワード駆動テストチュートリアルハンズアウト.03.06
 

Ähnlich wie Serverside ES6@Livesense technight

WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょう
Hishikawa Takuro
 
Decksetがよかった話
Decksetがよかった話Decksetがよかった話
Decksetがよかった話
Kohki Miki
 
Java scriptでslideを作ってみた
Java scriptでslideを作ってみたJava scriptでslideを作ってみた
Java scriptでslideを作ってみた
Katsuhito Yonao
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4
Koji SHIMADA
 

Ähnlich wie Serverside ES6@Livesense technight (20)

⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょう
 
JSDoc ToolKit
JSDoc ToolKitJSDoc ToolKit
JSDoc ToolKit
 
Form libraries
Form librariesForm libraries
Form libraries
 
Form libraries
Form librariesForm libraries
Form libraries
 
JavaScript 研修
JavaScript 研修JavaScript 研修
JavaScript 研修
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
Decksetがよかった話
Decksetがよかった話Decksetがよかった話
Decksetがよかった話
 
Java scriptでslideを作ってみた
Java scriptでslideを作ってみたJava scriptでslideを作ってみた
Java scriptでslideを作ってみた
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
Aizu lt tokyo_luxion
Aizu lt tokyo_luxionAizu lt tokyo_luxion
Aizu lt tokyo_luxion
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門
 
2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
 
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
 
演算子オーバーライドをDSLに活用する
演算子オーバーライドをDSLに活用する演算子オーバーライドをDSLに活用する
演算子オーバーライドをDSLに活用する
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 

Serverside ES6@Livesense technight