generator-ivweb 基于react-redux的多頁(yè)腳手架

背景

每個(gè)公司甚至每個(gè)項(xiàng)目組,在開(kāi)發(fā)新項(xiàng)目的時(shí)候都會(huì)有一些自己特色的東西灵汪,比如公共組件檀训,ajax請(qǐng)求攔截處理,內(nèi)部積累的一些業(yè)務(wù)邏輯等等享言,如果沒(méi)有自己的腳手架峻凫,那么拷貝代碼成為常態(tài),每個(gè)項(xiàng)目的結(jié)構(gòu)览露,甚至是構(gòu)建配置都會(huì)由很大差異荧琼,導(dǎo)致代碼維護(hù)成為一個(gè)難題。

簡(jiǎn)介

generator-ivweb是由騰訊IVWEB團(tuán)隊(duì)設(shè)計(jì)的腳手架,基于團(tuán)隊(duì)開(kāi)源項(xiàng)目feflow命锄,feflow是一個(gè)前端集成開(kāi)發(fā)環(huán)境堰乔,詳細(xì)介紹可以看這里:feflow

技術(shù)棧
  • React
  • redux
  • less
  • axios
  • webpack4
    ...
讓你心動(dòng)的地方

相對(duì)于官方腳手架脐恩,我們不僅僅是初始化一個(gè)項(xiàng)目镐侯,更多的是滿足實(shí)際開(kāi)發(fā)場(chǎng)景。

  • 支持多頁(yè)項(xiàng)目
  • 頁(yè)面適配
  • 內(nèi)聯(lián)語(yǔ)法
  • 構(gòu)建優(yōu)化
  • 豐富的默認(rèn)配置文件

架構(gòu)設(shè)計(jì)

目錄結(jié)構(gòu)
generator-ivweb-app
├── README.md
├── package.json
├── .babelrc
├── .editorconfig
├── .eslintrc.js
├── .gitattributes
├── feflow.json
├── config.json
├── node_modules
├── dist
└── src
    ├── assets
    ├── middleware
    ├── modules
    └── pages
        ├── otherPage
        └── indexPage
            ├── index.html
            ├── index.js
            ├── index.less
            ├── index.js
            ├── init.js
            ├── pageComponent.js
            ├── actions
            ├── assets
            ├── components
            └── reducers
  • 開(kāi)發(fā)和構(gòu)建
    這里我們默認(rèn)都是src為開(kāi)發(fā)目錄驶冒,dist為打包目錄苟翻,當(dāng)然你可以在feflow.json中配置為其他輸出目錄。
{
    "builderOptions": {
        "outDir": "dist" //輸出目錄名稱
    }
}
  • 多頁(yè)目錄
    多頁(yè)放在pages目錄下骗污,每個(gè)頁(yè)面一個(gè)單獨(dú)文件夾崇猫,訪問(wèn)的路徑如下:
https://xxx.xxx.xxx/xxx/indexPage.html
https://xxx.xxx.xxx/xxx/otherPage.html
頁(yè)面結(jié)構(gòu)化繼承(多頁(yè)設(shè)計(jì))

正常來(lái)說(shuō),多頁(yè)應(yīng)用只需要有自己的入口就可以需忿,在入口文件我們可能需要做這么幾件事

  • 注入store
  • 設(shè)置全局配置
  • 頁(yè)面監(jiān)控
  • 將組件渲染到頁(yè)面
    ...
    上面只是列舉了一些基本的東西诅炉,當(dāng)然還會(huì)有很多,甚至是一些跟業(yè)務(wù)相關(guān)的基本信息屋厘,而這些東西對(duì)于一個(gè)工程下的多個(gè)頁(yè)面來(lái)可能都是一樣的涕烧,不僅操作不方便,維護(hù)也很麻煩擅这。這里我們提出一個(gè)概念:頁(yè)面結(jié)構(gòu)化繼承澈魄。
    繼承大家都很熟悉景鼠,而react是可以用function/class方式來(lái)寫(xiě)組件的仲翎,我們?cè)谟胏lass方式寫(xiě)組件就是繼承自React.Component,那么對(duì)于這些公有東西我們也可以封裝成一個(gè)組件铛漓,通過(guò)繼承的方式來(lái)獲取這些能力溯香。
創(chuàng)建BasePage 頁(yè)面繼承
創(chuàng)建BasePage
繼承basePage

此處只寫(xiě)了對(duì)于多頁(yè)的應(yīng)用,對(duì)于復(fù)雜的單頁(yè)應(yīng)用同樣是適用的浓恶。

組件劃分

通常我們?cè)陂_(kāi)發(fā)一個(gè)單頁(yè)應(yīng)用都會(huì)抽離一些公共組件玫坛,比如title-bar

首頁(yè) 博客頁(yè)
image.png
image.png

如果這里是個(gè)多頁(yè)應(yīng)用,同樣是可以公用的包晰,因此對(duì)于多頁(yè)應(yīng)用來(lái)說(shuō)湿镀,組件應(yīng)該是這樣的結(jié)構(gòu):

image.png
狀態(tài)管理

每個(gè)頁(yè)面的狀態(tài)管理同樣是可以抽離一些公共action和reducer,比如登錄邏輯

image.png
模塊化

鑒于腳手架默認(rèn)是多頁(yè)項(xiàng)目伐憾,我們把公共模塊放到外層目錄勉痴,減少跟每個(gè)頁(yè)面的耦合。

modules
├── common //公用js模塊
├── components //公用組件
├── globalStore //store配置树肃,包含中間件注入
└── page //頁(yè)面結(jié)構(gòu)繼承組件
構(gòu)建

這里使用feflow的構(gòu)建器:builder-webpack4蒸矛,當(dāng)然這個(gè)東西同樣是可以配置的,甚至可以根據(jù)我們的官方構(gòu)建器寫(xiě)自己的構(gòu)建器。

項(xiàng)目配置

腳手架是基于feflow的雏掠,因此feflow.json文件是feflow項(xiàng)目的基礎(chǔ)配置斩祭,包含了一些構(gòu)建選項(xiàng),比如輸出目錄乡话,域名摧玫,webpack相關(guān)等。

{
    "builderType": "builder-webpack4", //構(gòu)建器類型
    "builderOptions": {
        "product": "", //產(chǎn)品民稱
        "outDir": "dist", //構(gòu)建輸出目錄
        "minifyHTML": true,
        "minifyCSS": true,
        "minifyJS": true,
        "inlineCSS": true,
        "usePx2rem": true, //是否轉(zhuǎn)化px
        "remUnit": 37.5, //rem基準(zhǔn)
        "remPrecision": 6, 
        "inject": true, 
        "useTreeShaking": true,
        "port": 8001, //項(xiàng)目端口
        "hot": true,
        "externals": [
            {
                "module": "react",
                "entry": "http://11.url.cn/now/lib/16.2.0/react.min.js?_bid=3123",
                "global": "React"
            },
            {
                "module": "react-dom",
                "entry": "http://11.url.cn/now/lib/16.2.0/react-dom.min.js?_bid=3123",
                "global": "ReactDOM"
            }
        ]
    }
}
其他

項(xiàng)目默認(rèn)是不顯示構(gòu)建相關(guān)配置的绑青,一方面席赂,我們有暴露一些基礎(chǔ)配置項(xiàng),另一方面避免多人協(xié)作開(kāi)發(fā)更改配置問(wèn)題时迫,如果你想查看或修改可以使用命令展示(不建議修改配置)

feflow eject

優(yōu)勢(shì)

多頁(yè)支持

generator-ivweb先天支持多頁(yè)應(yīng)用颅停,而不用我們?cè)偃ebpack中配置,在開(kāi)發(fā)中只需要在pages下創(chuàng)建多個(gè)目錄即可掠拳。

頁(yè)面適配

項(xiàng)目默認(rèn)接入rem適配癞揉,會(huì)自動(dòng)把px轉(zhuǎn)成rem,當(dāng)然溺欧,如果某些地方不想被轉(zhuǎn)化喊熟,有兩種方式:

  • 修改px寫(xiě)法
    height: 300Px;
    
  • feflow.json中設(shè)置usePx2rem為false
  1. 打包優(yōu)化

generator-ivweb默認(rèn)使用builder-webpack4構(gòu)建,webpack4中所做的一些優(yōu)化姐刁,比如treeShaking都有用到芥牌。并且這里我們默認(rèn)給react和react-dom加了外鏈cdn(使用我們自己的cdn,如果不放心可以改為自己的cdn)聂使。

  1. 內(nèi)聯(lián)語(yǔ)法

    比如一些meta標(biāo)簽壁拉,頁(yè)面loading等,都可以通過(guò)內(nèi)聯(lián)方式引入

    <!--inline[/assets/inline/meta.html]-->
    

    還有一些js文件我們可能也需要內(nèi)聯(lián)到html中提前加載

    <script src="amfe-flexible/index.js?__inline"></script>
    
  2. 多樣化配置文件

    項(xiàng)目默認(rèn)集成了gitignore柏靶、eslint弃理、editorconfig等配置,為倉(cāng)庫(kù)管理和開(kāi)發(fā)提供了便捷屎蜓。

├── .babelrc
├── .editorconfig
├── .eslintrc.js
├── .gitattributes

如何使用

# 安裝feflow
npm install feflow-cli -g
# 安裝腳手架
feflow install generator-ivweb
# 啟動(dòng)項(xiàng)目
feflow init
9b110b14-0d91-474a-a413-61e8a3c5c3a3.gif

未來(lái)規(guī)劃

  1. 添加測(cè)試用例痘昌,提高穩(wěn)定性。
  2. 完善腳手架內(nèi)容炬转,提供更高效的內(nèi)容

項(xiàng)目地址

https://github.com/feflow/generator-ivweb辆苔, 歡迎大家提issue以便于我們改進(jìn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扼劈,一起剝皮案震驚了整個(gè)濱河市驻啤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌测僵,老刑警劉巖街佑,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谢翎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沐旨,警方通過(guò)查閱死者的電腦和手機(jī)森逮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)磁携,“玉大人褒侧,你說(shuō)我怎么就攤上這事∫昶” “怎么了闷供?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)统诺。 經(jīng)常有香客問(wèn)我歪脏,道長(zhǎng),這世上最難降的妖魔是什么粮呢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任婿失,我火速辦了婚禮,結(jié)果婚禮上啄寡,老公的妹妹穿的比我還像新娘豪硅。我一直安慰自己,他們只是感情好挺物,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布懒浮。 她就那樣靜靜地躺著,像睡著了一般识藤。 火紅的嫁衣襯著肌膚如雪砚著。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天蹋岩,我揣著相機(jī)與錄音赖草,去河邊找鬼。 笑死剪个,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的版确。 我是一名探鬼主播扣囊,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绒疗!你這毒婦竟也來(lái)了侵歇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吓蘑,失蹤者是張志新(化名)和其女友劉穎惕虑,沒(méi)想到半個(gè)月后坟冲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溃蔫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年健提,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伟叛。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡私痹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出统刮,到底是詐尸還是另有隱情紊遵,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布侥蒙,位于F島的核電站暗膜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鞭衩。R本人自食惡果不足惜桦山,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醋旦。 院中可真熱鬧恒水,春花似錦、人聲如沸饲齐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捂人。三九已至御雕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滥搭,已是汗流浹背酸纲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瑟匆,地道東北人闽坡。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像愁溜,于是被迫代替她去往敵國(guó)和親疾嗅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容