From eea0950aeb432327daf3c314a785791424162292 Mon Sep 17 00:00:00 2001 From: Ruslan Makarov Date: Thu, 16 May 2024 12:53:33 +0700 Subject: [PATCH] feat(faq): add 'vue 3 project structure' section --- docs/.vitepress/config/sidebar.faq.en.ts | 1 + docs/.vitepress/config/sidebar.faq.ru.ts | 1 + docs/en/development/architectural-patterns.md | 16 - docs/en/development/project-structure.md | 270 +++++++++++++++++ docs/public/images/faq/atomic-design.jpg | Bin 0 -> 27312 bytes docs/public/images/faq/fsd.jpg | Bin 0 -> 34530 bytes docs/public/images/faq/microfronends.avif | Bin 0 -> 17316 bytes docs/public/images/faq/microfronends.jpg | Bin 0 -> 35505 bytes docs/ru/development/architectural-patterns.md | 241 +++++++++++++++- docs/ru/development/project-structure.md | 273 ++++++++++++++++++ pnpm-lock.yaml | 43 +-- 11 files changed, 807 insertions(+), 38 deletions(-) create mode 100644 docs/en/development/project-structure.md create mode 100644 docs/public/images/faq/atomic-design.jpg create mode 100644 docs/public/images/faq/fsd.jpg create mode 100644 docs/public/images/faq/microfronends.avif create mode 100644 docs/public/images/faq/microfronends.jpg create mode 100644 docs/ru/development/project-structure.md diff --git a/docs/.vitepress/config/sidebar.faq.en.ts b/docs/.vitepress/config/sidebar.faq.en.ts index cc4b0ee76..b57b129ad 100644 --- a/docs/.vitepress/config/sidebar.faq.en.ts +++ b/docs/.vitepress/config/sidebar.faq.en.ts @@ -15,6 +15,7 @@ export default [ items: [ { text: "Configuring the IDE", link: "/en/development/ide" }, { text: "Creating and building web application", link: "/en/development/building" }, + { text: "Project structure", link: "/en/development/project-structure" }, { text: "Architectural patterns", link: "/en/development/architectural-patterns" }, { text: "How to use images and other resources", link: "/en/development/assets" }, { text: "Stores - Vuex, Pinia and Composition API", link: "/en/development/stores" }, diff --git a/docs/.vitepress/config/sidebar.faq.ru.ts b/docs/.vitepress/config/sidebar.faq.ru.ts index 69cf910e2..4de5503b1 100644 --- a/docs/.vitepress/config/sidebar.faq.ru.ts +++ b/docs/.vitepress/config/sidebar.faq.ru.ts @@ -15,6 +15,7 @@ export default [ items: [ { text: "Настройка IDE", link: "/ru/development/ide" }, { text: "Создание и сборка приложения", link: "/ru/development/building" }, + { text: "Структура проекта", link: "/ru/development/project-structure" }, { text: "Архитектурные решения", link: "/ru/development/architectural-patterns" }, { text: "Как вставлять картинки и другие ресурсы", link: "/ru/development/assets" }, { text: "Сторы - Vuex, Pinia и Composition API", link: "/ru/development/stores" }, diff --git a/docs/en/development/architectural-patterns.md b/docs/en/development/architectural-patterns.md index 591bf3a40..c5773351d 100644 --- a/docs/en/development/architectural-patterns.md +++ b/docs/en/development/architectural-patterns.md @@ -1,21 +1,5 @@ # Architectural patterns -::: details Suitable architecture for Vue 3 web application - -The most suitable architecture for a Vue 3 application is modular. - -Initially, the application is divided into logical modules that are loosely related to each other. For example, for an online store, it can be a product catalog module, a module of a single product, a user account module etc. - -In addition, there is a shell module - what is sometimes referred to as `app shell`. A template with a header, footer, side menu and main window. It is wise to put utilities and resources used throughout the application into this module - for example, `api`, `useI18n`, `BaseButton`and`stringHelpers`. - -Each module has its own `components`, `composables`, `assets`, `utils`; probably `api`, `routes`, `views`, `layouts`. - -Loose coupling allows each module to be developed fairly independently, which greatly increases the likelihood of project success. - -![image](/assets/images/modular-architecture.webp) - -::: - ::: details How to reuse the same developed resources on several projects? Sometimes there are two or more projects (admin panel and website, for example) that need to use the same components, utilities, services, composite functions and other resources that are in the process of development. diff --git a/docs/en/development/project-structure.md b/docs/en/development/project-structure.md new file mode 100644 index 000000000..ae5a35d3c --- /dev/null +++ b/docs/en/development/project-structure.md @@ -0,0 +1,270 @@ +# Vue 3 project structure + +## Possible file structures for Vue 3 projects + +::: details Flat Approach + +When launching a small-scale Vue project such as a Proof of Concept, you might prefer a straightforward folder structure to avoid complexity: +/src + +```txt +/src +|-- /components +| |-- BaseButton.vue +| |-- BaseCard.vue +| |-- PokemonList.vue +| |-- PokemonCard.vue +|-- /composables +| |-- usePokemon.js +|-- /utils +| |-- validators.js +|-- /layout +| |-- DefaultLayout.vue +| |-- AdminLayout.vue +|-- /plugins +| |-- translate.js +|-- /views +| |-- Home.vue +| |-- PokemonDetail.vue +|-- /router +| |-- index.js +|-- /store +| |-- index.js +|-- /assets +| |-- /images +| |-- /styles +|-- /tests +| |-- ... +|-- App.vue +|-- main.js +``` + +::: + +::: details Atomic Design + +For larger Vue applications, employing the Atomic Design methodology can be advantageous. This approach organizes components into a hierarchy from simplest to most complex: + +- Atoms: Basic elements (e.g., buttons, icons) +- Molecules: Groups of atoms (e.g., search bars) +- Organisms: Complex components (e.g., navigation bars) +- Templates: Layouts displaying component structure +- Pages: Actual UI screens with real data + +This method ensures scalability and maintainability, facilitating the transition between simple and complex components smoothly. + +![image](/images/faq/atomic-design.jpg) + +```txt +/src +|-- /components +| |-- /atoms +| | |-- AtomButton.vue +| | |-- AtomIcon.vue +| |-- /molecules +| | |-- MoleculeSearchInput.vue +| | |-- MoleculePokemonThumbnail.vue +| |-- /organisms +| | |-- OrganismPokemonCard.vue +| | |-- OrganismHeader.vue +| |-- /templates +| | |-- TemplatePokemonList.vue +| | |-- TemplatePokemonDetail.vue +|-- /pages +| |-- PageHome.vue +| |-- PagePokemonDetail.vue +|-- /composables +| |-- usePokemon.js +|-- /utils +| |-- validators.js +|-- /layout +| |-- LayoutDefault.vue +| |-- LayoutAdmin.vue +|-- /plugins +| |-- translate.js +|-- /router +| |-- index.js +|-- /store +| |-- index.js +|-- /assets +| |-- /images +| |-- /styles +|-- /tests +| |-- ... +|-- App.vue +|-- main.js + +``` + +::: + +::: details Modules + +As your project scales, consider a modular monolithic architecture. This structure encapsulates each feature or domain, enhancing maintainability and preparing for potential evolution towards microservices: + +```txt +/src +|-- /core +| |-- /components +| | |-- BaseButton.vue +| | |-- BaseIcon.vue +| |-- /models +| |-- /store +| |-- /services +| |-- /views +| | |-- DefaultLayout.vue +| | |-- AdminLayout.vue +| |-- /utils +| | |-- validators.js +|-- /modules +| |-- /pokemon +| | |-- /components +| | | |-- PokemonThumbnail.vue +| | | |-- PokemonCard.vue +| | | |-- PokemonListTemplate.vue +| | | |-- PokemonDetailTemplate.vue +| | |-- /models +| | |-- /store +| | | |-- pokemonStore.js +| | |-- /services +| | |-- /views +| | | |-- PokemonDetailPage.vue +| | |-- /tests +| | | |-- pokemonTests.spec.js +| |-- /search +| | |-- /components +| | | |-- SearchInput.vue +| | |-- /models +| | |-- /store +| | | |-- searchStore.js +| | |-- /services +| | |-- /views +| | |-- /tests +| | | |-- searchTests.spec.js +|-- /assets +| |-- /images +| |-- /styles +|-- /scss +|-- App.vue +|-- main.ts +|-- router.ts +|-- store.ts +|-- /tests +| |-- ... +|-- /plugins +| |-- translate.js +``` + +::: + +::: details Feature Sliced Design + +Feature-Sliced Design is a way to organize big and long-term projects so they are easier to manage and grow. This approach breaks the application into different layers, each with a specific role: + +- App: Global settings, styles, and providers. +- Pages: Builds full pages using entities, features, and widgets. +- Widgets: Combines entities and features into cohesive UI blocks, like IssueList or UserProfile. +- Features: Handles user interactions that add value, such as sending comments, adding to cart, or searching users. +- Entities: Represents core business models like User, Product, and Order. +- Shared: Provides reusable utilities and components unrelated to specific business logic, like UIKit, libraries, and APIs. + +![image](/images/faq/fsd.jpg) + +```txt +/src +|-- /app +| |-- App.vue +| |-- main.js +| |-- app.scss +|-- /processes +|-- /pages +| |-- Home.vue +| |-- PokemonDetailPage.vue +|-- /widgets +| |-- UserProfile.vue +| |-- PokemonStatsWidget.vue +|-- /features +| |-- pokemon +| | |-- CatchPokemon.vue +| | |-- PokemonList.vue +| |-- user +| | |-- Login.vue +| | |-- Register.vue +|-- /entities +| |-- user +| | |-- userService.js +| | |-- userModel.js +| |-- pokemon +| | |-- pokemonService.js +| | |-- pokemonModel.js +|-- /shared +| |-- ui +| | |-- BaseButton.vue +| | |-- BaseInput.vue +| | |-- Loader.vue +| |-- lib +| | |-- api.js +| | |-- helpers.js +|-- /assets +| |-- /images +| |-- /styles +|-- /router +| |-- index.js +|-- /store +| |-- index.js +|-- /tests +| |-- featureTests.spec.js +``` + +::: + +::: details Microfrontends + +Microfrontends take the idea of Microservices and apply it to the front-end part of web apps. This means different teams can work on different sections of a web app without interfering with each other. Each section, or "Microfrontend," works on its own and can change independently. Here's a basic overview for an SPA. Please note that I won't delve into the details of how Microfrontends actually work in this blog post. + +- Application Shell: This is the main controller that handles the basic layout and routing for the site. It connects all the Microfrontends together. +- Decomposed UIs: Each Microfrontend focuses on a specific part of the application. They can be developed with different technologies and updated separately. + +![image](/images/faq/microfronends.jpg) + +The main advantage is that Microfrontends let teams update parts of the app without waiting for others, which can speed up development. However, this setup can make the app more complex to manage and keep consistent. + +Useful Resources: +- [Micro Frontends - Extending Microservice Ideas to Frontend Development](https://micro-frontends.org/) +- [Martin Fowler on Microfrontends](https://martinfowler.com/articles/micro-frontends.html) + +This strategy is ideal for large, complex projects with multiple development teams. Each team can focus on specific business requirements without affecting the work of others, potentially using the technology that best suits their part of the application. + +::: + +::: details Comparison table + +| Approach | Description | Pros | Cons | +| --- | --- | --- | --- | +| **Flat Approach** | Simple structure, ideal for small projects or proof of concept. | \- Easy to implement
\- Minimal setup | \- Not scalable
\- Clutters as project grows | +| **Atomic Design** | Hierarchical structure based on component complexity. | \- Scalable
\- Organized
\- Reusable components | \- Overhead in managing layers
\- Complex setup | +| **Modules** | Modular structure that encapsulates features. | \- Scalable
\- Encapsulated features | \- Potential duplication
\- Can become complex | +| **Feature-Sliced Design** | Organizes project into functional layers and slices. | \- High cohesion
\- Clear feature separation | \- Initial complexity
\- Requires thorough planning | +| **Microfrontends** | Each part of the application is deployed separately. | \- Independent deployments
\- Scalable | \- High complexity
\- Coordination needed between teams | + +(с) [source](https://dev.to/alexanderop/how-to-structure-vue-projects-20i4) +::: + + +## Suitable architecture for Vue 3 web application + +The most suitable architecture for a Vue 3 application is `Modular`. + +Initially, the application is divided into logical modules that are loosely related to each other. For example, for an online store, it can be a product catalog module, a module of a single product, a user account module etc. + +In addition, there is a shell module - what is sometimes referred to as `app shell`. A template with a header, footer, side menu and main window. It is wise to put utilities and resources used throughout the application into this module - for example, `api`, `useI18n`, `BaseButton`and`stringHelpers`. + +Each module has its own `components`, `composables`, `assets`, `utils`; probably `api`, `routes`, `views`, `layouts`. + +Within the `components` directory of each module, a hierarchy of components like in `atomic design` can be arranged if necessary + +Loose coupling allows each module to be developed fairly independently, which greatly increases the likelihood of project success. + +![image](/assets/images/modular-architecture.webp) + +`Atomic design` and `FSD` were not invented for Vue, but for the frontend in general, and as a consequence contain excessive complexity and inconvenience. diff --git a/docs/public/images/faq/atomic-design.jpg b/docs/public/images/faq/atomic-design.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c2f58a6ff6d7778b0f634817e7d2dc1344b2b0a GIT binary patch literal 27312 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 literal 0 HcmV?d00001 diff --git a/docs/public/images/faq/microfronends.avif b/docs/public/images/faq/microfronends.avif new file mode 100644 index 0000000000000000000000000000000000000000..a1163cde5254aff0b38926e6bf7d7d717674bdbe GIT binary patch literal 17316 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 literal 0 HcmV?d00001 diff --git a/docs/public/images/faq/microfronends.jpg b/docs/public/images/faq/microfronends.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5af315a3dc20f31ffe4301ab0180e821cae247d0 GIT binary patch literal 35505 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

tx+m{vVdu5jM&EEvRf0U~aX)uOSCbE*6XCdGY@ zudX36r4S*Ad^iyXL-p>h;+8m$F5JzP_v^+kyAvq z5pbIIOh>hVLHV*Q=IHmPyEcs^ScnuAW^7S587d7;qjxHWuD=r=b6;zk$}F(!Rk*_> z*j#AUU)qSw3$k}8Ywkg+9K{JSD3gwyUb?SGmJAL9}4yj441hV z_I=OApE{IBB$tr8#|5VXawv+>T*d}NOq({-2Dhuo`XAyszzMqHuE1lB@AnPwQvw|c ztPr=;Ap3q_Bx&-P7MxzNi?mwXvZi-B<0y@{aMx*4DLkSTva(GcS;w z!YNOv?J=b$NwTQdmecL;h;G!ywD7a;-ilAYNVY`yY{tg7OK+_n98ugLEm>JVBx!nu z?no#zc%9tUt-tXscHCvyhBD>`*Y&{gPJnp+9;}oW!GN@yl0~9>BLcM@v_MWS-p=+5 zLq9rrInc~`4?enI%%qu7Rx)Dv@#~)d`P==$w<|dy#lzCma>6OY%HjC)vqA3pTWX9TmdD+qL-O2y1IR`F^UFUv9G;(A#2;f|dXGOnA1t6L z-053vAui+_CtCY$DL@-5lo^70s_VIoOcSpW{7Q ze!CZPjPz!fFA%-@qef-bF*80{F=xPz_lw*qi1qRvCRxoo8R=Qv8oQk2(ZCxtK zT)aM(u4CM4q6Ieeq&Zn!Rby79I1JdfXk;zQ>CrX>RZ@A~uc_#pn`eFll#&*<4-3_B z>%ZW=zJ+k%=Gd(<6#1Arglc@_SbXRnd6wv_Le5Jy$iJT8{}946{;6bXE5q)fpRudO zAfLZNr-f%15&94vXqy!L)HW7&TCoviYc1dWXjT2nRyjsox7qHb5x1jKc!@o`)HIOW zJwsqxYu=CLV?77=Ci$tJdhFPMUYTCQD|yhz4Y#(tZv*PI-<0KTiz+$&Bpo-#qlxq? z*fNL+OLzV3{6jL`wsPMD-bp~_*227kWv5v0hTJO4I>JUzJYYq zAX3Le%2KJZ#IAujyLWk*SE52h+S`h{2qY$h=b3*r8^)!DasYJ$%mQgM zO*6<>w99+xPgX+fYaNCt4p#5ojQVJavYpe^Eu)>q;D__-h1GVwHxuJr z6Q%GElwB^!IDxk($IwLnSq+^#LT#w=uFhtD+AaMZI4O-6Q3nP=UN zWxg&rwGAW)oyRc9zN@e`-JM9A7&9TG#Ilshq+z@=>bs@k3k5&5J^Ikf&$ z`NH_RWMLc2BG@?nbat^N}yO&GO!-Xgt&u9A;Sv~X>5N@=IiR; zz(kk9F#5c7(+ah{NOc|2jgwfl!?CwgllgiJ?M%ajD`)?Zt}cG3U&-`x%1+N46i^te znQNDdkFs+k#;es2`Ei@<$`9zfhZm%`ukrMIzaxYMEOeEi2VYEUcTWhC%?qUB5UP-m zj^j-g4`+2^K0mBfpgOLyc|$}Mi~Yv3VeSK48_piXIVVdV!M91iwgK}`c9H0y(`^YqiJV5I8=kPrAnj(w z6D1m&2*1~m{-)3RJdx*XXT9&|>phI&7f*?P1DQfOB{oxMB6Cs?}ke;nvkOj}_knbJ+W+jRfnWiO8E*L~Zr+dX*X ztqmpQ3c5&pP5zXTxm|?4v~58y)de^6SMT_jm)6!pU+M&d_ba zqP6YWGcv=Ib?9-|W4ky*QoXw)SdP?iHR#1a&Bc z?asjwZ4{VqtYmpO8%-7}258fpYmyQ;B0;FsJ1&LhR=3!Mc*915`N%xa zUfiCfLqh7_um5tzM6}bWx`q-k$3ZwWHXZ_!^&8HNBE34<_$d}Y91siU%E+M3zs{CK zp-{@%J;D*x9QSl%Dx5=MZb2I-!TZ!~z2$chr4~B(wO&Q24CnP)jbQY8H;o2~D8(3d zLqs+XLNqa#ls*z+#R{1&$9_j-KfL%87hIseMR?Uap075p^oyl%LjVb}q~qd^4tSG^hD! zr!bHuG1p1VBGlA@^2>Dt@nc%ddBsKMcb||o`rC`g?cn0R@6lr+7X|r8XWVvy@PMP<*kjF17^>~Yf8*i*FKrqbZo+2mc<2IPlZON9*UFMbr~zJDl+ zducMaFvV`#;98(QRP;u5T#b)N{6hGK?!fHbxzPG9_Pq;ekX+L1!&}}bfydP0=k8)S zvL0aRuz^K`ozM`q%|j%~2H}O;ZwW2VDhT=f0{%!J@_zADEOjidI`#UC{=mrQ=-H{zb;%16b!#sc4og3A*kC)q{ z)_m@{_xs?36XW7Oy86@`XQ{dwx&DFWeiU6lhF7U&%Wu9ttG!}ty1AgZ7b{!5*u)lj z&mc{rB*4jz@I!)I=(5(iaOULQqCO@7+qF4xNIW4|V6ovs-zgs&nS6>l`4=8)?tJC(S3t%e2^2qTVqE4h4)-z-&C>RRr-CZfyU*4SvJ%)#vXLu!w5r_`2R$YF^zZ=_>rkdW=-QP8Gb-xZzh#Y0Cyb&KN8<(kg-*#Ww2C8jc)eGF%Ee`>7 zfq>^W0nHNaPRl1-3;WHl9>ZxsrO&qot`kKr*p_>i%;`?wk+A)gdE^Ff2UIK<*DtM? zYBFcCYBFaiF+fseA#u96&uoM6d&_cH`*!sohF3Y~oJwR%gayFV9&H(z*$AziJ}`O9BU7&GevUblBgsD*_YA9 z+tSI%I8Y|m`!8KyMiuhBHD{wj&QlJFZ)2ba*T8}a(K|K(o#-- zvbS8i>cW{%$B9{Y`d$WX?W4^49uGRfgVovg8$HaPUum*!Jz^6jo3{}`)RqwrI(m(g zL%Qnw{)T}i}d)t2}&8ix} z%1fBOZV*aWXGOf=(ZlS@@xbBg$=?$-qpdy4?M9O^6XT&Nb>vT@-3>qSDJ$q$OMl8s zBDb+^M`4Qas8Lg}Biwsc_;s=}(_5Z9#Yn%_fS1XBO2R-88>3w0wBosrzfHKQ%luwc z9(}W{QGq7U9-0X7AsSy7(d;8)nE3(g<@6T`OYks-z;i9-nDCnl^bhX&h;zC)nLtLCpxdRO9}cg+}UYuQ#k#Q z;Hk%0L&UxOV9Ci+8YHSOuMR7tk|Rx2F7RI-3TSA9u^Q@w;#V-xHwf~g)Q{%Z`^Y%6-%{upAuF-V?@czCcF=LoQIic!o%Bh-V9U`ufF1sMJt%3 zCbSLZ$BxNt7cZ|mRi<{`jwuP`n|n1}o|WP*F1xc9BITE@Et6kGSZx~H+}x~hrJP1F zDxkM}swb8fVv}$!S5%t2|L!e#qTVKjtRX$h!8^f3IMO&p3p;MzvTYl)0jqW{O`rPB z+gr`g*>Ytky%<++`HUKA>%@V%eFooTgW0667r>cYv7U|bLYNe88r z6&?_Bo>+GIF7ocj2<4MjEZ@f~rMEMU>FkXkXIL^u3ns5(Ka0kUYL9$lI$bRKuJjw2 zlQ1r7ntOlnu(|)(BH^XJ0^YgZ%qG^PzRvm$v`D-FuLg|2tho3MSY!xB{F;;)lhBSh z=|x`&RG_Qe`+>RpT&Md%<^-$g0g)M(cA#FEJyssM#opK4AD0JLJJCW(Tcj5OmBkxc zr?}{89H?fW5+|RFbRMT|bwSxxbOQe+7gc)ik%2n%dxHBd{5fY|FH2O}1)zlczL0@; zp>@o)`aVJbjTr~$_ZNz-+Wa_%n;Z%6Qt*5pUjCG9HaYBg%YHareZsJp&l{zV>?@lKy>41VMO?f2^c0^py-AOHXW literal 0 HcmV?d00001 diff --git a/docs/ru/development/architectural-patterns.md b/docs/ru/development/architectural-patterns.md index eb779b4fa..05bbed666 100644 --- a/docs/ru/development/architectural-patterns.md +++ b/docs/ru/development/architectural-patterns.md @@ -1,6 +1,245 @@ # Архитектурные решения -::: details Подходящая архитектура для Vue 3 веб-приложения +::: details Какие бывают структуры для Vue 3 проектов? + +### Плоская + +При запуске небольшого проекта Vue, такого как Proof of Concept, вы можете предпочесть простую структуру папок, чтобы избежать сложностей: + +```txt +/src +|-- /components +| |-- BaseButton.vue +| |-- BaseCard.vue +| |-- PokemonList.vue +| |-- PokemonCard.vue +|-- /composables +| |-- usePokemon.js +|-- /utils +| |-- validators.js +|-- /layout +| |-- DefaultLayout.vue +| |-- AdminLayout.vue +|-- /plugins +| |-- translate.js +|-- /views +| |-- Home.vue +| |-- PokemonDetail.vue +|-- /router +| |-- index.js +|-- /store +| |-- index.js +|-- /assets +| |-- /images +| |-- /styles +|-- /tests +| |-- ... +|-- App.vue +|-- main.js +``` + +### Атомарный дизайн + +Для больших приложений Vue может оказаться полезным использование методологии Atomic Design. Этот подход организует компоненты в иерархию от самого простого к самому сложному: + +- Атомы: Базовые элементы (например, кнопки, иконки). +- Молекулы: Группы атомов (например, строки поиска). +- Организмы: Сложные компоненты (например, панели навигации) +- Шаблоны: Макеты, отображающие структуру компонентов +- Страницы: Реальные экраны пользовательского интерфейса с реальными данными. + +Этот метод обеспечивает масштабируемость и поддерживаемость, облегчая плавный переход от простых к сложным компонентам. + +![image](/images/faq/atomic-design.jpg) + +```txt +/src +|-- /components +| |-- /atoms +| | |-- AtomButton.vue +| | |-- AtomIcon.vue +| |-- /molecules +| | |-- MoleculeSearchInput.vue +| | |-- MoleculePokemonThumbnail.vue +| |-- /organisms +| | |-- OrganismPokemonCard.vue +| | |-- OrganismHeader.vue +| |-- /templates +| | |-- TemplatePokemonList.vue +| | |-- TemplatePokemonDetail.vue +|-- /pages +| |-- PageHome.vue +| |-- PagePokemonDetail.vue +|-- /composables +| |-- usePokemon.js +|-- /utils +| |-- validators.js +|-- /layout +| |-- LayoutDefault.vue +| |-- LayoutAdmin.vue +|-- /plugins +| |-- translate.js +|-- /router +| |-- index.js +|-- /store +| |-- index.js +|-- /assets +| |-- /images +| |-- /styles +|-- /tests +| |-- ... +|-- App.vue +|-- main.js + +``` + +### Модульный дизайн + +По мере масштабирования проекта рассмотрите возможность создания модульной архитектуры. Такая структура инкапсулирует каждую функцию или домен, повышая поддерживоемость и готовя к потенциальной эволюции в сторону микросервисов: + +```txt +/src +|-- /core +| |-- /components +| | |-- BaseButton.vue +| | |-- BaseIcon.vue +| |-- /models +| |-- /store +| |-- /services +| |-- /views +| | |-- DefaultLayout.vue +| | |-- AdminLayout.vue +| |-- /utils +| | |-- validators.js +|-- /modules +| |-- /pokemon +| | |-- /components +| | | |-- PokemonThumbnail.vue +| | | |-- PokemonCard.vue +| | | |-- PokemonListTemplate.vue +| | | |-- PokemonDetailTemplate.vue +| | |-- /models +| | |-- /store +| | | |-- pokemonStore.js +| | |-- /services +| | |-- /views +| | | |-- PokemonDetailPage.vue +| | |-- /tests +| | | |-- pokemonTests.spec.js +| |-- /search +| | |-- /components +| | | |-- SearchInput.vue +| | |-- /models +| | |-- /store +| | | |-- searchStore.js +| | |-- /services +| | |-- /views +| | |-- /tests +| | | |-- searchTests.spec.js +|-- /assets +| |-- /images +| |-- /styles +|-- /scss +|-- App.vue +|-- main.ts +|-- router.ts +|-- store.ts +|-- /tests +| |-- ... +|-- /plugins +| |-- translate.js +``` + +### Feature Sliced Design + +Feature-Sliced Design - это способ организации больших и долгосрочных проектов, чтобы ими было легче управлять и развивать. При таком подходе приложение разбивается на различные слои, каждый из которых играет определенную роль: + +- App: Приложение: Глобальные настройки, стили и провайдеры. +- Pages: Создание полноценных страниц с использованием сущностей, функций и виджетов. +- Widgets: Объединяют сущности и функции в целостные блоки пользовательского интерфейса, например IssueList или UserProfile. +- Functions: Обрабатывают пользовательские взаимодействия, которые добавляют ценность, такие как отправка комментариев, добавление в корзину или поиск пользователей. +- Entities: Представляют основные бизнес-модели, такие как пользователь, продукт и заказ. +- Shared: Предоставляет многократно используемые утилиты и компоненты, не связанные с конкретной бизнес-логикой, такие как UIKit, библиотеки и API. + +![image](/images/faq/fsd.jpg) + +```txt +/src +|-- /app +| |-- App.vue +| |-- main.js +| |-- app.scss +|-- /processes +|-- /pages +| |-- Home.vue +| |-- PokemonDetailPage.vue +|-- /widgets +| |-- UserProfile.vue +| |-- PokemonStatsWidget.vue +|-- /features +| |-- pokemon +| | |-- CatchPokemon.vue +| | |-- PokemonList.vue +| |-- user +| | |-- Login.vue +| | |-- Register.vue +|-- /entities +| |-- user +| | |-- userService.js +| | |-- userModel.js +| |-- pokemon +| | |-- pokemonService.js +| | |-- pokemonModel.js +|-- /shared +| |-- ui +| | |-- BaseButton.vue +| | |-- BaseInput.vue +| | |-- Loader.vue +| |-- lib +| | |-- api.js +| | |-- helpers.js +|-- /assets +| |-- /images +| |-- /styles +|-- /router +| |-- index.js +|-- /store +| |-- index.js +|-- /tests +| |-- featureTests.spec.js +``` + +### Микрофронтенды + +Микрофронтенды берут за основу идею микросервисов и применяют ее к фронтенд-части веб-приложений. Это означает, что разные команды могут работать над разными разделами веб-приложения, не мешая друг другу. Каждый раздел, или «микрофронтенд», работает сам по себе и может изменяться независимо. Вот базовый обзор SPA. Обратите внимание, что в этой статье я не буду углубляться в детали того, как на самом деле работают микрофронтенды. + +Оболочка приложения: Это основной контроллер, который управляет базовой версткой и маршрутизацией сайта. Он соединяет все микрофронтенды вместе. +Декомпозированные пользовательские интерфейсы: Каждый микрофронтенд фокусируется на определенной части приложения. Они могут быть разработаны с использованием разных технологий и обновляться отдельно. + +![image](/images/faq/microfronends.jpg) + +Основное преимущество заключается в том, что микрофронтенды позволяют командам обновлять отдельные части приложения, не дожидаясь остальных, что ускоряет разработку. Однако такая настройка может сделать приложение более сложным в управлении и поддержании последовательности. + +Полезные ресурсы: +[Micro Frontends - Extending Microservice Ideas to Frontend Development](https://micro-frontends.org/) +[Martin Fowler on Microfrontends](https://martinfowler.com/articles/micro-frontends.html) + +Эта стратегия идеально подходит для крупных, сложных проектов с несколькими командами разработчиков. Каждая команда может сосредоточиться на конкретных бизнес-требованиях, не влияя на работу других, и потенциально использовать технологии, которые лучше всего подходят для их части приложения. + +::: + +::: details Сравнительная таблица + +| Подход | Описание | Плюсы | Минусы | +| --- | --- | --- | --- | +| **Плоский подход** | Простая структура, идеально подходящая для небольших проектов или проверки концепции. | \- Простота реализации
\- Минимальная настройка | \- Не масштабируется
\- Беспорядок по мере роста проекта | +| **Атомный дизайн** | Иерархическая структура, основанная на сложности компонентов. | \- Масштабируемые
\- Организованные
\- Многоразовые компоненты | \- Накладные расходы на управление слоями
\- Сложная настройка | +| **Модули** | Модульная структура, инкапсулирующая функции. | \- Масштабируемость
\- Инкапсулированные функции | \- Возможное дублирование
\- Может стать сложным | +| **Многофункциональный дизайн** | Организует проект по функциональным слоям и фрагментам. | \- Высокая сплоченность
\- Четкое разделение функций | \- Начальная сложность
\- Требует тщательного планирования | +| **Микроинтерфейсы** | Каждая часть приложения развертывается отдельно. | \- Независимые развертывания
\- Масштабируемость | \- Высокая сложность
\- Необходима координация между командами | +::: + +::: details Подходящая структура для Vue 3 проекта Самая удобная архитектура для Vue 3 приложения - модульная. diff --git a/docs/ru/development/project-structure.md b/docs/ru/development/project-structure.md new file mode 100644 index 000000000..104863703 --- /dev/null +++ b/docs/ru/development/project-structure.md @@ -0,0 +1,273 @@ +# Структура Vue 3 проекта + +## Какие бывают структуры файлов для Vue 3 проектов? + +::: details Плоская структура + +При запуске небольшого проекта Vue, такого как Proof of Concept, вы можете предпочесть простую структуру папок, чтобы избежать сложностей: + +```txt +/src +|-- /components +| |-- BaseButton.vue +| |-- BaseCard.vue +| |-- PokemonList.vue +| |-- PokemonCard.vue +|-- /composables +| |-- usePokemon.js +|-- /utils +| |-- validators.js +|-- /layout +| |-- DefaultLayout.vue +| |-- AdminLayout.vue +|-- /plugins +| |-- translate.js +|-- /views +| |-- Home.vue +| |-- PokemonDetail.vue +|-- /router +| |-- index.js +|-- /store +| |-- index.js +|-- /assets +| |-- /images +| |-- /styles +|-- /tests +| |-- ... +|-- App.vue +|-- main.js +``` + +::: + +::: details Атомарный дизайн + +Для больших приложений Vue может оказаться полезным использование методологии Atomic Design. Этот подход организует компоненты в иерархию от самого простого к самому сложному: + +- Атомы: Базовые элементы (например, кнопки, иконки). +- Молекулы: Группы атомов (например, строки поиска). +- Организмы: Сложные компоненты (например, панели навигации) +- Шаблоны: Макеты, отображающие структуру компонентов +- Страницы: Реальные экраны пользовательского интерфейса с реальными данными. + +Этот метод обеспечивает масштабируемость и поддерживаемость, облегчая плавный переход от простых к сложным компонентам. + +![image](/images/faq/atomic-design.jpg) + +```txt +/src +|-- /components +| |-- /atoms +| | |-- AtomButton.vue +| | |-- AtomIcon.vue +| |-- /molecules +| | |-- MoleculeSearchInput.vue +| | |-- MoleculePokemonThumbnail.vue +| |-- /organisms +| | |-- OrganismPokemonCard.vue +| | |-- OrganismHeader.vue +| |-- /templates +| | |-- TemplatePokemonList.vue +| | |-- TemplatePokemonDetail.vue +|-- /pages +| |-- PageHome.vue +| |-- PagePokemonDetail.vue +|-- /composables +| |-- usePokemon.js +|-- /utils +| |-- validators.js +|-- /layout +| |-- LayoutDefault.vue +| |-- LayoutAdmin.vue +|-- /plugins +| |-- translate.js +|-- /router +| |-- index.js +|-- /store +| |-- index.js +|-- /assets +| |-- /images +| |-- /styles +|-- /tests +| |-- ... +|-- App.vue +|-- main.js + +``` + +::: + +::: details Модульный дизайн + +Модульная архитектура инкапсулирует каждую функцию или предметную область, повышая поддерживаемость и готовя к потенциальной эволюции в сторону микрофронтендов: + +```txt +/src +|-- /core +| |-- /components +| | |-- BaseButton.vue +| | |-- BaseIcon.vue +| |-- /models +| |-- /store +| |-- /services +| |-- /views +| | |-- DefaultLayout.vue +| | |-- AdminLayout.vue +| |-- /utils +| | |-- validators.js +|-- /modules +| |-- /pokemon +| | |-- /components +| | | |-- PokemonThumbnail.vue +| | | |-- PokemonCard.vue +| | | |-- PokemonListTemplate.vue +| | | |-- PokemonDetailTemplate.vue +| | |-- /models +| | |-- /store +| | | |-- pokemonStore.js +| | |-- /services +| | |-- /views +| | | |-- PokemonDetailPage.vue +| | |-- /tests +| | | |-- pokemonTests.spec.js +| |-- /search +| | |-- /components +| | | |-- SearchInput.vue +| | |-- /models +| | |-- /store +| | | |-- searchStore.js +| | |-- /services +| | |-- /views +| | |-- /tests +| | | |-- searchTests.spec.js +|-- /assets +| |-- /images +| |-- /styles +|-- /scss +|-- App.vue +|-- main.ts +|-- router.ts +|-- store.ts +|-- /tests +| |-- ... +|-- /plugins +| |-- translate.js +``` + +::: + +::: details Feature Sliced Design + +Feature-Sliced Design - это способ организации больших и долгосрочных проектов, чтобы ими было легче управлять и развивать. При таком подходе приложение разбивается на различные слои, каждый из которых играет определенную роль: + +- App: Приложение: Глобальные настройки, стили и провайдеры. +- Pages: Создание полноценных страниц с использованием сущностей, функций и виджетов. +- Widgets: Объединяют сущности и функции в целостные блоки пользовательского интерфейса, например IssueList или UserProfile. +- Functions: Обрабатывают пользовательские взаимодействия, которые добавляют ценность, такие как отправка комментариев, добавление в корзину или поиск пользователей. +- Entities: Представляют основные бизнес-модели, такие как пользователь, продукт и заказ. +- Shared: Предоставляет многократно используемые утилиты и компоненты, не связанные с конкретной бизнес-логикой, такие как UIKit, библиотеки и API. + +![image](/images/faq/fsd.jpg) + +```txt +/src +|-- /app +| |-- App.vue +| |-- main.js +| |-- app.scss +|-- /processes +|-- /pages +| |-- Home.vue +| |-- PokemonDetailPage.vue +|-- /widgets +| |-- UserProfile.vue +| |-- PokemonStatsWidget.vue +|-- /features +| |-- pokemon +| | |-- CatchPokemon.vue +| | |-- PokemonList.vue +| |-- user +| | |-- Login.vue +| | |-- Register.vue +|-- /entities +| |-- user +| | |-- userService.js +| | |-- userModel.js +| |-- pokemon +| | |-- pokemonService.js +| | |-- pokemonModel.js +|-- /shared +| |-- ui +| | |-- BaseButton.vue +| | |-- BaseInput.vue +| | |-- Loader.vue +| |-- lib +| | |-- api.js +| | |-- helpers.js +|-- /assets +| |-- /images +| |-- /styles +|-- /router +| |-- index.js +|-- /store +| |-- index.js +|-- /tests +| |-- featureTests.spec.js +``` + +::: + +::: details Микрофронтенды + +Микрофронтенды берут за основу идею микросервисов и применяют ее к фронтенд-части веб-приложений. Это означает, что разные команды могут работать над разными разделами веб-приложения, не мешая друг другу. Каждый раздел, или «микрофронтенд», работает сам по себе и может изменяться независимо. Вот базовый обзор SPA. + +- Оболочка приложения: Это основной контроллер, который управляет базовой версткой и маршрутизацией сайта. Он соединяет все микрофронтенды вместе. +- Декомпозированные пользовательские интерфейсы: Каждый микрофронтенд фокусируется на определенной части приложения. Они могут быть разработаны с использованием разных технологий и обновляться отдельно. + +![image](/images/faq/microfronends.jpg) + +Основное преимущество заключается в том, что микрофронтенды позволяют командам обновлять отдельные части приложения, не дожидаясь остальных, что ускоряет разработку. Однако такая настройка может сделать приложение более сложным в управлении и поддержании последовательности. + +Полезные ресурсы: +- [Micro Frontends - Extending Microservice Ideas to Frontend Development](https://micro-frontends.org/) +- [Martin Fowler on Microfrontends](https://martinfowler.com/articles/micro-frontends.html) + +Эта стратегия подходит для крупных, сложных проектов с несколькими командами разработчиков. Каждая команда может сосредоточиться на конкретных бизнес-требованиях, не влияя на работу других, и потенциально использовать технологии, которые лучше всего подходят для их части приложения. + +::: + +::: details Сравнительная таблица + +| Подход | Описание | Плюсы | Минусы | +| --- | --- | --- | --- | +| **Плоский подход** | Простая структура, идеально подходящая для небольших проектов или проверки концепции. | \- Простота реализации
\- Минимальная настройка | \- Не масштабируется
\- Беспорядок по мере роста проекта | +| **Атомный дизайн** | Иерархическая структура, основанная на сложности компонентов. | \- Масштабируемые
\- Организованные
\- Многоразовые компоненты | \- Накладные расходы на управление слоями
\- Сложная настройка | +| **Модули** | Модульная структура, инкапсулирующая функции. | \- Масштабируемость
\- Инкапсулированные функции | \- Возможное дублирование
\- Может стать сложным | +| **FSD** | Организует проект по функциональным слоям и фрагментам. | \- Высокая сплоченность
\- Четкое разделение функций | \- Начальная сложность
\- Требует тщательного планирования | +| **Микрофронтенды** | Каждая часть приложения развертывается отдельно. | \- Независимые развертывания
\- Масштабируемость | \- Высокая сложность
\- Необходима координация между командами | + +(с) [source](https://dev.to/alexanderop/how-to-structure-vue-projects-20i4) +::: + + +## Подходящая структура для Vue 3 проекта + +Самая удобная архитектура для Vue 3 приложения - `Модульная`. + +Изначально, приложение разбивается на логические модули, слабо связанные друг с другом. Например, для онлайн магазина это могут быть модуль каталога товаров, модуль отдельного товара, модуль личного кабинета / аккаунта пользователя. + +Кроме того, есть модуль оболочки - то, что иногда называет `app shell`. Шаблон с хедером, футером, боковым меню и главным окном. В этот модуль целесообразно поместить утилиты и ресурсы, используемые по всему приложению - например, `api`, `useI18n`, `BaseButton` и `stringHelpers`. + +В каждом модуле свои `components`, `composables`, `assets`, `utils`; возможно, `api`, `routes`, `views`, `layouts`. + +Внутри `components` каждого модуля при необходимости можно устроить иерархию компонентов наподобие `атомарного дизайна` + +Слабая связанность позволяет разрабатывать каждый модуль достаточно независимо, что значительно повышает вероятность успешности проекта. + +`Плоская структура` - вырожденная форма модульной с одним модулем. В то же время модульная структура органично перерастает при необходимости в `Микрофронтенды`. + +![image](/assets/images/modular-architecture.webp) + +`Атомарный дизайн` и `FSD` изобретались не для Vue, а для фронтенда в целом, в следствие чего содержат избыточную сложность и неудобства. + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10f160760..3f08df9e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -246,10 +246,10 @@ packages: eslint-flat-config-utils: 0.2.4 eslint-merge-processors: 0.1.0(eslint@8.57.0) eslint-plugin-antfu: 2.2.0(eslint@8.57.0) - eslint-plugin-command: 0.2.0(eslint@8.57.0) + eslint-plugin-command: 0.2.1(eslint@8.57.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) eslint-plugin-import-x: 0.5.0(eslint@8.57.0)(typescript@5.4.5) - eslint-plugin-jsdoc: 48.2.4(eslint@8.57.0) + eslint-plugin-jsdoc: 48.2.5(eslint@8.57.0) eslint-plugin-jsonc: 2.15.1(eslint@8.57.0) eslint-plugin-markdown: 5.0.0(eslint@8.57.0) eslint-plugin-n: 17.7.0(eslint@8.57.0) @@ -356,7 +356,7 @@ packages: resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} dependencies: '@docsearch/react': 3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0) - preact: 10.21.0 + preact: 10.22.0 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -1134,20 +1134,20 @@ packages: '@vue/compiler-dom': 3.4.27 '@vue/shared': 3.4.27 - /@vue/devtools-api@7.1.3(vue@3.4.27): - resolution: {integrity: sha512-W8IwFJ/o5iUk78jpqhvScbgCsPiOp2uileDVC0NDtW38gCWhsnu9SeBTjcdu3lbwLdsjc+H1c5Msd/x9ApbcFA==} + /@vue/devtools-api@7.2.0(vue@3.4.27): + resolution: {integrity: sha512-92RsjyH9WKNFO6U/dECUMakq4dm2CeqEDJYLJ8wZ81AnCifpXE7d4jPIjK34ENsPaapA6BSfIZdH/qzLOHiepA==} dependencies: - '@vue/devtools-kit': 7.1.3(vue@3.4.27) + '@vue/devtools-kit': 7.2.0(vue@3.4.27) transitivePeerDependencies: - vue dev: true - /@vue/devtools-kit@7.1.3(vue@3.4.27): - resolution: {integrity: sha512-NFskFSJMVCBXTkByuk2llzI3KD3Blcm7WqiRorWjD6nClHPgkH5BobDH08rfulqq5ocRt5xV+3qOT1Q9FXJrwQ==} + /@vue/devtools-kit@7.2.0(vue@3.4.27): + resolution: {integrity: sha512-Kx+U0QiQg/g714euYKfnCdhTcOycSlH1oyTE57D0sAmisdsRCNLfXcnnIwcFY2jdCpuz9DNbuE0VWQuYF5zAZQ==} peerDependencies: vue: ^3.0.0 dependencies: - '@vue/devtools-shared': 7.1.3 + '@vue/devtools-shared': 7.2.0 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 @@ -1155,8 +1155,8 @@ packages: vue: 3.4.27(typescript@5.4.5) dev: true - /@vue/devtools-shared@7.1.3: - resolution: {integrity: sha512-KJ3AfgjTn3tJz/XKF+BlVShNPecim3G21oHRue+YQOsooW+0s+qXvm09U09aO7yBza5SivL1QgxSrzAbiKWjhQ==} + /@vue/devtools-shared@7.2.0: + resolution: {integrity: sha512-gVr3IjKjU7axNvclRgICgy1gq/TDnF1hhBAEox+l5mMXZiTIFVIm1zpcIPssc0HxMDgzy+lXqOVsY4DGyZ+ZeA==} dependencies: rfdc: 1.3.1 dev: true @@ -1389,7 +1389,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001618 - electron-to-chromium: 1.4.768 + electron-to-chromium: 1.4.772 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) dev: true @@ -1576,8 +1576,8 @@ packages: esutils: 2.0.3 dev: true - /electron-to-chromium@1.4.768: - resolution: {integrity: sha512-z2U3QcvNuxdkk33YV7R1bVMNq7fL23vq3WfO5BHcqrm4TnDGReouBfYKLEFh5umoK1XACjEwp8mmnhXk2EJigw==} + /electron-to-chromium@1.4.772: + resolution: {integrity: sha512-jFfEbxR/abTTJA3ci+2ok1NTuOBBtB4jH+UT6PUmRN+DY3WSD4FFRsgoVQ+QNIJ0T7wrXwzsWCI2WKC46b++2A==} dev: true /emoji-regex@8.0.0: @@ -1699,11 +1699,12 @@ packages: eslint: 8.57.0 dev: true - /eslint-plugin-command@0.2.0(eslint@8.57.0): - resolution: {integrity: sha512-SGOMTs6Pu5HQKwCF9uZ214cdVlJ99U+6GRoUS01zeLZmcQcFU4YXy2KTKqXaEsNCvaFY91OrHRZbh4/1xt9Yzw==} + /eslint-plugin-command@0.2.1(eslint@8.57.0): + resolution: {integrity: sha512-dA44MFCzjNpGlKa1xRA+qi2bTbpf5+zr2JgWUp9IFPteN+qCIS8DHu4EGmPs1680STcwQPvYBANFudpvIOeCYA==} peerDependencies: eslint: '*' dependencies: + '@es-joy/jsdoccomment': 0.43.0 eslint: 8.57.0 dev: true @@ -1750,8 +1751,8 @@ packages: - typescript dev: true - /eslint-plugin-jsdoc@48.2.4(eslint@8.57.0): - resolution: {integrity: sha512-3ebvVgCJFy06gpmuS2ynz13uh9iFSzZ1C1dDkgcSAqVVg82zlORKMk2fvjq708pAO6bwfs5YLttknFEbaoDiGw==} + /eslint-plugin-jsdoc@48.2.5(eslint@8.57.0): + resolution: {integrity: sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -2822,8 +2823,8 @@ packages: picocolors: 1.0.1 source-map-js: 1.2.0 - /preact@10.21.0: - resolution: {integrity: sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg==} + /preact@10.22.0: + resolution: {integrity: sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==} dev: true /prelude-ls@1.2.1: @@ -3303,7 +3304,7 @@ packages: '@shikijs/transformers': 1.5.2 '@types/markdown-it': 14.1.1 '@vitejs/plugin-vue': 5.0.4(vite@5.2.11)(vue@3.4.27) - '@vue/devtools-api': 7.1.3(vue@3.4.27) + '@vue/devtools-api': 7.2.0(vue@3.4.27) '@vueuse/core': 10.9.0(vue@3.4.27) '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.27) focus-trap: 7.5.4