Taro踩坑实践

简介: 快狗合伙人技术部,在去年使用 Taro开发了两个微信小程序,现在均已上线。开发过程中也遇到了一些大大小小的问题,下面列出几个比较典型的,供在使用或者已经使用但是还没有遇到的同学做个参考。

使用 Mobx 的列表渲染


使用 Mobx 包装过的数组类型,要slice()一下,否则会导致列表渲染不成功。


// store.js
import { observable, action } from 'mobx'
class ListStore {
    @observable listData = []
    ...
}
export default new ListStore()
// List.jsx
import Taro, { Component } from '@tarojs/taro'
import { observer, inject } from '@tarojs/mobx'
@inject('ListStore')
@observer
export default class List extends Component {
    ...
    render() {
        let list = this.props.ListStore.listData
        list.slice()
        const renderList = list && list.map((item) => (<View>{item.name}</View>))
        return (
            <View>{renderList}</View>
        )
    }
}


微信小程序手机号码授权


在微信小程序手机号码授权登录使用onGetPhoneNumber获取否则获取实现不了。


export default class login extends Component {
    getPhoneNumber(event) {
    }
    render() {
        return (
            <Button  openType='getPhoneNumber' onGetPhoneNumber="this.onGetPhoneNumberHandler.bind(this)">获取手机号</Button>
        )
    }
}


条件编译


Taro 最方便的一点就是支持条件编译,使用Taro特定的文件命名方式就能实现,但是只是在Js方面支持,并不支持在 config 的 pages 选项去用。


// src/set_title
// set_title.h5.js
/**
 * H5 设置页面title
 * @param {String} title
 */
export default function setTitle (title) {
  document.title = title
}
// set_title.weapp.js
import Taro from '@tarojs/taro'
export default function setTitle (title) {
  Taro.setNavigationBarTitle({ title })
}


使用


import setTitle from src/set_title
export default class MobileLogin extends Component {
    ...
    componentWillMount () {
        setTitle('标题')
    }
    render() {
        return (<View />)
    }
}


条件编译虽然好使,但是在app.js里面对页面使用是不可以的,例如你想定制支付宝小程序跟微信小程序通过同一个路径去访问不同的页面,只能通过在页面内部,通过代码进行逻辑判断实现。


// app.js
config = {
    pages: [
        // 只能是具体的文件
        'pages/Home/index',
        'pages/List/index'
    ]
}


版本问题


之前有个此,初始化项目的时候,没有使用 @taro/Mobx 的模板初始化,而是后来单独装的,导致在ios低版本(ios9)上页面显示异常。原因是使用的 mobx 版本太新,应该使用 mobx@4.8.0。


// package.json
{
    "dependencies": {
        "@tarojs/mobx": "1.3.19",
        "@tarojs/mobx-h5": "1.3.19",
        "@tarojs/mobx-rn": "1.3.19",
        "mobx": "4.8.0",
        ...
    }
}


注意: 需要特别注意的是本地全局安装的taro-cli项目中依赖的@tarojs相关版本号必须一致,之前有小伙伴出现本地Taro版本很新,拉下代码之后,运行项目不成功,这个很坑。


环境变量


通常项目会运行在多个环境,每个环境有一份对应的配置,如接口服务,如果能在编译的时候自动生成那是最好不过的了,那么如何能在 Taro 中使用。


安装 cross-env 设置环境变量,然后修改package.json


// package.json
...
"scripts": {
    "test:weapp": "cross-env APP_NS=test npm run build:weapp",
    "sandbox:weapp": "cross-env APP_NS=sandbox npm run build:weapp",
    "online:weapp": "cross-env APP_NS=online npm run build:weapp"
    ...
}


修改 Taro 生产环境的配置,只有执行 npm run build:xx 的时候,才会执行此文件的代码,也就是说,在 npm run dev:xx 的时候其实是不受影响的,所以本地开发环境,APP_NS 没有做设置。


// config/prod.js
const APP_NS = JSON.stringify(process.env.APP_NS);
module.exports = {
  env: {
    NODE_ENV: '"production"',
    APP_NS: `${APP_NS}`
  },
  ...
}


这样每次在打包的时候,就能区分出环境了,通过环境设置的环境变量APP_NS的值,就能在编译的时候取到对应字符串,进行区分当前是什么环境的资源包。


// src/api.js
const _env = process.env.APP_NS
const oUrl = {
    test: 'https://test.suyun.com',
    sandbox: 'https://sandbox.suyun.com',
    online: 'https://online.suyun.com'
}
export const baseUrl = oUrl[_env] || '/api'


Mock 数据


本地开发,自己编写服务器,数据格式自己定义,使用Mockjs 实现,作为本地的一个单独的服务器使用。


// mock/server.js
/**
 * mock 服务器
 */
const express = require('express')
const apiMocker = require('mocker-api')
const Mock = require('mockjs')
const mock = Mock.mock;
const PORT = 3000
const app = express();
const mocker = {
    'GET /list': mock({
        "code": 0,
        "message": 'success',
        "data|10": [
            {
                "sid": "@id",
                "name": "@cname",
                "photo": "@image",
            }
        ]
    })
}
apiMocker(app, mocker)
app.listen(PORT, () => {
  console.log(`Mock Server listening on http://localhost:${PORT}`)
});


修改 package.js 脚本命令


"scripts": {
    "mock": "node ./mock/mock-server.js",
    ...
}


添加mock数据也可以单独放在一个文件中,方便维护。


// mocker.js
const Mock = require('mockjs');
const mock = Mock.mock;
const mocker = {
    'GET /list': mock({
        "code": 0,
        "message": 'success',
        "data|10": [
            {
                "sid": "@id",
                "name": "@cname",
                "photo": "@image",
            }
        ]
    })
}
module.exports = mocker


相关文章
|
5月前
|
Python
mpvue填坑
mpvue填坑
|
10月前
|
开发框架 Dart 前端开发
从零到应用:我的Flutter项目开发之旅
Flutter是一种流行的跨平台移动应用开发框架,由Google推出。它使用Dart编程语言,通过单一代码库可以同时构建iOS和Android应用。Flutter具有许多吸引力的特性,如快速的渲染性能、漂亮的用户界面、丰富的组件库以及热重载等。通过阅读这篇文章,你将获得一些关于Flutter项目开发的实际指导,可以帮助你更有效地构建高质量的移动应用程序。无论你是初学者还是有一定经验的开发者,希望这些笔记能够为你提供一些有用的思路和技巧,让你在Flutter项目开发中取得更好的成果。
|
27天前
|
JavaScript 前端开发 区块链
vue项目实战:实战技巧总结(上)
vue项目实战:实战技巧总结
84 0
|
27天前
|
缓存 JavaScript 前端开发
vue项目实战:实战技巧总结(中)
vue项目实战:实战技巧总结
84 1
|
9月前
|
API 开发者
uniapp 微信分享踩坑 onShareAppMessage
uniapp 微信分享踩坑 onShareAppMessage
184 0
|
10月前
|
Dart JavaScript 前端开发
一个写了3年半flutter的小伙,突然写了2个月uniapp的感悟!
因为某些原因,在过去的三年半时间,我除了flutter之外,很少接触其他的框架,而最近突然写了2个月uniapp,有了些想法...
|
12月前
|
前端开发 JavaScript 测试技术
React组件库Concis,寻求社区有兴趣的小伙伴加入...
对于不熟悉这个项目的小伙伴们做个简单的介绍,Concis是一个基于React+TypeScript开发的一款轻量级组件库,全面拥抱React生态,支持React新特性(hooks/redux)追求轻量的组件体积,简单的使用方式,最小的思维负担。
52 1
|
12月前
|
移动开发 小程序 前端开发
【前端】taro 跨端应用环境搭建
【前端】taro 跨端应用环境搭建
12000 1
|
前端开发 JavaScript ice
flexiwan项目踩坑实践
flexiManage是以色列一家初创公司flexiWAN开源的基于SD-WAN平台的应用层的框架,包括flexiManage服务端框架以及硬件侧的flexiAgent框架,然而其并没有开源前端框架,为了验证其SD-WAN方案的可行性,需要快速搭建一个前端应用
191 0
|
小程序 开发者 内存技术
【七日打卡】taro小程序项目入门使用
Taro 项目基于 node,请确保已具备较新的 node 环境(>=8.0.0),推荐使用 node 版本管理工具 nvm 来管理 node,这样不仅可以很方便地切换 node 版本,而且全局安装时候也不用加 sudo 了。
【七日打卡】taro小程序项目入门使用