Share
Embed
Modular Monolith Monorepo ~シンプルさを保ちながらmonorepoのメリットを最大化する~
スタートアップにおけるMonorepo開発で、単にコードを一箇所に集めるだけでなく、チームの意思決定プロセスとコミュニケーションの設計を通じて、その真価を最大化する実践について解説。
Yui Sakamoto
November 23, 2024
Transcript
58 slides
-
Yui Sakamoto (@yui_tang) Who am Iʁ Softw a re Engineer
a t @newmohq M a inly Web Frontend, B a ckend I ♥ Workout🏋 Driving🚗 S a un a 🧖 C a t🐱 He a vy Met a l🤘 Street Fighter6🕹 2 -
~ γϯϓϧ͞Λอͪͳ͕ΒmonorepoͷϝϦοτΛ࠷େԽ͢Δ ~ Modular Monolith Monorepo • Introduction • Why
Monorepo? • Pr a cticing the One Version Rule • Communic a tion Design • Pr a ctic a l ex a mple: Intern a l UI component • Wr a p up 5 -
͞ͳ͍͜ͱ Things not to talk about ϞϊϨϙπʔϧબఆɾઃఆͷ • Nx, Lern
a , Turborepoͷൺֱ • ϏϧυύΠϓϥΠϯͷ࠷దԽ • ύοέʔδϚωʔδϟͷৄࡉઃఆ Modul a r Monolithͷ࣮ৄࡉ • ϚΠΫϩαʔϏεͱͷൺֱ • Ϟδϡʔϧׂͷ۩ମతͳํ๏ • υϝΠϯઃܭ 7 -
Monorepo in newmo NewmoͰɺϑϩϯτΤϯυɺόοΫΤϯυɺiOSAndroidͳͲͷϞόΠϧΞϓϦΛ ͯ͢ಉ͡ϦϙδτϦͰཧ͢ΔmonorepoΛ࠾༻͍ͯ͠·͢ monorepoΛ࠾༻͢Δ͜ͱͰɺΞϓϦέʔγϣϯؒͰڞ௨ͷίʔυΛڞ༗͢Δ͜ͱ͕ Ͱ͖ͨΓɺCIͷཧָ͕ʹͳͬͨΓɺଞͷνʔϜͷίʔυΛݟΔͷʹΘ͟Θ͟Ϧϙδτ ϦΛclone͢Δඞཁ͕ͳ͘ͳΓ·͢ ·ͨɺmonorepoΛ࠾༻͢Δ͜ͱͰɺΞϓϦέʔγϣϯ͕ར༻͍ͯ͠Δύοέʔδ(ϥ ΠϒϥϦπʔϧ)ͷόʔδϣϯΛ1͚ͭͩʹ͢ΔOne
Version Rule͕࣮Ͱ͖·͢ Why Monorepo? monorepoͰͷύοέʔδͷόʔδϣϯΛ1͚ͭͩʹ౷Ұ͢ΔOne Version RuleΛpnpm c a t a logͰ࣮͢Δ https://tech.newmo.me/entry/one-version-rule-built-on-pnpm-c a t a log 9 -
MonorepoͱԿ͔ What is Monorepo? Source: https://www.linkedin.com/pulse/n a vig a ting-monorepo-polyrepo-str
a tegies-optim a l-softw a re-dev a m-n a rk a r- a 4crf/ Monorepo directories s a mple 10 -
MonorepoͷओͳϝϦοτ ίʔυͷՄࢹੑͱ࠶ར༻ • git clone ҰൃͰશͯͷίʔυʹΞΫηεՄೳ • ڞ௨ίʔυͷൃݟ࠶ར༻͕༰қ • νʔϜؒͷίϥϘϨʔγϣϯ͕ଅਐ͞ΕΔ
Ұ؏ੑͷ͋Δ։ൃڥ • ϏϧυπʔϧɺςετεΠʔτɺCIͷઃఆΛ౷Ұ Մೳ • ։ൃڥͷηοτΞοϓ͕؆ૉԽ Why Monorepo? Atomicͳมߋ͕Մೳ • ෳϓϩδΣΫτʹލΔมߋΛ1ͭͷPRͰཧ • ґଘؔͷߋ৽͕ಉ࣌ʹߦ͑Δ ίʔυڞ༗ͷ؆ૉԽ • ύοέʔδͷެ։ɾόʔδϣϯཧ͕ෆཁ • ෦ϥΠϒϥϦͷڞ༗͕γϯϓϧ 11 -
Monorepoͷ՝ Why Monorepo? ϦϙδτϦͷංେԽ • git cloneͷ࣌ؒ૿Ճ • CIͷίετ૿ •
Triggerཧͷෳࡶ͞ • Ϗϧυ࣌ؒͷ૿Ճ ݖݶཧͷෳࡶ͞ • ࡉ͔͍ΞΫηε੍ޚ͕ඞཁͳ߹ʹཧ͕ࡶ ઐ༻πʔϧͷඞཁੑͱબఆ • ϞϊϨϙʹಛԽͨ͠ϏϧυπʔϧύοέʔδϚωʔδϟ͕ඞཁʁ 12 -
monorepo.tools: https://monorepo.tools/ “Not just “code colocation” Consider a repository with
several projects in it. We de fi nitely have “code colocation”, but if there are no well de fi ned relationships among them, we would not call it a monorepo. Likewise, if a repository contains a massive application without division and encapsulation of discrete parts, it's just a big repo. You can give it a fancy name like "garganturepo," but we're sorry to say, it's not a monorepo. In fact, such a repo is prohibitively monolithic, which is often the fi rst thing that comes to mind when people think of monorepos. Keep reading, and you'll see that a good monorepo is the opposite of monolithic. ✋ Monorepo ≠ Monolith A good monorepo is the opposite of monolithic! Read more about this and other misconceptions in the article on “Misconceptions about Monorepos: Monorepo != Monolith”. “ 13 -
Monorepo in newmo ԿσβΠϯΛͤͣʹ։ൃ͕ਐΉ ↓ Β͵ؒʹಉׂ͡ͷ̼odule͕࡞ΒΕΔɾಋೖ͞ΕΔ ↓ ཧίετ૿େ ↓ ͪΌΜͱٞઃܭ͓͚ͯ͠Α͔ͬͨʂʂ
Why Monorepo? こんな未来が 😭 訪れるのは避けたい!! 15 -
Modular Monolithͱͷੑ ίʔυͷ৫Խͷߟ͑ํ͕Ұக • Modul a r Monolithɿػೳ୯ҐͰϞδϡʔϧׂ • MonorepoɿϓϩδΣΫτϥΠϒϥϦ୯ҐͰσΟϨΫτ
Ϧׂ • → ྆ऀͱʮదͳཻͰͷׂʯͱʮ໌֬ͳڥքʯΛ ॏࢹ ஈ֊తͳׂɾਐԽ͕Մೳ • Modul a r MonolithɿඞཁʹԠͯ͡ϚΠΫϩαʔϏεԽ͕Մ ೳ • MonorepoɿඞཁʹԠͯ͡ϦϙδτϦׂ͕Մೳ • → ৫ͷʹ߹ΘͤͯॊೈʹରԠͰ͖Δ Why Monorepo? ґଘؔͷՄࢹੑ • Modul a r MonolithɿϞδϡʔϧؒͷґଘΛ໌ࣔతʹཧ • MonorepoɿϓϩδΣΫτؒͷґଘΛύοέʔδϚωʔ δϟͰཧ • → ґଘؔͷѲɾ੍ޚ͕༰қ ڞ௨Խͷଅਐ • Modul a r Monolithɿڞ௨ػೳΛϞδϡʔϧͱͯ͠Γग़ ͠ • Monorepoɿڞ௨ϥΠϒϥϦͱͯ͠Γग़͠ • → ࠶ར༻Մೳͳίʔυͷཧ͕ࣗવʹߦ͑Δ 17 -
Modular Monolithʹ͍ͭͯ • Deconstructing the Monolith: Designing Softw a re
th a t M a ximizes Developer Productivity • https://shopify.engineering/deconstructing-monolith-designing-softw a re- m a ximizes-developer-productivity • Monolith First • https://m a rtinfowler.com/bliki/MonolithFirst.html • Tow a rds Modern Development of Cloud Applic a tions • https://dl. a cm.org/doi/pdf/10.1145/3593856.3595909 Why Monorepo? 18 -
The One Version Rule: https://opensource.google/documentation/reference/thirdparty/oneversion “There may only be one
version of a package in third_party. This rule applies to both di ff erent versions of a single package, and forks or separate copies having di ff erent package names under third_party. There are several reasons for this restriction.” 20 -
One Version Ruleͱ monorepoͷύοέʔδͷύοέʔδͷόʔδϣϯΛ1͚ͭͩʹ͢ΔϧʔϧͰ͢ɻ One Version RuleͰɺmonorepoͷΞϓϦέʔγϣϯ͕ґଘ͢Δύοέʔδ1ͭͷόʔδϣϯ͚ͩʹ͠ ·͢ ͨͱ͑ɺΞϓϦέʔγϣϯA͕p a
ck a ge Xͷόʔδϣϯ 1.0.0 Λ͍ͬͯΔͱ͖ɺΞϓϦέʔγϣϯB p a ck a ge Xͷόʔδϣϯ 1.0.0 Λ͏Α͏ʹ౷Ұ͠·͢ ͜ΕʹΑͬͯɺ͋Δύοέʔδ͕1ͭͷόʔδϣϯ͚ͩʹू͞Εɺϝϯςφϯεੑ͕Α͘ͳͬͨΓɺύο έʔδͷΞοϓσʔτʹؔ͢ΔηΩϡϦςΟతͳʹରॲ͘͢͠ͳͬͨΓɺDi a mond dependencyͷΑ ͏ͳύοέʔδಉ࢜ͷґଘʹ͓͚ΔόʔδϣϯͷCon f lict͕ى͖ʹ͘͘ͳΓ·͢ Practicing the One Version Rule https://opensource.google/document a tion/reference/thirdp a rty/oneversion 21 -
One Version Ruleͱ One Version RuleΛ࣮ફ͢Δʹɺͦͷ໊ͷ ௨ΓύοέʔδͷόʔδϣϯΛ1ͭʹ౷Ұ͢Δ ඞཁ͕͋Γ·͢ ͦͷͨΊɺґଘ͢Δύοέʔδͷόʔδϣϯ Λ1ͭʹ౷Ұ͢ΔͨΊͷํ๏Λߟ͑Δඞཁ͕͋
Γ·͢ ͜ͷύοέʔδͷόʔδϣϯཧํ๏ݴޠ ʹΑΓҟͳΔͨΊɺݴޠ͝ͱʹదͳํ๏Λ બ͢Δඞཁ͕͋Γ·͢ Practicing the One Version Rule 22 -
pnpm catalogsʹΑΔ࣮ pnpm 9.5ͰՃ ґଘ͢Δෳͷύοέʔδʹ໊લΛͭ ͚ͯཧͨ͠ΓɺύοέʔδͷґଘΛ ΧλϩάతʹҰՕॴͰཧͰ͖Δ Έ Practicing the
One Version Rule pnpm-workspace.yaml package.json packages: - packages/* # Define a catalog of version ranges. catalog: react: ^18.3.1 redux: ^5.0.1 { "name": "@example/app", "dependencies": { "react": "catalog:", "redux": "catalog:" } } 23 -
Named Catalog ෳͷύοέʔδͱόʔδϣϯΛ·ͱ Ίͨͷʹର໊ͯ͠લΛ͚ͭͯཧ͢ Δ͜ͱ͕Մೳ monorepoʹ͋Δશͯͷύοέʔδͷ ໊લͱόʔδϣϯ͕pnpm- worksp a ce.y
a mlͱ͍͏ҰͭͷϑΝΠϧ ͰཧͰ͖ΔΑ͏ʹͳΓ·͢ɻ Practicing the One Version Rule catalogs: # Can be referenced through "catalog:react17" react17: react: ^17.0.2 react-dom: ^17.0.2 # Can be referenced through "catalog:react18" react18: react: ^18.2.0 react-dom: ^18.2.0 { "name": "@example/components", "dependencies": { "react": "catalog:react18", } } pnpm-workspace.yaml package.json 24 -
pnpmͷHooksΛͬͨOne Version Ruleͷ࣮ pnpmͷHooksػೳΛ͏͜ͱͰɺґଘ͢ΔύοέʔδͷόʔδϣϯΛ1ͭʹ ౷Ұ͢ΔOne Version RuleΛ࣮͢Δ͜ͱ͕Ͱ͖·͢ Practicing the One
Version Rule https://pnpm.io/pnpm f ile#hooks 25 -
pnpmͷHooksΛͬͨOne Version Ruleͷ࣮ 1. ΞϓϦέʔγϣϯ͕ґଘ͢Δύοέʔδͷόʔδϣϯ workspace:* ·ͨ catalog: Ͱࢦఆ ͢Δ
2. {"<name>": "catalog:"}ͱΞϓϦέʔγϣϯͰࢦఆ͞Εͨύοέʔδͷ࣮ࡍͷόʔδϣϯ ͕ pnpm-worksp a ce.y a ml ʹهࡌ͞Ε͍ͯΔ 3. Monorepoͷύοέʔδͱnode_modulesͷύοέʔδΛ۠ผͰ͖ΔΑ͏ͳ໊લΛ͚ͭΔ 4. όʔδϣϯඞͣPin͞ΕͨόʔδϣϯΛ͏Α͏ʹ͢Δ 5. ͜ͷϧʔϧΛຬͨ͞ͳ͍࣌ɺࣗಈతʹमਖ਼ίϚϯυΛΤϥʔʹදࣔ͢Δ Practicing the One Version Rule 26 -
One Version Ruleͷಋೖɾӡ༻ͷ͠͞ 1. ٕज़తͳ՝ • طଘϓϩδΣΫτͰͷґଘؔͷղফ͕ࠔ • Bre a
king Ch a ngesͷରԠ͕શϓϩδΣΫτͰඞཁνʔϜӡ༻্ͷ՝ 2. νʔϜӡ༻্ͷ՝ • ৽نϥΠϒϥϦಋೖʹ͓͚Δ߹ҙܗ • ֤ϓϩδΣΫτͷݸผχʔζͱͷંΓ߹͍ 3. Ҡߦ࣌ͷ՝ • طଘͷෳόʔδϣϯࠞࡏঢ়ଶ͔Βͷ٫ • ஈ֊తͳҠߦͷͨΊͷ֬อ Practicing the One Version Rule 27 -
One Version Ruleͷಋೖɾӡ༻ͷ͠͞ 1. ٕज़తͳ՝ • طଘϓϩδΣΫτͰͷґଘؔͷղফ͕ࠔ • bre a
2. νʔϜӡ༻্ͷ՝ • ৽نϥΠϒϥϦಋೖʹ͓͚Δ߹ҙܗ • ֤ϓϩδΣΫτͷݸผχʔζͱͷંΓ߹͍ 3. Ҡߦ࣌ͷ՝ • طଘͷෳόʔδϣϯࠞࡏঢ়ଶ͔Βͷ٫ • ஈ֊తͳҠߦͷͨΊͷ֬อ Practicing the One Version Rule ϓϩμΫτͷॳظϑΣʔζ͔ͩΒͦ͜બ͠ಘΔઓུ🤞 • ΞϓϦέʔγϣϯͷ෦ߏͷཧʢModul a r Monolithʣ • ґଘؔͷཧʢOne Version Ruleʣ ։ൃͷAgilityΛอͪ ٕज़తෛ࠴Λ࠷খݶʹ͑ কདྷͷʹඋ͑ͨج൫Λ࡞Δ 28 -
Tierͷߟ͑ํ Tier 1 : ͜ΕΛࣺͯΔ࣌ίʔυΛҰ͔Β ॻ͖֮͢ޛΛ࣋ͭʮ৺த͢Δʯ૬ख Tier 2 : ࠩ͠ସ͑ʹେ͖ͳ࿑ྗΛඞཁͱ
͢Δʮڧ͘ґଘ͢Δʯ૬ख Tier 3 : ͍ͣΕࠩ͠ସ͑Δ͜ͱΛఆͨ͠ ʮґଘΛܰ͘͢Δʯ૬ख Communication Design 32 -
τϨʔαϏϦςΟͷ֬อ ʮͳͥ͜ͷϥΠϒϥϦΛ࠾༻ͨ͠ͷ͔ʁʯ ʮͲ͏͍͏ٞΛܦͯ͜ͷܾఆʹࢸͬͨͷ͔ʁʯ ͱ͍͏ҙࢥܾఆͷཤྺΛɺ ίʔυͱඥ͚ͮͯḪΔ͜ͱ͕ग़དྷΔΑ͏ʹ͢Δ Communication Design # pnpm-workspace.yaml packages:
# ϑϩϯτΤϯυΞϓϦέʔγϣϯ - ‘apps/*’ # ڞ௨ϥΠϒϥϦ܈ # designDoc: https://... (UIίϯϙʔωϯτͷڞ௨Խʹؔ͢Δઃܭॻ) # tier: 1 (ίΞϥΠϒϥϦͱͯ͠Ґஔ͚ͮ) # approvedDate: 2024-01-01 - ‘libs/ui-components' # APIΫϥΠΞϯτ # designDoc: https://... (APIΫϥΠΞϯτͷઃܭํ) # tier: 1 # approvedDate: 2024-01-15 - 'libs/api-client' # ϩΪϯάϥΠϒϥϦ # designDoc: https://... (ϩάऩूͷ౷ҰԽʹ͍ͭͯ) # tier: ̎ # approvedDate: 2024-02-01 - 'libs/logger' 33 -
Internal UI component in newmo Practical example ❯ tree -L
1 -d ./lib/typescript/p a ck a ges/ | grep "g a r a ge-" ᵓᴷᴷ g a r a ge-p a nd a css-preset ᵓᴷᴷ g a r a ge-p a nd a css-re a ct ᵓᴷᴷ g a r a ge-ui-re a ct 35 -
എܠͱલఏ݅ͷೝࣝڞ༗ Internal UI component in newmo Design Doc ݱঢ়ͷ՝ •
ෳͷΣϒΞϓϦέʔγϣϯͰڞ௨ͷίϯϙʔωϯτ͕૿Ճ • ࣮ͷॏෳ͕ൃੜ • ڞ༗ํ๏ɾཧํ๏ͷݕ౼͕ඞཁʹ ಛʹ৻ॏͳஅ͕ඞཁͳཧ༝ • ʮڧ͘ґଘ͢Δʯ͜ͱʹͳΔίʔυ • ࠩ͠ସ͑ʹେ͖ͳ࿑ྗ͕ඞཁ ఆಡऀͷ໌֬Խ • ϑϩϯτΤϯυΤϯδχΞ • σβΠϯΤϯδχΞ 37 -
͜Ε·Ͱͷٞʹ͓͚Δ༻ޠͷཧ Internal UI component in newmo Design Doc ϢϏΩλεݴޠͷఆٛ֬ೝ ཧ༰:
σβΠϯγεςϜͱ σβΠϯγεςϜɺࢥͱσβΠϯͱ࣮ͱΨΠυϥΠϯͷ ૯শ(ઓུͱઓज़ͷ྆ํΛؚΉ) ͜ͷυΩϡϝϯτͰɺ࣮ΑΓͷΛѻ͍ͬͯΔͨΊɺ ”UIίϯϙʔωϯτϥΠϒϥϦ”ͷͱ͢Δɻ 38 -
తͱɺతͰͳ͍͜ͱΛઃఆ Internal UI component in newmo Design Doc త UIίϯϙʔωϯτϥΠϒϥϦͱͯ͠ԿΛ͍࣋ͬͯΔ͖͔ΛܾΊΔ
[] UIίϯϙʔωϯτϥΠϒϥϦͲ͏ͬͯΞϓϦέʔγϣϯͱ݁߹͢Δ͔ܾΊΔ [݁߹ํ๏] UIίϯϙʔωϯτϥΠϒϥϦ୭͔Ͳ͏ͷΑ͏ʹཧ͢Δ͔ΛܾΊΔ [ϝϯςφϯε] ͍ͭUIίϯϙʔωϯτϥΠϒϥϦʹίϯϙʔωϯτΛՃ͢Δ͔ [அج४] తͰͳ͍͜ͱ UIίϯϙʔωϯτϥΠϒϥϦΛެ։͢Δ͜ͱ ͋͘·ͰࣾͷΞϓϦέʔγϣϯͰͷσβΠϯΛͭίϯϙʔωϯτΛͲ͏͢Δ͔ΛܾΊ͍ͨ 39 -
UIίϯϙʔωϯτϥΠϒϥϦͲ͏ͬͯΞϓϦέʔγϣϯͱ݁߹͢Δ͔ܾΊΔ [݁߹] • UIίϯϙʔωϯτϥΠϒϥϦUIίϯϙʔωϯτϥΠϒϥϦͰςε τΛߦ͏ • ओʹϏδϡΞϧతͳ෦͕ଟ͘ͳΔͨΊɺVRT(Visu a l Regression
Test)Λجຊͱͯ͠ߦ͏ • ΠϯλϥΫγϣϯཁૉ͕͋Δ߹ɺPl a ywrightΛ͍ςετΛߦ͏ • UIίϯϙʔωϯτϥΠϒϥϦΛར༻͢ΔΞϓϦέʔγϣϯͰɺUIί ϯϙʔωϯτͦͷͷͷςετߦΘͳ͍ • ΞϓϦέʔγϣϯͰ݁߹ͨ͠ΞϓϦέʔγϣϯʹର͢Δ Integr a tion TestsΛجຊͱͯ͠ߦ͏ • UIίϯϙʔωϯτΛ͞Βʹϥοϓͨ͠ίϯϙʔωϯτΛ࡞͍ͯ͠Δ ߹ɺίϯϙʔωϯτʹର͢ΔςετΛߦ͏͜ͱ͋Γͱ͢Δ • ςετͷΧόϨοδͷߟ͑ํʢӈਤʣ Practical example 41 -
͍ͭUIίϯϙʔωϯτϥΠϒϥϦʹίϯϙʔωϯτΛՃ͢Δ͔ [அج४] ୭͕ΈͯΘ͔ΔΑ͏ͳɺUIίϯϙʔωϯτͱͯ͠Ճ͢Δج४ΛܾΊΔ • ͜ͷج४Λຬͨ͞ͳ͘ͳͬͨͷUIίϯϙʔωϯτϥΠϒϥϦ͔Β֎͖͢ ྫ) σβΠϯγεςϜʹՃ͢Δίϯϙʔωϯτ࣍ͷ͜ͱΛຬ͍ͨͯ͠Δ • Design TokenΛར༻͍ͯ͠Δ
• 2ͭҎ্ͷΞϓϦέʔγϣϯͰશ͘ಉ͡ར༻ͷ͞Εํ͕͞Ε͍ͯΔ • 3ճҎ্ಉ͡ॻ͖ํ͕͞Ε͍ͯΔ • Figm a ଆͰίϯϙʔωϯτԽ͞Ε͍ͯΔ(σβΠφʔଆͰίϯϙʔωϯτͱͯ͠ѻΘΕ͍ͯΔ) • ΞϓϦέʔγϣϯʹґଘ͍ͯ͠ͳ͍ίϯϙʔωϯτ = APIͱ͔ݖݶͷఆͱ͔ґଘͯ͠ͳ͍ Practical example 42 -
Design DocͰͷٞͱ݁ Practical example UIコンポーネントの命名 τʔΫϯɺϑϨʔϜϫʔΫɺ UIίϯϙʔωϯτͷύοέʔδ σβΠϯτʔΫϯɺUIίϯϙʔωϯτͷόʔδϣϯཧ ίϯϙʔωϯτཧπʔϧͷੋඇͱબఆ ֛֪֨㟙㻵
6*ίϯϙʔωϯτͷςετ デザインコンポーネントのインポートパス Storyの境界線 Storybook: StoryͱPropsͷ定義 Design System͔ΒͷٯҾ͖ͷ࣮ Cross Browserͷςετ 43 -
τʔΫϯɺϑϨʔϜϫʔΫɺUIίϯϙʔωϯτͷύοέʔδ Practical example Design Token σβΠϯͷجૅΛఆٛ { "colors": { "primary":
"#2E7D32", "secondary": "#1565C0" } } Styled System ܕ҆શͳCSS in JSؔ css({ color: "primary", padding: "md", fontSize: "lg" }) UI Components ࠶ར༻ՄೳͳUIίϯϙʔωϯτ <Button variant="primary" size="md" fontSize="lg" /> @newmo-app/garage-pandacss-preset @newmo-app/garage-pandacss-react @newmo-app/garage-ui-react 44 -
τʔΫϯɺϑϨʔϜϫʔΫɺUIίϯϙʔωϯτͷύοέʔδ 1. Design Tokenͷఆٛͷύοέʔδ 1. P a ck a ge
N a me: @newmo- a pp/g a r a ge-p a nd a css-preset 2. ׂ: Design TokenΛఆٛ͢Δ 3. ฤू͢Δత: Design TokenΛՃɺআɺߋ৽͢Δ 1. https://p a nd a -css.com/docs/customiz a tion/presets 2. UIϑϨʔϜϫʔΫ͝ͱͷ styled-system 1. P a ck a ge N a me: @newmo- a pp/g a r a ge-p a nd a css-re a ct 2. ׂ: ελΠϧΛఆٛ͢ΔUIϑϨʔϜϫʔΫ͝ͱͷؔ 3. ฤू͢Δత: P a nd a CSSͷઃఆΛมߋ͢Δͱ͖ 3. Design TokenҎ֎ͷઃఆ 1. UIϑϨʔϜϫʔΫ͝ͱͷ UIίϯϙʔωϯτ 2. P a ck a ge N a me: @newmo- a pp/g a r a ge-ui-re a ct 3. ׂ: ελΠϧ͖ͷUIίϯϙʔωϯτΛఏڙ͢Δ 4. ฤू͢Δత: ΞϓϦέʔγϣϯͰར༻͢ΔUIίϯϙʔωϯτΛ࡞ɺฤूɺআ͢Δͱ͖ Practical example Dependency diagram 45 -
ίϯϙʔωϯτཧπʔϧͷੋඇͱબఆ Storybook͔ɺͦΕҎ֎͔ͷݕ౼ ӈදͷΑ͏ʹൺֱදΛ࡞ͯٞ͠ɻ • Storybookͷґଘ͕ଟ͍͕ɺଞʹ൚༻తͳΈ͕ॆ࣮͠ ͍ͯͯɺVRTͷཧίετΛԼ͛ΒΕΔͷ͕ͳ͍ঢ়ଶ • ґଘ͕ଟ͍StorybookΛUIίϯϙʔωϯτϥΠϒϥ Ϧͷதʹด͡Δ͜ͱͰΞϓϦέʔγϣϯଆʹStorybook ͷґଘ͕ൃੜ͠ͳ͍Α͏ʹ͢Δ
• ͜ΕʹΑͬͯStorybookʹΑͬͯΞϓϦέʔγϣϯͷ Ξοϓσʔτ͕ϒϩοΫ͞Εͳ͍Α͏ʹ͢Δ • Ref: Storyͷڥքઢ ※ storybookͷґଘվળத Practical example 46 -
ςετํ๏ ཧ: Inter a ction Testͷॻ͖ํҰͭʹ౷Ұ ํ๏ • pl a
ywrightΛ͍ͬͯΔͷͰɺpl a ywrightͰςετ Λॻ͘ • storybookͷςετํ๏Ͱॻ͘ Practical example ݁ σβΠϯͷݪଇͱͯ͠ɺׂ͕ಉ͡ͷͰ͖Δ͚ͩ Ұͭͷํ๏ʹ͢Δ • Inter a ction TestPl a ywrightͰॻ͘ • storybookͷpl a yؔΘͳ͍ • ίϯϙʔωϯτͷςετVRTΛجຊతʹߦ͏ Refs: Storybook Λϑϧ׆༻ͯ͠ςετΛ࣮ͨͦ͠ͷޙͷ https://blog.cybozu.io/entry/2024/08/13/140000 47 -
UIίϯϙʔωϯτͷςετ 1. UIίϯϙʔωϯτͷσβΠϯతͳςετ StoryBookͷSn a pshot Test 2. ΞϓϦέʔγϣϯʹೖΕͨ࣌ʹϦάϨογϣϯς ετ
Pl a ywrightͷIntegr a tion Test Practical example ݁: • ίϯϙʔωϯτγεςϜVRT • ෳࡶͳίϯϙʔωϯτPl a ywrightͰςετΛॻ͘ • ΞϓϦέʔγϣϯଆʹPl a ywrightͷςετ͕͋Δ 48 -
Storyͷڥքઢ 💡ܾΊΔ͜ͱ: ΞϓϦέʔγϣϯʹStoryΛॻ͖͔͘Ͳ͏͔ 1. ϖʔδϨϕϧͷStoryෆཁ 1. ͜Ε࣮ࡍͷF a keͰಈ͔ͨ͠ͷΛѻͬͨํ͕͍͍ 2.
ίϯϙʔωϯτϨϕϧͷStoryཁݕ౼ 1. @newmo- a pp/g a r a ge-ui-re a ct ʹ͍࣋ͬͯ͘લʹɺ֤ΞϓϦέʔγϣϯʹίϯϙʔωϯτ͕ॻ͔ΕΔ 2. ΞϓϦέʔγϣϯͱ@newmo- a pp/g a r a ge-ui-re a ctͰຖճมίετ͕ൃੜ͢Δ 3. ΞϓϦέʔγϣϯʹStory͕ॻ͚Δͱ͜ΕղফͰ͖Δ͕ɺΞϓϦέʔγϣϯ͕Storyʹґଘ͠ग़͢ͷඍົ ݁ • StorybookσβΠϯγεςϜͷํ͚ͩʹ͓͘ • ΞϓϦέʔγϣϯଆʹstoriesॻ͔ͳ͍ • ͍࣋ͬͯ࣌͘ʹstoryΛॻ͘ Practical example 49 -
Storybook: StoryͱPropsͷఆٛ 💡ܾΊΔ͜ͱ: ίϯϙʔωϯτͷPropsΛͲ͏ॻ͔͘ Practical example re a ct-docgen 1.
σϑΥϧτͰΘΕΔ͕ݡ͍ܕύʔεͰ͖ͳ ͍ 2. ͜ΕʹΑͬͯ a utodocͷࣗಈੜ͕͏·͍͔͘ ͳ͍έʔε͕͋Δ 3. ࣍ͷΑ͏ͳPropsͩͱStorybookͷ a utodoc͕͏ ·͍ͬͯ͘ͳ͍͜ͱ͕Θ͔Δ re a ct-docgen-typescript 1. ͳ͘ѻ͑Δ 2. ϝϦοτ 1. ෳࡶͳܕରԠͯ͠Δ 3. σϝϦοτ 1. ϝϯς͞Εͯͳ͍ 2. ͍ 3. storybookͷσϑΥϧτͰͳ͍ 🖊݁: ্هΛ͕ٞͨ͠ɺݱঢ়ͲͪΒʹґଘͤͣجຊpropsͰίϯϙʔωϯτʹඞཁͳͷΛఆٛ͢Δํʹܾఆ 50 -
Design System͔ΒͷٯҾ͖ͷ࣮ • ҰೖΕͨσβΠϯίϯϙʔωϯτ֎͢ཧ༝͕ൃੜ͠ʹ͍͘ • ೖΕΔ݅ʹ֎ͤΔ݅Ճͯ͠ɺͦΕͱͯ͠ཧՄ ೳͳͷͱ࣮ͯ͢͠Δ • ྫ) ϦϑΝϨϯεճɺར༻ճ
• ىಈ࣌ʹgrepͯ͠ɺstorybookʹinject͢ΔΈ͕͋Δͱྑ ͦ͞͏ • → ίϯϙʔωϯτ໊͕ύεʹೖΔΑ͏ʹ࣮ͯ͠ Practical example Refs: ιʔείʔυΛղੳ͚ͯࣾ͠UIϥΠϒϥϦͷ༻ঢ়گΛࣗಈͰूܭ͢Δ https://tech.pl a id.co.jp/ a n a lyze-intern a l-ui-libr a ry-us a ge import { Spinner } from "@newmo-app/garage-ui-react/Spinner"; export default function Loading() { return <Spinner />; } 51 -
Modular MonolithΛMonorepoͰ։ൃ͢Δ ͳͥΈ߹ΘͤΔͷ͔ ྆ऀͷઃܭࢥ͕Ұக దͳཻͰͷׂ ໌֬ͳڥքઃఆ কདྷͷมߋΛݟਾ͑ͨઃܭ ʮίʔυΛҰՕॴʹ·ͱΊΔʯҎ্ͷՁ ҙࢥܾఆϓϩηεͷઃܭ ࠷ॳͷઃܭʹ࣌ؒΛֻ͚Δ
ཧରΛ૿͞ͳ͍அج४ Design DocʹΑΔҙࢥܾఆͷه MonorepoͷਅՁͱ 1/2 55 -
νʔϜ։ൃͷ࣋ଓՄೳੑΛߴΊΔ One Version Ruleͷ࣮ફ ύοέʔδͷґଘؔΛ౷੍ ٕज़બఆͷҙࢥܾఆΛ৻ॏʹ ׂΛલఏͱͨ͠ઃܭ ֶͼ ҙࢥܾఆΛ৻ॏʹߦ͏͜ͱͰɺ֦େͯ͠ӡ༻ίετΛ੍Ͱ͖Δ ҙࢥܾఆ࣌ͷஅج४ͱϩάΛ͢͜ͱͰɺҰ؏ੑͷ͋Δൃల͕Մೳʹ
ׂΛલఏͱͨ͠ઃܭͱίʔυͷڞ௨ԽͰɺݱࡏͷ։ൃޮ্ͤ͞Δ MonorepoͷਅՁͱ 2/2 56 -
·ͱΊ ࢀߟ จݙɺURL • N a vig a ting Monorepo
& Polyrepo Str a tegies for Optim a l Softw a re Architecture • https://www.linkedin.com/pulse/n a vig a ting-monorepo-polyrepo-str a tegies-optim a l-softw a re-dev a m-n a rk a r- a 4crf/ • monorepo.tools • https://monorepo.tools/ • Deconstructing the Monolith: Designing Softw a re th a t M a ximizes Developer Productivity • https://shopify.engineering/deconstructing-monolith-designing-softw a re-m a ximizes-developer-productivity • Monolith First • https://m a rtinfowler.com/bliki/MonolithFirst.html • Tow a rds Modern Development of Cloud Applic a tions • https://dl. a cm.org/doi/pdf/10.1145/3593856.3595909 • Design Docs a t Google • https://www.industri a lemp a thy.com/posts/design-docs- a t-google/ • Storybook Λϑϧ׆༻ͯ͠ςετΛ࣮ͨͦ͠ͷޙͷ • https://blog.cybozu.io/entry/2024/08/13/140000 • ιʔείʔυΛղੳ͚ͯࣾ͠UIϥΠϒϥϦͷ༻ঢ়گΛࣗಈͰूܭ͢Δ https://tech.pl a id.co.jp/ a n a lyze-intern a l-ui-libr a ry-us a ge Wrap up 57