Slide 1

Slide 1 text

denoʹ͍ͭͯ 2018/06/28 @ Recruit Technologies TEPCO office

Slide 2

Slide 2 text

Twitter: @yosuke_furukawa Github: yosuke-furukawa

Slide 3

Slide 3 text

2018/11/23 - 24 Node ֶԂࡇ։࠵

Slide 4

Slide 4 text

deno

Slide 5

Slide 5 text

ྺ࢙ΛḪΔ͜ͱ9೥લ…

Slide 6

Slide 6 text

Ryan Dahl ͕Node.jsʹ͍ͭͯτʔΫ

Slide 7

Slide 7 text

https://www.slideshare.net/shigeki_ohtsu/node-v012tng12

Slide 8

Slide 8 text

v0.1ͷެද͔Β9೥ޙ…

Slide 9

Slide 9 text

10 THINGS I REGRET ABOUT NODE.JS

Slide 10

Slide 10 text

Ryan DahlͷޙչϙΠϯτ • Dynamic Typed Language ʹͨ͜͠ͱ • Promise Λ࠾༻͠ͳ͔ͬͨ͜ͱ • Security ϞσϧΛצҊ͠ͳ͔ͬͨ͜ͱ • Gypʹ৐͔ͬͬͨ͜ͱ • moduleϋϯυϦϯά (package.json, node_modules, etc)

Slide 11

Slide 11 text

Dynamic Typed Language

Slide 12

Slide 12 text

Dynamic Typed Language • JavaScript͸࠷΋ྑ͍ಈతܕ෇͚ݴޠͩͱࢥͬͯΔ • ͔͠͠ͳ͕Βɺಈతܕ෇͚ݴޠ͸Ұճ͖ͬ͜Γͷܭ ࢉΛ͢ΔͳΒ·ͩ͠΋ɺԿ౓΋࣮ߦ͢Δ΋ͷʹద༻ ͢Δ΂͖͡Όͳ͍ͱࢥ͏ • Node.js͸ઃܭաఔʹ͓͍ͯෳ਺ͷτϥΠΤϥʔΛ ܁Γฦ͢ඞཁ͕͋Γɺͦͷ࣌ͷΤϥʔͷ಺༰͸Θ͔ Γʹ͘͘ɺΤϥʔͷղফ΋͸͖ͬΓͯ͠ͳ͍ɻ

Slide 13

Slide 13 text

Dynamic Typed Language • JavaScript͸࠷΋ྑ͍ಈతܕ෇͚ݴޠͩͱࢥͬͯΔ • ͔͠͠ͳ͕Βɺಈతܕ෇͚ݴޠ͸Ұճ͖ͬ͜Γͷܭ ࢉΛ͢ΔͳΒ·ͩ͠΋ɺԿ౓΋࣮ߦ͢Δ΋ͷʹద༻ ͢Δ΂͖͡Όͳ͍ͱࢥ͏ • Node.js͸ઃܭաఔʹ͓͍ͯෳ਺ͷτϥΠΤϥʔΛ ܁Γฦ͢ඞཁ͕͋Γɺͦͷ࣌ͷΤϥʔͷ಺༰͸Θ͔ Γʹ͘͘ɺΤϥʔͷղফ΋͸͖ͬΓͯ͠ͳ͍ɻ ͔֬ʹͦ͏͔΋͠ΕΜ͚Ͳɺ͍·ͦΕ͍͏ʁ

Slide 14

Slide 14 text

Dynamic Typed Language • ࣮͸ੲNode.jsΛશ෦TypeScriptʹ͠Α͏ͱ͠ ͨΓɺCoffeeScriptʹ͠Α͏͍ͬͯ͏PR͕ ཱͬͨ͜ͱ͕͋ͬͨɻ • ΋ͪΖΜશ෦ফ͞Ε͖ͯͨɻ

Slide 15

Slide 15 text

PromiseΛ࠾༻Ͱ͖ͳ͔ͬͨ

Slide 16

Slide 16 text

Promise • 2009೥ʹҰ౓࣮૷͞Εͨ΋ͷͷɺ2010೥ʹ͸ ؙ͝ͱফͯ͠͠·ͬͨɻ • ࠓͰ΋۪͔ͳܾஅͩͬͨͱࢥ͍ͬͯ·͢ɻ • async/awaitͷந৅Խʹ͸ඞཁͰͨ͠ɻ

Slide 17

Slide 17 text

Promise • 2009೥ʹҰ౓࣮૷͞Εͨ΋ͷͷɺ2010೥ʹ͸ ؙ͝ͱফͯ͠͠·ͬͨɻ • ࠓͰ΋۪͔ͳܾஅͩͬͨͱࢥ͍ͬͯ·͢ɻ • async/awaitͷந৅Խʹ͸ඞཁͰͨ͠ɻ Promiseͷ࿩Λ͢Δͱ໨ͷલ͕೤͘ͳΔ

Slide 18

Slide 18 text

Promise • Ұ౓ masuidrive ͞Μ͕nodeͷඪ४APIΛ͢΂ͯPromiseʹ͠ ͨࣄ͕͋ͬͨɻ • ҰํɺIRCͷதͰ͸ɺʮPromise͕ඪ४ʹͳΔ͔͸ෆ໌ͩ͠ɺ callbackͷ͕simpleͰΑ͘Ͷʁʯ͍ͬͯ͏ٞ࿦͕͋ͬͨɻ • ͔ͯ͘͠ɺPromiseͷίʔυ͸͢΂ͯফ͞Εͯ͠·ͬͨɻ • ͜Ε͕ੈʹݴ͏ʮmasuidrive ͷ൵ܶʯͰ͋Δɻ

Slide 19

Slide 19 text

Security ϞσϧΛצҊ͠ͳ ͔ͬͨ͜ͱ

Slide 20

Slide 20 text

SecurityϞσϧΛצҊ͠ͳ͔ͬ ͨ͜ͱ • V8ͦΕࣗ਎͸secureͳsandboxϞσϧΛදݱ ͍ͯ͠·͢ɻ • ΋ͬͱྑ͍ηΩϡϦςΟʹͰ͖ͨ͸ͣɻ • LinterΛಈ͔͚ͩ͢Ͱ network΁ͷΞΫηε΍ ϑΝΠϧॻ͖ࠐΈΛ͢Δඞཁ͸ͳ͍Ͱ͢ΑͶʁ

Slide 21

Slide 21 text

SecurityϞσϧΛצҊ͠ͳ͔ͬ ͨ͜ͱ • v8͚ͩͩͱ ϑΝΠϧಡΈࠐΈɺॻ͖ࠐΈ΋Ͱ͖ ͳ͍͠ɺωοτϫʔΫΞΫηε΋Ͱ͖·ͤΜɻ • ඪ४ग़ྗͷconsole.log΋v8ͷ֎Ͱ͢ɻ • ͜ΕΒΛsandboxͷதͰదٓύʔϛογϣϯΛಘ ͳ͕Β࣮ߦͰ͖Ε͹΋ͬͱΑΓྑ͍ηΩϡϦςΟ ϞσϧΛఏڙͰ͖ͨɺͱݴ͍͍ͨͷͰ͠ΐ͏ɻ

Slide 22

Slide 22 text

GYPΛ࠾༻ͨ͜͠ͱ

Slide 23

Slide 23 text

GYPΛ࠾༻ͨ͜͠ͱ • GYP͸େ͖ͳࣦഊͩͬͨ • V8͕GYPΛ࠾༻͍ͯͯ͠ɺnode.js΋ͦΕʹ҆қʹ ৐͔ͬͬͯ͠·ͬͨɻ • v8͸GYP͔ΒgnʹҠΓNode.jsͷgypϢʔβʔ͸औΓ ࢒͞Εͯ͠·ͬͨɻ • ࠓͳΒͦ͏͠ͳ͍ɺ FFI Λ࠾༻͢Δɻ

Slide 24

Slide 24 text

GYPΛ࠾༻ͨ͜͠ͱ • FFI (Foreign Function Interface)ͷ͕ϙʔλϒ ϧͰݺͼ΍͍͢ҰํͰɺgypͷ͕ߴ଎ͩͱ͞Ε ͍ͯͨɻ • ੑೳΛ༏ઌͨ݁͠ՌɺgypΛ࠾༻͕ͨ͠ɺࠓ΍ gyp͸python2Ͱ͋Γɺgyp͸΋͸΍աڈͷҨ ࢈ʹͳͬͯ͠·͍·ͨ͠ɻ

Slide 25

Slide 25 text

moduleϋϯυϦϯάશൠ

Slide 26

Slide 26 text

moduleϋϯυϦϯάશൠ • package.jsonपΓɺෆཁͳ৘ใ͕ଟ͗͢Δ • require()ͨ࣌͠ʹnode_modulesҎԼʹ͋ΔmainϑΟʔϧυΛউ खʹಡΉͳͲɺfancyͳڍಈ͕ଟ͍ʢnpmʹ͋Δ΋ͷͳͷ͔ɺ localͷద౰ͳϑΝΠϧͳͷ͔Θ͔Γʹ͍͘ʣ •

Slide 27

Slide 27 text

moduleϋϯυϦϯάશൠ

Slide 28

Slide 28 text

moduleϋϯυϦϯάશൠ • moduleͷղܾΞϧΰϦζϜ͕૬౰ෳࡶʹͳͬ ͯ͠·ͬͨɻ • ϒϥ΢βͷsemantics͔Β΋֎Εͯ͠·ͬͨɻ

Slide 29

Slide 29 text

moduleϋϯυϦϯάશൠ • module ͷղܾΞϧΰϦζϜ͸ node_modules ಺ͷґଘ ؔ܎ΛͨͲͬͯґଘղܾΛ͢Δɻ • ·ͨɺ module͸ࢦఆݩ͔Βͷ૬ରύεͰϑΝΠϧΛࢦ ఆ͢Δ͕ɺ $NODE_PATH ؀ڥม਺ʹύε͕ηοτ͞Ε ͍ͯΔͱ͔ͦ͜Β΋ಡΈࠐΉɻ • ͜ͷଞʹ΋͍͔ͭ͘ hacky ͳํ๏͕͋Δ͕ɺͲΕ΋ඍົ

Slide 30

Slide 30 text

moduleϋϯυϦϯάશൠ

Slide 31

Slide 31 text

moduleϋϯυϦϯάશൠ • ".js" ͳ͠ͰಡΈࠐΊΔ • "index.js" ͸লུՄೳ • ͳͲͳͲɺϑΝϯγʔͳػೳ͕ଟ͘ɺ࣮͸ͦΕ͕ ෳࡶ͞ͱόάͷԹচʹͳΓ΍͍͢ɻ • লུͪ͠Ό͏ͱɺϑΥϧμͳͷ͔ϑΝΠϧͳͷ͔ ݟ෼͚͕͔ͭͳ͍ɻ

Slide 32

Slide 32 text

ͦ͜Ͱ deno Λ࡞ͬͨ

Slide 33

Slide 33 text

deno ͸ v8 Ͱಈ͘ηΩϡΞͳ TypeScript ࣮ߦ؀ڥ

Slide 34

Slide 34 text

TypeScript

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

TypeScript • deno͸TypeScriptΛ࠾༻ͨ͠ • TypeScript͸DartͳͲͷ΋ͷͱ͸ҟͳΓɺ JavaScriptͷεʔύʔηοτͱ͍͏Ґஔ͚ͮ • ڊେͳγεςϜʹ΋ରԠͰ͖Δɻ

Slide 39

Slide 39 text

sandboxηΩϡϦςΟϞσϧ

Slide 40

Slide 40 text

sandbox ηΩϡϦςΟϞσϧ • deno͸sandboxͰಈ͘ • v8ͷϨΠϠ͸workerͰJSͷruntime͕ಈ͖ɺϑΝ Πϧ΍ωοτϫʔΫʹΞΫηε͢Δͱ͖͚ͩ͸ಛ ݖϞʔυʹͳΔɻ • ಛݖϞʔυͷϓϩηεͱruntimeؒͰ௨৴͢Δࡍ ͸protocol bufferΛ࢖ͬͯ௨৴͢Δɻ

Slide 41

Slide 41 text

sandbox ηΩϡϦςΟϞσϧ • deno͸sandboxͰಈ͘ • v8ͷϨΠϠ͸workerͰJSͷruntime͕ಈ͖ɺ ϑΝΠϧ΍ωοτϫʔΫʹΞΫηε͢Δͱ͖ ͚ͩ͸ಛݖϞʔυʹͳΔɻ

Slide 42

Slide 42 text

sandbox ηΩϡϦςΟϞσϧ • deno͸sandboxͰಈ͘ • v8ͷϨΠϠ͸workerͰJSͷruntime͕ಈ͖ɺ ϑΝΠϧ΍ωοτϫʔΫʹΞΫηε͢Δͱ͖ ͚ͩ͸ಛݖϞʔυʹͳΔɻ ͓ɺOS͔Αɻɻɻ

Slide 43

Slide 43 text

ϞδϡʔϧγεςϜͷγϯϓϧԽ

Slide 44

Slide 44 text

ϞδϡʔϧγεςϜͷγϯϓϧ Խ • NodeͷطଘϞδϡʔϧͱͷ਌࿨ੑ͸ٻΊͯ· ͤΜɻ • import͸૬ରύε͔ઈରύεɺ΋͘͠͸URL ͚ͩͰ͔͠ࢦఆͰ͖·ͤΜɻ import { test } from "https://unpkg.com/[email protected]/testing.ts" import { log } from "./util.ts"

Slide 45

Slide 45 text

ϞδϡʔϧγεςϜͷγϯϓϧ Խ • NodeͷطଘϞδϡʔϧͱͷ਌࿨ੑ͸ٻΊͯ· ͤΜɻ • import͸૬ରύε͔ઈରύεɺ΋͘͠͸URL ͚ͩͰ͔͠ࢦఆͰ͖·ͤΜɻ import { test } from "https://unpkg.com/[email protected]/testing.ts" import { log } from "./util.ts" ͍͗͞Α͗͢Δɻ

Slide 46

Slide 46 text

2018೥Ͱ͋Δ͜ͱΛར༻ͨ͠ Ϟσϧ • Ωϟον͞Εͳ͍ྫ֎͕ى͖ͨΒଈ࠲ʹఀࢭ͢Δ • top-level await Λαϙʔτ͢Δ • ػೳతʹॏͳΔ৔߹͸ϒϥ΢βͱͷޓ׵Λ༏ઌ͢ Δ • ౰ॳ͸GoͰ࡞͍͕ͬͯͨɺࠓ͸RustͱC++ʹͳͬ ͍ͯΔɻ

Slide 47

Slide 47 text

2018೥Ͱ͋Δ͜ͱΛར༻ͨ͠ Ϟσϧ • Ωϟον͞Εͳ͍ྫ֎͕ى͖ͨΒଈ࠲ʹఀࢭ͢Δ • top-level await Λαϙʔτ͢Δ • ػೳతʹॏͳΔ৔߹͸ϒϥ΢βͱͷޓ׵Λ༏ઌ͢ Δ • ౰ॳ͸GoͰ࡞͍͕ͬͯͨɺࠓ͸RustͱC++ʹͳͬ ͍ͯΔɻ ͪͳΈʹಈ͔ͯ͠΋Կ΋ى͖·ͤΜͰͨ͠ɻ

Slide 48

Slide 48 text

ײ૝

Slide 49

Slide 49 text

ײ૝ • ·ͩ·ͩϓϩτλΠϓʢͱ͍͏ΑΓϋϩʔϫʔϧυϨϕϧʣ • Node.jsͰ΋ࢀߟʹͳΔͱ͜Ζ͸ଟͦ͏ • Node.jsʹ͓͚Δ module ͱ͸ package ͷ͜ͱͰ͋ΓɺσΟϨΫτϦ Λࢦͯ͠Δɻ • ҰํͰ ES Modules ΍ deno ʹ͓͚Δ module ͱ͍͏ͷ͸ϑΝΠϧͷ ࣄͰ͋Γɺ࠷௿ݶͷ୯Ґ͔࣋ͨ͠ͳ͍ɻ • Կ͕Ұମਖ਼ղͩͬͨͷ͔͸·ͩΘ͔Βͳ͍ɻ໘നͦ͏ͳ͓΋ͪΌ͕ग़ ͖ͯͨͷͰ৮Δͷ͓͢͢Ίɻ