• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • react native

    一、移動APP 開發技術選型進化

    第一階段   Native

    1.性能優秀

    2.開發效率低下,不可跨端

    第二階段    Native H5/Hybrid

    1.Hybrid多端運行,解決了開發效率問題

    2.性能存在瓶頸

    現階段  Native H5/Hybrid React Native

    二、開發進階-頁面性能

    頁面(Page)切換卡頓問題

    頁面切換(push)和render同時進行,對復雜頁面場景,會有卡頓問題

    解決方案:1.調整頁面切換動畫時間

                     2.使用InteractionManager API頁面切換完成,再render


    三、開發進階-統一Storage

    統一Storage提供

    1.Storage.load(params,callback)

    2.Storage.remove(params)

    3.Storage.save(parmas)

    說明:

    Native/RN/H5通用

    Save API,params中domain區分不同業務

    Save API,params中expires可控制過期時間

    Save API,params中isSecret可控制是否加密存儲

    四、開發進階-IconFont

    Iconfont使用

    1.文件大小,可以設置顏色,靈活性高

    2.Font文件中每個圖標對應一個Unicode碼

    使用步驟

    1.http://iconfont/平臺創建下載字體文件

    2.導出字體文件,項目/文件命名規則crn_font_xxx,前綴固定;

    3.注冊字體文件CRNDev.registerIconFont()測試環境使用,生產環境會動態查找注冊;

    4.設置組件style,fontfamily = 項目/文件名   Note:iconfont項目/文件名不能手動修改

    common.js

    export default StyleSheet.create({
        commonIcon: {
            fontFamily: 'ct_font_common',
        },
        diyTourIcon: {
            fontFamily: 'crn_font_diytour2'
        },
        diyTourIcon2: {
            fontFamily: 'crn_font_diyTour'
        }
        
    })

    頁面上使用icon引用字體: icon.js

    import PropTypes from 'prop-types';
    import React, { Component } from 'react';
    import {Text,Dimensions} from 'react-native'
    import baseStyle,{color} from "../../styles/base/common"
    
    export default class Icon extends Component {
        render() {
            let { size, color,value, style,type } = this.props
            let fontFamily = baseStyle.diyTourIcon
            if(type==='common'){
                fontFamily=baseStyle.commonIcon
            }else if(type==='dp2'){
                fontFamily=baseStyle.diyTourIcon2
            }
            return (
                <Text
                    style={[
                        fontFamily,
                        {
                            color,
                            fontSize: size
                        },
                        style
                    ]}
                >
                {value}</Text>
            )
        }
    
    }
    Icon.propTypes = {
        size: PropTypes.number,
        color: PropTypes.string,
        value: PropTypes.string,
        style: Text.propTypes.style,
    }
    Icon.defaultProps = {
        size: 20,
        color: color.cBule,
        value:'',
    }

    開發環境常見問題

    1.icon不顯示,一般是由于下載的文件名被修改過文件名

    生產環境常見問題

    1.圖標非自己設計的icon,一般是被系統其它unicode占用,到iconfont平臺生成新的code即可


    五、開發常見問題

    A.原因: Native Runtime 和 RN JS 代碼API 不一致

    解決方案:

    1.刪除node_modules

    2.修改package.json中依賴的相關JS組件版本

    3.重裝node_modules


    B.原因:依賴CRN版本和App版本不一致 0.51 runtime的App運行0.41的Js代碼

    解決方案:

    1.刪除node_modules

    2.修改package.json中CRN的依賴分支

    3.重裝node_modules


    C.原因:從node_modules查找模塊出錯

    解決方案:

    1.npm list |grep react* 查看是否有其他組件使用不同的react版本

    2.刪除node_modules

    3.重啟電腦,重新安裝node_modules


    六、CRN發布

    發布流程:

    1.創建項目(發布計劃),設置代碼倉庫分支,入口文件,發布版本、頻道

    2.新增版本,FAT->UAT->生產 環境逐一發布

    3.支持灰度發布、暫停發布

    4.發布結果查看,支持分APP版本查看下載量、使用量


    CRN-Web框架

    crn-cli run-patch  替換RN依賴文件

    crn-cli pack 本地打包

    crn-cli openUrl 在App中打開url

    crn-cli example 建立API示例工程

    crn默認會依賴常用第三方庫 crn-ext提供常用第三方庫,業務按需依賴 eg: react-native-swiper

    頁面路由與跳轉

    page.push()

    page.pop()

    page.popToPage()

    page.replace()

    page.replaceAtIndex()

    pop到容器最后一層后直接關閉CRN容器



    Android物理鍵回退:onBackAndroid()


    組件和Page生命周期:

    componentWillMount           PageWillAppear

    componentDidMount            PageDidAppear

    componentWillUpdate           PageWillDisappear

    componentDidUpdate           PageDidDisappear

    componentWillUnMount



    CRN頁面加載流程

    包安裝 -> CRN框架代碼執行(后臺預加載) -> 業務JS -> 代碼執行(a.頁面渲染 b.初始頁面渲染->網絡請求->頁面渲染)




    router.js

    import { App,lazyRequire } from '@ctrip/crn';
    import pageConfig from './constants/pageConfig';
    const DIYIndex = lazyRequire('./containers/diyIndex');
    const DPCalendar = lazyRequire('./containers/dpCalendar');
    const CityList = lazyRequire('./containers/cityList');
    const DPIndex = lazyRequire('./containers/dpIndex');
    const Confirm = lazyRequire('./containers/confirm');
    const DPConfirm = lazyRequire('./containers/dpConfirm');
    const Passenger = lazyRequire('./containers/passenger');
    const FlightList = lazyRequire('./modules/flightList/container/flightList');
    const HotelDetail = lazyRequire('./containers/hotelDetail/hotelDetail');
    
    const pages = [
        {
            component: DIYIndex,
            name: pageConfig.DIYINDEX.pageName,
            // isInitialPage: true 
        },
        {
            component: DPCalendar,
            name: pageConfig.DPCALENDAR.pageName,
            // isInitialPage: true 
        }, {
            component: CityList,
            name: pageConfig.CITYLIST.pageName,
        },
        {
            component: DPIndex,
            name: pageConfig.DPINDEX.pageName
        }, {
            component: DPConfirm,
            name: pageConfig.DP_CONFIRM,
            // isInitialPage: true
        }, {
            component: Confirm,
            name: pageConfig.SDP_CONFIRM.pageName
        }, {
            component: FlightList,
            name: pageConfig.FLIGHT_LIST.pageName,
            // isInitialPage: true
        },
        {
            component: Passenger,
            name: pageConfig.PASSENGER.pageName,
        }, 
        {
            component: HotelDetail,
            name: pageConfig.HOTEL_DETAIL.pageName,
            isInitialPage: true
        }
    ];
    
    const navigationBarConfig = {
        hide: true, // 默認為 false
        backgroundColor: "#19A0F0", // 導航欄背景色
    };
    
    export default class Router extends App {
        constructor(props) {
            super(props);
            this.init({
                pages,
                navigationBarConfig,
            });
        }
    }

    index.ios.js

    /**
     * Sample Ctrip React Native App
     * http://crn.site.ctripcorp.com/
     * @flow
     *
     * 此處有幾點需要注意:
     * 1、必須將AppRegistry.registerComponent寫在該文件中, 并且將AppComponent從其他處require進來;
     * 2、必須添加一個module.exports這一句, 發生產包必須這么做;
     */
    
    'use strict';
    
    import {
        AppRegistry
    } from 'react-native';
    
    const DIYTOUR = require('./main');
    
    AppRegistry.registerComponent('diytour', () => DIYTOUR);
    
    //Attention: 此處module.exports必須保留
    module.exports = DIYTOUR;

    index.android.js

    /**
     * Sample Ctrip React Native App
     * http://crn.site.ctripcorp.com/
     * @flow
     */
    
    'use strict';
    
    import {
      AppRegistry,
    } from 'react-native';
    
    const DIYTOUR = require('./main');
    AppRegistry.registerComponent('diytour', () => DIYTOUR);
    
    // Attention: 此處module.exports必須保留
    module.exports = DIYTOUR;

    main.js

    'use strict';
    
    import { CRNDev } from '@ctrip/crn';
    
    import DIYTOUR from './src/app';
    
    // global.console = {
    //   timeEnd: ()=>{},
    //   time: ()=>{},
    //   info: () => {},
    //   log: () => {},
    //   warn: () => {},
    //   debug: () => {},
    //   error: () => {},
    // };
    if (__DEV__) {
      CRNDev.registryIconFont({
        fontList:[
          'http://10.32.228.8:5389/fonts/crn_font_diytour2.ttf',
          'http://10.32.228.8:5389/fonts/crn_font_diyTour.ttf',
        ]
      }, (result) => {
        console.log('ttf文件安裝' + (result ? '成功' : '失敗'));
      });
    }
    
    module.exports = DIYTOUR;

    import打包后->require -> JS exe -> Cache Ret -> LazyRequire的使用(LazyRequire加載Page子類,只加載需要的Page)


















    版權聲明:本文為acm_wln原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/acm_wln/article/details/79995597

    智能推薦

    react native (一)

    開始接觸app方面的工作,真心塞~ 又開始了周而復始的死磕一個問題專坐一整天的節奏,關鍵是還沒有成績,實在無語。╮(╯▽╰)╭,還是總結一下最近心塞歷程吧…… react native中文網:http://reactnative.cn/docs/0.48/getting-started.html 看看文檔就上手吧(默認環境均已配好): 1.新建項目的那些事: 將npm包...

    初識React Native

    一、環境搭建,安裝命令行工具 二、項目初始化 初始化后的項目目錄 三、運行項目 四、運行起來后,開始顯示正確,隨后紅屏,然后電腦風扇轉到飛起。。。趕緊關了。。。路漫漫其修遠兮...

    React Native android打包

    前言 從沒接觸過RN開始趕鴨子上架,7月份一個月做了3個app。項目結束要打包了,各種坑啊。這里整理一下,我的悲慘打包經歷。 打包步驟 1.生成簽名文件(略,網上查查吧) 2.在 android/app/src/main/ 目錄下創建 assets 目錄 項目根目錄下,執行命令 : 3.修改android/gradle.properties文件,增加如下 4.在android/app/build....

    React Native打包apk

    生成一個簽名** 你可以用keytool命令生成一個私有**。在Windows上keytool命令放在JDK的bin目錄中(比如C:\Program Files\Java\jdkx.x.x_x\bin),你可能需要在命令行中先進入那個目錄才能執行此命令。 進入bin目錄下面后執行下列代碼: 這條命令會要求你輸入**庫(keystore)和對應**的密碼,然后設置一些發行相關的信息。最后它會生成一個...

    React Native 搭建環境

    react-native(無需下載) 在 GitHub 的地址 https://github.com/facebook/react-native 按照官方文檔 先安裝好 python2.x 再安裝好 node.js 還需要安裝一下 JDK1.8,暫不支持更高版本,而 Android Studio 支持的 JDK 最低版本為 JDK1.8,所以還是就裝 JDK1.8 吧 JDK1.8 下載http:...

    猜你喜歡

    React Native開發總結

    一、RN優劣勢 React Native的設計理念: 既擁有Native的用戶體驗、又保留React的開發效率 優勢: 它對比原生開發更為靈活,對比H5體驗更為高效。 替代傳統的WebView,打開效率更高,和原生之間的交互更方便。 多個版本迭代后的今天,它已經擁有了豐富第三方插件支持。 更方便的熱更新。 劣勢: 盡管是跨平臺,但是不同平臺Api的特性與顯示并不一定一致。 調試’相對&...

    React Native 旅程開始

    React Native 旅程開始 由于公司業務發展自己開始介入React Native 對于我這個小白來講,光光安裝環境居然用了5個小時。首先先介紹下我是一名Android 開發工程師,同時也是一名吃雞選手。不知道從什么時候起,感覺自己好迷茫,不知道自己該學些什么,感覺自己什么都會啊。迷茫無所適從現在我的想法是先適應公司的需求吧,畢竟生存是第一位的。 在這里總結下自己遇到的問題,首先自己按照RN...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    精品国产乱码久久久久久蜜桃不卡