Upgrade to Pro — share decks privately, control downloads, hide ads and more …

denoの話

 denoの話

Node学園 31時限目で発表した deno の話です。

Yosuke Furukawa
PRO

June 29, 2018
Tweet

More Decks by Yosuke Furukawa

Other Decks in Programming

Transcript

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

  2. Twitter: @yosuke_furukawa Github: yosuke-furukawa

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

  4. deno

  5. ྺ࢙ΛḪΔ͜ͱ9೥લ…

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

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

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

  9. 10 THINGS I REGRET ABOUT NODE.JS

  10. Ryan DahlͷޙչϙΠϯτ • Dynamic Typed Language ʹͨ͜͠ͱ • Promise Λ࠾༻͠ͳ͔ͬͨ͜ͱ

    • Security ϞσϧΛצҊ͠ͳ͔ͬͨ͜ͱ • Gypʹ৐͔ͬͬͨ͜ͱ • moduleϋϯυϦϯά (package.json, node_modules, etc)
  11. Dynamic Typed Language

  12. Dynamic Typed Language • JavaScript͸࠷΋ྑ͍ಈతܕ෇͚ݴޠͩͱࢥͬͯΔ • ͔͠͠ͳ͕Βɺಈతܕ෇͚ݴޠ͸Ұճ͖ͬ͜Γͷܭ ࢉΛ͢ΔͳΒ·ͩ͠΋ɺԿ౓΋࣮ߦ͢Δ΋ͷʹద༻ ͢Δ΂͖͡Όͳ͍ͱࢥ͏ •

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

    Node.js͸ઃܭաఔʹ͓͍ͯෳ਺ͷτϥΠΤϥʔΛ ܁Γฦ͢ඞཁ͕͋Γɺͦͷ࣌ͷΤϥʔͷ಺༰͸Θ͔ Γʹ͘͘ɺΤϥʔͷղফ΋͸͖ͬΓͯ͠ͳ͍ɻ ͔֬ʹͦ͏͔΋͠ΕΜ͚Ͳɺ͍·ͦΕ͍͏ʁ
  14. Dynamic Typed Language • ࣮͸ੲNode.jsΛશ෦TypeScriptʹ͠Α͏ͱ͠ ͨΓɺCoffeeScriptʹ͠Α͏͍ͬͯ͏PR͕ ཱͬͨ͜ͱ͕͋ͬͨɻ • ΋ͪΖΜશ෦ফ͞Ε͖ͯͨɻ

  15. PromiseΛ࠾༻Ͱ͖ͳ͔ͬͨ

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

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

  18. Promise • Ұ౓ masuidrive ͞Μ͕nodeͷඪ४APIΛ͢΂ͯPromiseʹ͠ ͨࣄ͕͋ͬͨɻ • ҰํɺIRCͷதͰ͸ɺʮPromise͕ඪ४ʹͳΔ͔͸ෆ໌ͩ͠ɺ callbackͷ͕simpleͰΑ͘Ͷʁʯ͍ͬͯ͏ٞ࿦͕͋ͬͨɻ •

    ͔ͯ͘͠ɺPromiseͷίʔυ͸͢΂ͯফ͞Εͯ͠·ͬͨɻ • ͜Ε͕ੈʹݴ͏ʮmasuidrive ͷ൵ܶʯͰ͋Δɻ
  19. Security ϞσϧΛצҊ͠ͳ ͔ͬͨ͜ͱ

  20. SecurityϞσϧΛצҊ͠ͳ͔ͬ ͨ͜ͱ • V8ͦΕࣗ਎͸secureͳsandboxϞσϧΛදݱ ͍ͯ͠·͢ɻ • ΋ͬͱྑ͍ηΩϡϦςΟʹͰ͖ͨ͸ͣɻ • LinterΛಈ͔͚ͩ͢Ͱ network΁ͷΞΫηε΍

    ϑΝΠϧॻ͖ࠐΈΛ͢Δඞཁ͸ͳ͍Ͱ͢ΑͶʁ
  21. SecurityϞσϧΛצҊ͠ͳ͔ͬ ͨ͜ͱ • v8͚ͩͩͱ ϑΝΠϧಡΈࠐΈɺॻ͖ࠐΈ΋Ͱ͖ ͳ͍͠ɺωοτϫʔΫΞΫηε΋Ͱ͖·ͤΜɻ • ඪ४ग़ྗͷconsole.log΋v8ͷ֎Ͱ͢ɻ • ͜ΕΒΛsandboxͷதͰదٓύʔϛογϣϯΛಘ

    ͳ͕Β࣮ߦͰ͖Ε͹΋ͬͱΑΓྑ͍ηΩϡϦςΟ ϞσϧΛఏڙͰ͖ͨɺͱݴ͍͍ͨͷͰ͠ΐ͏ɻ
  22. GYPΛ࠾༻ͨ͜͠ͱ

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

    ࠓͳΒͦ͏͠ͳ͍ɺ FFI Λ࠾༻͢Δɻ
  24. GYPΛ࠾༻ͨ͜͠ͱ • FFI (Foreign Function Interface)ͷ͕ϙʔλϒ ϧͰݺͼ΍͍͢ҰํͰɺgypͷ͕ߴ଎ͩͱ͞Ε ͍ͯͨɻ • ੑೳΛ༏ઌͨ݁͠ՌɺgypΛ࠾༻͕ͨ͠ɺࠓ΍

    gyp͸python2Ͱ͋Γɺgyp͸΋͸΍աڈͷҨ ࢈ʹͳͬͯ͠·͍·ͨ͠ɻ
  25. moduleϋϯυϦϯάશൠ

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

  27. moduleϋϯυϦϯάશൠ

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

  29. moduleϋϯυϦϯάશൠ • module ͷղܾΞϧΰϦζϜ͸ node_modules ಺ͷґଘ ؔ܎ΛͨͲͬͯґଘղܾΛ͢Δɻ • ·ͨɺ module͸ࢦఆݩ͔Βͷ૬ରύεͰϑΝΠϧΛࢦ

    ఆ͢Δ͕ɺ $NODE_PATH ؀ڥม਺ʹύε͕ηοτ͞Ε ͍ͯΔͱ͔ͦ͜Β΋ಡΈࠐΉɻ • ͜ͷଞʹ΋͍͔ͭ͘ hacky ͳํ๏͕͋Δ͕ɺͲΕ΋ඍົ
  30. moduleϋϯυϦϯάશൠ

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

    • লུͪ͠Ό͏ͱɺϑΥϧμͳͷ͔ϑΝΠϧͳͷ͔ ݟ෼͚͕͔ͭͳ͍ɻ
  32. ͦ͜Ͱ deno Λ࡞ͬͨ

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

  34. TypeScript

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

  39. sandboxηΩϡϦςΟϞσϧ

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

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

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

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

  44. ϞδϡʔϧγεςϜͷγϯϓϧ Խ • NodeͷطଘϞδϡʔϧͱͷ਌࿨ੑ͸ٻΊͯ· ͤΜɻ • import͸૬ରύε͔ઈରύεɺ΋͘͠͸URL ͚ͩͰ͔͠ࢦఆͰ͖·ͤΜɻ import {

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

    test } from "https://unpkg.com/[email protected]/testing.ts" import { log } from "./util.ts" ͍͗͞Α͗͢Δɻ
  46. 2018೥Ͱ͋Δ͜ͱΛར༻ͨ͠ Ϟσϧ • Ωϟον͞Εͳ͍ྫ֎͕ى͖ͨΒଈ࠲ʹఀࢭ͢Δ • top-level await Λαϙʔτ͢Δ • ػೳతʹॏͳΔ৔߹͸ϒϥ΢βͱͷޓ׵Λ༏ઌ͢

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

    Δ • ౰ॳ͸GoͰ࡞͍͕ͬͯͨɺࠓ͸RustͱC++ʹͳͬ ͍ͯΔɻ ͪͳΈʹಈ͔ͯ͠΋Կ΋ى͖·ͤΜͰͨ͠ɻ
  48. ײ૝

  49. ײ૝ • ·ͩ·ͩϓϩτλΠϓʢͱ͍͏ΑΓϋϩʔϫʔϧυϨϕϧʣ • Node.jsͰ΋ࢀߟʹͳΔͱ͜Ζ͸ଟͦ͏ • Node.jsʹ͓͚Δ module ͱ͸ package

    ͷ͜ͱͰ͋ΓɺσΟϨΫτϦ Λࢦͯ͠Δɻ • ҰํͰ ES Modules ΍ deno ʹ͓͚Δ module ͱ͍͏ͷ͸ϑΝΠϧͷ ࣄͰ͋Γɺ࠷௿ݶͷ୯Ґ͔࣋ͨ͠ͳ͍ɻ • Կ͕Ұମਖ਼ղͩͬͨͷ͔͸·ͩΘ͔Βͳ͍ɻ໘നͦ͏ͳ͓΋ͪΌ͕ग़ ͖ͯͨͷͰ৮Δͷ͓͢͢Ίɻ