Gotanda.js #11 in MobileFactory ( https://gotandajs.connpass.com/event/127779/ ) での発表資料です。
Node.jsͰͷrecursive readdirΛߟ͑Δ͋Β @arayaryomaGotanda.js #11 in Mobile Factory
View Slide
ࣗݾհ͋Β / Ѩ෦ ྇ຏ@arayaryoma@arayaryomahttps://araya.devגࣜձࣾϔϚλΠτ / ෭ۀϑϦʔϥϯεJavaScript/TypeScript/Go/KotlinAngular/React/ReactNative/Next.js/Nest.js
͔͜͜Βࠇํ໘ʹ10͘Β͍า͍ͨͱ͜ΖʹΦϑΟε͕͋ΔձࣾͰಇ͍͍ͯ·͢ޒాͷ͖ͳ͓ళϗοτεϓʔϯͰ͢
ୡ͍ͨ͜͠ͱ͜ͷΑ͏ͳσΟϨΫτϦͰfilesΑΓԼʹ͋ΔશͯͷϑΝΠϧͷϦετΛऔಘ͍ͨ͠
·ͣߟ͑Δ͜ͱfs.readdirʹΦϓγϣϯΛ͢ͱɺ͔͍͍ͯ͠͠ײ͡ʹऔΕΔͷͰͳ͍͔
·ͣߟ͑Δ͜ͱવͦΜͳநతͳͷͳ͍
ੈͷதʹస͕͍ͬͯΔղܾࡦ• https://github.com/jergason/recursive-readdir• https://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search• https://gist.github.com/kethinov/6658166 ͳͲ…GoogleͰʮnode.js recursive readdirʯͱݕࡧ͢Δͱɺ͍͔ͭ͘ղܾࡦϥΠϒϥϦ͕ݟ͔ͭΔ
ੈͷதʹస͕͍ͬͯΔղܾࡦ͜ΕΒͷ࣮ྫͰɺ͓͓·͔ʹ1. fs.readdirͰσΟϨΫτϦԼͷϑΝΠϧͷϦετΛऔಘ͢Δ2. 1ͷ݁ՌΛϧʔϓΠςϨʔλͰճ͠ɺ֤ϑΝΠϧͷύεΛfs.statؔʹ͠ɺfs.StatsΦϒδΣΫτΛಘΔ3. fs.StatsΦϒδΣΫτʹisDirectory()ϝιου͕͋Γɺ͜ΕͰରͷϑΝΠϧ͕σΟϨΫτϦ͔Ͳ͏͔ఆ͢Δ4. 3ͷ݁ՌɺσΟϨΫτϦͩͬͨ߹ͦͷσΟϨΫτϦʹ͍ͭͯɺ1~3Λߦ͏ 3ͷ݁ՌɺϑΝΠϧͩͬͨ߹ྻfilesʹՃ͢Δ5. ϧʔϓ͕ऴΘͬͨΒྻfilesΛฦ͢ͱ͍͏ํ๏͕ͱΒΕ͍ͯΔɻ
ੈͷதʹస͕͍ͬͯΔղܾࡦΤϥʔϋϯυϦϯάແࢹͨ͠࠷খݶͷ࣮ྫಡΈ͢͞ͷͨΊʹಉظ࣮ߦ͞ΕΔؔΛ༻
ੈͷதʹస͕͍ͬͯΔղܾࡦݱࡏͷσΟϨΫτϦԼͷϑΝΠϧҰཡΛऔಘ
ੈͷதʹస͕͍ͬͯΔղܾࡦfs.statSync()Ͱfs.StatsΦϒδΣΫτΛऔಘ͠ɺσΟϨΫτϦ͔Ͳ͏͔ఆɻϑΝΠϧͩͬͨ߹ϑΝΠϧϦετʹՃɻ
ੈͷதʹస͕͍ͬͯΔղܾࡦࢠσΟϨΫτϦͷϦετΛϧʔϓͰճ͠ɺ֤ࢠσΟϨΫτϦʹରͯؔ͠Λ࠶ؼݺͼग़͢͠Δɻ
ੈͷதʹస͕͍ͬͯΔղܾࡦϑΝΠϧͷϦετΛฦ͢
ੈͷதʹస͕͍ͬͯΔղܾࡦ࣮ߦ݁Ռ
Node.js v10.10Ҏ߱Ͱfs.statΛΘͣʹॻ͚Δfs.readdir()ʹ{withFileTypes: true}Λ͢ͱɺfilesfs.DirentΦϒδΣΫτͷྻʹͳΔ
Node.js v10.10Ҏ߱Ͱfs.statΛΘͣʹॻ͚Δfs.DirentΦϒδΣΫτʹisDirectory()isFile()ͳͲͷϝιου͕࣮͞Ε͍ͯΔϑΝΠϧ໊.nameͰऔಘͰ͖Δ-> ϑΝΠϧγεςϜίʔϧΛ1σΟϨΫτϦʹ͖ͭ1Ͱࡁ·͢͜ͱ͕Ͱ͖Δhttps://github.com/nodejs/node/pull/22020
fs.Dirent ΦϒδΣΫτΛ࣮ͬͨྫ
fs.Dirent ΦϒδΣΫτΛ࣮ͬͨྫ{withFileTypes: true}Λࢦఆͯ͠fs.DirentΦϒδΣΫτΛಘΔdirent.isDirectoryͰσΟϨΫτϦ͔Ͳ͏͔ఆ1֊ʹ͖ͭ1ͷϑΝΠϧγεςϜίʔϧ
ඇಉظʹ͢Δfs.readdir()ʹίʔϧόοΫؔΛͯ݁͠ՌΛॲཧ͍͍͕ͯ͠ɺNode.js v10 ͰɺExperimental͕ͩfs Promises API͕ఏڙ͞Ε͍ͯΔ(v12Ͱstable)
fs Promises API
fs Promises APIΛͬͯॻ͖͢
·ͱΊ•ϥΠϒϥϦΛΘͳͯ͘ɺͦ͜·Ͱଟ͘ͳ͍هड़ྔͰrecursive readdir࣮ݱͰ͖Δɻ•Node.js v10.10Ҏ͕߱͑Δ߹fs.DirentΦϒδΣΫτΛ׆༻ͯ͠ ϑΝΠϧγεςϜίʔϧͷճΛݮΒ͢͜ͱ͕Ͱ͖Δɻ•fs Promises APIΛ༻͍Δ͜ͱͰɺϑΝΠϧγεςϜૢ࡞͕PromiseϕʔεͰॻ͚Δɻ•Node.jsminor version updateͰศརͳAPI͕Ճ͞ΕΔ͜ͱ͕͋ΔͨΊɺ LTSͷ࠷৽Λ͍ଓ͚Δબࢶ͕औΕΔͱྑ͍ɻ
ิ: direntͱ͍͏֓೦ʹ͍ͭͯdirentLinux Programmingʹ͓͍ͯɺϑΝΠϧͷใΛ࣋ͭߏମɻreaddirؔ͜ͷߏମΛฦ͢ɻmanϖʔδ( http://man7.org/linux/man-pages/man3/readdir.3.html )ΑΓɺglibcͰͷ࣮