Slide 1

Slide 1 text

15分で知る 最近の フロントエンド事情 2018/9/27 もくテク 最近のWeb技術についてワイワイ語る会 (った気にな)

Slide 2

Slide 2 text

麦島 一 (むぎしま はじめ) @mugi_uno 自己紹介

Slide 3

Slide 3 text

フロントエンド、ついていけてます?

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

よく聞くワード 「Javascriptは初心者向け」

Slide 6

Slide 6 text

現実

Slide 7

Slide 7 text

一気におさらいしてみよう!

Slide 8

Slide 8 text

〜はじめに〜

Slide 9

Slide 9 text

15分じゃ無理

Slide 10

Slide 10 text

〜目標〜 1. 言語自体の話 2. JSと静的型付け 3. よく聞くフレームワーク 4. 状態管理 5. モジュール管理 を知った気になってもらう

Slide 11

Slide 11 text

言語自体の話

Slide 12

Slide 12 text

ECMAScript • ESxとも呼ばれる(e.g. ES6) • 実装状況はブラウザによる
 https://kangax.github.io/compat-table/es6/ • 提案状況→tc39/proposals • Javascriptの標準仕様

Slide 13

Slide 13 text

ECMAScript • ESxと呼ばれたりする(e.g. ES6) • 実装状況はブラウザによる
 https://kangax.github.io/compat-table/es6/ • 提案状況→tc39/proposals • Javascriptの標準仕様

Slide 14

Slide 14 text

レガシー環境に合わせる必要がある • 要するにIE11で動かないといけない 参考: MDN 「クラス定義」 サポート状況 https:// developer.mozilla.org/ja/ docs/Web/JavaScript/ Reference/Classes

Slide 15

Slide 15 text

新しい仕様があるのに 使えない…

Slide 16

Slide 16 text

Babel • ECMAScript 2015+のコードを
 未実装の環境でも動く形に変換する • コードをtransformする際に、
 ついでに色々できるので混乱しがち
 (代表例: JSX→JSの変換)

Slide 17

Slide 17 text

AltJS • ECMAScriptに変換可能な言語 • 混同しがちだが、ECMAScript自体 は仕様なので、AltJSではない

Slide 18

Slide 18 text

AltJSの例 • TypeScript - Microsoft製 / よく聞く • Dart - Google製 • ReasonML - Facebook製 • CoffeeScript - あんまり元気がない

Slide 19

Slide 19 text

なにを選べばいい?

Slide 20

Slide 20 text

• 私なら、可能ならTypeScriptを選ぶ • フレームワークによってはつらいので、
 その場合はES2017 (async/await) • Proposalのstage0-2は避ける

Slide 21

Slide 21 text

JSと静的型付け

Slide 22

Slide 22 text

JSと型 • JSは動的型付言語 • データ型は7種類のみ • String • Number • Boolean • Object • null • unde ned • Symbol (ES2015+)

Slide 23

Slide 23 text

静的型検査を したくなることがある

Slide 24

Slide 24 text

よくある問題 • APIのレスポンスはわかっているけど… • タイポで動いてませんでした const user = response.uesr; // user === undefined

Slide 25

Slide 25 text

レスポンスを型定義できれば…

Slide 26

Slide 26 text

型を強化する色々 • TypeScript • Flow • 静的型付けのできるAltJS • 対応ライブラリが多い • 個人的にオススメ • ES上に静的型付けのみを提供する • コメントで定義できる

Slide 27

Slide 27 text

必要?

Slide 28

Slide 28 text

• 可能なら使ったほうが良いと思う • リファクタリングの敷居がグッと下がる • わ、わたしも導入しないと…(焦)

Slide 29

Slide 29 text

よく聞くフレームワーク

Slide 30

Slide 30 text

jQueryのコード例

Slide 31

Slide 31 text

e.g. 追加ボタンでタスクを追加 $(‘#add-button’).on('click', () => { const input = $(''); input.attr('type', 'text'); $(‘#todo-list').append(input); }); クリックすると タスクを追加

Slide 32

Slide 32 text

e.g. 追加ボタンでタスクを追加 $(‘#add-button’).on('click', () => { const input = $(''); input.attr('type', 'text'); input.addClass('todo'); $(‘#todo-list').append(input); }); 仕様変更 →classの追加

Slide 33

Slide 33 text

e.g. 追加ボタンでタスクを追加 $(‘#add-button').on('click', () => { const todo = $('
'); todo.addClass(‘wrapper’); const input = $(''); input.attr('type', 'text'); input.addClass('todo'); todo.append(input); $('#todo-list').append(todo); }); 仕様変更 →divで囲む

Slide 34

Slide 34 text

e.g. 追加ボタンでタスクを追加 $(‘#add-button').on('click', () => { const todo = $('
'); todo.addClass(‘wrapper’); if($(‘.todo’).length % 5) { const separator = $(‘
’); todo.append(separator); } const input = $(''); input.attr('type', 'text'); input.addClass('todo'); todo.append(input); $('#todo-list').append(todo); }); 仕様変更 →5件ごとに区切る

Slide 35

Slide 35 text

e.g. 追加ボタンでタスクを追加 $(‘#add-button').on('click', () => { const todo = $('
'); todo.addClass(‘wrapper’); if($(‘.todo’).length % 5) { const separator = $(‘
’); todo.append(separator); } const input = $(''); input.attr('type', 'text'); input.addClass('todo'); todo.append(input); $(‘#todo-list').append(todo); if($(‘.todo’).length === 20) { $(‘#add-button’).hide(); } }); 仕様変更 →20件を上限

Slide 36

Slide 36 text

e.g. 追加ボタンでタスクを追加 $(‘#add-button').on('click', () => { const todo = $('
'); todo.addClass(‘wrapper’); if($(‘.todo’).length % 5) { const separator = $(‘
’); todo.append(separator); } const input = $(''); input.attr('type', 'text'); input.addClass('todo'); todo.append(input); $(‘#todo-list').append(todo); if($(‘.todo’).length === 20) { $(‘#add-button’).hide(); } }); Q. 最終的なDOMの形は?

Slide 37

Slide 37 text

• 気軽に描画結果を変更できない • CSS適用に一苦労 • 実際にはこんなものではない • 機能の追加・修正の難易度も高い

Slide 38

Slide 38 text

• React • Vue • Angular

Slide 39

Slide 39 text

• Viewを事前に定義する • 状態とViewを分離する 共通している考え方

Slide 40

Slide 40 text

さっきの例をVueのtemplateで書くと?

Slide 41

Slide 41 text

React Facebook / VirtualDOM / JSX • 事例・情報が多い • 他ライブラリとの依存が薄い • JSX書くのがつらい • 結局他ライブラリが必要になる
 (Redux, React-Router, など) • トータルで記述量が多くなりがち

Slide 42

Slide 42 text

Vue コミュニティ / VirtualDOM / SFC • 日本語ドキュメントが充実 • 学習コストが低め(と思う) • 関連ライブラリとの一体感 • 型付けがつらい • 大企業の後ろ盾がないので、
 人によっては不安になるかも

Slide 43

Slide 43 text

Google / フルスタック / DI • 全部入りなので慣れると強いらしい • TypeScriptとの相性が良い
 (公式で推奨) • 独自の概念が多い • 学習コストが高い Angular (経験が薄いので偉そうなことを書けない)

Slide 44

Slide 44 text

どれにしたらいいの?

Slide 45

Slide 45 text

いまゼロから学ぶなら
 Vueから入ると良さそう (個人の意見です)

Slide 46

Slide 46 text

状態管理

Slide 47

Slide 47 text

• データ(状態)が散らばったまま • ドメインロジックも散らばっている • SPAだと特につらくなる Reactなどを使って、 Viewは宣言的になったけど… e.g.)
 アプリケーション全体で使うFlashメッセージ

Slide 48

Slide 48 text

状態管理だけをきれいにまとめたい (脱オレオレ実装)

Slide 49

Slide 49 text

• Redux • Vuex

Slide 50

Slide 50 text

• Reactでの採用例が多い • 単一Store / ReadOnly • 変更時は純粋関数のみを使う Redux

Slide 51

Slide 51 text

• Vueに特化した状態管理 • Vueならこれにしとけば良い Vuex

Slide 52

Slide 52 text

必要なの?

Slide 53

Slide 53 text

• 規模が大きくなってからの
 状態管理ライブラリ導入はキツい 入れるなら早めに • 早い段階で判断したほうがいい

Slide 54

Slide 54 text

モジュール管理

Slide 55

Slide 55 text

• Javaで言えばimport • Cで言えばinclude • Rubyで言えばrequire • ES5以前はモジュールの概念がない
 → コード間の依存関係を表現できない • みんな工夫してがんばってた
 (RequireJSというものがあってじゃな…)

Slide 56

Slide 56 text

• Node.jsの登場 • CommonJSの採用 const sub = require(‘./sub.js’);

Slide 57

Slide 57 text

ブラウザでも使いたい…!

Slide 58

Slide 58 text

• webpack • Parcel • ES Modules

Slide 59

Slide 59 text

• CommonJSで書いたコードを
 ブラウザで動く形に変換できる • 他にできることがめっちゃ多い • uglify(コード圧縮・難読化) • PostCSS/SASSの変換 • 画像変換
 など..

Slide 60

Slide 60 text

• webpack同様のモジュールバンドラ • 特徴 : Zero Con guration Parcel

Slide 61

Slide 61 text

ECMAScript単体で モジュール管理できないの?

Slide 62

Slide 62 text

• ES6(2015)以降の仕様 ES Modules import sub from ‘./sub.js’; • webpack/Parcelは
 ESModulesも変換できる

Slide 63

Slide 63 text

結局どうすればいいの?

Slide 64

Slide 64 text

• ESModulesで書くのが主流 • やりたいことが増えてくると
 webpackじゃないと厳しくなる • とりあえず考えたくない場合は
 Parcelが圧倒的に楽 • 不要になる未来は到底来ない気がする

Slide 65

Slide 65 text

その他

Slide 66

Slide 66 text

• ESLint, Prettier • Mocha, Jest • puppeteer • SSR • Next.js • Nuxt.js • Service Worker • PWA

Slide 67

Slide 67 text

時間切れ

Slide 68

Slide 68 text

まとめ

Slide 69

Slide 69 text

15分はあまりにも短すぎる

Slide 70

Slide 70 text

よく聞くワード 「フロントエンドは変化が速い」

Slide 71

Slide 71 text

facebook/react - Releases • v16.0.0 - 2017/09/27 • v15.0.0 - 2016/04/09 • v0.14.0 - 2015/08/08

Slide 72

Slide 72 text

ECMAScript • 2017 - 2017/06 • 2016 - 2016/06 • 6(2015) - 2015/06

Slide 73

Slide 73 text

そこまで速いわけでもないのでは?

Slide 74

Slide 74 text

なぜ速く感じるのだろう?

Slide 75

Slide 75 text

現実

Slide 76

Slide 76 text

現実 変化するものが多い

Slide 77

Slide 77 text

私たちは忙しいので、
 すべてを常に追うのは難しい。

Slide 78

Slide 78 text

現実的な話、 新しいものを一気に導入するのは 容易じゃない

Slide 79

Slide 79 text

ひとつずつやっていこう!