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
denoの話
Search
Yosuke Furukawa
PRO
June 29, 2018
Programming
4
2.5k
denoの話
Node学園 31時限目で発表した deno の話です。
Yosuke Furukawa
PRO
June 29, 2018
Tweet
Share
More Decks by Yosuke Furukawa
See All by Yosuke Furukawa
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
160
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
10
4.6k
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
1
4.4k
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
270
Removing Corepack
yosuke_furukawa
PRO
9
1.7k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
2.9k
Strip Types と Storage
yosuke_furukawa
PRO
4
440
Module Harmony について
yosuke_furukawa
PRO
3
1.8k
LTのやり方
yosuke_furukawa
PRO
16
2.7k
Other Decks in Programming
See All in Programming
アーキテクチャと考える迷子にならない開発者テスト
irof
9
3.2k
Honoを技術選定したAI要件定義プラットフォームAcsimでの意思決定
codenote
0
250
AIの弱点、やっぱりプログラミングは人間が(も)勉強しよう / YAPC AI and Programming
kishida
9
5.1k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
5
1.8k
歴史から学ぶ「Why PHP?」 PHPを書く理由を改めて理解する / Learning from History: “Why PHP?” Rediscovering the Reasons for Writing PHP
seike460
PRO
0
160
「正規表現をつくる」をつくる / make "make regex"
makenowjust
1
670
Atomics APIを知る / Understanding Atomics API
ssssota
1
150
[堅牢.py #1] テストを書かない研究者に送る、最初にテストを書く実験コード入門 / Let's start your ML project by writing tests
shunk031
10
4.7k
Bakuraku E2E Scenario Test System Architecture #bakuraku_qa_study
teyamagu
PRO
0
780
The Missing Link in Angular's Signal Story: Resource API and httpResource
manfredsteyer
PRO
0
140
Vueで学ぶデータ構造入門 リンクリストとキューでリアクティビティを捉える / Vue Data Structures: Linked Lists and Queues for Reactivity
konkarin
1
310
イベントストーミングのはじめかた / Getting Started with Event Storming
nrslib
1
640
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
11
940
Writing Fast Ruby
sferik
630
62k
Building Adaptive Systems
keathley
44
2.8k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
658
61k
How to Ace a Technical Interview
jacobian
280
24k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Building Applications with DynamoDB
mza
96
6.8k
Side Projects
sachag
455
43k
Site-Speed That Sticks
csswizardry
13
970
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Transcript
denoʹ͍ͭͯ 2018/06/28 @ Recruit Technologies TEPCO office
Twitter: @yosuke_furukawa Github: yosuke-furukawa
2018/11/23 - 24 Node ֶԂࡇ։࠵
deno
ྺ࢙ΛḪΔ͜ͱ9લ…
Ryan Dahl ͕Node.jsʹ͍ͭͯτʔΫ
https://www.slideshare.net/shigeki_ohtsu/node-v012tng12
v0.1ͷެද͔Β9ޙ…
10 THINGS I REGRET ABOUT NODE.JS
Ryan DahlͷޙչϙΠϯτ • Dynamic Typed Language ʹͨ͜͠ͱ • Promise Λ࠾༻͠ͳ͔ͬͨ͜ͱ
• Security ϞσϧΛצҊ͠ͳ͔ͬͨ͜ͱ • Gypʹ͔ͬͬͨ͜ͱ • moduleϋϯυϦϯά (package.json, node_modules, etc)
Dynamic Typed Language
Dynamic Typed Language • JavaScript࠷ྑ͍ಈతܕ͚ݴޠͩͱࢥͬͯΔ • ͔͠͠ͳ͕Βɺಈతܕ͚ݴޠҰճ͖ͬ͜Γͷܭ ࢉΛ͢ΔͳΒ·ͩ͠ɺԿ࣮ߦ͢Δͷʹద༻ ͢Δ͖͡Όͳ͍ͱࢥ͏ •
Node.jsઃܭաఔʹ͓͍ͯෳͷτϥΠΤϥʔΛ ܁Γฦ͢ඞཁ͕͋Γɺͦͷ࣌ͷΤϥʔͷ༰Θ͔ Γʹ͘͘ɺΤϥʔͷղফ͖ͬΓͯ͠ͳ͍ɻ
Dynamic Typed Language • JavaScript࠷ྑ͍ಈతܕ͚ݴޠͩͱࢥͬͯΔ • ͔͠͠ͳ͕Βɺಈతܕ͚ݴޠҰճ͖ͬ͜Γͷܭ ࢉΛ͢ΔͳΒ·ͩ͠ɺԿ࣮ߦ͢Δͷʹద༻ ͢Δ͖͡Όͳ͍ͱࢥ͏ •
Node.jsઃܭաఔʹ͓͍ͯෳͷτϥΠΤϥʔΛ ܁Γฦ͢ඞཁ͕͋Γɺͦͷ࣌ͷΤϥʔͷ༰Θ͔ Γʹ͘͘ɺΤϥʔͷղফ͖ͬΓͯ͠ͳ͍ɻ ͔֬ʹͦ͏͔͠ΕΜ͚Ͳɺ͍·ͦΕ͍͏ʁ
Dynamic Typed Language • ࣮ੲNode.jsΛશ෦TypeScriptʹ͠Α͏ͱ͠ ͨΓɺCoffeeScriptʹ͠Α͏͍ͬͯ͏PR͕ ཱͬͨ͜ͱ͕͋ͬͨɻ • ͪΖΜશ෦ফ͞Ε͖ͯͨɻ
PromiseΛ࠾༻Ͱ͖ͳ͔ͬͨ
Promise • 2009ʹҰ࣮͞Εͨͷͷɺ2010ʹ ؙ͝ͱফͯ͠͠·ͬͨɻ • ࠓͰ۪͔ͳܾஅͩͬͨͱࢥ͍ͬͯ·͢ɻ • async/awaitͷநԽʹඞཁͰͨ͠ɻ
Promise • 2009ʹҰ࣮͞Εͨͷͷɺ2010ʹ ؙ͝ͱফͯ͠͠·ͬͨɻ • ࠓͰ۪͔ͳܾஅͩͬͨͱࢥ͍ͬͯ·͢ɻ • async/awaitͷநԽʹඞཁͰͨ͠ɻ PromiseͷΛ͢Δͱͷલ͕͘ͳΔ
Promise • Ұ masuidrive ͞Μ͕nodeͷඪ४APIΛͯ͢Promiseʹ͠ ͨࣄ͕͋ͬͨɻ • ҰํɺIRCͷதͰɺʮPromise͕ඪ४ʹͳΔ͔ෆ໌ͩ͠ɺ callbackͷ͕simpleͰΑ͘Ͷʁʯ͍ͬͯ͏͕ٞ͋ͬͨɻ •
͔ͯ͘͠ɺPromiseͷίʔυͯ͢ফ͞Εͯ͠·ͬͨɻ • ͜Ε͕ੈʹݴ͏ʮmasuidrive ͷ൵ܶʯͰ͋Δɻ
Security ϞσϧΛצҊ͠ͳ ͔ͬͨ͜ͱ
SecurityϞσϧΛצҊ͠ͳ͔ͬ ͨ͜ͱ • V8ͦΕࣗsecureͳsandboxϞσϧΛදݱ ͍ͯ͠·͢ɻ • ͬͱྑ͍ηΩϡϦςΟʹͰ͖ͨͣɻ • LinterΛಈ͔͚ͩ͢Ͱ networkͷΞΫηε
ϑΝΠϧॻ͖ࠐΈΛ͢Δඞཁͳ͍Ͱ͢ΑͶʁ
SecurityϞσϧΛצҊ͠ͳ͔ͬ ͨ͜ͱ • v8͚ͩͩͱ ϑΝΠϧಡΈࠐΈɺॻ͖ࠐΈͰ͖ ͳ͍͠ɺωοτϫʔΫΞΫηεͰ͖·ͤΜɻ • ඪ४ग़ྗͷconsole.logv8ͷ֎Ͱ͢ɻ • ͜ΕΒΛsandboxͷதͰదٓύʔϛογϣϯΛಘ
ͳ͕Β࣮ߦͰ͖ΕͬͱΑΓྑ͍ηΩϡϦςΟ ϞσϧΛఏڙͰ͖ͨɺͱݴ͍͍ͨͷͰ͠ΐ͏ɻ
GYPΛ࠾༻ͨ͜͠ͱ
GYPΛ࠾༻ͨ͜͠ͱ • GYPେ͖ͳࣦഊͩͬͨ • V8͕GYPΛ࠾༻͍ͯͯ͠ɺnode.jsͦΕʹ҆қʹ ͔ͬͬͯ͠·ͬͨɻ • v8GYP͔ΒgnʹҠΓNode.jsͷgypϢʔβʔऔΓ ͞Εͯ͠·ͬͨɻ •
ࠓͳΒͦ͏͠ͳ͍ɺ FFI Λ࠾༻͢Δɻ
GYPΛ࠾༻ͨ͜͠ͱ • FFI (Foreign Function Interface)ͷ͕ϙʔλϒ ϧͰݺͼ͍͢ҰํͰɺgypͷ͕ߴͩͱ͞Ε ͍ͯͨɻ • ੑೳΛ༏ઌͨ݁͠ՌɺgypΛ࠾༻͕ͨ͠ɺࠓ
gyppython2Ͱ͋ΓɺgypաڈͷҨ ࢈ʹͳͬͯ͠·͍·ͨ͠ɻ
moduleϋϯυϦϯάશൠ
moduleϋϯυϦϯάશൠ • package.jsonपΓɺෆཁͳใ͕ଟ͗͢Δ • require()ͨ࣌͠ʹnode_modulesҎԼʹ͋ΔmainϑΟʔϧυΛউ खʹಡΉͳͲɺfancyͳڍಈ͕ଟ͍ʢnpmʹ͋Δͷͳͷ͔ɺ localͷదͳϑΝΠϧͳͷ͔Θ͔Γʹ͍͘ʣ •
moduleϋϯυϦϯάશൠ
moduleϋϯυϦϯάશൠ • moduleͷղܾΞϧΰϦζϜ͕૬ෳࡶʹͳͬ ͯ͠·ͬͨɻ • ϒϥβͷsemantics͔Β֎Εͯ͠·ͬͨɻ
moduleϋϯυϦϯάશൠ • module ͷղܾΞϧΰϦζϜ node_modules ͷґଘ ؔΛͨͲͬͯґଘղܾΛ͢Δɻ • ·ͨɺ moduleࢦఆݩ͔Βͷ૬ରύεͰϑΝΠϧΛࢦ
ఆ͢Δ͕ɺ $NODE_PATH ڥมʹύε͕ηοτ͞Ε ͍ͯΔͱ͔ͦ͜ΒಡΈࠐΉɻ • ͜ͷଞʹ͍͔ͭ͘ hacky ͳํ๏͕͋Δ͕ɺͲΕඍົ
moduleϋϯυϦϯάશൠ
moduleϋϯυϦϯάશൠ • ".js" ͳ͠ͰಡΈࠐΊΔ • "index.js" লུՄೳ • ͳͲͳͲɺϑΝϯγʔͳػೳ͕ଟ͘ɺ࣮ͦΕ͕ ෳࡶ͞ͱόάͷԹচʹͳΓ͍͢ɻ
• লུͪ͠Ό͏ͱɺϑΥϧμͳͷ͔ϑΝΠϧͳͷ͔ ݟ͚͕͔ͭͳ͍ɻ
ͦ͜Ͱ deno Λ࡞ͬͨ
deno v8 Ͱಈ͘ηΩϡΞͳ TypeScript ࣮ߦڥ
TypeScript
None
None
None
TypeScript • denoTypeScriptΛ࠾༻ͨ͠ • TypeScriptDartͳͲͷͷͱҟͳΓɺ JavaScriptͷεʔύʔηοτͱ͍͏Ґஔ͚ͮ • ڊେͳγεςϜʹରԠͰ͖Δɻ
sandboxηΩϡϦςΟϞσϧ
sandbox ηΩϡϦςΟϞσϧ • denosandboxͰಈ͘ • v8ͷϨΠϠworkerͰJSͷruntime͕ಈ͖ɺϑΝ ΠϧωοτϫʔΫʹΞΫηε͢Δͱ͖͚ͩಛ ݖϞʔυʹͳΔɻ • ಛݖϞʔυͷϓϩηεͱruntimeؒͰ௨৴͢Δࡍ
protocol bufferΛͬͯ௨৴͢Δɻ
sandbox ηΩϡϦςΟϞσϧ • denosandboxͰಈ͘ • v8ͷϨΠϠworkerͰJSͷruntime͕ಈ͖ɺ ϑΝΠϧωοτϫʔΫʹΞΫηε͢Δͱ͖ ͚ͩಛݖϞʔυʹͳΔɻ
sandbox ηΩϡϦςΟϞσϧ • denosandboxͰಈ͘ • v8ͷϨΠϠworkerͰJSͷruntime͕ಈ͖ɺ ϑΝΠϧωοτϫʔΫʹΞΫηε͢Δͱ͖ ͚ͩಛݖϞʔυʹͳΔɻ ͓ɺOS͔Αɻɻɻ
ϞδϡʔϧγεςϜͷγϯϓϧԽ
ϞδϡʔϧγεςϜͷγϯϓϧ Խ • NodeͷطଘϞδϡʔϧͱͷੑٻΊͯ· ͤΜɻ • import૬ରύε͔ઈରύεɺ͘͠URL ͚ͩͰ͔͠ࢦఆͰ͖·ͤΜɻ import {
test } from "https://unpkg.com/
[email protected]
/testing.ts" import { log } from "./util.ts"
ϞδϡʔϧγεςϜͷγϯϓϧ Խ • NodeͷطଘϞδϡʔϧͱͷੑٻΊͯ· ͤΜɻ • import૬ରύε͔ઈରύεɺ͘͠URL ͚ͩͰ͔͠ࢦఆͰ͖·ͤΜɻ import {
test } from "https://unpkg.com/
[email protected]
/testing.ts" import { log } from "./util.ts" ͍͗͞Α͗͢Δɻ
2018Ͱ͋Δ͜ͱΛར༻ͨ͠ Ϟσϧ • Ωϟον͞Εͳ͍ྫ֎͕ى͖ͨΒଈ࠲ʹఀࢭ͢Δ • top-level await Λαϙʔτ͢Δ • ػೳతʹॏͳΔ߹ϒϥβͱͷޓΛ༏ઌ͢
Δ • ॳGoͰ࡞͍͕ͬͯͨɺࠓRustͱC++ʹͳͬ ͍ͯΔɻ
2018Ͱ͋Δ͜ͱΛར༻ͨ͠ Ϟσϧ • Ωϟον͞Εͳ͍ྫ֎͕ى͖ͨΒଈ࠲ʹఀࢭ͢Δ • top-level await Λαϙʔτ͢Δ • ػೳతʹॏͳΔ߹ϒϥβͱͷޓΛ༏ઌ͢
Δ • ॳGoͰ࡞͍͕ͬͯͨɺࠓRustͱC++ʹͳͬ ͍ͯΔɻ ͪͳΈʹಈ͔ͯ͠Կى͖·ͤΜͰͨ͠ɻ
ײ
ײ • ·ͩ·ͩϓϩτλΠϓʢͱ͍͏ΑΓϋϩʔϫʔϧυϨϕϧʣ • Node.jsͰࢀߟʹͳΔͱ͜Ζଟͦ͏ • Node.jsʹ͓͚Δ module ͱ package
ͷ͜ͱͰ͋ΓɺσΟϨΫτϦ Λࢦͯ͠Δɻ • ҰํͰ ES Modules deno ʹ͓͚Δ module ͱ͍͏ͷϑΝΠϧͷ ࣄͰ͋Γɺ࠷ݶͷ୯Ґ͔࣋ͨ͠ͳ͍ɻ • Կ͕Ұମਖ਼ղͩͬͨͷ͔·ͩΘ͔Βͳ͍ɻ໘നͦ͏ͳ͓ͪΌ͕ग़ ͖ͯͨͷͰ৮Δͷ͓͢͢Ίɻ