春からはじめる新しいNode.js / start new Node.js in spring
by
Masashi Hirano
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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ͷ༷ • ҰൠతʹEcmaScriptECMA-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 • LTSCurrentظؒऴྃޙͷϝϯςφϯεظؒ • LTS12ϲ݄ؒαϙʔτ • όάɺ੬ऑੑɺυΩϡϝϯτͳͲ͕ϝϯς͞ ΕΔ
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 + ""; 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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠