Slide 1

Slide 1 text

य़͔Β͸͡ΊΔ ৽͍͠Node.js ؔ੢NodeֶԂ #1 ฏ໺ ণ࢜ / @shisama

Slide 2

Slide 2 text

{ "about": { "name": "Masashi Hirano", "works": "Weblio, Inc.", "twitter": "@shisama_", "github": "shisama" } }

Slide 3

Slide 3 text

Agenda • ݱࡏͷNode.jsΛ෮श • ৽͍͠Node.jsΛ༧श • ৽͍͠Node.jsΛ࣮श

Slide 4

Slide 4 text

ର৅ͱ͢Δਓ • Node.jsΛ࢖ͬͨ͜ͱ͋Δਓ • Node.js΍ͬͯΔ͚Ͳɺ࠷৽৘ใΛ஌Γ͍ͨਓ • ݹ͍όʔδϣϯͷNode.js࢖ͬͯΔਓ

Slide 5

Slide 5 text

ࠓ೔࿩͞ͳ͍͜ͱ • Node.jsͱ͸ • ϑϩϯτΤϯυ(jQuery,React,Angular,Vue…) • ػೳ΍࢓༷ͷ͢΂ͯʢ࣌ؒత੍໿ʣ

Slide 6

Slide 6 text

Goal • Node.jsͷ࠷৽৘ใΛ஌Δ • ݹ͍؀ڥΛΞοϓσʔτ͢Δ • ৽͍͠Node.jsͷػೳΛ࢖ͬͯΈΔ

Slide 7

Slide 7 text

·ͣࠓճ࿩͢಺༰ʹؔ܎͢Δ ༻ޠΛͬ͘͟Γ෮श

Slide 8

Slide 8 text

V8 engine • Google͕։ൃ͢ΔJavaScriptΤϯδϯ • ChromeͱNode.jsͰ࢖ΘΕ͍ͯΔ • ࣮ߦ଎౓͕଎͍

Slide 9

Slide 9 text

npm • Node Package Manager • ϥΠϒϥϦ؅ཧ • λεΫ࣮ߦ

Slide 10

Slide 10 text

V8ɺnpmͷόʔδϣϯ৘ใ https://nodejs.org/en/download/releases/

Slide 11

Slide 11 text

EcmaScript • JavaScriptͷ࢓༷ • ҰൠతʹEcmaScript͸ECMA-262Λࢦ͢ • TC39ͱ͍͏ҕһձ͕࢓༷ࡦఆΛ͍ͯ͠Δ • Living Standard • ৗʹ࢓༷͕Ξοϓσʔτ͞ΕΔ

Slide 12

Slide 12 text

EcmaScript • 2ϲ݄ʹ1ճϛʔςΟϯά͕ߦΘΕ͍ͯΔ • ֤ػೳͷεςʔδߋ৽ͳͲ͕ٞ࿦͞ΕΔ • stage-4ʹͳͬͨ΋ͷ͕1೥ʹ1ճEcmaScript ͷ࢓༷ͱͯ͠ϦϦʔε͞ΕΔ(ES201X)

Slide 13

Slide 13 text

EcmaScript • ࢓༷ࡦఆ·Ͱʹstage0ʙstage4·Ͱͷஈ֊͕ଘࡏ͢Δ • 0 Strawman - ΞΠσΞ • 1 Proposal - ఏҊ • 2 Draft - υϥϑτ • 3 Candidate- ࢓༷ॻͱಉ͡ܗࣜ • 4 Finished - ࡦఆ׬ྃ

Slide 14

Slide 14 text

EcmaScript https://azu.github.io/slide-what-is-ecmascript/slide/ B[V͞Μͷʰ&$."4DSJQUͱ͸Կ͔ʁʱ͕ Θ͔Γ΍͍͢ͷͰಡΜͰΈͯ΄͍͠

Slide 15

Slide 15 text

&DNB4DSJQUͷ࠷৽৘ใ͸5$ͷ ϦϙδτϦʹ͋Γ·͢ʂ

Slide 16

Slide 16 text

ݱࡏͷNode.jsΛ෮श

Slide 17

Slide 17 text

Release Schedule • github.com/nodejs/Releaseʹࡌ͍ͬͯΔ • ൒೥ʹҰճϝδϟʔϦϦʔε͕ߦΘΕΔ

Slide 18

Slide 18 text

https://github.com/nodejs/Release

Slide 19

Slide 19 text

https://github.com/nodejs/Release

Slide 20

Slide 20 text

Active • LTS (Long Term Support) • 18ϲ݄ؒαϙʔτ͕ߦΘΕΔ • ຖ೥10݄͔ΒLTS ActiveʹͳΔ • όʔδϣϯ൪߸͕ۮ਺

Slide 21

Slide 21 text

https://github.com/nodejs/Release

Slide 22

Slide 22 text

Current • ࠷৽ͷϦϦʔε൛ • ϝδϟʔόʔδϣϯ͕ح਺ˠ10݄ʹϦϦʔε • ϝδϟʔόʔδϣϯ͕ۮ਺ˠ4݄ʹϦϦʔε

Slide 23

Slide 23 text

https://github.com/nodejs/Release

Slide 24

Slide 24 text

Maintenance • LTS΍Currentظؒऴྃޙͷϝϯςφϯεظؒ • LTS͸12ϲ݄ؒαϙʔτ • όάɺ੬ऑੑɺυΩϡϝϯτͳͲ͕ϝϯς͞ ΕΔ

Slide 25

Slide 25 text

https://github.com/nodejs/Release ݱࡏαϙʔτதͷόʔδϣϯ͸ʁ

Slide 26

Slide 26 text

Node 4.x • V8Τϯδϯ͸4.5 • ES2015ͷػೳͷଟ͕͘࢖͑ΔΑ͏ʹ • 2018/04/30ʹϝϯςφϯεऴྃ༧ఆ • αϙʔτࢭ·ΔͷͰΞοϓσʔτඞਢ

Slide 27

Slide 27 text

Node 6.x • V8Τϯδϯ͸5.1 • Proxy΍σϑΥϧτҾ਺͕࢖͑ΔΑ͏ʹ • 2018/04/30͔ΒLTSͰ͸ͳ͘ͳΔ༧ఆ • ϝϯςφϯε͞ΕΔ͚Ͳདྷ೥4݄ʹ͸αϙʔτ ऴྃ༧ఆ

Slide 28

Slide 28 text

Node 8.x • ݱࡏͷLTS • V8Τϯδϯ͸6.1 • async / awaitΛαϙʔτ͢Δ࠷ॳͷLTS • util.promisify, inspectorͳͲ͕௥Ճ͞Εͨ

Slide 29

Slide 29 text

Node 8.x • npm@5 • package-lock.json • 8.5͔Β͸ϑϥά෇͖ͰES Modules࢖͑Δ • import / export syntax • AWS LambdaͰ΋࠷ۙΑ͏΍͘v8͕࢖͑ΔΑ͏ʹ

Slide 30

Slide 30 text

Node 8.x • 2019/04͔ΒLTSͰ͸ͳ͘ͳΔ • 2019/12ʹ͸ϝϯςφϯεऴྃ • ࠓ࢖͏ͳΒ͜ͷόʔδϣϯ͕ແ೉

Slide 31

Slide 31 text

Node 9.x • ݱࡏͷCurrent • V8Τϯδϯ͸6.2 • HTTP2͕ϑϥάͳ͠Ͱ࢖͑Δ • 2018/06/30Ͱϝϯςφϯεऴྃ༧ఆ

Slide 32

Slide 32 text

͜͜·Ͱͷ͓͞Β͍ • 4.x࢖ͬͯΔਓ͸ࠓ݄தʹΞοϓσʔτ • 6.x࢖ͬͯΔਓ͸̍೥Ҏ಺ʹΞοϓσʔτ • 8.x࢖ͬͯΔਓ͸·ͩ̍೥Ҏ্େৎ෉ • 9.x࢖ͬͯΔਓ͸݄̒຤·ͰʹΞοϓσʔτ

Slide 33

Slide 33 text

͜͜·Ͱͷ͓͞Β͍ • 4.x࢖ͬͯΔਓ͸ࠓ݄தʹΞοϓσʔτ • 6.x࢖ͬͯΔਓ͸̍೥Ҏ಺ʹΞοϓσʔτ • 8.x࢖ͬͯΔਓ͸·ͩ̍೥Ҏ্େৎ෉ • 9.x࢖ͬͯΔਓ͸݄̒຤·ͰʹΞοϓσʔτ ࠓ͕Ξοϓσʔτ͢Δͱ͖Ͱ͢Αʂʂ

Slide 34

Slide 34 text

৽͍͠Node.jsΛ༧श

Slide 35

Slide 35 text

https://github.com/nodejs/Release

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

Node.js 10.0 • 2018/04/24ʹϦϦʔε༧ఆ • ࣍ͷLTS • V8Τϯδϯ͸6.6 • npm@6(ϦϦʔε࣌ʹೖΔ͔ະఆ)

Slide 38

Slide 38 text

V8 Engine • ݱࡏͷmasterʹೖͬͯΔͷ͸6.6 • 6.7ʹͯ͠΄͍͠ཁ๬΋͋Δ

Slide 39

Slide 39 text

WWFSTJPOIʹఆٛ͞Ε͍ͯΔ https://github.com/nodejs/node/blob/master/deps/ v8/include/v8-version.h ࠷৽ͷNode.jsͷV8͸ʁ

Slide 40

Slide 40 text

V8 engine • Node 9.x(V8 6.2) => Node 10.0(V8 6.6) • EcmaScript৽ػೳͷ௥Ճ(ޙड़) • ࣮ߦ଎౓ͷվળ • asyncͷύϑΥʔϚϯεվળ

Slide 41

Slide 41 text

https://github.com/nodejs/node/pull/19091 V8 6.7 7͸ʹTUBCMFʹͳΔ͚Ͳɺ ͦΕͰ͸஗͗͢Δ /PEF͸݄ޙ൒ʹϦϦʔε͍ͨ͠

Slide 42

Slide 42 text

V8 6.7 • Chrome 67 • BigInt(64bit੔਺ܕ)ͳͲEcmaScript৽ػೳͷ ௥Ճ • Node v10Ͱ΋ϑϥά෇͖Ͱ࢖͑Δ΋ͷ΋͋ Δ

Slide 43

Slide 43 text

npm@6 https://github.com/npm/npm/releases/tag/v6.0.0-next.0 มߋ͸খ͞Ίɻ/PEF͕ϦϦʔε͞Ε Δ·Ͱখ͍͞มߋ͔͠͠ͳ͍༧ఆ

Slide 44

Slide 44 text

npm@6 https://github.com/npm/npm/releases/tag/v6.0.0-next.0 ࠓ೥ޙ൒ʹେ͖ͳมߋΛೖΕΔ ༧ఆɻOQN!ʹ஫໨ʂ

Slide 45

Slide 45 text

npm@6 • Node 10.0ʹ޲͚ͯখ͞ͳมߋ͸͋Δ • Node 4.xͱNode 7.xͷαϙʔτऴྃ • npm ci && npm tͳnpm cit͕௥Ճ • npm install͢Δͱ͖ʹdeprecateͷόʔδϣϯ ΛճආͳͲ

Slide 46

Slide 46 text

deprecateͷόʔδϣϯΛճආ $ npm install example@~1.1.0 // 1.1.2 // 1.1.3 (deprecated) // 1.2.0 (latest) ͕Yͷ࠷৽͕ͩɺEFQSFDBUFʹͳͬ ͍ͯΔͨΊΠϯετʔϧ͞Εͳ͍

Slide 47

Slide 47 text

EcmaScript৽ػೳ • ଟ͘ͷػೳ͕௥Ճ͞Εͨ • ES Modules͸·ͩϑϥά෇͚ͳ͍ͱ࢖͑ͳ͍

Slide 48

Slide 48 text

Node.js v10ʹ௥Ճ͞ΕΔ EcmaScript৽ػೳ • Dynamic import • Async Iteration • Promise.prototype.finally • RegExp New Features • Intl.NumberFormat.formatToParts • Function.prototype.toString() • Optional catch binding • String.prototype.trimStart • String.prototype.trimEnd

Slide 49

Slide 49 text

Dynamic Import (async() => { let count = 0; let id = setInterval(async() => { const i = Math.floor(Math.random() * 3) + 1; const module = await import(`./hello${i}.mjs`); module.hello(); count++; if (count === 10) { clearInterval(id); } }, 1000); })(); ಈతʹϞδϡʔϧΛJNQPSUՄ ೳʹ

Slide 50

Slide 50 text

Async Iteration async function* gen() { while (true) { const res = await axios.get(‘https:// hogehoge.com'); const data = await res.data; yield data; } } (async() => { for await (const data of gen()) { console.log(data); } })(); 1SPNJTFͳ഑ྻΛGPSBXBJU PGͰඇಉظϧʔϓ͕Մೳʹ

Slide 51

Slide 51 text

Promise.prototype.finally Promise.resolve(“then”) .then(val => { console.log(val); throw new Error(“catch") }).catch(err => { console.log(err.message) }).finally(() => { console.log(“finally") }); pOBMMZ ͕௥Ճ

Slide 52

Slide 52 text

RegExp New Features const result = '123$456 $789 $ 000'.match(/(?<=\ $)\d+/g); console.log(result); // ['456', '789'] ਖ਼نදݱͷޙಡΈ͕Մೳɻ ଞʹ΋ υοτ ͕վߦจࣈʹϚον͢ ΔΑ͏ʹͳΔTϑϥάͳͲ

Slide 53

Slide 53 text

Intl.NumberFormat.formatTo Parts const num = 1000; const formatter = new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }); const yen = formatter.formatToParts(num).map(({type, value}) => { switch (type) { case 'currency': return "" + value + " strong>"; default: return value; } }).reduce((string, part) => {return string + part}); console.log(yen); // => "¥1,000" ਺஋ͷΧελϜϑΥʔϚοτ ͕Մೳʹ

Slide 54

Slide 54 text

Function.prototype.toString function /* a comment */ foo () {} foo.toString(); // → 'function /* comment */ foo () {}' UP4USJOH ͷ࢓༷มߋ

Slide 55

Slide 55 text

Optional catch binding try { const a = 1; a = 2; } catch { console.error("catch"); } DBUDIͷҾ਺ͳ͠Ͱ΋Մೳʹ

Slide 56

Slide 56 text

String.prototype.trim{Start|End} const value = " has spaces "; console.log(`‘${value}'`); // => ‘ has spaces ‘ console.log(`‘${value.trimStart()}'`); // => ‘has spaces ‘ console.log(`trimEnd: '${value.trimEnd()}'`); // => ‘ has spaces‘ จࣈྻͷલޙͷεϖʔεΛআ ڈ

Slide 57

Slide 57 text

http://node.green/ OPEFHSFFOͱ͍͏αΠτʹ /PEFKTͷόʔδϣϯ͝ͱʹ &4ͷͲͷػೳ͕࢖͑Δ͔ࡌ͍ͬͯΔ

Slide 58

Slide 58 text

ͦͷଞؾʹͳΔ௥Ճػೳ • fs͕PromiseϕʔεͰಈ͔ͤΔΑ͏ʹͳͬͨ • const data = await fs.readFile(‘./ something’, ‘utf-8’); • util.types.isPromiseͱ͔isDateͰܕ൑ఆ ͳͲ

Slide 59

Slide 59 text

Wʹ͍ͭͯ΋ͬͱৄ͍͠࿩Λฉ ͖͍ͨਓ͸དྷि౦ژ΁ʂ

Slide 60

Slide 60 text

৽͍͠Node.jsΛ࣮श

Slide 61

Slide 61 text

࠷৽ͷNode.jsΛ࢖͏

Slide 62

Slide 62 text

https://github.com/nodejs/Release

Slide 63

Slide 63 text

master • ࠷৽ͷιʔείʔυ • ຖ೔େྔʹίϛοτ͞Ε͍ͯΔ • ࠓϏϧυ͢ΔͱNode 10.0.0-preʹͳΔ

Slide 64

Slide 64 text

Node.jsΛϏϧυ https://github.com/nodejs/node/blob/master/BUILDING.md #6*-%*/(NEΛݟΕ͹֤04޲͚ͷखॱ͕ॻ ͔Ε͍ͯΔɻ Ϗϧυ࣌ؒ΋ͦΜͳʹ͔͔Βͳ͍

Slide 65

Slide 65 text

Node.jsΛϏϧυ $ ./configure $ make -j4 Ϗϧυதɾɾɾ $ ./node -v > v10.0.0-pre ͜Ε͚ͩ

Slide 66

Slide 66 text

Ϗϧυͨ͠Node.jsΛ࢖͏ • ৽ػೳΛࢼͯ͠ΈΔ ➡ ࠓ೔঺հͨ͠ES৽ػೳ͸ಈ͘ʂʂ • Nodeຊମͷ࣮૷Λมߋͯ͠ಈ͔ͯ͠ΈΔ

Slide 67

Slide 67 text

͞Βʹ৽͍͠ػೳΛࢼ͢ • Node.jsʹ͸࣮ݧతʹ࣮૷͞Ε͍ͯΔػೳ͕͋ Δ • ϑϥάΛ͚ͭΔ͜ͱͰ࢖͑Δ • ES Modules΋·࣮ͩݧతͳػೳ

Slide 68

Slide 68 text

ES Modules $ node —experimental-modules index.mjs ŠFYQFSJNFOUBMNPEVMFTϑϥάΛ࢖͏ɻ ֦ுࢠ͸NKT

Slide 69

Slide 69 text

harmony • --harmonyϑϥάΛ࢖͑͹࣮ݧతͳػೳ͕࢖͑ ΔΑ͏ʹͳΔ • Node.jsʹ࣮૷͞Ε͍ͯΔEcmaScriptͷػೳʹ Αͬͯϑϥά͸มΘΔ • EcmaScriptͷػೳ͸̏ͭʹ෼͚ΒΕΔ

Slide 70

Slide 70 text

EcmaScriptͷػೳ • shipping: ϦϦʔεࡁ • ϑϥάͳ͠Ͱ࣮ߦՄೳ • staged: ΄΅׬੒͕ͩɺ҆ఆ͍ͯ͠ΔͱΈͳ͞Εͳ͍ • --harmonyϑϥάͰ࣮ߦՄೳ • in progress: ։ൃத • --harmony-class-fieldsͷΑ͏ʹݸʑʹ༻ҙ͞Εͨ harmonyϑϥά

Slide 71

Slide 71 text

harmony ֬ೝํ๏ $ node —v8-options | grep harmony --es_staging (enable test-worthyɾɾɾ --harmony (enable all completedɾɾɾ --harmony_shipping (enable allɾɾɾ --harmony_array_prototype_values (ɾɾ --harmony_function_sent (enableɾɾɾ ͲΜͳIBSNPOZϑϥά͕͋Δ͔͸ŠW PQUJPOTΛ࣮ߦ͢Ε͹֬ೝͰ͖Δ

Slide 72

Slide 72 text

harmony ྫ $ node —harmony-bigint > typeof 123n ‘bigint’ > 123n + 1n 124n ŠIBSNPOZϑϥάΛ͚ͭΔ͜ͱͰ#JH*OU΋ ࢖͑Δ /PEFW

Slide 73

Slide 73 text

Node.jsʹ࣮૷͞Ε͍ͯͳ͍ػೳΛ࢖͏ • BabelͰτϥϯεύΠϧ • EcmaScriptશػೳΛΧόʔ͍ͯ͠ΔΘ͚Ͱ͸ͳ ͍ • Node.jsͱޓ׵ੑ͕ͳ͍SyntaxͰ΋ಈ͘ͷͰ஫ҙ • import {readFile} from ‘fs’; ͜ΕNode.jsͰ͸ ErrorʹͳΓ·͢

Slide 74

Slide 74 text

Ξ΢τϓοτ͢Δ • ৽͍ٕ͠ज़ʹ৮ΕͨΒ͔ͤͬ͘ͳͷͰ஌ݟΛ ڞ༗ͯ͠΄͍͠ʂ • ϒϩά • Qiita • ษڧձ

Slide 75

Slide 75 text

ؔ੢NodeֶԂ͸ ͍ͭͰ΋͋ͳͨͷొஃΛ ͓଴͍ͪͯ͠·͢ʂ

Slide 76

Slide 76 text

·ͱΊ • Node.jsͷαϙʔτظؒΛҙࣝ͠Α͏ʂ • Node.js v10 ͸དྷिϦϦʔεʂ(༧ఆ) • ٕज़͸஌Δ͚ͩͰͳ͘ɺ࢖ͬͯͳΜ΅Ͱ͢ʂ • ొஃͯ͘͠ΕΔํ͓଴͍ͪͯ͠·͢ʂʂ

Slide 77

Slide 77 text

Special Thanks! ओ࠵ऀϝϯόʔ (@sbntaminif, @vanx2, @mdaisuke, @kamiyam,@leichtgewicht), ͘͞ΒΠϯλʔωοτ ༷, εϐʔΧʔͷํʑ(@mochiya98, @sota1235, @h_michael_z) and ࠓ೔དྷͯ͘Εͨօ༷!! 1ճ໨։࠵Ͱ͖ͯخ͍͠Ͱ͢ʂ͜Ε͔Β΋ؔ੢Node ֶԂΛ຤Ӭ͘ΑΖ͓͘͠ئ͍͍ͨ͠·͢

Slide 78

Slide 78 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠