TechFeed Summit#6 - v16リリース記念!Node.jsの最新動向を語り尽くす! - connpass https://techfeed.connpass.com/event/213218/
Node.js + Web CompatibilityNode.js v16ͰՃ͞Εͨ Web APIɺWebͱͷޓੑʹ͍ͭͯ TechFeed Summit #6@shisama_
View Slide
ฏ ণ࢜ / Masashi Hirano@shisama_shisamaNode.js Core Collaborator
Agenda• Node.js v16Ͱ͑ΔWeb APIͷհ• Webඪ४ϒϥβޓʹର͢ΔNode.jsͷऔΓΈ
Webϒϥβͱͷޓੑॏཁhttps://github.com/nodejs/node/blob/master/doc/guides/technical-values.mdtechnical-values.md͔Βൈਮ
Node.js v14 -> v16 Web APIͷҰྫ• Web Crypto API: Ճ• AbortController: ҆ఆ൛• EventTarget & Event: ҆ఆ൛• Blob: Ճ• BroadcastChannel: Ճ&YQFSJNFOUBM&YQFSJNFOUBMʢશ෦v15͔Β͑Δ͚Ͳ…v156݄ͰEOLʣ…etc&YQFSJNFOUBM
Web Crypto API• ҉߸Խ෮߸ɺॺ໊ͷݕূͳͲͷ҉߸ॲཧΛߦ͏API• Node.jsʹੲ͔ΒCrypto API͋Δ͕ϒϥβͱͷޓੑͳ͍• Promiseϕʔε• Node.jsͷCrypto APIίʔϧόοΫϕʔε
AbortController & AbortSignal• DOMϦΫΤετΛதஅͰ͖Δ• Promise• Event• ReadableStream• Web Locks API• Ճ͑ͯNode.jsͰඇಉظͳॲཧͷதஅʹར༻Մೳhttps://dom.spec.whatwg.org/#interface-abortcontrollerconst controller = new AbortController();const signal = controller.signal;abortButton.addEventListener('click', function() {controller.abort();});try {await fetch('https://site.example', { signal });} catch(err) {console.error(err.name);}
AbortControllerʹରԠ͢ΔNode.js Core API• Child Process• Events• File System• HTTP• HTTP/2• Net• Readline• Stream• Timers• UDP/datagram socketsconst controller = new AbortController();const { signal } = controller;const promise = fs.readFile(fileName, { signal });setTimeout(() => {controller.abort();}, 10000);await promise;import {setTimeout,} from 'timers/promises';const ac = new AbortController();const signal = ac.signal;await setTimeout(10000, 'timeout', {signal});ac.abort();
EventTarget• ΠϕϯτॲཧΛ͢ΔͨΊͷΠϯλϑΣʔε• addEventListenerΛඋ͍͑ͯΔ• Node.js ʹੲ͔ΒEventEmitter͋Δ͕ɺϒϥβͱͷޓੑͳ͍https://dom.spec.whatwg.org/#interface-eventtargetconst target = new EventTarget();target.addEventListener("foo", (event) => {console.log("foo is called");});target.dispatchEvent(new Event("foo"));
EventTarget + AbortController• AbortControllerͰEventTargetʹొͨ͠ΠϕϯτϦεφʔΛআͰ͖Δconst ac = new AbortController();const { signal } = ac;et.addEventListener(‘click', handler, { signal });// ΠϕϯτϦεφʔͷআɻremoveEventListenerෆཁcontroller.abort();et.addEventListener('event1', handler, { signal });et.addEventListener(‘event2', handler, { signal });// ҰׅআͰ͖Δcontroller.abort();
Node.js͔ΒWebͷ༷ఏҊ• AbortControllerΛͬͨΠϕϯτϦεφʔͷআݩʑWebͷ༷ʹͳ͍ͷ• Node.js͔ΒWebඪ४ʹఏҊ → ༷ೖΓ• Chrome, FirefoxͰ࣮ࡁ• WebͱNode.js͕૬ޓʹྑͯ͘͠ ͍͍ͬͯΔhttps://github.com/whatwg/dom/issues/911
Ͳ͏ͬͯNode.jsWebͱͷޓੑΛҡ͍࣋ͯ͠Δ͔ʁ• Node.jsͷRespositoryͰWeb Platform Tests (WPT)͕࣮ߦͰ͖ΔΑ͏ʹͳ͍ͬͯΔhttps://github.com/nodejs/node/tree/master/test/wpt
Webඪ४ͰՃ৻ॏ• എܠΛΒͳ͍։ൃऀ͕ࠞཚ͢Δ͔͠Εͳ͍ͨΊΫϩʔζhttps://github.com/nodejs/node/pull/37971
ϒϥβޓͰՃ৻ॏ• UIʹؔ࿈͢ΔػೳNode.jsͷείʔϓ֎ͱ͍͏ҙݟ͋Δhttps://github.com/nodejs/node/pull/38552#pullrequestreview-652840752
Node.jsʹ࣮͢Δ͔ٞதͷWeb API• Fetch API https://github.com/nodejs/node/issues/19393• WHATWG Stream Full Support https://github.com/nodejs/node/issues/36566• HTTPS Imports https://github.com/nodejs/node/pull/36328• Web Locks API https://github.com/nodejs/node/pull/36502• MIME Type https://github.com/nodejs/node/pull/21128
·ͱΊ• WebͱͷޓੑNode.jsʹͱͬͯॏཁ• Node.js v16ʹWeb API͕Ճ͞Ε͍ͯΔ• ࠓޙWebͷ༷มߋՃʹରͯ͠Node.jsਵ͢ΔWebͷͱͱʹNode.js͢Δ
Thanks