Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2018年の”JavaScript” 再入門/re-learning-about-js-in-...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
pastak
March 20, 2018
13k
31
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2018年の”JavaScript” 再入門/re-learning-about-js-in-2018
KMC春合宿2018での発表資料です
pastak
March 20, 2018
More Decks by pastak
See All by pastak
アクセシビリティの向上がそのまま事業貢献になると良い
pastak
3
530
幕間CMを支える技術
pastak
4
690
無からniboshiを生み出す
pastak
0
37
Helpfeelがアクセシビリティにどのように取り組み始めて、どこまで来れたのか/Helpfeel Accessibility 2025-07
pastak
3
590
LT: JavaScript / HTML カルトクイズ
pastak
0
190
「夏フェス」をヒントに新しいカンファレンスを考えてみた at 函館市電LT
pastak
3
580
「アクセシビリティを始めたい!」から1年、あれからどうなったのか。
pastak
2
250
「アクセシビリティを始めたい!」から1年、あれからどうなったのか。 〜LTバージョン〜
pastak
1
1k
【2024年最新】「エンジニアお茶会」という取り組みについて
pastak
1
550
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Mobile First: as difficult as doing things right
swwweet
225
10k
Paper Plane (Part 1)
katiecoart
PRO
0
9k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
590
Transcript
2018ͷ”JavaScript” ࠶ೖ Pasta-K at KMC SpringCamp 2018
[email protected]
/
[email protected]
@pastak
• ژେֶֶ෦ใֶՊ ܭࢉػՊֶίʔε5ճੜ • KMC ݩใ • Nota Inc Gyazo։ൃνʔϜ
ΞϧόΠτ • JavaScript / React / Ruby on Rails • Browser Extension • גࣜձࣾͯͳ ΞϧόΠτ • TypeScript
࣍ • JavaScriptͷྺ࢙ • JavaScriptͱECMAScript • ECMAScriptͷḷ͖ͬͯͨಓͷΓ • babel /
browserify / Webpack ...ԿͷͨΊʁ • ·ͱΊ
͜ͷτʔΫͷλʔήοτ • JavaScriptʹ͍ͭͯաڈʹ৮Εͨ͜ͱ͕͋Δͷͷɺ͜͜ JavaScriptͷΤίγεςϜʹ৮Ε͍ͯͳ͍ਓ • ࠷ۙͷJavaScriptֶशίετ͕ߴ͍ͱײ͍ͯ͡Δਓ • JavaScriptʹ͍ͭͯೖ͍ͨ͠ͱߟ͍͑ͯΔਓ • ࠓޙJavaScriptΛ͍ͬͯ͘"Մೳੑ͕͋Δਓ
͜ͷτʔΫͷΰʔϧ • ʮ࠷ۙͷJavaScriptΛॻͨ͘Ίʹඞཁͳπʔϧ͕ଟֶͯ͘शίε τ͕ߴͯ͘ΫιʯΈ͍ͨͳ͜ͱΛಥવݴ͍ग़ͯ͠͠·Θͳ͍Α͏ ʹ͢Δ • ͱ͜ΖͰԿނ͜Μͳʹ৭ʑπʔϧΒ༷Β͕ʹͳ͍ͬͯ Δͷ͔Λཧͯ͠ཧղ͢Δ • ͱ͜ΖͰͱ͜ΖͰɺ
ʮ“JavaScript”ͬͯԿ??ʯΛѲ͢Δ
࣍ͷ֤ߦͷίʔυ(ϒϥβ|NodeJS)Ͱಈ͘?
͜ͷτʔΫͰ͞ͳ͍͜ͱ • JavaScriptͷจ๏ه๏ɺ࠷ۙՃ͞ΕͨECMAScriptͷ༰ʹ͍ͭͯ • JavaScriptΛ༻͍ͨΞϓϦέʔγϣϯߏஙςΫχοΫ • JSͷςΫχοΫΓ͍ͨਓڈͷय़߹॓ͷࢿྉΛಡΜͰ͘Ε • WebΞϓϦέʔγϣϯͰ 60fpsΛ(ۃྗ)ࢦ͢
// Speaker Deck • https://speakerdeck.com/pastak/webahurikesiyonte-60fpswo-ji-li-mu-zhi-su
JavaScriptͷྺ࢙Λ ৼΓฦͬͯΈΔ
օ͞Μ͕Πϝʔδ͢ΔJavaScriptͲΕͰ͢? • WebϖʔδΛ͔ʹ͢Δͭ • Google Maps / Web 2.0 /
Ajax • Twitter / Facebook / SPA / PWA • NodeJS
ॳظͷϢʔεέʔε • WebαΠτΛ՚ඒʹ͢Δ • ͋Μ·ΓศརͳΘΕํ͕ͳ͔ͬͨ • ΫϦοΫͨ͠ΒalertΛग़͢ • จࣈ͕νΧνΧ͢Δ •
mouseoverͰcursorΛม͑Δ
JavaScript҉ࠇ࣌ • 2000લJSͷ੬ऑੑΛͭ͘ΣϒαΠτଟ͘JavaScript ΛແޮԽ͍ͯ͠Δਓͨͪଟ͍ͨ͘ • ϒϥΫϥ • Flashશظ
2005 Google Mapsര • Google MapsແݶʹεΫϩʔϧͰ͖ΔਤαΠτͩͬͨ • ྫ͑Yahoo!ͷਤ্ԼࠨӈʹҠಈ͢ΔϦϯΫΛԡͯ͠Ҡಈ͍ͯͨ͠ • Google
Maps͜ͷͱ͖XMLHttpRequestͳͲΛͬͯμΠφϛοΫʹಡ ΈࠐΈΈΛఏڙ͍ͯͨ͠ • AjaxΞϓϦέʔγϣϯ͕ਓؾΛത͢Δ͖͔͚ͬʹͳͬͨ
ਓʑ ؾ͍ͨ
JavaScript ศར͡ΌΜ
JavaScriptʹର͢ΔೝࣝͷมԽ • WebαΠτΛ૽͕͘͢͠Δ͚ͩͷअຐͳଘࡏͩͱࢥΘΕ͍ͯͨ • ࣮ࡍɺJavaScriptΛUXʹܨ͛ΔΑ͏ͳΞϓϦέʔγϣϯ͕ͳ͔ͬͨ • DynamicHTMLͷඇޓඇಉظ௨৴ΛNN͕ͳ͔ͳ͔࣮͠ͳ͔ͬ ͨ͜ͱ͋Δ͕ɾɾɾ • ࣮ྫͱͯ͠ͷGoogle
MapsϢʔβʔ͚ͩͰͳ͘։ൃऀʹେ͖ͳӨڹΛ༩ ͑ͨ
JSͰϚογϡΞοϓ͢Δͷ͕ྲྀߦͬͨ • Google Maps Ajax APIΛ࢝Ίͱ͢ΔXMLΛఏڙ͢ΔAPIjsonpΛఏڙ͢ ΔAPI͕৭ʑͱొ • ͜ΕΒΛΈ߹ΘͤͯΞϓϦέʔγϣϯΛ࡞ΔʰϚογϡΞοϓʱ͕ྲྀߦ •
͜ͷྲྀΕΛਵ͢ΔϦονͳWebΞϓϦέʔγϣϯ͕ొ࢝͠ΊΔ • ʰWeb 2.0ʱ
ϒϥβߴԽ • 2008 Google Chromeͷొ • GoogleۘJSΤϯδϯ V8͕͔ͬͨ • ଞͷJSΤϯδϯਵͯ͠ߴԽͷಓ
• ͜Μͳʹ͘Ͱ͖ΔͳΒͬͱΞϓϦέʔγϣϯͷػೳΛدͤΕΔ ͧ
NodeJSొ • 2009 V8Λར༻ͨ͠αʔόʔαΠυ্ͷJavaScript࣮ߦڥͱͯ͠ొ • ΠϕϯτۦಈܕʹΑΔϊϯϒϩοΩϯάIOͳͲʹ͕ू·ͬͨ • ʰΫϥΠΞϯτ1ສʱ͕ى͖ͳ͍ • ͔͜͜ΒҰؾʹJSϒϥβ্Ҏ֎Ͱಈ͘ϓϩάϥϛϯάݴޠʹ
• ͦΕҎલಈ͔͢ڥ͕͋ͬͨ͋·ΓϝδϟʔʹͳΒͳ͔ͬͨ • ࠓαʔόʔαΠυͪΖΜɺCLI༻ͷεΫϦϓτπʔϧΛॻͨ͘Ίʹଟ͘ར༻͞Ε͍ͯΔ
ݱࡏͷJavaScriptΞϓϦέʔγϣϯ • AngularReactɺVueͳͲΛͬͨSPAΞϓϦέʔγϣϯ • pushStateʹΑΔཤྺॻ͖ࠐΈ + XHR/fetchʹΑΔσʔλऔಘ • Progressive Web
Application • ϞόΠϧϒϥβͰσεΫτοϓϒϥβͰ͍͍ײ͡ʹಈ͘ • ΦϑϥΠϯΩϟογϡɾϩʔΧϧετϨʔδ
JavaScriptͱECMAScript
ECMAScriptͱԿ͔
·ͣ”ECMAScript”Λͬ͘͟Γͱ • JavaScriptͷඪ४༷ͷ໊শ • Ecma Internationalͷtc39Ͱٞ͞Ε͍ͯΔ • ݱࡏLiving StandardͷܗͰͲΜͲΜ༷͕Ճ͞Ε͍ͯΔ
JavaScriptॳظ • 1995 NetScapeʹͤΔͨΊʹ։ൃ͞ΕΔ • Java͕ྲྀߦ͍ͬͯͨͷͰɺ໊લΛआΓ͖ͯͯJavaScriptʹ • 1996 IE3.0ʹͤΑ͏ͱ͢Δަবࣦഊ •
Microsoft͕ಠࣗͷJScriptͱͯ͠։ൃ
JavaScriptඪ४Խ • 1997 JavaScriptͱJScriptͷ྆ํ͕͋Δঢ়گΛͳΜͱ͔͠Α͏ͱ͍͏ Ϟνϕʔγϣϯ͕Netscapeʹ͋ͬͨ • ͜ͷJavaScriptͷඪ४ԽΛECMAΠϯλʔφγϣφϧʹґཔ • ECMA-262ͷॳ൛͕ग़དྷΔ •
“JavaScript”ඪͷ߹Ͱ͑ͳ͍ͷͰɺ”ECMAScript”ʹ
ECMAScriptඪ४Խͷܥේ • 1998 ECMA-262 ୈ2൛ • 1999 ECMA-262 ୈ3൛ •
͜͜·Ͱॱௐͩͬͨɾɾɾ
ECMAScriptඪ४Խͷܥේ • 1998 ECMA-262 ୈ2൛ • 1999 ECMA-262 ୈ3൛ •
͜͜·Ͱॱௐͩͬͨɾɾɾ • ECMA-262 ୈ4൛Ͱࣄ݅ىͬͨ͜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ECMAScript 4Ͱͷग़དྷࣄ • ਪਐ • Adobe, Mozilla(چNetscape Navigationࣾ), Opera, Google
• ଟ͘ͷ৽ػೳΛऔΓࠐΈJavaScriptΛେ෯ʹมߋ͢Δ • ର • Microsoft & Yahoo • ES3ΛϕʔεʹػೳՃόάमਖ਼ΛؚΜͩES3.1ͱͯ͠ެ։͢Δ
ECMAScript4ͱͳΜͩͬͨͷ͔ • ߏཁૉᶃ • ActionScript 3.0(Adobe͕FlashΞϓϦέʔγϣϯͷͨΊʹ։ൃ͠ ͍ͯͨϓϩάϥϛϯάݴޠ)͔ΒऔΓࠐΜͩػೳ • class, interface,
ܕ, ໊લۭؒ, package ͳͲ
ECMAScript4ͱͳΜͩͬͨͷ͔ • ߏཁૉᶄ • JavaScript 1.7(NNFirefoxʹࡌ͍ͬͯͨJS࣌JavaScript 1.X ͱ͍͏όʔδϣϯ൪߸͕߱ΒΕ͍ͯͨ)͔ΒऔΓࠐΜͩػೳ • let,
ׂೖ, δΣωϨʔλʔ ͳͲ
ECMAScript4ͱͳΜͩͬͨͷ͔ • ߏཁૉᶅ • ͦͷଞʹଟ͘ͷ৽ͨͳػೳΛऔΓࠐΉ͜ͱ͕ըࡦ͞Ε͍ͯͨ • ྫ͑ɾɾɾ
ςϯϓϨʔτ • C#ͰGenericͱݺΕͯΔͭ http://tech.nitoyon.com/ja/blog/2007/10/30/es4-overview/ ΑΓ
ԋࢉࢠΦʔόʔϩʔυ http://tech.nitoyon.com/ja/blog/2007/10/30/es4-overview/ ΑΓ
ECMAScript4ʹؔ͢Δܾண • ݁Ռͱͯ͠ES3.1 (aka ES Harmony)Λ͍ͬͯ͘͜ͱʹऩଋ (20088݄) • ES4͜Ε·ͰͷESʹରͯ͠มߋ͕େ͖͗͢ΔͷͰԺʹΓ͍ͨ •
จ๏ͷޓੑͷͳͲ͔ΒաڈͷWebͷࢿ࢈ʹӨڹΛ༩͑ͯ͠·͍͔Ͷͳ͍ • ໊લۭؒύοέʔδͳͲWebʹ͙ͦΘͳ͍ͷͰɺES3.1ͷٞͷ্ͰҰѻ Θͳ͍ • ͦΕҎ֎ͷػೳʹ͍ͭͯٞͷରͱͯ͠ѻ͏
ECMAScript5ϦϦʔε • ES Harmonyͱͯ͠ਐΊΒΕ͍ͯͨ࡞ۀʹ2009ɺES5ͱͯ͠Ϧ Ϧʔε͞Εͨ • ϝδϟʔόʔδϣϯ͕2্͕͍ͭͬͯΔ͕࣮ଶ3.0͔Β3.1ͷϚΠ φʔόʔδϣϯΞοϓ • Mozilla͕ਐΊ͍ͯͨJavaScript
1.X → 2.0ͷ࡞ۀESʹ४ڌ͢Δํ ʹͳΓɺ͜ͷόʔδϣϯݺশߦΘΕͳ͘ͳͬͨ
ECMAScript 5ͷ৽ػೳ • JSON.parse, JSON.stringify ͷՃ • ArrayͷϝιουͷՃ forEach, filter,
map, reduce, indexOf • StringͷϝιουͷՃ trim • StrictϞʔυͷՃ ͳͲ
تͷECMAScript6ϦϦʔε • 2015ϦϦʔε • ଟ͘ͷັྗతͳػೳ͕༷ʹͳͬͨ!!!!!!!!!!!!!!!!!!! • Θ͍Θ͍
arrow function • () => {} ͰؔࣜΛॻ͚Δ • this͕ͦͷએݴ࣌ͷίϯςΩετͷthisʹଋറ͞ΕΔ
enhanced object literals / destructuring • Objectͷkey͕ม໊ͱಉ࣌͡ʹলུՄೳ • ArrayͱObjectͰׂೖ͕Մೳʹ
Promise • JSͷίʔϧόοΫࠈ͔ΒਓʑΛղ์ • ͦΕ·ͰਓʑjQuery.defferͱ͔ʢyieldͱ͔ʣͰࣃΛ৯͍ͬ͠ ͍ͯͨͷ͡Ό
Class • ͦΕ·ͰਓʑprototypeΛར༻͍͍ͯͬͯͬͯͨ͠
Class • ES6ͰClassߏจ͕Ճ͞Εͨ
ͦͷଞ • Symbol • Number.isNaN • Array.from / Array.find •
String.includes / String.repeat • Object.assign • ඌ࠶ؼ࠷దԽ
ES6➜ES2015…ͦͯͦ͠ͷઌ • ES6ES2015ʹվশɻҎ߱Living Standardํࣜʹ • ECMAScriptͷ༷ॻͷυϥϑτGithub্ͷtc39/ecma262Ͱཧ͞Ε͍ͯΔ • ࠷৽ͷECMAScript༷ https://tc39.github.io/ecma262/ •
ຖ۠ΓΛ͚ͯҎ߱ES2016, ES2017ͱTagΛ͚Δ • ͜ͷλΠϛϯάͰStage4ʹೖ͍ͬͯΔ༷Λରʹ͢Δ
http://azu.github.io/slide/2018/node/ecmascript39.html ΑΓ
ࠓͷECMAScript • ͦΕ·Ͱશͯͷ༷͕߹ҙ͞ΕͨޙʹϦϦʔε͞Ε͍͕ͯͨɺݱ ࡏͷES߹ҙ͕औΕ༷͔ͨΒॱ࣍ϦϦʔε͞Ε͍ͯΔ • ྫ͑ɺES4ͷ߹ҙܗͷࣦഊʹΑΓES3͔Β࣍ظόʔδϣϯͰ͋ ΔES5·Ͱʹ10ʢES4ࣗମʹ2.5͘Β͍ͷϦιʔε͕͔͔ͬ ͍ͯͨͱݴΘΕ͍ͯΔ)͕͔͔ͬͨ
ࠓͷECMAScript • Github্ͷେ͖ͳϓϩδΣΫτͱ͍͏ܗͰਐΊ͍ͯΔ • ϑΟʔυόοΫΛΑΓड͚͍͢ڥʹ • ϒϥβϕϯμʔ͚ͩͰͳ͘JavaScriptΛར༻͢Δ։ൃऀ͔Β ϑΟʔυόοΫΛΑΓड͚ΔͨΊʹ • ϓϩηεͷಁ໌Խ
• ϛʔςΟϯάϊʔτશͯGithub্Ͱެ։͞Ε͍ͯΔ
ECMAScriptͷݱࡏͷࡦఆखॱ • ͦΕͧΕͷػೳʹ͍ͭͯݸผͷϓϩϙʔαϧͱͯ͠ਐΊΔ • ͜ͷϓϩϙʔαϧٞͷͨΊʹ࠷େ࠷খݶͷܗͷͷ͕૿͑ͨ • ऀ(νϟϯϐΦϯ)ͱstage0ʙ4͕͋Γɺstage4ʹͳΔͱ ECMAScriptͷ༷ʹmergeՄೳʹͳΔ
ECMAScriptϓϩϙʔαϧͷStageʹ͍ͭͯ http://azu.github.io/slide/2018/node/ecmascript39.html ΑΓ
ECMAScriptϓϩϙʔαϧͷStageʹ͍ͭͯ stage3͔Βstage4ʹ ʲ2ͭҎ্ͷ࣮*ʳ͕ඞཁ * flag͖࣮ͰOK
TranspilerPolyfillʹ͍ͭͯ • Transpiler: ৽͍͠ߏจΛطଘͷػೳͰ࠶ݱͰ͖ΔΑ͏ʹιʔείʔυΛม ͢Δπʔϧ • ex: Babel • Polyfill:
ϓϩϙʔβϧͰՃ͞Εͨ৽͍͠ϝιουؔͳͲΛ࣮Λఏ ڙ͢ΔϥΠϒϥϦ • ex: babel-polyfill, whatwg-fetch
TranspilerPolyfillʹ͍ͭͯ • TranspilerPolyfill৽͍͠ߏจϝιουͳͲͷ࠶ݱΛࢼΈ͍ͯ Δ͚ͩͰɺ෦తͳৼΔ͍࣮ߦʹ͍࣮ͭͯࡍͷϒϥβ ࣮ͱҟͳΔͷͰҙ • ϒϥβຊମͷ࣮Λͨͣͯ͠ઌߦͯ͠ࢼ͢͜ͱ͕ग़དྷΔͷͰɺ ϓϩϙʔαϧͷϑΟʔυόοΫ͕༰қʹͳͬͨ
ECMAScriptݱঢ়·ͱΊ • ES5·Ͱશ༷ʹ͍ͭͯಉҙͷ্ͰϦϦʔε͍ͯͨ͠ • ES6 (= ES2015)Ҏ༷߱ຖʹಉҙ͕ͳ͞ΕΔͱϦϦʔε • ࣮͕2ͭҎ্ଘࡏ͍ͯ͠Δɾςετ͕͋Δ •
tc39ٕज़ҕһձͰͷঝೝ • ຖ6݄ࠒʹESXXXXͱศٓతͳ໊લ(λά)͕͚ΒΕΔ
JavaScriptͱECMAScript
“JavaScript”ͱ”ECMAScript"
“JavaScript”ͱ”ECMAScript" ͔͜͜Β͕ຊ!!!!!!!!!!
JavaScriptͷॲཧܥ • ϒϥβʹࡌ͍ͬͯΔΤϯδϯͨͪ • Chrome: V8, Safari: JavaScriptCore, Firefox: SpiderMonkey
ͳͲ • CLI্ͳͲͰར༻Ͱ͖Δॲཧܥ • NodeJS
օ͞Μͷॻ͍͍ͯΔ”JavaScript”ʁ
օ͞Μͷॻ͍͍ͯΔ”JavaScript”ʁ Perl????
օ͞Μͷॻ͍͍ͯΔ”JavaScript”ʁ ES5 strict mode
"use strict" / Opt-in Strict mode • JavaScriptجຊతʹޙํޓੑΛഁյ͠ͳ͍Α͏ʹ։ൃ͕ਐΊΒΕͯ ͖ͨ •
ES5ͷStrict modeաڈͷJSͷෛ࠴ͷฦ٫ɺকདྷͷJSͷࢿͷͨΊ • ߏจϥϯλΠϜͷৼΔ͍ʹରͯ͠มߋΛՃ͑Δ • ϑΝΠϧͷઌ಄·ͨؔͷઌ಄Ͱ
"use strict" / Opt-in Strict mode • JavaScriptجຊతʹޙํޓੑΛഁյ͠ͳ͍Α͏ʹ։ൃ͕ਐΊΒΕͯ ͖ͨ •
ES5ͷStrict modeաڈͷJSͷෛ࠴ͷฦ٫ɺকདྷͷJSͷࢿͷͨΊ • ߏจϥϯλΠϜͷৼΔ͍ʹରͯ͠มߋΛՃ͑Δ • ϑΝΠϧͷઌ಄·ͨؔͷઌ಄Ͱ ߏจΛՃ͢ΔͷͰͳ͘จࣈྻΛࣝผ ʹར༻͢Δ͜ͱͰඇରԠͷڥͰͦΕ ͳΓʹಈ͘Α͏ʹͳ͍ͬͯΔ (ͨͩ͠ৼΔ͍͕ҟͳΔͷͰҙਤ௨Γ ʹಈ͔ͳ͍͜ͱ͕ଟ͍ͷͰҙ)
Strict modeͰมΘΔ͜ͱ • ۮൃతͳάϧʔόϧมͷೖΛΤϥʔʹ • ͍͔ͭ͘ͷ߹ʹTypeError ྫ֎͕ൃੜ͢ΔΑ͏ʹʢҎԼͦͷྫʣ • NaN ͷೖ
• JSͰ NaN ΩʔϫʔυͰͳ͘άϧʔόϧม • getterϓϩύςΟͷೖ • ΦϒδΣΫτʹॏෳͨ͠ϓϩύςΟΛઃఆ͢Δ
Strict modeͰมΘΔ͜ͱ • implementsɺinterfaceɺletɺpackageɺprivateɺprotectedɺpublicɺstaticɺyield Λ༧ޠʹՃ • with Λ͏ͱSyntax Errorʹ •
thisͷৼΔ͍ͷมߋ • τοϓϨϕϧ·ͨؔҎ֎ͰͷؔએݴΛΤϥʔʹ ͳͲ
this in JS • JavaScriptͷthisͦΕ͚ͩͰ1ͷຊ͕ॻ͚Δ͘Β͍৭ʑͳ͕ ͋Δ
this in JS • JavaScriptͷthisͦΕ͚ͩͰ1ͷຊ͕ॻ͚Δ͘Β͍৭ʑͳ͕ ͋Δ From http://efcl.info/2018/01/04/what-is-this/
this in JS • JavaScriptͷthisͦΕ͚ͩͰ1ͷຊ͕ॻ͚Δ͘Β͍৭ʑͳ͕ ͋Δ From http://efcl.info/2018/01/04/what-is-this/
this in JS • JavaScriptͷthisͦΕ͚ͩͰ1ͷຊ͕ॻ͚Δ͘Β͍৭ʑͳ͕ ͋Δ • JSΛॻ͍͍ͯΔͱͱʹ͔͘thisͰϋϚΔɻ͜ΕͰ͔ͱϋϚΔɻ • ࠷ۙΞϩʔؔͳͲͷ͓ӄͰϚγʹͳͬͨ
օ͞Μͷॻ͍͍ͯΔ”JavaScript”ʁ ES6 spread parameter
օ͞Μͷॻ͍͍ͯΔ”JavaScript”ʁ jQuery
jQuery • ΈΜͳେ͖jQuery • JSjQueryΛ༻͍ͨͷ͔͠ॻ͍ͨ͜ͱͳ͍ਓଟ͍͔? • $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
jQueryͱJavaScript • JS͕DOMૢ࡞ʹΑΔUIߏஙͳͲͷϋʔυϧ͕ҰؾʹԼ͕ͬͨ • ϝιουνΣʔϯͰॻ͚Δͷਓؾͩͬͨ • jQueryϓϥάΠϯΛར༻ͨ͠Ξχϝʔγϣϯ৭ʑͳύʔπ(ྫ͑lightbox)Λར༻ ͨ͠WebαΠτ͕രൃతʹ૿͑ͨ • jQuery
mobileͱ͍͏ϞόΠϧରԠͤ͞Δͷ͋ͬͨ • WebαΠτͰෳͷϓϥάΠϯΛͬͨΓɺUIຖʹ৭ʑͳίʔυΛॻ͍ͯఏڙ͢Δͱ ͍͏͜ͱҰൠతʹͳͬͨ
ͦͷଞͷஶ໊ͳJavaScriptϥΠϒϥϦ • Backbone.js • prototype.js • YUI Library • AngularJS
• React • VueJS
2009:AngularJS 2005: prototype 2006: jQuery 2014:Vue 2010:Backbone 2013:React
օ͞Μͷॻ͍͍ͯΔ”JavaScript”ʁ DOM API
DOM APIͬͯԿʁ • DOM(Document Object Model)XML, HTML, SVGυΩϡϝϯτΛ ϓϩάϥϛϯάݴޠͰར༻͢ΔͨΊʹϞσϧԽͨ͠ͷ •
จॻΛߏͰදݱ͍ͯ͠Δ • ϊʔυ͞ΒʹΠϕϯτϋϯυϥΛ͍࣋ͬͯΔ • ଟ͘JavaScriptͰར༻͞ΕΔ͕ɺDOMECMAScriptͷ༷ͷҰ ෦Ͱͳ͍
DOM APIͬͯԿʁ • Q: DOM APIʹ͍ͭͯͷ༷ͲͷஂମʹΑͬͯࡦఆ͞Ε͍ͯΔʁ
DOM APIͬͯԿʁ • Q: DOM APIʹ͍ͭͯͷ༷ͲͷஂମʹΑͬͯࡦఆ͞Ε͍ͯΔʁ • A: W3C, WHATWG
DOM APIͬͯԿʁ • Q: DOM APIʹ͍ͭͯͷ༷ͲͷஂମʹΑͬͯࡦఆ͞Ε͍ͯΔʁ • A: W3C, WHATWG
• HTMLͷ༷ࡦఆͷํͷҧ͍ͰᦻΛ͔ͭ͜ͱʹͳͬͨ2ͭͷஂ ମ͕ͦΕͧΕ༷Λ༗͍ͯ͠Δ • WHATWGͰDOM Standard, W3CͰDOM 4 • جຊతʹಉ͕ͩ͡Ұ෦͕ࠩ͋Δ
༨ஊ: W3CͱWHATWG • 1999ͷHTML4.01קࠂҎ߱ɺHTMLͷΞοϓσʔτ͕ࢭ·͍ͬͯͨ • 2004 Apple, Opera, MozillaͰWHATWGઃཱ •
2007 ྆ऀ͕ڠྗମ੍ΛऔΔW3C HTML Working GroupΛઃཱ • 2012 קࠂΛઃཱ͍ͨ͠W3Cͱ։ൃͷܧଓΛॏࢹ͢ΔWHATWG͕ᦻΛ͔ͭ͜ͱʹ ͳΓɺ྆৫͕ผʑʹࡦఆ࡞ۀΛਐΊ͍ͯ͘͜ͱʹ • 2014 W3C HTML 5קࠂ͕ൃߦ
༨ஊ: W3CͱWHATWG • WHATWGͷDOM (Living) Standard • ϒϥβϕϯμʔWHATWGͷվగʹूத͍ͯ͠Δ • W3C͜ΕΒΛίϐʔ͢Δ͚ͩͰͳ͘Ұ෦ՃචΛͯ͠ဃΛ࢈ΜͩΓ͍ͯ͠Δ
͜ͱʹରͯ͠൷͕͋Δ • ͨͩW3CͷจॻϩΠϠϦςΟʔϑϦʔ͕໌ه͞Ε͍ͯͨΓɺઐՈʹΑΔϫ ΠυϨϏϡʔ͕ͳ͞Ε͍ͯΔ(ͱ͍͏ͷ͕ओுͰ͋Δ)
ಉ͘͡ECMAScriptͷ༷ʹؚ·Εͳ͍ͷ • window • window.navigator • window.location • window.history •
XMLHttpRequest • HTML Canvas 2D Context • WebStorage ...etc HTML Living Standardʹ ؚ·Ε͍ͯΔ
օ͞Μͷॻ͍͍ͯΔ”JavaScript”ʁ ES module
JavaScriptͰ֎෦ϥΠϒϥϦΛಡΈࠐΉ • ౷తͳJavaScriptͷϥΠϒϥϦͷಡΈࠐΈํ
JavaScriptͰ֎෦ϥΠϒϥϦΛಡΈࠐΉ • scriptλάͰಡΈࠐΉख๏ͷ • window(άϩʔόϧ)Λհͯؔ͠Λڞ༗͢Δඞཁ͕͋Δ • άϩʔόϧྖҬͷԚછ • ར༻ॱΛߟ͑ͯɺॱ൪ʹλάΛهड़͢Δඞཁ͕͋Δ •
ෳͷϑΝΠϧΛಡΈࠐΉඞཁ͕͋Δ • ಉҰΦϦδϯͷಉ࣌ଓ੍ݶ
֎෦ϥΠϒϥϦಡΈࠐΈͱ͖߹͏ • JSͷߏจͱͯ͠֎෦ϥΠϒϥϦΛಡΈࠐΉํ๏Λఏڙ͢Δ͜ͱͰ άϩʔόϧڥΛར༻ͨؔ͠ͷڞ༗ΛࢭΊΔ • ࣄલʹͦΕΒͷϥΠϒϥϦΛؚΜͩঢ়ଶͰ1ͭͷϑΝΠϧʹίϯύ Πϧ͢Δ͜ͱͰଓϑΝΠϧαΠζͷΛղܾ͢Δ
JavaScriptͱpackage maneger • ֎෦ͷϥΠϒϥϦΛޮΑ͘ཧ͢ΔͨΊʹύοέʔδϚωʔδϟ ͕ඞཁͰ͋ͬͨ • ͦͷͨΊʹొͨ͠ͷ͕ • bower •
npm
JavaScriptͱpackage maneger • JavaScriptͷpackage manager • bower • ϒϥβ͚ͷϥΠϒϥϦΛఏڙ͍ͯͨ͠ •
2014ޙ͘Β͍͔ΒJSք۾͔Βෛ࠴ͱͯ͠ೝࣝ͞Ε͍ͯͨ • npm • Node͚ͷϥΠϒϥϦΛఏڙ͍͕ͯͨ͠ɺϒϥβ͚ͷϥΠϒϥϦѻ ͏Α͏ʹͳͬͨ • 20147݄ʹjQuery͕npmͷΈͰbowerͷαϙʔτΛऴྃͨ͠ • https://github.com/jquery/jquery/pull/1620
require vs import • CommonJS • module.exportsʹೖ͢Δ͜ͱͰॻ͖ग़͠ • require()Λར༻ͯ͠ಡΈࠐΈ •
ECMAScript • exportࣜΛར༻ͯ͠ॻ͖ग़͠ • importࣜΛར༻ͯ͠ಡΈࠐΈ
#
͋Εʁզʑ ECMAScriptܗࣜ ͡Όͳ͍ͷΛ ͣͬͱͬͯͨͷʁ
ͳͥ require ͕ΘΕ͍ͯͨͷ͔ • ES2015ͷͱ͖ʹγϯλοΫεͷΈΛܾΊ͍ͯͨ • ࣮ࡍʹॲཧܥ͕ͲͷΑ͏ʹϞδϡʔϧͷಡΈࠐΈΛߦ͏͔ʹ͍ͭͯECMAScriptͰఆٛ͞ Ε͍ͯͳ͔ͬͨ ➜ NodeJS:
NodeJSਞӦ ➜ϒϥβ: WHATWG • ͲͷΑ͏ͳৼΔ͍Ͱ࣮͢Δ͔Λ֤ਞӦ͕ܾఆ͢Δඞཁ͕͋ͬͨͷͰɺ༷ʹΑͬͯ શͯ
۩ମతʹͲ͏͍͏͕͋ͬͨͷ͔ • ϩʔυ࣌ʹͦͷϑΝΠϧ͕ESM͔Ͳ͏͔ΛΔඞཁ͕͋Δ • ࣝผࢠ(URI)ΛͲͷΑ͏ʹղܾ͢Δ͔ • طଘͷCommonJSͱͷޓੑΛͲ͏͢Δ͔(NodeJS)
۩ମతʹͲ͏͍͏͕͋ͬͨͷ͔ https://teppeis.hatenablog.com/entry/2017/08/es-modules-in-nodejs ΑΓ
ES Modulesͷݱঢ় • ϒϥβChromeͱFirefoxରԠࡁΈ • NodeJS֦ுࢠΛmjsͱ࣮ͯ͠ߦ͢Δ͜ͱͰରԠ • Strict mode͕ڧ੍͞ΕɺτοϓϨϕϧthisundefinedʹ •
__dirnameͳͲ͑ͳ͘ͳ͍ͬͯΔͷͰҙ
͜͜ʹͳ͍ʁ
͔ͯ͠͠ʁ
͔ͯ͠͠ʁ CoffeeScript
CoffeeScript • Alt JSͷ1ͭɻRubyͳͲ͔ΒӨڹΛड͚ͨγϯλοΫεγϡΨʔ͍͔ͭ͘ ͷػೳͳػೳ͕ਓؾͩͬͨ • Ruby on Rails 3.1Ҏ߱Ͱެࣜʹαϙʔτ͞Ε͍ͯͨ
• AtomϦϦʔε֤࣌छϓϥάΠϯͳͲ͕CoffeeScriptͰॻ͔Ε͍ͯͨ • JavaScriptͷੜΈͷͰ͋ΔϒϨϯμϯɾΞΠΫʮJavaScriptͷະདྷʯʹ ӨڹΛ༩͑ͨͱ໌ݴ͍ͯ͠Δ • ͪͳΈʹࠓܧଓతʹΞοϓσʔτ͞Ε͍ͯͯɺݱࡏ2ܥ͕࠷৽൛
CoffeeScriptͷه๏;Γ͔͑Γ Ruby෩ʹ ObjectϦςϥϧͷ{}Λলུ
CoffeeScriptͷه๏;Γ͔͑Γ this.ͷγϯλοΫεγϡΨʔ
CoffeeScriptͷه๏;Γ͔͑Γ ޙஔͷif/unless
arrow function
arrow function
arrow function fat arrowthisΛଋറ
arrow function ͜Ε͕ޙʹES2015Ͱ arrow functionΛಋೖ͢ΔͨΊͷ͖͔͚ͬʹ ͳͬͨ
2010 CoffeeScriptొ
JSͱESͷҧ͍ͷཧ • "ECMAScript" • JavaScriptݴޠͷ༷͕ऩΊΒΕ͍ͯΔ • ࣮ࡍͷϒϥβ্Ͱѻ͑ΔAPIผ్HTMLͷ༷DOMͷ༷ͱ ͯ͠ࡦఆ͞Ε͍ͯΔ • ্هશͯΛؚΊͯৗతʹ"JavaScript"ͱݺশ͍ͯ͠Δ
babel / browserify / Webpack ...etc ͦΕͧΕԿͷͨΊʁ
Babel
Babel • Babel (چ: 6to5) ES2015Ҏ߱ͷه๏Λ֤छϒϥβͰಈ͘ES5 Ҏલͷදݱʹม͢ΔTranspiler • ։ൃऀES2015Ҏ߱ͷه๏Ͱهड़ՄೳʹͳΓͭͭɺϢʔβʔ ʹରͯ͠ޙํޓੑΛ୲อͯ͠αʔϏεΛఏڙͰ͖Δ
Babel • babel-plugin • ECMAScriptͷ1ͭͷ༷ʹରԠͨ͠ม͕ϓϥάΠϯʹͳ͍ͬͯΔ • babel-preset • babel-pluginͷू߹ɻbabel-preset-2015ES2015ʹؚ·ΕΔͷ ͷू߹ɻbabel-preset-stage0,
babel-preset-latest, babel-preset- envͳͲɻ
Babel • babel-register • NodeJSͰrequire͢ΔࡍʹઌಡΈͯ͠BabelͰcompile͢ΔΑ͏ʹ͠ ͯ͘ΕΔ • babel-polyfill • globalείʔϓͷՃ͕ඞཁͳPromiseWeakmapstatic
methodͰ͋ΔArray.formͳͲΛར༻Մೳʹ͢Δ
Browserify
Browserify • CommonJSܗࣜͷmoduleͷղܾΛ͢Δπʔϧ • BrowserifyΛར༻͢Δ͜ͱͰCJS moduleΛར༻ͨ͠ϑΝΠϧ ΛϒϥβͰಡΊΔܗʹมͰ͖Δ • NodeJS͚ʹॻ͔ΕͨCJSܗࣜͷϥΠϒϥϦͳͲΛϒϥβͰ ༻Մೳʹ
Webpack
Webpack • BrowserifyͷΑ͏ͳJSͷTranspilergulpͷΑ͏ͳλεΫϥϯ φʔ͕ྲྀߦ͢ΔதɺͦΕΒΛΦʔϧΠϯϫϯతʹΈ߹Θͤͨ πʔϧͱͯ͠ొ • JSϑΝΠϧͷόϯυϦϯά͚ͩͰͳ͘ɺCSS/LESSͳͲը૾ ϑΝΠϧͳͲͷΞηοτJSϑΝΠϧͱಉ༷ʹѻ͏͜ͱ͕ग़དྷ ͨͷͰਓؾ
TypeScript
TypeScript • MicrosoftʹΑͬͯJSʹܕΛ༩͑ΔͨΊͷAltJS/Transpilerͱͯ͠ ։ൃ͞Εͨ • JavaScriptʹ੩తܕ͚ͳͲΛՃ͑ͨϓϩάϥϛϯάݴޠ • େنΞϓϦέʔγϣϯͷ։ൃʹ͑͏ΔΑ͏ʹͳ͍ͬͯΔ(?)
ͦͷଞͷπʔϧͨͪ • rollup • ES moduleܗࣜͷJSͷͨΊͷόϯυϦϯάπʔϧ • tree-shakingͬͯ͘ΕΔͧ • flowtype
• JSʹ੩తܕ͚ͷͨΊͷه๏ΛՃ͢Δ • babelϓϥάΠϯͱͯ͠ಈ࡞͢ΔͷͰɺbabelͰॲཧ͢ΔࡍʹAST͔Βফͯ͘͠ΕΔ
babel / browserify / Webpack ...etc ͦΕͧΕԿͷͨΊʁ
ͦΕͧΕԿͷͨΊʁ • Babel • ES2015Ҏ߱ͷදݱΛඇରԠͷϒϥβͳͲͰಈ͘Α͏ʹม • Browserify • CommonJSܗࣜͷrequireΛղܾɻओʹrequireΛղܾͰ͖ͳ͍ϒϥβ͚ •
Webpack • JSͷόϯυϦϯά͚ͩͰͳ͘ɺCSSը૾ͳͲऔΓѻ͏
·ͱΊ
࣍ͷ֤ߦͷίʔυ(ϒϥβ|NodeJS)Ͱಈ͘?
࣍ͷ֤ߦͷίʔυ(ϒϥβ|NodeJS)Ͱಈ͘? Έͳ͞Μ͑ΒΕ·͢ΑͶʁ
࣍ͷ֤ߦͷίʔυ(ϒϥβ|NodeJS)Ͱಈ͘? ղօ͞Μͷࣗྗݚڀʹظ͠·͢
·ͱΊ • "JavaScript"ͷ༷ECMAScript͚ͩͰͳ͘WHATWG HTML Living StandardͳͲؚΜͰ͍Δ • ͜͜ʹࢸΔ·Ͱʹ৭ʑͳܦҢ͕͋ͬͨ • JavaScriptͷݱࡏͷπʔϧͨͪ͜Ε·Ͱͷྺ࢙ͷෛ࠴ͱະདྷͷࢿͷͨ
ΊͷؒΛܨ͍Ͱ͘Ε͍ͯΔ • ίϯςΩετΛཧղͯ͠దࡐదॴͰֶΜͩΓ͍ͬͯ͜͏
ࢀߟจݙ • [ThinkIT] ୈ2ճɿGoogleWebͷৗࣝΛృΓସ͑ͨ (1/4) https://thinkit.co.jp/free/article/0612/22/2/ • GoogleΤϯδχΞɿʮGoogle Mapsͷެ։ͰAJAXͷؔ৺͕ߴ·ͬͨʯ -
ZDNet Japan https://japan.zdnet.com/article/20085943/ • ECMAScript 4 ͷ Draft Λͬ͘͟ΓಡΜͰΈͨ - ͯͬࣽ͘ϒϩά http://tech.nitoyon.com/ja/blog/2007/10/30/es4-overview/ • JavaScript - Wikipedia https://ja.wikipedia.org/wiki/JavaScript • ECMAScript 4ͷඪ४Խ͕தࢭ͞ΕΔ | εϥυ σϕϩούʔ https://developers.srad.jp/story/08/08/19/0714251/ • JavaScript 1.7 ͷ৽ػೳ: Days on the Moon http://nanto.asablo.jp/blog/2006/08/12/481381#js17-block-scope • JavaScript ୈ6൛, David Flanagan ஶɺଜ্ ྻ ༁, ΦϥΠϦʔδϟύϯ • JavaScript 2.0ECMAScript 3.1ϕʔεʹɺECMAScript 4ৡา | ϚΠφϏχϡʔε https://news.mynavi.jp/article/20080818-a027/ • ECMAScript 5ϦϦʔε https://www.infoq.com/jp/news/2009/12/ecmascript5 • ECMAScript6ͷ৽ػೳ - Qiita https://qiita.com/rana_kualu/items/1f98c1a642102f48aa78 • ECMAScriptͷ͍ํ http://azu.github.io/slide/2018/node/ecmascript39.html • ES6ͷ৽ػೳʮclassߏจʯ – جૅฤ – | ES6ͷ͋Δʹੜ·Εͯ https://liginc.co.jp/266587 • Node.jsͷES Modulesαϙʔτͷݱঢ়֬ೝͱඋ͑ - teppeis blog https://teppeis.hatenablog.com/entry/2017/08/es-modules-in-nodejs • Strict Ϟʔυ - JavaScript | MDN https://developer.mozilla.org/ja/docs/Web/JavaScript/Strict_mode • WHATWG൛ͱW3C൛͕͋Δ༷ͨͪ - Unreviewed http://takenspc.hatenablog.com/entry/2015/12/03/235927 • ͓ͬ͞ΜES6/ES2015,React.jsΛֶͿ https://www.slideshare.net/dcubeio/es6es2015reactjs