React項目模板-從項目搭建到部署

来源:https://www.cnblogs.com/lidgblogs/archive/2018/02/24/8464091.html
-Advertisement-
Play Games

前一段時間做了一個小項目,時間比較緊,就一個人月。最終希望能夠通過微信公眾號鏈接啟動應用。 項目的業務細節就不多說了,主要是想分享一下做這個項目技術方面的一些經驗。 技術選型 參考範圍大致三種:AngularJS,Angular,React。 這裡可能會有些困惑,AngularJS和Angular不 ...


前一段時間做了一個小項目,時間比較緊,就一個人月。最終希望能夠通過微信公眾號鏈接啟動應用。
項目的業務細節就不多說了,主要是想分享一下做這個項目技術方面的一些經驗。

技術選型

參考範圍大致三種:AngularJS,Angular,React。

這裡可能會有些困惑,AngularJS和Angular不是一個東西嗎?

沒錯,它們是一個東西,但也不是一個東西。好了,廢話少說,首先說明一下AngularJS和Angular的區別。

引用官方文檔中的一句話

Angular is the name for the Angular of today and tomorrow. AngularJS is the name for all v1.x versions of Angular.

這回很清晰了。

Angular:指的是 v2.x 及以後的版本

AngularJS:特指 v1.x

由於Angular從2.0以後版本更新比較大,所以為了做區分,只能想出這麼一招了。

好了,回歸正題,這三種技術怎麼選擇?

以下是我當時的考慮:

AngularJS:由於之前兩個項目一直在用AngularJS,所以使用起來並不陌生,相對buffer也會少很多(前面說了,時間比較緊,只有一個月)。碰到問題還可以和大家商量一下。
但是AngularJS性能及體積是個問題,尤其是要在手機端運行。

Angular: 性能不是問題,體積也還好。但是接觸比較少,之前只做過一個Web端的項目。

React: 前一段時間剛剛研究過,性能,體積都不是問題。但是同Angular一樣,沒有實際項目經驗啊,出了問題就只能百度了。

經過以上的一番權衡,其實我心裡是想用React的。其中一個原因是經過前一段時間的學習,很想通過一個項目積累一些React的開發經驗,
另外一個原因是React無論從性能上(得益於Virtual DOM)還是思想上(組件化)都更為先進。

基於以上兩點原因,所以在和項目經理確定技術選型的時候,我極力推薦React,雖然可能會存在一些buffer,但是從可持續化發展的角度考慮(自己瞎猜的...),最終項目經理同意了。

項目框架搭建

在GitHub上看了很多的boilerplate工程,或多或少都和自己的需求有些出入。
所以,最終自己通過React官方的create-react-app cli搭建了一個seed工程。

1. 準備環境

node.js

2. 安裝creat-react-app cli

npm install -g create-react-app

3. 創建工程

create-react-app react-seed

然後進入項目根目錄react-seed安裝相關依賴

cd react-seed
npm install

4. 暴露配置項

由於採用create-react-app創建的項目webpack等配置信息都是封裝好的,所以為了靈活修改相關配置,可以通過以下命令讓封裝好的配置文件暴露出來。

npm run eject

創建好的項目目錄如下:

5. 本地服務啟動

// 啟動本地server用於開發
npm run start

將會在本地 3000 埠啟動

redux集成

熟悉React的可能都知道,React是單向數據流,所以有些情況下單單依賴React自身無法實現組件之間的通信,這時就需要Redux登場了。

本文不介紹Redux的語法及思想,只說明如何集成。

首先需要安裝Redux相關依賴,由於不同版本之間可能存在相容性問題,所以安裝的時候最好制定版本:

npm install [email protected] --save
npm install [email protected] --save
npm install [email protected] --save

然後就可以在項目中引入redux了,可以像如下方式組織目錄結構:

路由集成

react-router

npm install [email protected] --save

路由支持嵌套,代碼如下:

const routes = (
    <Router history={hashHistory}>
        <Route path="/home" component={Layout} onEnter={onEnter}>
            <IndexRoute getComponent={home} onEnter={onEnter}/>
            <Route path="/home" getComponent={home} onEnter={onEnter}/>
            <Route path="/detect" getComponent={detect} onEnter={onEnter}/>
            <Route path="/about" getComponent={about} onEnter={onEnter}/>
        </Route>
        <Route path="/unauthorized" getComponent={unauthorized}/>
        <Redirect from="*" to="/home" />
    </Router>
);

export default routes;

國際化方案

採用的是常用的react-intl

npm install [email protected] --save

UI組件集成

基於React的UI組件在這裡推薦兩個,一個是螞蟻金服的Ant Design;另外一個是Material-UI

兩個都很不錯,本人使用的是Ant Design。

npm install [email protected] --save

fetch集成

關於請求數據有很多種方式,本人用的是fetch

npm install [email protected] --save

可以簡單封裝一下,如下:

import 'whatwg-fetch'
import loggerService from './logger'

let notAuthorizedCounter = 0;
let fetchService = {
    fetch: (url, method, header, body) => {
        if (!header) {
            header = {}
        }

        return fetchService[method.toLowerCase()](url, header, body).catch(function(exception) {
            loggerService.log('fetchService failed:', exception);

            // token過期,重新獲取token併發起請求
            if (exception.code === '401' || exception.code === '403') {
                notAuthorizedCounter++;
                // 最多重試3次
                if (notAuthorizedCounter > 2) {
                    notAuthorizedCounter = 0;
                    loggerService.warn("401 or 403 received. Max attemps reached.");
                    return;
                } else {
                    return fetchService.fetch(url, method, header, body);
                }
            }
        });
    },
    get: (url, header) => {
        return fetch(url, {
            method: 'GET',
            headers: header
        }).then((response) => {
            return response.json();
        });
    },
    post: (url, header, body) => {
        header['Content-Type'] = 'application/json';
        return fetch(url, {
            method: 'POST',
            headers: header,
            body: JSON.stringify(body)
        }).then((response) => {
            return response.json();
        });
    }
};
export default fetchService;

項目部署

首先對項目進行打包。

npm run build

可以通過以下命令在本地環境運行打包後的項目。

serve -s build
註意:

如果項目中引入路由的時候使用的是BrowserRouter,
那麼當執行npm run build打包之後,本地打開index.html文件,會出現空白頁面。

原因是BrowserRouter是用瀏覽器history對象的方法去請求伺服器,
如果伺服器沒有配置相對應的路由去指向對應的頁面,路由會找不到資源。

BrowserRouter會變成類似這樣的路徑http://111.230.139.105:3001/detail/9459469, 這樣的路徑在訪問伺服器時,伺服器會認為是請求查找某個介面數據。

所以這時候必須使用HashRouter,這時候訪問具體頁面時就是http://111.230.139.105:3001/#/detail/9459469


項目源碼已經開源到github上,喜歡的給個Star支持下吧!(^_^)

react-seed


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 記錄自己在工作中,時不時使用,每次都要去查一下的基礎方法。以及ES6經常使用的方法 一、Array 1、concat 合併數組 2、shift 獲取數組第一個元素 unshift 向數組首位添加一個元素 3、pop 獲取數組中最後一個元素 4、slice 截取數組 5、splice 對數組的增刪改 ...
  • css 單位px、em、rem、vh、vw、vmin、vmax區別 ...
  • 一直自以為自己vue還可以,一直自以為webpack還可以,今天在慕課逛node的時候,才發現,自己還差的很遠。眾所周知,vue-cli基於webpack,而webpack基於node,對node不瞭解,談什麼瞭解webpack。所以就自己給自己出了一道題,爬取豆瓣數據,目前還處於初級階段。今天就淺 ...
  • 工作需要,項目中需要完成一個日誌工作安排的功能,網上找了好多資料,最後還是修修改改花了一些時間的 碼雲代碼地址:https://gitee.com/yinxiuli/fullcalendar_log_management.git 主要貼一下前端部分的代碼(可見git): <!DOCTYPE html ...
  • 哈哈,上首頁真難,每次都被秒下,心疼自己1秒~ 這裡補充一個簡要圖,方便理解流程: 在處理./input.js入口文件時,在類型判斷被分為普通文件,所以走的文件事件流,最後拼接得到文件的絕對路徑。 但是對應"babel-loader"這個字元串,在如下正則中被判定為模塊類型: 因此,參考第33節的流 ...
  • 用最清晰簡潔的方法整合一個響應式相冊 <! more "效果" 技術選型 由於我選用的主題使用了fancyBox作為圖片彈出展示的框架,查看後表示很不錯,能滿足需要 "http://fancyapps.com/fancybox/3/" 圖片載入可能會太慢,所以還需要一個圖片延遲載入插件 "Lazyl ...
  • 定義: 通過 @keyframes 規則,能夠創建動畫。 創建動畫的原理是,將一套 CSS 樣式逐漸變化為另一套樣式。 在動畫過程中,可以多次改變這套 CSS 樣式。 以百分比來規定改變發生的時間,或者通過關鍵詞 "from" 和 "to",等價於 0% 和 100%。 0% 是動畫的開始時間,10 ...
  • Carbon 是一個可以幫助你創建和分享源代碼美麗圖像的小工具。開始在文本區域輸入或拖入代碼文件以開始使用。你還在等什麼? 讓你的設計實力讓所有閱讀者印象深刻。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...