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
140
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
10
4.2k
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
1
4.2k
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
260
Removing Corepack
yosuke_furukawa
PRO
9
1.7k
JavaScript Runtime とはなにか
yosuke_furukawa
PRO
15
2.8k
Strip Types と Storage
yosuke_furukawa
PRO
4
420
Module Harmony について
yosuke_furukawa
PRO
3
1.7k
LTのやり方
yosuke_furukawa
PRO
16
2.7k
Other Decks in Programming
See All in Programming
概念モデル→論理モデルで気をつけていること
sunnyone
3
290
rage against annotate_predecessor
junk0612
0
170
アルテニア コンサル/ITエンジニア向け 採用ピッチ資料
altenir
0
110
AIと私たちの学習の変化を考える - Claude Codeの学習モードを例に
azukiazusa1
10
4.4k
テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成
makun
0
500
請來的 AI Agent 同事們在寫程式時,怎麼用 pytest 去除各種幻想與盲點
keitheis
0
120
testingを眺める
matumoto
1
140
Kiroで始めるAI-DLC
kaonash
2
620
ぬるぬる動かせ! Riveでアニメーション実装🐾
kno3a87
1
230
時間軸から考えるTerraformを使う理由と留意点
fufuhu
16
4.8k
The Past, Present, and Future of Enterprise Java with ASF in the Middle
ivargrimstad
0
160
Reading Rails 1.0 Source Code
okuramasafumi
0
250
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
Code Reviewing Like a Champion
maltzj
525
40k
How GitHub (no longer) Works
holman
315
140k
A designer walks into a library…
pauljervisheath
207
24k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
The Invisible Side of Design
smashingmag
301
51k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Building Adaptive Systems
keathley
43
2.7k
The Pragmatic Product Professional
lauravandoore
36
6.9k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.1k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
How to train your dragon (web standard)
notwaldorf
96
6.2k
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 ͱ͍͏ͷϑΝΠϧͷ ࣄͰ͋Γɺ࠷ݶͷ୯Ґ͔࣋ͨ͠ͳ͍ɻ • Կ͕Ұମਖ਼ղͩͬͨͷ͔·ͩΘ͔Βͳ͍ɻ໘നͦ͏ͳ͓ͪΌ͕ग़ ͖ͯͨͷͰ৮Δͷ͓͢͢Ίɻ