2023/10/20 虎の穴ラボで発表した JavaScript Server Runtime の歴史です。
JavaScript ServerRuntime History2023/10/20 @ toranoana
View Slide
X(Twitter): @yosuke_furukawaGitHub: yosuke-furukawa
+4$POGKQ͡·Γ·͢ʔʂ
߽՚εϐʔΧʔਞ
NodeֶԂࡇ 2011Ryan Dahl changed my life.
JavaScript Server Runtime ͷྺ࢙ʹ͍ͭͯ• 90͔Βݱ·ͰৼΓฦΔ• ࠓޙͲ͏͍͏ྲྀΕ͕͋Δ͔ɺͲ͏ͳΔ͔Λ༧ଌ͢Δ• ྺ࢙ͬͯ໘ന͍ͷͰݟͯཉ͍͠• ͍ͨ͜͠ͱΛ͢ɺͳΜ͔ͨΊʹͳΔ͕ฉ͚Δͱࢥ͍͚ͬͯͳ͍
1995:JavaScript was born
1995• JavaScript ੜ• Netscape Navigator 2.0 Beta ൛ʹಉࠝ• ޙʹ 1996ʹਖ਼ࣜϦϦʔε൛͕ൃද
#SFBOEBO&JDIࢯͷϗʔϜϖʔδྺ࢙Λײ͡ΔσβΠϯ
1995• ͔͜͜Β࠷ॳͷ Browser War ͕ى͖Δ• ͍ΘΏΔ Internet Explorer ਞӦ vs NetscapeਞӦ• ྺ࢙Ͱݴ͏ͱؔέݪͷઓ͍นͷઓ͍• ·͊ͳΜͱ͍͏͔өըͰݴ͏ͱݟͲ͜Ζͷ෦
1996:Netscape Livewire wasborn
1996• ϒϥβઓ૪ͷཪͰͻͬͦΓͱग़͖ͯͨ NetscapeLivewire ͱ͍͏αʔόαΠυ JavaScript ٕज़• ͳΜͱ HTML λάͷதʹ λάΛॻ͍ͯͦ͜ʹεΫϦϓτΛॻ͘ͱ࣮ߦ͞ΕΔͱ͍͏༷• ॻ͍ͨhtmlΛίϯύΠϧ͢ΔͱόΠτίʔυ͕͍࣮ͭͨߦՄೳͳܗࣜʹม͞ΕɺWebαʔόΛىಈͰ͖Δ
Netscape Livewire• HTMLͱಉ͡ॴʹॲཧΛॻ͍ͯɺίϯύΠϧ͢Δ# jsac ͱ͍͏ίϯύΠϥͰίϯύΠϧ͢Δ$ jsac -i app.html -o app.web
1996• ͳΜͱ͜ͷଞʹ Java ͷΫϥεΛݺͼग़ٕ͢ज़ʢࠓͰݴ͏C++ native codeݺͼग़͢Α͏ͳײ͡ʣ͋ͬͨΓ• Database ଓ͢Δٕज़͋ͬͨ• ͨͩ·͊ΈΜͳͬͯͷ௨Γɺ͜Ε͕ϝΠϯετϦʔϜʹͳΔ͜ͱͳ͔ͬͨ
1996• ཪͰߦΘΕͯΔϒϥβઓ૪։ൃڥͷઓ૪Ͱ͋Δ• Microsoft ASP ͱਅ͔ͬΒରཱ͕ͨ͠ɺ ASP ίϯύΠϧεςοϓ͕ͳͯ͘ಈ͘ͷʹରͯ͋͠·Γʹݪ࢝త• ࠓͰͦ͜ JavaScript ϓϩάϥϛϯάݴޠͱͯ͠ͷҐΛཱ֬Ͱ͖͍ͯΔ͕͜ͷ࣌Ͱ·ͩए͗ͨ͢• ݁ہྲྀߦΒͳ͔ͬͨɻɹ
2009: Node.js was born
2009• αʔόαΠυ JavaScript ݩ• Node.js ͕ੜ• ಉळʹ JSConf.EU Ͱ Ryan ͕ൃද
2009• ͜ͷ࣌ͷ Node.js ͷಛ• Event-driven / Non-blocking IO• Built on Google V8• CommonJS• ·ͩ͜ͷͱ͖ npm Windows αϙʔτͳ͍
2009• Apache HTTP Server ͕ C10K ͱ͍͏൷ΛཋͼͤΒΕ͍ͯͨ࣌• Non blocking IO / Event driven ͳΞʔΩςΫνϟ nginx / eventmachine ͱ͔Ͱطʹྲྀߦͬͯͨɻ• ͡Ό͋ͦΕΛ JavaScript ͰͬͯΈͨΒͲ͏͔ʁͱ͍͏ΞΠσΞޭΛͨ͠• JavaScript ʹ File IO ॲཧ͕ͳ͘ɺαʔόαΠυͷAPIະ։ͩͬͨ
2010: npm was born
2010• 3rd party ͷϥΠϒϥϦΛެ։͠ɺಡΈࠐΉ͜ͱ͕Ͱ͖ΔΈΛ npm ͱ࣮ͯ͠• ͦΕΛಉࠝ͢Δ͜ͱͰϥΠϒϥϦ։ൃΛ͘͢͠ɺ·ͨίΞʹΓ͍ͯͳ͍ػೳΛՃͨ͘͢͠͠• ΤίγεςϜ͕ੜ·Ε͍ͯͬͨ࣌
2010• Express ͕ొ• socket.io v0.1ޙʹొ• ͔͜͜ΒϒʔϜʹՐ͕͍͍ͭͯ͘• Yeoman/grunt/gulp ͱ͔ 2013ʹొ
2011-2014• 2011: Windows αϙʔτ• 2011: Joyent ͕ग़ࢿ• 2012: Node.js Ϧʔμʔަ Ryan => isaacs• 2014: Node.js Ϧʔμʔަ isaacs => TJFontaine
2014: Node.js were forkedas io.js
2014• มԽ͕ى͖ͣɺӢߦ͖͕ո͘͠ͳΔ• ৽͍͠ػೳ͕Ճ͞Εͳ͍ɺόʔδϣϯ͕ϦϦʔε͞Εͳ͍• ΤϯλʔϓϥΠζͳ҆ఆੑ͔Γٻ͞Εɺ৽͍͠ػೳ͕ग़ͯ͜ͳ͍
2014͔ΒίΞͷ։ൃ͕ఀ͢Δɻ
2015• io.js ͕ Node.js ΛϑΥʔΫͯ͠ϦϦʔε• ҰؾʹίΞίϛολʔͷେ͕ io.js ଆҠಈ• io.js ͱ Node.js ͕༥߹͠ɺγϯ Node.js ͱͯ͠։ൃऀίϛϡχςΟ͕ओಋ͢Δํ Node.js Foundation ൃ• Node.js v4.0 ͕ϦϦʔε
2015• ES2015 ͳͲͷ׆ಈ༗Γɺ class, let, const, ESM, ͜͏͍ͬͨػೳΛਖ਼ਐԽ͍ͤͯͨ͘͞Ίʹඞཁͳվֵͩͬͨ• ͔͜͜Β React ͳͲͷՐ͚ੜ·ΕɺϑϩϯτΤϯυϒʔϜ͕ى͖Δ• Browserify ͱ͔͕ྲྀߦΓɺ server ͱ client ͷ͕֞ࠜಥഁ͞Ε͍ͯ͘• Isomorphic / universal ͱ͔ͷݴ༿͜͜Ͱੜ·ΕΔ
Ұ୴͜͜·ͰͰৼΓฦΓ
The rise of Node.js(2009-2015)• ϦϦʔε͔Βౖ౭ͷ6ؒ• ৽ػೳ͕୯ҐͰՃ͞ΕΔΘ• ΤίγεςϜ͕Ͱ͖ͯେྔͷ3rd party libੜ·ΕΔΘ• ϦʔμʔมΘͬͯɺ։ൃओମίϛϡχςΟओಋʹมΘΔΘ
The rise of Node.js(2009-2015)• ES2015ͱbabel, React/Vue.js ͳͲͷίϯϙʔωϯτࢦϥΠϒϥϦͷຄڵ, ਐԽͨ͠ Node.js ͦΕͧΕ͕ҰݸͷʹͳͬͯϒʔϜ͕ੜ·ΕΔ• ͜Ε͕୭͔ʹࢦ͞Ε͔ͨͷΑ͏ͳಈ͖ͰৼΓฦΔͱͳΜ͔ࢥ͏ͷ͕͋Δɻ• 2015ʹෳͷϒϨΠΫεϧʔ͕ى͖ͨΑ͏ʹࢥ͑Δɻ
2016-2018
2016-2018• ͜ͷ͋ͨΓ͔ΒաڈʹऔΓೖΕ͖ͯͨϥΠϒϥϦͷதͰ ES Web Standard ͱҧ͏ΈΛͲ͏౷߹͢Δ͔͕ٞʹͳ͍ͬͯ͘• ESModule ͱ CommonJS• Stream / Event Emitter ͱ Promise / WHATWGStream
2016-2018• 2016: Leftpad ࣄ͕݅ൃੜ• Npm ͕উखʹϥΠϒϥϦΛফ͢• ౖͬͨ࡞ऀ͕શͯͷϥΠϒϥϦΛফ͢• Leftpad ͱ͍͏ϥΠϒϥϦ͕ webpack ͕͍ͬͯͨΓɺ babelͷҰ෦ͰΘΕ͍ͯͨΓͱ৭ΜͳॴͰϥΠϒϥϦ͕յΕΔ• ͔͜͜ΒɺʮࢲୡɺϥΠϒϥϦґଘ͗͢͠͡ΌͶʁʯ͍ͬͯ͏งғؾ͕ྲྀΕΔɻ
2016-2018• 2018: npm ࢿۚͰ৭ʑͱ͕͠ग़ͯ͘Δ• ϨΠΦϑ͕͋ͬͨΓͱք۾͕͟Θͭ͘• Ұ୴ github ͱ౷߹͞Εͯམͪண͘ (2020)
2016-2018• 2017: Node.js ͕ CommonJS ͱ ESM ͷํΛ૬ޓޓੑΛอͬͨ··ղܾ͢Δͱ͍͏ํ๏Λ࣮ɺ֦ுࢠʹΑΔΓํ͕ΛݺͿ• 2017: React Vue.js Ͱ SSR ͢Δͱ͍͏ํ๏͕Ұఆͷྲྀߦͷஹ͠ΛݟͤΔɺ͜ͷࠒ Next.js ͕ϦϦʔε͞ΕΔɺΫΤϦʔύϥϝʔλͰ͔͠ routingͰ͖ͳ͔ͬͨͷͰ͋Μ·Γྲྀߦͬͯͳ͔ͬͨ
2016-2018• 2016: TypeScript ͕ @types ͳͲͷΈΛҾͬఏ͛ͯܕͷࢀরΛղܾ͢ΔखஈΛఏڙ͠ɺVS Code ͳͲͷΤσΟλͱͱʹਐԽ• 2018: Deno ͕ jsconf.eu Ͱൃද͞ΕΔɻ10Λܦͯ Ryan ͔Β࠶ͼͷൃදɻಛʹ TypeScriptnative αϙʔτͳͲͷηϯεྲྀੴɻ
ݱ(2019-2023)
ݱ• 2019: Node.js 10पɺࠓޙͷϩʔυϚοϓͱͯ͠ ESM ڧԽɺfetchɺ single executable appsɺ TS ͱͷੑ্ͳͲͷ denoΛҙࣝͨ͠ײ͡ʹͳΔɻ• 2020: deno v1.0 ϦϦʔε• 2021: Node.js ʹ web standard ͱͷੑΛڧԽ͢Δ͕૿͑Δɺ atob / btoa ͱ͔URLͱ͔ͷػೳ͕૿͍͑ͯ͘• 2021: Node.js Promise Λओମʹͨ͠APIʹมΘΔ
ݱ• 2022: WINTER CG ൃɺ Node.js, Deno,Bun ͳͲͷϒϥβҎ֎ͷϥϯλΠϜͷͨΊͷ༷Խஂମ• Fetch ͷ minimum spec ͱ͔ ৭ʑܾ·ͬͨ
ྲྀߦͱڝ૪• npmҰ࣌ظࢿ͕͕ۚ͋ͬͨɺ GitHub ʹΑΔ౷߹ͰҰ୴ղܾ͞Εͨ• TypeScript VS CodeͳͲͷπʔϧपΓ͕ਐԽͯ͠ɺେྲྀߦ• Next.js ͕େྲྀߦɺ Vercel ͳͲͷେ͖ͳελʔτΞοϓ͕ੜ·Εͨ
ྲྀߦͱڝ૪• ྲྀߦʹΑΓɺ݈શͳڝ૪͕૿͖͑ͯͨΑ͏ʹײ͡Δ• Node.js vs Deno vs Bun Έ͍ͨͳ• ݈શͳڝ૪ͱޓੑͱ༷Խͱ͍͏ਐԽΤϯυϢʔβʔʹҰ൪རΛͨΒͯ͘͠ΕΔͱࢥ͑Δ
ྲྀߦͱڝ૪• Node.jsίϛϡχςΟͷ͕ओಋ͞ΕΔɺྲྀߦͬͨͭΛޙ͔ΒऔΓೖΕ͍ͯ͘ํ• Test ͷΈ͕ೖͬͨ• Permission ͕αϙʔτ͞Εͨ• Experimental Ͱ͋Δ͕ɺ module ղܾͷ default ͕ มߋͰ͖ΔΑ͏ʹͳͬͨʢdefault Λ esm ʹม͍͑ͯ͜͏ͱͯ͠Δʣ• Single executablefile ͕࡞ΕΔΑ͏ʹͳͬͨ• Web Standard ͱͷੑΛ্͍͛ͯ͜͏ͱͯ͠Δʢnavigator͕ೖͬͨΓʣ• ࠓϚείοτΩϟϥΫλʔืूͯ͠Δͱͷ͜ͱ
ྲྀߦͱڝ૪• Deno Node.js ͱͷ compat Λ্͍͖͍͛ͯͨํ• npm support• ͦͷ্ͰπʔϧνΣΠϯɺಈ࡞ڥΛݩʹ։ൃશମΛΓ্͍͛ͯ͘• Deno Deploy• Deno fresh
ࠓޙͷ༧
ࠓޙ• Node.jsޓੑ্͕͕Γɺ Deno Bun ͳͲͱͷڝ૪͕ͬͱ૿͑Δ• ΤίγεςϜΛͲ͜·ͰࣗͷਞӦʹ࣋ͬͯ͜ΕΔ͔উෛʹͳΓͦ͏ɻ• ޓੑ্͕͕ΕޙੑೳηΩϡϦςΟ։ൃऀମݧӡ༻҆ఆੑͳͲͷඇػೳཁ݅ͰͷউෛʹͳΔ
ࠓޙ• Denoଆ͔ΒݟΔͱɺNode.jsΤίγεςϜͱͷੑΛ্͛ͯɺԿʹૣ͘ Node.js ͷγΣΞΛୣ͑Δ͔• Node.js ଆ͔ΒݟΔͱɺଞͷϥϯλΠϜͱͷػೳࠩΛແͯ͘͠ɺطଘγΣΞΛҡ࣋Ͱ͖Δ͔• Bun ଆ͔ΒݟΔͱɺΤίγεςϜͷੑΛ্͛ΔͱͱʹѹతͳύϑΥʔϚϯεͰੑೳࠩͰѹ͍ͨ͠
ࠓޙ• ࡾऀࡾ༷• ͜͏͍͏݈શͳڝ૪͕͠Β͘ଓ͖ɺڝ૪ঢ়ଶͷ··ۉߧͦ͠͏ͳؾ͍ͯ͠Δɻ
ࠓޙ• ͜ͷଞͷํੑͱͯ͠:• ΤοδίϯϐϡʔςΟϯάํͰCDNͰಈ͘αʔόαΠυܰྔJSͷྲྀߦ• ϑϧελοΫͳ JS ϑϨʔϜϫʔΫͷོͱਐԽ• Σϒ։ൃͷਐԽͱͱʹԼճΓΛࢧ͑Δπʔϧͱͯ͠ਐԽ͠ଓ͚ͦ͏
·ͱΊ
·ͱΊ• JavaScript Server Runtime ͷྺ࢙ΛৼΓฦͬͨɻ• ίϛϡχςΟͱྗΛ࣋ͬͨاۀ͕࿈ಈ͠ͳ͕Βൃల͖ͯͨ͠ྺ࢙ͩͬͨΑ͏ʹײ͡Δɻ• ݈શͳڝ૪ʹΑΔػೳͱඇػೳͷࠩผԽ͕ܹԽͯ͠Δ• ҰํͰڞ௨ԽΛWinterCGΛத৺ʹߦΘΕ͍ͯΔ• ·ͩ·ͩൃల͍͖ͯͦ͠͏ɺ։ൃऀʹ༏͍͠ൃల͕ࠓޙ·ΕΔ
12લʹͷਓੜΛม͑ͨΑ͏ʹࠓͷ Ryan ͷൃදͰ୭͔ͷਓੜ͕มΘΔͱ͍͍ͳͱࢥ͍·͢ɻ
Thanks!!
ࢀߟࢿྉ• https://webdevelopmenthistory.com/1995-the-birth-of-javascript/• https://webdevelopmenthistory.com/1996-javascript-annoyances-and-meeting-the-dom/• https://dev.to/macargnelutti/server-side-javascript-a-decade-before-node-js-with-netscape-livewire-l72• https://philip.greenspun.com/wtr/livewire.html• http://sunsite.uakom.sk/sunworldonline/swol-08-1999/swol-08-webmaster.html• https://en.wikipedia.org/wiki/Node.js• https://yosuke-furukawa.hatenablog.com/entry/2022/04/08/111651