はてなブログのESM化
by
NanimonoDemonai
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
ͯͳϒϩάͷESMԽ id: nanimono_demonai 2023/9/27 Kyoto Tech Talk #2
Slide 2
Slide 2 text
1. ࣗݾհ 2. ͯͳϒϩάͷJS 3. ESMԽͷಈػͱΓํ 4. ύϑΥʔϚϯεվળ 5. ϑΟʔνϟʔϑϥά࣮ݱ
Slide 3
Slide 3 text
ࣗݾհ • id: nanimono_demonai • @NanimonoDaemon • େֶͰػցֶशͷݚڀ • ʮגࣜձࣾͯͳʯʹ2020ʹब৬ • ීஈTypeScript/React/CSSͷใΛ͍ͬͯΔ • ੲSCP-JPͷཧऀ͍ͬͯ·ͨ͠ • ࠓࣗಈंͷ໔ڐऔΖ͏ͱ͍ͯ͠·͢ 3
Slide 4
Slide 4 text
ͯͳϒϩάͷհίʔφʔ • ͯͳϒϩάϦϦʔε͔Β12ʂ • ࠓͷ6݄ʹهࣄͷ༗ྉൢചػೳՃʂ • codocגࣜձ͕ࣾఏڙ͢ΔίϯςϯπൢചαʔϏεʮcodocʢίʔυΫʣʯͱͷ ࿈ܞʹΑΓͯͳϒϩάͰɺϒϩάهࣄͷ༗ྉൢച͕Ͱ͖ΔΑ͏ʹͳΓ·ͨ͠ 4 قͷ͋ΔϓϩμΫτͷ࠷ۙͷ ࢥ͍ݴ༿ʹɻ ͯͳϒϩάɺ͋ͳͨͷࢥ͍ߟ͑Λͨ͠Γɺ ͞·͟·ͳਓ͕௲ͬͨଟ༷ͳՁ؍ʹ৮ΕͨΓͰ͖ΔॴͰ͢ɻ
Slide 5
Slide 5 text
࠷ۙͷͯͳϒϩά • ͯͳϒϩάͷύϑΥʔϚϯεΛվળ • ͯͳϒϩάʹϑΟʔνϟʔϑϥάΛ͚ͭͯ։ൃମݧΛ্ 5 ͦͷഎޙʹɺͯͳϒϩάͷ&4.Խ͋Γ https://staff.hatenablog.com/entry/2023/07/07/122734 ͯͳϒϩάͷӾཡମݧվળͷऔΓΈʹ͍ͭͯ
Slide 6
Slide 6 text
ͯͳϒϩάͷJS
Slide 7
Slide 7 text
ͯͳϒϩάͷJS - ྺ࢙ͱແடং • ͯͳϒϩάʑ։ൃ͞Ε͍ͯΔ • ϑϩϯτΤϯυͷίʔυଟ͍ • աڈݱࡏͷϑϩϯτΤϯυͷΪϟοϓ͕ແடংΛੜΉ • ݴޠ, ελΠϧ, ςετ, etc… • Ϟδϡʔϧܗࣜͷࠞࡏ 7 From Kyoto.js 12 https://speakerdeck.com/nanimonodemonai/ hatenaburogufalsehurontoendonizhi-xu- hamotarasaretafalseka ࠓճϞδϡʔϧΛ͑ͨ +BWB4DSJQU ߦ 5ZQF4DSJQU ߦ
Slide 8
Slide 8 text
ͯͳϒϩάͷJS - ”چ”ϏϧυπʔϧνΣʔϯ 8
Slide 9
Slide 9 text
ͯͳϒϩάͷJS - ”چ”ΞʔΩςΫνϟ 9 ϖʔδʹڞ௨ͳJSΛಡΈࠐΜͰ͍Δ
Slide 10
Slide 10 text
ESMԽͷಈػͱΓํ
Slide 11
Slide 11 text
JSͷϞδϡʔϧܗࣜʹ͍ͭͯ • JSͷϞδϡʔϧܗࣜ • CJS: Node.jsͰ࠾༻͞Ε͍ͯΔܗࣜ • requireؔͰϞδϡʔϧղܾ • ESM: ES2015͔ΒJSͷ༷ʹೖͬͨϞδϡʔϧܗࣜ • import/exportจͰϞδϡʔϧղܾ • ͯͳϒϩάͰ͜ΕΒ͕ࠞࡏ • Ϗϧυ࣌ʹESMΛCJSʹม͍ͯͨ͠ (Babel preset-envͱtscon fi gͰmodule = “common”ͱ͍ͯͨ͠) 11
Slide 12
Slide 12 text
CJS/ESMࠞࡏͷۤ͠͞ • CJSܗࣜͰಡΈࠐΜͩϞδϡʔϧ੩తղੳ͕ޮ͖ͮΒ͍ • CIΛ͢Γൈ͚ͯϏϧυ௨Δͷʹɺ࣮ߦ࣌ʹΤϥʔʹͳ͍ͬͯΔ • ESMͳΒWebpack͕Ϗϧυ࣌ʹϞδϡʔϧղܾΛνΣοΫ͢Δ • Ϟδϡʔϧʹؔ͢ΔTreeShakingσουίʔυআ͕ޮ͔ͳ͍ • requireؔΛͬͯޮ͔ͤΒΕΔํ๏͋Δ͕ͣͩ… 12 &4.$+4͕͍ࠞͬͯ͟Δ͜ͱ͠ΜͲ͍ʂʁ
Slide 13
Slide 13 text
CJS→ESMԽͷΓํ: આಘฤ • ίʔυͷશ໘తͳมߋʹͳΔͷͰɺ͕ඞཁ • ಈ࡞νΣοΫΛೖ೦ʹ͍ͨ͠ͳͲ • ΛͱͬͯͰΔ͖λεΫͰ͋Δ͜ͱΛೲಘͯ͠Β͍͍ͨ → վળΛߟ͑ٞͰ͖ΔͰઆಘࡐྉΛἧ͑Δ • վળΛߟ͑ٞͰ͖Δ • ͓༡ٔձʢޙड़ʣ • ϑϩϯτΤϯυձ • આಘࡐྉ • ։ൃମݧ্, ύϑΥʔϚϯε্, ৽ػೳ։ൃ͕ศརʹ, ෳࡶੑ͕গͳ͍ 13 CJS->ESMޮՌ͕͋Γͦ͏ɺͰઆ໌͍ͨ͠ΑͶ
Slide 14
Slide 14 text
͓༡ٔձ • ;ͩΜͷλεΫҎ֎ͷ͜ͱΛΔ࣌ؒ • ִि • ΤϯδχΞ͕ؾʹͳ͍ͬͯΔ͜ͱ, ࣮ෛ୲ʹͳ͍ͬͯΔ͜ͱΛղফ͢Δ खஈͱͯ͠ΤϯδχΞͷࡋྔͰλεΫʹऔΓΊΔ • ΤϯδχΞ͕Ұ੪ʹ͓༡ٔձλΠϜͰ͖ΔͷͰϫΠϫΠ͠ͳ͕ΒͰ͖Δ • ESMԽͰٞલͷঢ়گ֬ೝPOCͷ༻ҙʹཱͯͨ 14
Slide 15
Slide 15 text
ϑϩϯτΤϯυձ • νʔϜͷϑϩϯτΤϯυʹڵຯͷ͋Δ༗ࢤͰఆྫձΛ։͍ͯվળҊΛ ·ͱΊͯɺεϓϦϯτʹ࣮ͤͯࢪ͍ͯ͠Δ • ͜͜ͰESMԽͷ࡞ઓΛಥ͖٧Ίͨ 15 νʔϜͰԿΛΔͷ͔ͷೝࣝΛἧ͑ͨ
Slide 16
Slide 16 text
CJS→ESMԽͷΓํ: આಘฤ • ։ൃମݧͷ্ʹܨ͕Δ • લड़ͷ௨Γ੩తղੳ͕ޮ͖͘͢ͳΔ • CJSͱESMࠞࡏΛ࣮ݱ͢ΔͨΊͷઃఆϑΝΠϧͷهड़͕ͳ͘ͳΔ 16
Slide 17
Slide 17 text
CJS→ESMԽͷΓํ: આಘฤ • ύϑΥʔϚϯε্͕͕Δ • ֤छܭଌ͔ΒJSͷαΠζ͕ύϑΥʔϚϯεΛԼ͛ΔཁҼͱΘ͔͍ͬͯͨ • ESM౷Ұ৴͢ΔJSͷαΠζ͕ݮΔࢪࡦͰ࣮ࢪ͢Δҙ͕ٛ͋Δ • TreeShakingͰෆཁͳJSΛݮΒͤΔ 17 https://speakerdeck.com/nanimonodemonai/deng-tan-zi-liao
Slide 18
Slide 18 text
CJS→ESMԽͷΓํ: આಘฤ • ৽ػೳ։ൃ͕ศརʹͳΔ • ϑΟʔνϟʔϑϥά͕͋Ε… • ։ൃମݧ্͕ • ৽ػೳ։ൃ͍ͯ͠Δ͜ͱΛϢʔβʔʹӅ͢͜ͱ͕༰қʹ • σϞ͘͢͠ • ৽ػೳΛඇΤϯδχΞʹࢼͯ͠Β͏ͷ͕༰қʹͳΔ • σϞΛ௨ͯ͡ϦϦʔε·ͰʹΛ্͛ΒΕΔ • ͦͷଞʹ • ABςετͱ͔ 18 ͋ͱͰ͏Ұճ͠·͢
Slide 19
Slide 19 text
CJS→ESMԽͷΓํ: ࡞ۀฤ • େྔʹ͋ΔͷͰࣗಈม • jscodeshiftͷcommonjs-to-es-module-codemodΛ༻ • ESMʹ౷Ұͨ͠ΒɺWebpack͕ϞδϡʔϧղܾͷΤϥʔΛग़͢Α͏ʹ • ػցతͳஔʹΑΔΤϥʔؾ͕͚ͭɺࣗ৴Λ࣋ͬͯҠߦ͕Ͱ͖ͨ 19 ྔׂ͕͋ͬͨͱ؆୯ʹͰ͖ͨ https://www.npmjs.com/package/commonjs-to-es-module-codemod https://www.npmjs.com/package/jscodeshift ࣗಈతʹஔͰ͖ͳ͔ͬͨͷͷྫ • named export͍ͯ͠ͳ͍ͷʹnamed import͍ͯ͠ΔϞδϡʔϧ • ΦϒδΣΫτΛ࡞͔ͬͯΒdefault export͍ͯ͠ΔϞδϡʔϧ
Slide 20
Slide 20 text
݁ՌͲ͏ͳ͔ͬͨ……ʁ
Slide 21
Slide 21 text
ύϑΥʔϚϯεվળ
Slide 22
Slide 22 text
ϒϩάͷJSαΠζݮͰύϑΥʔϚϯεվળ • ESMԽʹΑͬͯTreeShaking͕ޮ͖ɺJSͷαΠζ͕ݮ • ಉ࣌ʹTreeShaking͕ޮ͘ϥΠϒϥϦʹม͑ͨ (lodash -> lodash-es) • ߹Θͤͯόϯυϧͷ࠷దԽ࣮ࢪ • ϒϩάͷμογϡϘʔυͷJSΛϒϩάදࣔ໘͔Βୀආ • ߹Θͤͯάϩʔόϧϔομόϯυϧׂ 22 ϒϩάΛӾཡ͢ΔͨΊʹඞཁͳ+4͕લ݄ൺ
Slide 23
Slide 23 text
ͯͳϒϩάͷJS - ΞʔΩςΫνϟ 23 ϖʔδ͝ͱʹదJSΛಡΈࠐΜͰ͍Δ
Slide 24
Slide 24 text
ϒϩάΛӾཡ͢ΔͨΊʹඞཁͳJS͕લ݄ൺ1/5 24 ݱࡏͳ͓ݮΒ͠ଓ͚͍ͯΔ վળલ ݄ όϯυϧׂޙ &4.౷Ұޙ ݱࡏ IBUFOBCMPHKT .# ,# ,# ,# ,# ,# ,# ,# CVOEMF HMPCBMIFBEFSKT ,# ,# ,# ,# ,# ,# ϖʔδڞ௨෦ WFOEPSKT .# ,# ,# ,# ϖʔδڞ௨෦ DPNNPOTKT ,# ,# ߹ܭ .# ,# ,# ,# ,# ,# ,# ,#
Slide 25
Slide 25 text
ύϑΥʔϚϯεվળ - ·ͱΊ • ESMԽʹΑͬͯJSͷαΠζΛݮ • TreeShakingͳͲ͕͖͍ͨ • શϖʔδ͝ͱʹڞ௨ͷJSͰͳ͘ɺը໘͝ͱʹผͷJSʹ͢Δ • ͬͪ͜ͷํ͕ΠϯύΫτ͕େ͖͔ͬͨ • ࠓޙɺΞʔΩςΫνϟΛݟͯ͠JSͷαΠζΛݮΒ͢ 25
Slide 26
Slide 26 text
ϑΟʔνϟʔϑϥά࣮ݱ
Slide 27
Slide 27 text
ϑΟʔνϟʔϑϥά • ࠓ·Ͱ։ൃதͷػೳΛӅͯ͠։ൃ͢Δʹ… • ϏοάόϯϦϦʔε • ख࡞ΓͷJSͰύονΛͯΔ • ৽ػೳ։ൃ͕େมͩͬͨ 27
Slide 28
Slide 28 text
CJS→ESMԽͷΓํ: આಘฤ (࠶ܝ) • ৽ػೳ։ൃ͕ศརʹͳΔ • ϑΟʔνϟʔϑϥά͕͋Ε… • ։ൃମݧ্͕ • ৽ػೳ։ൃ͍ͯ͠Δ͜ͱΛϢʔβʔʹӅ͢͜ͱ͕༰қʹ • σϞ͘͢͠ • ৽ػೳΛඇΤϯδχΞʹࢼͯ͠Β͏ͷ͕༰қʹͳΔ • σϞΛ௨ͯ͡ϦϦʔε·ͰʹΛ্͛ΒΕΔ • ͦͷଞʹ • ABςετͱ͔ 28 ESMԽͰϑΟʔνϟʔϑϥάΛ࣮ݱͨ͠
Slide 29
Slide 29 text
ϑΟʔνϟʔϑϥάΛ࣮ݱ͢ΔͨΊʹ • ESMͰಈ͘Α͏ͳͬͨTreeShakingΛ׆༻ͯ͠ɺ ಉ͡ιʔε͔Βϑϥά͝ͱʹҧ͏JSΛు͖ग़ͤΔΑ͏ʹ͢Δ • WebpackͷDe fi nePluginͰιʔεதͷϑΟʔνϟʔϑϥάมΛ Ϗϧυ࣌ʹఆʹஔ͖͑ɺDeadCodeআ͢Δ 29
Slide 30
Slide 30 text
ͯͳϒϩάͷJS - ΞʔΩςΫνϟ࠶ߏ2 30
Slide 31
Slide 31 text
ϑΟʔνϟʔϑϥά • Ϗϧυ࣌ʹDead CodeআͰϑΟʔνϟʔϑϥάΛ࣮ݱ • WebpackͰ Ϗϧυ࣌ʹ FEATURES.featureA Λ false͔trueʹม͢Δ • Webpack De fi ne Plugin • WebpackͰ if(false){ } ͱͳΔՕॴΛফͯ͠Β͏ • Webpack.optimizeͷػೳ • TreeShakingͰimport͍ͯ͠Δ͕ΘΕͯͳ͍Ϟδϡʔϧফ͑Δ 31 if (FEATURES.hogehoge){ / / fugafuga const elem = document.querySelector('.js - fugafuga'); if (elem) renderHogehoge(elem); }
Slide 32
Slide 32 text
·ͱΊ
Slide 33
Slide 33 text
·ͱΊ • ϒϩάͷιʔείʔυΛESMʹ౷Ұͨ͠ • ͜Εͷ࣮ݱͷͨΊʹઆಘࡐྉΛूΊͨ • όϯυϧͷ࡞ΓํΛݟͯ͠ύϑΥʔϚϯεվળ • TreeShakingͰϑΟʔνϟʔϑϥάΛ࣮ݱ 33 ͜Ε͔ΒϒϩάͷϑϩϯτΤϯυΛΑͯ͘͠ɺ ύϑΥʔϚϯε։ൃମݧ্͍͛ͯͧ͘