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
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
540
幕間CMを支える技術
pastak
4
700
無からniboshiを生み出す
pastak
0
39
Helpfeelがアクセシビリティにどのように取り組み始めて、どこまで来れたのか/Helpfeel Accessibility 2025-07
pastak
3
600
LT: JavaScript / HTML カルトクイズ
pastak
0
200
「夏フェス」をヒントに新しいカンファレンスを考えてみた at 函館市電LT
pastak
3
580
「アクセシビリティを始めたい!」から1年、あれからどうなったのか。
pastak
2
250
「アクセシビリティを始めたい!」から1年、あれからどうなったのか。 〜LTバージョン〜
pastak
1
1k
【2024年最新】「エンジニアお茶会」という取り組みについて
pastak
1
550
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Faster Mobile Websites
deanohume
310
32k
How GitHub (no longer) Works
holman
316
150k
Everyday Curiosity
cassininazir
0
250
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
260
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
sira's awesome portfolio website redesign presentation
elsirapls
0
300
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
240
How to build a perfect <img>
jonoalderson
1
5.8k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Scaling GitHub
holman
464
140k
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