前端開發快速入門

一、了解前端技術棧

1. react:前端開發語言(着重學習)

  • React是用於構建用戶界面的JavaScript框架,用於構建高效、快速的用戶界面。React 中一切都是組件。
  • 虛擬dom

2. webpack:前端打包工具

  • 一個開源的前端打包工具,將你的js、css、img、svg以更優的方式進行解析加載,配置靈活,功能強大

3. ant-design:商戶側前端使用的UI組件庫(着重使用)

  • 是基於 Ant Design 設計體系的 React UI 組件庫,主要用於研發企業級中後台產品

4. dva:react異步請求以及redux全局數據流

  • dva 首先是一個基於 redux 和 redux-saga的數據流方案
  • 易學易用,僅有 6 個 api,對 redux 用戶尤其友好

5. es6:JavaScript語言的下一代標準

  • es5語言的升級,提供更加強大的語法糖,開發更加便捷,不但能減少代碼量,還能解決原來沒有完善的問題
  • 目前ES6也是使用最多的javaScript語言標準

6.axios:一個基於 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中

  • 從瀏覽器中創建 XMLHttpRequests
  • 從 node.js 創建 http 請求
  • 支持 Promise API
  • 攔截請求和響應
  • 轉換請求數據和響應數據
  • 取消請求
  • 自動轉換 JSON 數據
  • 客戶端支持防禦 XSRF

image

二、項目結構理解

image

1. node_modules:前端組件庫管理包

  • 安裝node後用來存放用包管理工具下載安裝的包的文件夾,例如react、webpack、輪播圖插件等各種庫,以便項目使用,類似後端的nuget

2. package.json:項目組件庫版本管理文件(如果我們用自己開發的組件庫,也是npm組件庫的讀取文件)

  • 1.管理node_modules組件庫版本的配置文件(常用)
  • 2.當你開發自己的組件庫,它也是作為組件庫的版本管理配置文件(組件庫開發)

3. .babellrc:es6語法解析

  • 下一代Javascript的標準,瀏覽器因版本的不同對此會有兼容性問題
  • .babelrc是Babel的配置文件,放在項目根目錄下,結合webpack使用

4. webpack配置文件

開發環境和生產環境打包希望看到的效果肯定不一樣,比如生產環境需要壓縮代碼,去除注釋,開發環境需要熱更新,不壓縮代碼,所以需要存在一套開發環境版本和一套生產環境版本

  • webpack.config.common.js:webpack公用文件

  • webpack.config.dev.js:webpack開發環境文件

  • webpack.config.prod.js:webpack生產環境文件

node_modules和package.json

image

7. src:源碼目錄components、configs、models、services、utils、index.ejs、index.js、Router.js

三、src源碼目錄講解

開發一個頁面的流程:

  1. components文件夾新建js組件、less樣式,進行前端靜態頁開發並連接dva
  2. router.js路由文件引入頁面組件,並放置到路由上
  3. models文件夾寫入models文件
  4. services文件夾寫入services文件
  5. index.js註冊對應的models文件或者在路由註冊
  6. 前後端接口開發聯調

image

3.1 component

功能:存放開發的業務組件
包含:

  1. js
  2. less
  3. imgs
jsx頁面結構介紹
import React from 'react'; // 引用react組件
// import './less/test.less';
const param = 1; // 定義常量
// 名稱必須大寫
class Test extends React.Component {
   constructor(props) {
      super(props);
      // 定義state,在頁面或者傳遞數據使用
      this.state = {
         num: 1,
      };
   }
   // 定義事件
   clickFunc = () => {
      let { num } = this.state;
      num++;
      this.setState({
         num
      });
   }
   render() {
      // 獲取state
      const { num } = this.state;
      return (
         <div className="content">
            {/*渲染元素*/}
            <div className="count">{num}</div>
            {/*點擊修改元素*/}
            <button onClick={this.clickFunc}>點擊</button>
         </div>
      )
   }
}
export default Test
less樣式文件介紹
// 設置樣式
.content{
    // 可設置嵌套樣式
    .count{
        
    }
}

數據講解

1.state:內部定義,它只是用來控制這個組件本身自己的狀態,頁面渲染通過setState進行完成。

2.setState:

  • 當我們調用這個函數的時候,React.js 會更新組件的狀態 state ,並且重新調用 render 方法,然後再把 render 方法所渲染的最新的內容顯示到頁面上
  • React.js為了批次與效能並不會馬上修改state。而是把這個對象放到一個更新隊列裏面,稍後才會從隊列當中把新的狀態提取出來合併到 state 當中,然後再觸發組件更新。

3.props:外部傳入,包括父子組件之間的通信,全局數據流的傳遞

  • 父子組件之間的通信
  • 全局數據流的傳遞(dva)

image

3.2 models

定義每個頁面交互的命名空間以及dispatch發起的行為方法和數據的處理

import * as lightMemberRightsManage from '../services/lightMemberRightsManage';

export default {
    //表示對於整個應用不同的命名空間,以便通過this.props.lightMemberRightsManage,規範保證命名空間和當前頁面js名稱相同
    namespace: 'lightMemberRightsManage', 
    state: {},  // 表示當前的example中的state狀態,這裡可以給初始值
    effects: {
        *lightMemberRightsManageGetList({ payload, callback }, { call, put }) {
            const testRes = yield call(lightMemberRightsManage.lightMemberRightsManageGetList, payload);
            //這裡的put表示存儲在當前命名空間lightMemberRightsManage中,通過success方法存在當前state中
            yield put({
                type: 'success',
                payload: {
                    lightMemberRightsManageGetListResult: testRes
                }
            });
            // 回調函數
            callback && callback(testRes);
            // 可以promise.then使用
            return testRes;
        }
    },
    //用來保存更新state值 上面的put方法調用這裡的方法
    reducers: {
        success(state, { payload }) {
            return {
                ...state,
                ...payload
            }
        }
    }
}

3.3 services

// 異步請求的中轉文件
import axios from '../utils/axios';
// 請求地址的文件
import Api from '../configs/api';
export function lightMemberRightsManageGetList(params) {
    return axios.get(configs.host.test + Api.lightMemberRightsManageGetList, { 'params': params });
}

3.4 untils工具庫

定義自己寫的工具庫,例如異步請求axios、數據截取的公用函數js

3.5 index.js

  1. 項目入口js文件
  2. 引用全局樣式
  3. 引用models文件connect連接組件
  4. 引用路由

3.6 index.ejs

  1. 單頁應用入口html文件

3.7 router.js

頁面路由

import React from 'react';
import PropTypes from 'prop-types';
import {
  Switch,
  Route,
  routerRedux,
} from 'dva/router';
import dynamic from 'dva/dynamic';


const { ConnectedRouter } = routerRedux;
const RouterWrapper = ({ history, app }) => {
  // 開發的組件
  const Home = dynamic({
    app,
    component: () => import('./components/Home'),
  });
  return (
    <ConnectedRouter history={history}>
      <Switch>
        // 加載路由
        <Route exact path="/" component={Home} />
      </Switch>
    </ConnectedRouter>
};

四、頁面開發流程

image

  • 1.通過vscode插件生成頁面組件、models、services
  • 2.路由註冊對應頁面
  • 3.index.js引用對應的頁面models
  • 4.models,services進行細微調整
  • 5.api接口地址調整對應後端接口地址

五、實戰:使用腳手架開發商戶側項目

// 全局安裝fl-hscli,生成商戶側腳手架的命令(目前寫入的是mall商戶側)
npm i fl-hscli -g

// 進入想要創建項目的文件夾創建項目(projectName是你的項目名稱)
create-react-app-fl projectName

// package.json中fl-pro、fulu-method是公司內部組件庫,安裝模塊包之前,先安裝公內部組件,不然會報錯

npm --registry //10.0.1.244:8081/repository/npm-group/ install [email protected]   --save 

// 安裝成功後,執行安裝模塊包的命令,因為package.json模塊非常多,可以使用淘寶鏡像進行安裝,安裝速度快
npm i
cnpm i(需要先安裝淘寶鏡像)


// 安裝成功後,啟動項目
npm start

六、商戶側顯示效果

image

注意

  • 安裝nodejs,才可使用npm命令
  • cnpm安裝:npm install -g cnpm –registry=//registry.npm.taobao.org
  • 開發者運行的商戶側地址都需要在福祿管家配置回調地址,否則頁面打不開,開發環境訪問使用自己開啟的域名(例如://192.168.0.105:3008)/?MerchantId=商戶id(bcc1adce-927a-4c0b-88c0-c446a0435b98 )進行訪問

七、模塊包下載工具

npm

  • npm是node官方的包管理器,如果沒有鎖定版本,通常會直接下載package.json中版本庫里最高版本
  • 下載速度慢,可能因為網絡原因無法使用npm下載,或者是國外的庫無法進行下載

cnpm

  • cnpm是個中國版的npm,是淘寶定製的 cnpm,下載速度極快
  • 每隔10分鐘去刷新npm庫同步到cnpm
  • 不會讀取package.lock.json

yarn

  • 斷點續傳,鎖定版本,不過npm5更新之後,兩者都沒有明顯的優劣勢

後續會做更加詳細的講解

如何提高開發效率

js

  • 公用模塊進行提取
  1. 代碼片段
  2. vscode插件
  3. 封裝繼承
  4. npm命令行進行項目代碼導入

css

  • 規範的間距、顏色、字體大小、行高、居中、浮動

開發規範

  • 1.按照目前的目錄結構進行開發
  • 2.頁面的文件命名具有語義化,對應使用的文件名與其保持一致,組件命名首字母需要大寫,其餘命名需要使用駝峰命名
好處
  • 1.目錄結構清晰,根據頁面來查找問題更加輕鬆便捷
  • 2.同事接手也更簡單易懂,上手更快

開發注意事項

  • 如果引用的組件或者函數不支持按需加載,引用的話,會把所有功能都打包進來
  • less文件在生產環境會被打包在一起,所以每個頁面的less文件最外層樣式必須唯一,不然會互相影響
  • setState會渲染頁面,所以不要在render(渲染頁面的函數)里使用setState,不然就會死循環,不要使用this.state賦值(不會重新渲染)
  • 不要直接給props賦值
  • 後續會一直迭代…
福祿ICH·ERP項目部
福小松
Tags: