摘要:組件劃分這種的話組件劃分的比較清晰。將組件強(qiáng)勢(shì)得分為類,這種結(jié)構(gòu)上雖然非常清晰,但是在項(xiàng)目開(kāi)發(fā)的過(guò)程中你不得不頻繁地將組件在跟之間移來(lái)移去,降低了開(kāi)發(fā)體驗(yàn)。
緣由
在開(kāi)發(fā)項(xiàng)目的過(guò)程中,大家多多少少會(huì)對(duì)自己項(xiàng)目的目錄結(jié)構(gòu)產(chǎn)生疑惑,如何合理地劃分模塊以及如何合理的命名,這些如果在項(xiàng)目前期的時(shí)候沒(méi)有好好規(guī)范好的話,那么后面新進(jìn)來(lái)的人便會(huì)按照自己的邏輯又重新在劃分自己的目錄,這樣日復(fù)一日項(xiàng)目體積不但會(huì)增加而且目錄結(jié)構(gòu)會(huì)越來(lái)越混亂,因此非常有必要聚焦項(xiàng)目的文件目錄,本文也是出于這樣的一個(gè)出發(fā)點(diǎn)來(lái)寫(xiě)的,先來(lái)看看幾個(gè)優(yōu)秀項(xiàng)目的目錄。
crate-react-app├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ └── manifest.json └── src ├── App.css ├── App.js ├── App.test.js ├── Lazy.js ├── index.css ├── index.js ├── logo.svg └── serviceWorker.js
create-react-app是非常的簡(jiǎn)潔,只包含了src以及public2個(gè)目錄。
@vue/cli├── package.json ├── public │ ├── favicon.ico │ └── index.html └── src ├── App.vue ├── assets │ └── logo.png ├── components │ └── HelloWorld.vue └── main.js
vue的cli也是如出一轍。
nuxt├── assets ├── components │ └── Logo.vue ├── layouts │ └── default.vue ├── middleware ├── nuxt.config.js ├── package-lock.json ├── package.json ├── pages │ └── index.vue ├── plugins ├── server │ └── index.js ├── static │ └── favicon.ico └── store
相對(duì)于SPA應(yīng)用,MPA應(yīng)用特別是同構(gòu)應(yīng)用來(lái)說(shuō),目錄結(jié)構(gòu)也是很清晰的。
那么如何組織文件才合理呢?答案便是組件化,一切以組件為核心來(lái)建立相應(yīng)的文件目錄,這里有幾種劃分組件的方式:
1、公共組件與業(yè)務(wù)組件:一般比較常用的劃分方式便是有公共用到的組件便往上提升一級(jí),遇到部分頁(yè)面用到的組件的話有可能放到跟頁(yè)面同級(jí)也有可能直接放到最上面的一級(jí),例如:
├── common │ ├── Footer │ ├── Header │ └── Slider └── pages ├── _common │ └── banner ├── index └── info
這種優(yōu)點(diǎn)的話比較靈活,但是局部的公共部分你很難去界定。
2、BEM組件劃分這種的話組件劃分的比較清晰。
├── Blocks │ ├── Avatar │ │ ├── index.js │ ├── Button │ │ ├── index.js │ ├── Header │ │ ├── index.js │ │ └── style.scss ├── Elements │ ├── DownloadBtn.js │ ├── Logo.js └── Icons ├── Audience.js
將組件強(qiáng)勢(shì)得分為3類,這種結(jié)構(gòu)上雖然非常清晰,但是在項(xiàng)目開(kāi)發(fā)的過(guò)程中你不得不頻繁地將組件在Block跟Elemens之間移來(lái)移去,降低了開(kāi)發(fā)體驗(yàn)。
3、容器組件與展示型組件├── components │ ├── Banner │ ├── Footer │ └── Header ├── containers │ ├── ArticleDetail │ └── CommentList └── screens └── home
這里就要看你怎么定義什么是容器組件跟展示型組件了,對(duì)于日常的開(kāi)發(fā)來(lái)說(shuō),這2者是沒(méi)有強(qiáng)制的邊界的,兩者之間可以隨意切換,也并不是說(shuō)展示組件一定非得是純組件,也不一定是說(shuō)容器組件一定非得有狀態(tài)跟生命周期,而對(duì)于本人來(lái)說(shuō),一個(gè)很好的準(zhǔn)則就是展示組件是為了解耦,容器組件是為了內(nèi)聚。
4、樣式組件與邏輯組件如果項(xiàng)目中有用到css-in-js之類的工具,如styled-component,想必會(huì)想到樣式放在哪里這個(gè)問(wèn)題,于是便會(huì)出現(xiàn)如下情況:
./ └── Avatar ├── index.js └── styles └── styleWrapper.js
這就會(huì)多出來(lái)一種邏輯出來(lái)。
那么有沒(méi)有統(tǒng)一的一種方式來(lái)規(guī)范好組件的文件目錄呢?答案是有的,這種是基于以上幾種劃分方式來(lái)的,通常開(kāi)發(fā)一個(gè)組件的時(shí)候有可能被認(rèn)定為樣式組件或者容器組件,那么我們這時(shí)就不把它們分開(kāi),而是所有的組件都放在components目錄下面,再根據(jù)模塊進(jìn)行劃分,所有的頁(yè)面都是通過(guò)模塊組件進(jìn)行組合,最外層的頁(yè)面組件則是應(yīng)該是最簡(jiǎn)潔以及少代碼量的。如下:
├── components │ └── User │ ├── Avatar │ │ ├── images │ │ ├── index.js │ │ └── style.scss │ ├── InfoCard │ │ ├── images │ │ ├── indexjs │ │ └── style.scss │ └── LoginBox │ ├── reaList │ │ ├── images │ │ ├── index.js │ │ └── style.scss │ ├── index.js │ └── style.scss └── screens └── home └── index.js
例如在用戶模塊這個(gè)目錄下,有頭像、信息卡以及登陸框的情景,我們限定image、js、scss分別在每個(gè)組件目錄下,這樣做的話,單個(gè)組件如果要遷移的話就可以非常方便的移動(dòng)了,這里再說(shuō)明下LoginBox下面的AreaList,如果再LoginBox要添加功能的話,那么直接就在這個(gè)組件添加,也非常方便地?cái)U(kuò)展了。
最后至于文件如何命名這個(gè)要看項(xiàng)目組如何規(guī)定,但有個(gè)通用原則是如果是類的話必須是首字母大寫(xiě),我上面的例子,由于組件也可以看成是一個(gè)類,因此大寫(xiě)是比較清晰的,至于組件的命名,有個(gè)比較流行的方式叫path-base-naming,就是基于文件路徑來(lái)命名,例如在home/index.js 里面命名AreaList的話就可以這樣:
import LoginBoxAreaList from "../../components/LoginBox/AreaList";
但如果在LoginBox目錄下命名就不再需要這么長(zhǎng)了.
import AreaList from "./AreaList";總結(jié)
最后基于這種分模塊的方式,開(kāi)發(fā)者可以自由的將容器組件或者展示組件分布在各個(gè)獨(dú)立的組件文件夾之中,可以說(shuō)規(guī)范和靈活性都得到了保障。
參考https://medium.com/@dan_abram...
https://hackernoon.com/struct...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/109266.html
摘要:作為一個(gè)庫(kù),它沒(méi)有規(guī)定項(xiàng)目的整體結(jié)構(gòu)。位于的組件應(yīng)命名為。組件根據(jù)其與組件或的相對(duì)路徑進(jìn)行相應(yīng)命名??紤]這樣一個(gè)場(chǎng)景,處于位置的組件會(huì)被命名為而不是。 React 作為一個(gè)庫(kù),它沒(méi)有規(guī)定項(xiàng)目的整體結(jié)構(gòu)。這很好,因?yàn)樗o了我們自由去嘗試不同的方法,并適應(yīng)更適合我們的方式。另一方面,這可能會(huì)給React領(lǐng)域的開(kāi)發(fā)人員帶來(lái)一些困惑。 我將會(huì)在本文為大家展示我已經(jīng)使用過(guò)一段時(shí)間并且效果不錯(cuò)的方...
摘要:父類為,代表著一系列文章的列表。對(duì)于可讀性較好地與代碼,不應(yīng)該像一本書(shū),而應(yīng)該像一個(gè)故事,一個(gè)故事中會(huì)存在角色和角色之間的關(guān)系,而這種更多的語(yǔ)義化地可以較好地提示你整個(gè)代碼的可維護(hù)性。無(wú)論哪種文件組織方式比較順眼,你都應(yīng)該遵循統(tǒng)一的原則。 原文地址。本文從屬于Web 前端入門(mén)與最佳實(shí)踐。 CSS的學(xué)習(xí)是一個(gè)典型的低門(mén)檻,高瓶頸的過(guò)程,第一次接觸CSS的時(shí)候覺(jué)得一切是如此簡(jiǎn)單,直到后面越...
摘要:并不是使用安裝的模塊我們就可以使用同樣的方式使用任何一個(gè)模塊,使用某種工具將這些模塊打包發(fā)布作為事實(shí)上的前端模塊化標(biāo)準(zhǔn),或可以出來(lái)解救我們。目前比較拿的出手的,也就是的模塊化,比如或者等等,分別可以使用和。 Teambition是一家追求卓越技術(shù)的公司,我們工程師都很Geek,我們使用了很多新潮的,開(kāi)源的技術(shù)。同時(shí)我們也貢獻(xiàn)了很多開(kāi)源的項(xiàng)目。我們希望能夠把一些技術(shù)經(jīng)驗(yàn)分享給大家。...
摘要:并不是使用安裝的模塊我們就可以使用同樣的方式使用任何一個(gè)模塊,使用某種工具將這些模塊打包發(fā)布作為事實(shí)上的前端模塊化標(biāo)準(zhǔn),或可以出來(lái)解救我們。目前比較拿的出手的,也就是的模塊化,比如或者等等,分別可以使用和。 Teambition是一家追求卓越技術(shù)的公司,我們工程師都很Geek,我們使用了很多新潮的,開(kāi)源的技術(shù)。同時(shí)我們也貢獻(xiàn)了很多開(kāi)源的項(xiàng)目。我們希望能夠把一些技術(shù)經(jīng)驗(yàn)分享給大家。...
閱讀 3039·2021-11-23 09:51
閱讀 1723·2021-10-15 09:39
閱讀 1123·2021-08-03 14:03
閱讀 2960·2019-08-30 15:53
閱讀 3487·2019-08-30 15:52
閱讀 2558·2019-08-29 16:17
閱讀 2882·2019-08-29 16:12
閱讀 1708·2019-08-29 15:26