Upgrade to Pro — share decks privately, control downloads, hide ads and more …

モダンフロントエンド技術概論

 モダンフロントエンド技術概論

Webの歴史を振り返りながら
モダンなフロントエンド技術の網羅的に説明し、
その技術戦略上の意義を語りたい

makotunes

June 28, 2021
Tweet

Other Decks in Technology

Transcript

  1. WebͱϑϩϯτΤϯυͷྺ࢙ • WebϨΨγʔ࣌୅(1990-2006) • όοΫΤϯυϑϨʔϜϫʔΫ͕ओ໾ͷ࣌୅ • jQueryͷ࣌୅(2006-2010) • jQueryීٴޙͷੈք •

    SPAͱϑϩϯτΤϯυΤϯδχΞͷొ৔ • ϑϨʔϜϫʔΫઓࠃ࣌୅(2010-2013) • ϞμϯϑϩϯτΤϯυͷϑϨʔϜϫʔΫᴈ໌ظ • ݱ୅(2013-) • React,AltJSͷొ৔ ొ৔͔Βීٴ·Ͱ̎೥͘Β͍͸λΠϜϥά͕͋ΔͷͰɺ࣮ײͱͯ͠͸࣌୅มԽ͸໿̎೥஗Ε
  2. 1997ࠒ ಈతαΠτͷນ։͚ɹCGI • ϓϩάϥϜͰ௚઀HTMLΛฦ͢ • PerlʹΑΔCGI, Java Servlet public void

    doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException { response.setContentType("text/html;"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println(" <head>"); out.println(" <title>Hoge</title>"); out.println(" </head>"); out.println(" <body>"); out.println(new java.util.Date()); out.println(" </body>"); out.println("</html>"); } $(*
  3. 1999ࠒɹςϯϓϨʔτΤϯδϯͷొ৔ • HTMLʹϓϩάϥϜΛຒΊࠐΉ • Java JSP(1999), PHP <%@ page contentType="text/html

    %> <html> <head> <title>Hoge</title> </head> <body> <% out.println(new java.util.Date()); %> </body> </html> $(*ɾςϯϓϨʔτΤϯδϯ
  4. 1998 DHTMLϑϩϯτΤϯυͰͷಈతαΠτ • JavaScriptͷDOM API(1998)Λ࢖༻ͯ͠ HTMLΛૢ࡞Ͱ͖Δϒϥ΢β͕ొ৔ͨ͠ <!DOCTYPE HTML PUBLIC "-//W3C//DTD

    HTML 4.01 Transitional//EN" "http:// www.w3.org/TR/html4/loose.dtd"> <html> <head> </head> <body> <div id="hogehoge"></div> <script type="text/javascript"> // id͕hogehogeͷཁૉͷࢠཁૉͱͯ͠ʮ<p>HOGEEEEEEE</p>ʯΛ௥Ճɻ document.getElementById("hogehoge").innerHTML = "<p>HOGEEEEEEE</p>" </script> </body> </html> ※WikipediaΑΓ
  5. 2005 MVCΞʔΫςΫΩϟͷొ৔ • Model, View, Controller͔ΒͳΔΞʔΩςΫνϟΛಛ௃ͱ͢Δ • ࣮૷ͱͯ͠Ruby on Rails,

    CakePHP, DjangoͳͲ class UsersController < ApplicationController def index status = {name: 'ʹΌ͔ʹ͠', age: 28} @user = User.new @user.call_template(status) end end class User < ApplicationRecord require 'erb' def call_template(status) @name = status[:name] @age = status[:age] file = File.read('app/models/users/template.html.erb') erb = ERB.new(file).result(binding) puts erb end end ※WikipediaΑΓ ࢲ͸<%= @name %>Ͱ͢ɻ ೥ྸ͸<%= @age %>ࡀͰ͢ɻ
  6. 2005 Ajax • ϖʔδϦϩʔυͤͣɺJavascriptͷ࣮ߦͷΈ Ͱαʔόʔͱ௨৴Ͱ͖Δ • ωΟςΟϒΞϓϦʹ͍ۙUX͕࣮ݱ͢Δ • ϖʔδભҠΛ൐Θͳ͍WebΞϓϦΛSPAͱ ݺͿ

    (Single Page Application) var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://httpbin.org/get', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(null); Ҿ༻ɿ೔ܦXTECH
  7. 2005 jQuery • ؆ܿͳهड़ͰDOMૢ࡞΍Ajax௨৴͕Ͱ͖Δ • ϦονͳUIΛ࣮ݱ͢Δଟ͘ͷϓϥάΠϯ͕ొ৔ͨ͠ • ϑϩϯτΤϯυͷ։ൃ͕૿େ͠ɺઐ໳ͷ৬छ͕੒ ཱ $.ajax({

    url: "/api/getWeather", data: { zipcode: 97201 }, success: function( result ) { $( "#weather-temp" ).html( "<strong>" + result + "</strong> degrees" ); } }); ※jQueryΑΓ
  8. 2008 HTML 5ͱCSS 3ͱECMAScript 5 • 15೥ͿΓͷ࢓༷ͷඪ४Խ • ͋Δఔ౓ϦονͳWebUIΛ։ൃͰ͖ΔΑ͏ʹͳͬͨ //ϚϧνϝσΟΞରԠ

    <video width="640" height="360" preload="auto" poster="hoge.png" controls autoplay> <source src="hoge.webm" type='video/webm; codecs="vp8, vorbis"'> </video> //ϩʔΧϧετϨʔδ <script> localStorage.setItem('myCat', 'Tom'); var cat = localStorage.getItem("myCat"); localStorage.removeItem("myCat"); </script> //ϑΥʔϜͷόϦσʔγϣϯ <input name="email" type="email"> ※pngitem.comΑΓ
  9. ,OPDLPVU #BDLCPOFKT &NCFSKTW "OHVMBS+4 2010 ϞμϯϑϩϯτΤϯυϑϨʔϜϫʔΫᴈ໌ظ • MVCϞσϧ౳ͷ໌֬ͳσβΠϯύλʔϯΛ࣋ͭ • View૚ʢςϯϓϨʔτΤϯδϯʣɹએݴܕϓϩάϥϛϯά

    • ૒ํ޲σʔλόΠϯσΟϯά • AjaxϢʔςΟϦςΟ • URLϧʔςΟϯά <!doctype html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/ angular.min.js"></script> <script> var app = angular.module('myApp', []); app.controller('myController', function($scope) { $scope.message = 'Hello world!'; }); </script> </head> <body> ※WikipediaΑΓ
  10. 2010ࠒ Node.jsͱपลπʔϧͷొ৔ʹΑΔ։ൃ؀ڥͷൃల • αʔόʔαΠυͷJavascriptϥϯλΠϜ Node.js • τϥϯεύΠϥʹΑΓAltJS͕෮چɹBabel • ϞδϡʔϧγεςϜΛݴޠ࢓༷ͱͯ͠αϙʔτ CommonJS

    • ϞδϡʔϧϋϯυϥɹWebpack • ύοέʔδϚωʔδϟɹNpm & Yarn var a = require('module') ※WikipediaΑΓ <script src="/module.min.js"></script>
  11. 2010ࠒ AltJSɹτϥϯεύΠϧʹΑΓJavascriptʹม׵Ͱ͖Δϓϩάϥϛϯάݴޠ • CoffeeScript • ݩ૆AltJSɻΫϥεɺΞϩʔؔ਺ɺΠϯσϯτͳͲ࢖༻Մɻۙ೥͸ഇΕ͖ͯͨɻ • TypeScript • ੩తܕ෇͚ɾΫϥεɾΠϯλʔϑΣΠεɾδΣωϦΫε౳ɻۙ೥ओྲྀɻ

    • Dart • ϒϥ΢βͰ͸ഇΕ͕ͨɺϞόΠϧΞϓϦͷੈքͰੜ͖࢒ͬͨ(FlutterͳͲ)ɻ ※WikipediaΑΓ interface IUser { name: string; getName: (keisho: string) => string; } class User implements IUser { name: string; getName (keisho: string) { return `${this.name} (${keisho})`; } }
  12. 2015 Javascriptඪ४࢓༷(ECMAScript)ͷϞμϯԽ • ECMAScript 2015(ES2015/ES6) • ߏจ͕࡮৽͞ΕͯҰؾʹϞμϯͳݴޠʹͳͬͨʢӈهʣ • Ұൠతʹ͸͔͜͜ΒϞμϯͱݟͳ͢ •

    ECMA࢓༷͕ൃද͞Ε͔ͯΒɺϒϥ΢βJS͕ରԠ͞ΕΔ·ͰλΠϜϥά͕͋Δʢhttps://kangax.github.io/compat- table/es6/ʣ • ຖ೥ߋ৽͞Εͯɺ͢ͰʹES2022(ES12)·Ͱൃද͞Ε͍ͯΔ • BabelͷΑ͏ͳτϥϯεύΠϧπʔϧ͕ීٴͨͨ͠Ίɺ࠷৽࢓༷ͷεΫϦϓτͰ࣮૷͢Δ͜ͱ͕Մೳʹͳͬͨ • ʢϑϨʔϜϫʔΫΛ࢖Θͳ͍ɺAltJSͰ͸ͳ͍ͱ͍͏จ຺Ͱʣඪ४ͷJSͷ͜ͱΛVanillaJSͱݺͿɻ if (true) { var a = 1; let b = 2; const c = 3; b = 20; } console.log(a); // => 1 console.log(b); // => undefined console.log(c); // => undefined const fn = (a, b) => { return a + b; }; ES2015(ES6 ) • let/constએݴ • classߏจ • Promis e • Ξϩʔؔ਺ • importͱexportʹΑΔϞδϡʔϧߏจ • ςϯϓϨʔτจࣈྻ • ؔ਺ͷՄม௕Ҿ਺ • ؔ਺ͷσϑΥϧτҾ਺ • ෼ׂ୅ೖ • ഑ྻల։ • for o f • Map/Set/WeakMap/WeakSe t • Symbo l • ܕ෇͖഑ྻ ES2016(ES7 ) • Array.include s • Exponentiation operator ES2017(ES8 ) • Object.values/Object.entrie s • String.padStart/String.padEn d • Object.getOwnPropertyDescriptor s • ຤ඌΧϯϚڐ༰ • Async/Awai t • Shared memory and atomic s
  13. Sassͷಛ௃ • ωετʢೖΕࢠʣ͕࢖͑ͯߏ଄͕೺Ѳ͠΍͍͢ • ࢛ଇԋࢉ͕Ͱ͖Δ • ม਺͕࢖͑Δ • ϑΝΠϧΛ෼ׂͰ͖Δ •

    MixinʢϛοΫεΠϯʣͰίʔυΛҾ༻Ͱ͖Δ • ίʔυΛܧঝͰ࢖͍ճͤΔ • JavaScriptͷΑ͏ʹؔ਺͕࢖͑Δ 2006 AltCSS ϓϩάϥϛϯάݴޠʹ͍ۙ࢓༷ͷ࣮ݱ • ϓϦϓϩηοαͱ΋ݺ͹ΕΔ • Less • ݩ૆CSSϓϦϓϩηοαɹۙ೥ഇΕΔɻ • Sass • ϓϦϓϩηοαݱࡏओྲྀ • PostCSS • ΧελϚΠζੑͱ࠷దԽπʔϧΛఏڙ͢Δ ※WikipediaΑΓ $blue: #3bbfce; $margin: 16px; .content-navigation { border-color: $blue; color: darken($blue, 10%); } .border { padding: $margin / 2; margin: $margin / 2; border-color: $blue;
  14. 2013 Reactͷొ৔ • DOMͷԾ૝ԽʹΑΔࠩ෼ߋ৽γεςϜʹΑΓύϑΥʔϚϯεͷվળΛ࣮ݱ • HTMLϥΠΫͳJSॻ͚ΔJSXͷऔΓࠐΈ • React͸ViewͷΈఏڙ͠ɺঢ়ଶ؅ཧ͸ผϑϨʔϜϫʔΫ͕ఏڙ͢Δ • ୯ํ޲ͷσʔλϑϩʔΞʔΩςΫνϟ͕࢖ΘΕΔʮFlux,

    Reduxʯ import React from "react"; import ReactDOM from "react-dom"; class Layout extends React.Component { render() { return ( <h1>Welcome!</h1> ); } } const app = document.getElementById('app'); ReactDOM.render(<Layout/>, app); Flux Redux Ҿ༻ɿClarion Technologies, Qiita
  15. 2015 ReactͷӨڹΛड͚ͨϑϨʔϜϫʔΫ͕૿Ճ • Grommet • Ember.js v2 • Vue.js v2

    • Svelte • Hyperapp • Dojo <div id="app"> {{ message }} </div> <script> var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) </script> Ҿ༻ɿPublickey ར༻཰
  16. 2020 ۙ೥ͷReactͷਐԽ • ؔ਺ܕίϯϙʔωϯτ • Ϋϥεܕίϯϙʔωϯτʹ୅ΘΓpropsΛड͚औΓReactΤϨϝϯτΛฦؔ͢਺Λ ࢖༻ͨ͠σβΠϯύλʔϯΛ௥Ճ • ϑοΫ •

    ؔ਺ܕίϯϙʔωϯτͷͨΊͷstateͷ؅ཧํ๏ import React, { useState, useEffect } from 'react'; function FriendStatus(props) { const [isOnline, setIsOnline] = useState(null); function handleStatusChange(status) { setIsOnline(status.isOnline); } useEffect(() => { ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange); return () => { ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange); }; }); if (isOnline === null) { return 'Loading...'; } return isOnline ? 'Online' : 'Offline'; }
  17. αʔόʔαΠυͰϖʔδΛ࡞Δٕज़ɹSSR/SSG • ैདྷͷϑϩϯτΤϯυ׬݁ܕʢSPA(CSR)ʣϑϨʔϜϫʔΫͷܽ఺ • αʔνΤϯδϯ͕಺༰Λݕग़͠ਏ͘SEO؍఺ʹ໰୊͕͋Δ • ॳճϩʔυʹ͕͔͔࣌ؒΔ • Next.js, Nuxt.js,

    GatsbyJS • ϑϩϯτΤϯυٕज़ΛόοΫΤϯυϑϨʔϜϫʔΫʹͨ͠΋ͷ • SSR Server Side Rendering • ϦΫΤετʹԠͯ͡ɺαʔόʔαΠυͰϨϯμϦϯάͯ͠ฦ͢ • APIͱͷ௨৴͸ϒϥ΢β͔Β΋౎౓ߦΘΕΔ • SSG Server Side Generation • Ϗϧυ࣌ʹϨϯμϦϯάͯ͠ϖʔδΛ༻ҙ͓ͯ͘͠ • APIͱͷ௨৴͸Ϗϧυ࣌ͷΈ • CDNͷΈͰ΋࣮ݱՄೳ Ҿ༻ɿ͠·ͿΖ͙
  18. ωΠςΟϒΞϓϦͷΑ͏ͳWebϖʔδΛ໨ࢦ͢ɹPWA(Progressive Web App) • ϒϥ΢βͷServiceWorkerͱ͍͏ػೳΛ࢖༻͢Δ • Ұ୴ಡΈࠐΊ͹ΦϑϥΠϯͰಈ࡞Ͱ͖Δ • ϞόΠϧΞϓϦͱͯ͠΋૊ΈࠐΊΔ->TWAʮTrusted Web

    Activityʯ • ΞϓϦ಺෦Ͱϒϥ΢β࣮ߦ͢Δٕज़ • ϞόΠϧϒϥ΢β͚ͩͰͳ͘ɺσεΫτοϓϒϥ΢βͰ΋Մೳ • ΞϓϦΛΠϯετʔϧͤͣɺͱΓ͋͑ͣ࢖ͬͯ΋Β͑Δ͜ͱͰ͖Δ • ॳճར༻཰ɺCVɺ࠶๚໰཰ͳͲ͕޲্ͨ͠ࣄྫ͕ଟ͍ Spotifyͷࣄྫ Ҿ༻ɿpantograph
  19. ΫϩεϓϥοτϑΥʔϜΞϓϦ։ൃ • ҰͭͷίʔυͰෳ਺ͷϓϥοτϑΥʔϜʹରԠͤ͞Δٕज़ • Electron • σεΫτοϓΞϓϦΛWebٕज़Ͱ࣮ݱ͢Δ • جຊతʹReactͳͲͷSPAͱ૊Έ߹Θͤͯ࢖͏ •

    Linux/Windows/Mac • Chromium+Node.jsͰಈ͘ΞϓϦͰ͋ΓɺωΟςΟϒΞϓ ϦͰ͸ͳ͍ • React Native • iOS, AndroidϞόΠϧωΠςΟϒΞϓϦ༻ • React Native for Windoes + macOS • Mac,Windows༻ωΠςΟϒΞϓϦ
  20. GraphQL΁ͷظ଴ • ඞཁͱ͢ΔΫΤϦͷෳࡶੑʹର͢ΔରԠ͢ΔιϦϡʔγϣϯ • ϦονϑϩϯτΤϯυԽͰAPI͕ෳࡶԽ͢Δ • UI͸ৗʹϢʔβʔͷχʔζʹै͍ɺ଎΍͔ʹมԽ͢Δ • ϚϧνϓϥοτϑΥʔϜԽͰݸผΞϓϦ͕ҟͳΔΫΤϦΛཁٻ͢Δ •

    ϦΞϧλΠϜͰͷσʔλಉظ • ෳ਺ͷϚΠΫϩαʔϏε͕ଘࡏ͢Δ Ҿ༻ɿwebprofessional.jp // Schema type Project { name: String tagline: String contributors: [User] } // Ask for what you want { project(name: "GraphQL") { tagline } } // Get predictable results { "project": { "tagline": "A query language for APIs" } }
  21. Ϋϥ΢υͷϚωʔδυɾαʔϏεΛखܰʹར༻͢ΔAmplify • ΞϓϦ։ൃʹूத͢ΔͨΊͷΠϯϑϥɾόοΫΤ ϯυΛαʔϏεԽͯ͠ఏڙ • αʔόʔϨεͳόοΫΤϯυΛηοτΞοϓ͢ ΔͨΊͷ Amplify CLI •

    ϑϩϯτΤϯυ͔ΒόοΫΤϯυʹ઀ଓ͢Δͨ Ίͷ Amplify Libraries • CI/CD ΍΢ΣϒΞϓϦͷϗεςΟϯάʹ޲͚ ͨ Amplify Console • Ϣʔβʔ؅ཧ΍ CMS తͳίϯςϯπ؅ཧΛҰ ݩԽ͢Δίϯιʔϧ Amplify Admin UI Ҿ༻ɿaws