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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

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

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

Avatar for makotunes

makotunes

June 28, 2021

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