JavaScript Server Runtime History
by
Yosuke Furukawa
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
JavaScript Server Runtime History 2023/10/20 @ toranoana
Slide 2
Slide 2 text
X(Twitter): @yosuke_furukawa GitHub: yosuke-furukawa
Slide 3
Slide 3 text
+4$POGKQ͡·Γ·͢ʔʂ
Slide 4
Slide 4 text
߽՚εϐʔΧʔਞ
Slide 5
Slide 5 text
NodeֶԂࡇ 2011 Ryan Dahl changed my life.
Slide 6
Slide 6 text
JavaScript Server Runtime ͷ ྺ࢙ʹ͍ͭͯ • 90͔Βݱ·ͰৼΓฦΔ • ࠓޙͲ͏͍͏ྲྀΕ͕͋Δ͔ɺͲ͏ͳΔ͔Λ༧ଌ ͢Δ • ྺ࢙ͬͯ໘ന͍ͷͰݟͯཉ͍͠ • ͍ͨ͜͠ͱΛ͢ɺͳΜ͔ͨΊʹͳΔ͕ฉ͚ Δͱࢥ͍͚ͬͯͳ͍
Slide 7
Slide 7 text
1995: JavaScript was born
Slide 8
Slide 8 text
1995 • JavaScript ੜ • Netscape Navigator 2.0 Beta ൛ʹಉࠝ • ޙʹ 1996ʹਖ਼ࣜϦϦʔε൛͕ൃද
Slide 9
Slide 9 text
#SFBOEBO&JDIࢯͷϗʔϜϖʔδ ྺ࢙Λײ͡ΔσβΠϯ
Slide 10
Slide 10 text
1995 • ͔͜͜Β࠷ॳͷ Browser War ͕ى͖Δ • ͍ΘΏΔ Internet Explorer ਞӦ vs Netscape ਞӦ • ྺ࢙Ͱݴ͏ͱؔέݪͷઓ͍นͷઓ͍ • ·͊ͳΜͱ͍͏͔өըͰݴ͏ͱݟͲ͜Ζͷ෦
Slide 11
Slide 11 text
1996: Netscape Livewire was born
Slide 12
Slide 12 text
1996 • ϒϥβઓ૪ͷཪͰͻͬͦΓͱग़͖ͯͨ Netscape Livewire ͱ͍͏αʔόαΠυ JavaScript ٕज़ • ͳΜͱ HTML λάͷதʹ λάΛॻ͍ͯͦ͜ ʹεΫϦϓτΛॻ͘ͱ࣮ߦ͞ΕΔͱ͍͏༷ • ॻ͍ͨhtmlΛίϯύΠϧ͢ΔͱόΠτίʔυ͕͍ͭͨ ࣮ߦՄೳͳܗࣜʹม͞ΕɺWebαʔόΛىಈͰ͖Δ
Slide 13
Slide 13 text
Netscape Livewire • HTMLͱಉ͡ॴʹॲཧΛॻ͍ͯɺίϯύΠϧ ͢Δ # jsac ͱ͍͏ίϯύΠϥͰίϯύΠϧ͢Δ $ jsac -i app.html -o app.web
Slide 14
Slide 14 text
1996 • ͳΜͱ͜ͷଞʹ Java ͷΫϥεΛݺͼग़ٕ͢ ज़ʢࠓͰݴ͏C++ native codeݺͼग़͢Α͏ͳ ײ͡ʣ͋ͬͨΓ • Database ଓ͢Δٕज़͋ͬͨ • ͨͩ·͊ΈΜͳͬͯͷ௨Γɺ͜Ε͕ϝΠϯ ετϦʔϜʹͳΔ͜ͱͳ͔ͬͨ
Slide 15
Slide 15 text
1996 • ཪͰߦΘΕͯΔϒϥβઓ૪։ൃڥͷઓ૪Ͱ͋Δ • Microsoft ASP ͱਅ͔ͬΒରཱ͕ͨ͠ɺ ASP ίϯύ Πϧεςοϓ͕ͳͯ͘ಈ͘ͷʹରͯ͋͠·Γʹݪ࢝ త • ࠓͰͦ͜ JavaScript ϓϩάϥϛϯάݴޠͱͯ͠ͷҐ Λཱ֬Ͱ͖͍ͯΔ͕͜ͷ࣌Ͱ·ͩए͗ͨ͢ • ݁ہྲྀߦΒͳ͔ͬͨɻɹ
Slide 16
Slide 16 text
2009: Node.js was born
Slide 17
Slide 17 text
2009 • αʔόαΠυ JavaScript ݩ • Node.js ͕ੜ • ಉळʹ JSConf.EU Ͱ Ryan ͕ൃද
Slide 18
Slide 18 text
2009 • ͜ͷ࣌ͷ Node.js ͷಛ • Event-driven / Non-blocking IO • Built on Google V8 • CommonJS • ·ͩ͜ͷͱ͖ npm Windows αϙʔτͳ͍
Slide 19
Slide 19 text
2009 • Apache HTTP Server ͕ C10K ͱ͍͏൷ΛཋͼͤΒΕ͍ͯͨ ࣌ • Non blocking IO / Event driven ͳΞʔΩςΫνϟ nginx / event machine ͱ͔Ͱطʹྲྀߦͬͯͨɻ • ͡Ό͋ͦΕΛ JavaScript ͰͬͯΈͨΒͲ͏͔ʁͱ͍͏ΞΠσΞ ޭΛͨ͠ • JavaScript ʹ File IO ॲཧ͕ͳ͘ɺαʔόαΠυͷAPIະ։ ͩͬͨ
Slide 20
Slide 20 text
2010: npm was born
Slide 21
Slide 21 text
2010 • 3rd party ͷϥΠϒϥϦΛެ։͠ɺಡΈࠐΉ͜ ͱ͕Ͱ͖ΔΈΛ npm ͱ࣮ͯ͠ • ͦΕΛಉࠝ͢Δ͜ͱͰϥΠϒϥϦ։ൃΛ͠ ͘͢ɺ·ͨίΞʹΓ͍ͯͳ͍ػೳΛՃ͠ ͨ͘͢͠ • ΤίγεςϜ͕ੜ·Ε͍ͯͬͨ࣌
Slide 22
Slide 22 text
2010 • Express ͕ొ • socket.io v0.1ޙʹొ • ͔͜͜ΒϒʔϜʹՐ͕͍͍ͭͯ͘ • Yeoman/grunt/gulp ͱ͔ 2013ʹొ
Slide 23
Slide 23 text
2011-2014 • 2011: Windows αϙʔτ • 2011: Joyent ͕ग़ࢿ • 2012: Node.js Ϧʔμʔަ Ryan => isaacs • 2014: Node.js Ϧʔμʔަ isaacs => TJ Fontaine
Slide 24
Slide 24 text
2014: Node.js were forked as io.js
Slide 25
Slide 25 text
2014 • มԽ͕ى͖ͣɺӢߦ͖͕ո͘͠ͳΔ • ৽͍͠ػೳ͕Ճ͞Εͳ͍ɺόʔδϣϯ͕Ϧ Ϧʔε͞Εͳ͍ • ΤϯλʔϓϥΠζͳ҆ఆੑ͔Γٻ͞Εɺ ৽͍͠ػೳ͕ग़ͯ͜ͳ͍
Slide 26
Slide 26 text
2014͔ΒίΞͷ։ ൃ͕ఀ͢Δɻ
Slide 27
Slide 27 text
2015 • io.js ͕ Node.js ΛϑΥʔΫͯ͠ϦϦʔε • ҰؾʹίΞίϛολʔͷେ͕ io.js ଆҠಈ • io.js ͱ Node.js ͕༥߹͠ɺγϯ Node.js ͱͯ͠։ൃऀ ίϛϡχςΟ͕ओಋ͢Δํ Node.js Foundation ൃ • Node.js v4.0 ͕ϦϦʔε
Slide 28
Slide 28 text
2015 • ES2015 ͳͲͷ׆ಈ༗Γɺ class, let, const, ESM, ͜͏͍ͬ ͨػೳΛਖ਼ਐԽ͍ͤͯͨ͘͞Ίʹඞཁͳվֵͩͬͨ • ͔͜͜Β React ͳͲͷՐ͚ੜ·ΕɺϑϩϯτΤϯυ ϒʔϜ͕ى͖Δ • Browserify ͱ͔͕ྲྀߦΓɺ server ͱ client ͷ͕֞ࠜಥഁ͞ Ε͍ͯ͘ • Isomorphic / universal ͱ͔ͷݴ༿͜͜Ͱੜ·ΕΔ
Slide 29
Slide 29 text
Ұ୴͜͜·ͰͰৼΓฦΓ
Slide 30
Slide 30 text
The rise of Node.js (2009-2015) • ϦϦʔε͔Βౖ౭ͷ6ؒ • ৽ػೳ͕୯ҐͰՃ͞ΕΔΘ • ΤίγεςϜ͕Ͱ͖ͯେྔͷ3rd party libੜ·Ε ΔΘ • ϦʔμʔมΘͬͯɺ։ൃओମίϛϡχςΟओಋ ʹมΘΔΘ
Slide 31
Slide 31 text
The rise of Node.js (2009-2015) • ES2015ͱbabel, React/Vue.js ͳͲͷίϯϙʔωϯτ ࢦϥΠϒϥϦͷຄڵ, ਐԽͨ͠ Node.js ͦΕͧΕ͕ ҰݸͷʹͳͬͯϒʔϜ͕ੜ·ΕΔ • ͜Ε͕୭͔ʹࢦ͞Ε͔ͨͷΑ͏ͳಈ͖ͰৼΓฦΔͱ ͳΜ͔ࢥ͏ͷ͕͋Δɻ • 2015ʹෳͷϒϨΠΫεϧʔ͕ى͖ͨΑ͏ʹࢥ͑ Δɻ
Slide 32
Slide 32 text
2016-2018
Slide 33
Slide 33 text
2016-2018 • ͜ͷ͋ͨΓ͔ΒաڈʹऔΓೖΕ͖ͯͨϥΠϒϥϦ ͷதͰ ES Web Standard ͱҧ͏ΈΛͲ ͏౷߹͢Δ͔͕ٞʹͳ͍ͬͯ͘ • ESModule ͱ CommonJS • Stream / Event Emitter ͱ Promise / WHATWG Stream
Slide 34
Slide 34 text
2016-2018 • 2016: Leftpad ࣄ͕݅ൃੜ • Npm ͕উखʹϥΠϒϥϦΛফ͢ • ౖͬͨ࡞ऀ͕શͯͷϥΠϒϥϦΛফ͢ • Leftpad ͱ͍͏ϥΠϒϥϦ͕ webpack ͕͍ͬͯͨΓɺ babel ͷҰ෦ͰΘΕ͍ͯͨΓͱ৭ΜͳॴͰϥΠϒϥϦ͕յΕΔ • ͔͜͜ΒɺʮࢲୡɺϥΠϒϥϦґଘ͗͢͠͡ΌͶʁʯ͍ͬͯ͏งғ ؾ͕ྲྀΕΔɻ
Slide 35
Slide 35 text
2016-2018 • 2018: npm ࢿۚͰ৭ʑͱ͕͠ग़ͯ͘Δ • ϨΠΦϑ͕͋ͬͨΓͱք۾͕͟Θͭ͘ • Ұ୴ github ͱ౷߹͞Εͯམͪண͘ (2020)
Slide 36
Slide 36 text
2016-2018 • 2017: Node.js ͕ CommonJS ͱ ESM ͷํΛ૬ ޓޓੑΛอͬͨ··ղܾ͢Δͱ͍͏ํ๏Λ࣮ ɺ֦ுࢠʹΑΔΓํ͕ΛݺͿ • 2017: React Vue.js Ͱ SSR ͢Δͱ͍͏ํ๏͕Ұ ఆͷྲྀߦͷஹ͠ΛݟͤΔɺ͜ͷࠒ Next.js ͕ϦϦʔ ε͞ΕΔɺΫΤϦʔύϥϝʔλͰ͔͠ routing Ͱ͖ͳ͔ͬͨͷͰ͋Μ·Γྲྀߦͬͯͳ͔ͬͨ
Slide 37
Slide 37 text
2016-2018 • 2016: TypeScript ͕ @types ͳͲͷΈΛ Ҿͬఏ͛ͯܕͷࢀরΛղܾ͢ΔखஈΛఏڙ͠ɺ VS Code ͳͲͷΤσΟλͱͱʹਐԽ • 2018: Deno ͕ jsconf.eu Ͱൃද͞ΕΔɻ10 Λܦͯ Ryan ͔Β࠶ͼͷൃදɻಛʹ TypeScript native αϙʔτͳͲͷηϯεྲྀੴɻ
Slide 38
Slide 38 text
ݱ(2019-2023)
Slide 39
Slide 39 text
ݱ • 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ʹมΘΔ
Slide 40
Slide 40 text
ݱ • 2022: WINTER CG ൃɺ Node.js, Deno, Bun ͳͲͷϒϥβҎ֎ͷϥϯλΠϜͷͨΊ ͷ༷Խஂମ • Fetch ͷ minimum spec ͱ͔ ৭ʑܾ·ͬͨ
Slide 41
Slide 41 text
Ұ୴͜͜·ͰͰৼΓฦΓ
Slide 42
Slide 42 text
ྲྀߦͱڝ૪ • npmҰ࣌ظࢿ͕͕ۚ͋ͬͨɺ GitHub ʹΑΔ ౷߹ͰҰ୴ղܾ͞Εͨ • TypeScript VS CodeͳͲͷπʔϧपΓ͕ਐԽ ͯ͠ɺେྲྀߦ • Next.js ͕େྲྀߦɺ Vercel ͳͲͷେ͖ͳελʔ τΞοϓ͕ੜ·Εͨ
Slide 43
Slide 43 text
ྲྀߦͱڝ૪ • ྲྀߦʹΑΓɺ݈શͳڝ૪͕૿͖͑ͯͨΑ͏ʹ ײ͡Δ • Node.js vs Deno vs Bun Έ͍ͨͳ • ݈શͳڝ૪ͱޓੑͱ༷Խͱ͍͏ਐԽΤ ϯυϢʔβʔʹҰ൪རΛͨΒͯ͘͠ΕΔ ͱࢥ͑Δ
Slide 44
Slide 44 text
ྲྀߦͱڝ૪ • Node.jsίϛϡχςΟͷ͕ओಋ͞ΕΔɺྲྀߦͬͨͭΛޙ͔ΒऔΓೖΕ͍ͯ͘ํ • Test ͷΈ͕ೖͬͨ • Permission ͕αϙʔτ͞Εͨ • Experimental Ͱ͋Δ͕ɺ module ղܾͷ default ͕ มߋͰ͖ΔΑ͏ʹͳͬͨ ʢdefault Λ esm ʹม͍͑ͯ͜͏ͱͯ͠Δʣ • Single executable fi le ͕࡞ΕΔΑ͏ʹͳͬͨ • Web Standard ͱͷੑΛ্͍͛ͯ͜͏ͱͯ͠Δʢnavigator͕ೖͬͨΓʣ • ࠓϚείοτΩϟϥΫλʔืूͯ͠Δͱͷ͜ͱ
Slide 45
Slide 45 text
ྲྀߦͱڝ૪ • Deno Node.js ͱͷ compat Λ্͍͖͍͛ͯͨํ • npm support • ͦͷ্ͰπʔϧνΣΠϯɺಈ࡞ڥΛݩʹ։ൃશମΛ Γ্͍͛ͯ͘ • Deno Deploy • Deno fresh
Slide 46
Slide 46 text
ࠓޙͷ༧
Slide 47
Slide 47 text
ࠓޙ • Node.jsޓੑ্͕͕Γɺ Deno Bun ͳͲͱͷ ڝ૪͕ͬͱ૿͑Δ • ΤίγεςϜΛͲ͜·ͰࣗͷਞӦʹ࣋ͬͯ͜Ε Δ͔উෛʹͳΓͦ͏ɻ • ޓੑ্͕͕ΕޙੑೳηΩϡϦςΟ։ൃ ऀମݧӡ༻҆ఆੑͳͲͷඇػೳཁ݅Ͱͷউෛʹ ͳΔ
Slide 48
Slide 48 text
ࠓޙ • Denoଆ͔ΒݟΔͱɺNode.jsΤίγεςϜͱͷੑ Λ্͛ͯɺԿʹૣ͘ Node.js ͷγΣΞΛୣ͑Δ͔ • Node.js ଆ͔ΒݟΔͱɺଞͷϥϯλΠϜͱͷػೳࠩΛ ແͯ͘͠ɺطଘγΣΞΛҡ࣋Ͱ͖Δ͔ • Bun ଆ͔ΒݟΔͱɺΤίγεςϜͷੑΛ্͛Δͱ ͱʹѹతͳύϑΥʔϚϯεͰੑೳࠩͰѹ͍ͨ͠
Slide 49
Slide 49 text
ࠓޙ • ࡾऀࡾ༷ • ͜͏͍͏݈શͳڝ૪͕͠Β͘ଓ͖ɺڝ૪ঢ় ଶͷ··ۉߧͦ͠͏ͳؾ͍ͯ͠Δɻ
Slide 50
Slide 50 text
ࠓޙ • ͜ͷଞͷํੑͱͯ͠: • ΤοδίϯϐϡʔςΟϯάํͰCDNͰಈ͘αʔ όαΠυܰྔJSͷྲྀߦ • ϑϧελοΫͳ JS ϑϨʔϜϫʔΫͷོͱਐԽ • Σϒ։ൃͷਐԽͱͱʹԼճΓΛࢧ͑Δπʔϧͱ ͯ͠ਐԽ͠ଓ͚ͦ͏
Slide 51
Slide 51 text
·ͱΊ
Slide 52
Slide 52 text
·ͱΊ • JavaScript Server Runtime ͷྺ࢙ΛৼΓฦͬͨɻ • ίϛϡχςΟͱྗΛ࣋ͬͨاۀ͕࿈ಈ͠ͳ͕Βൃల͖ͯͨ͠ ྺ࢙ͩͬͨΑ͏ʹײ͡Δɻ • ݈શͳڝ૪ʹΑΔػೳͱඇػೳͷࠩผԽ͕ܹԽͯ͠Δ • ҰํͰڞ௨ԽΛWinterCGΛத৺ʹߦΘΕ͍ͯΔ • ·ͩ·ͩൃల͍͖ͯͦ͠͏ɺ։ൃऀʹ༏͍͠ൃల͕ࠓޙ ·ΕΔ
Slide 53
Slide 53 text
12લʹͷਓੜΛม͑ͨΑ ͏ʹࠓͷ Ryan ͷൃදͰ୭ ͔ͷਓੜ͕มΘΔͱ͍͍ͳͱ ࢥ͍·͢ɻ
Slide 54
Slide 54 text
Thanks!!
Slide 55
Slide 55 text
ࢀߟࢿྉ • 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