01 Taro_Mall 开源多端小程序框架设计

项目介绍

Taro_Mall是一款多端开源在线商城应用程序,后台是基于litemall基础上进行开发,前端采用Taro框架编写,现已全部完成小程序和h5移动端,后续会对APP,淘宝,头条,百度小程序进行适配。Taro_Mall已经完成了 litemall 前端的所有功能

扫码体验

由于小程序没有认证,只发布了一个预览版,只能加15个人,如有需要,请点击小程序申请

小程序 h5移动端

项目架构

项目用Taro做跨端开发框架,Taro基本采用React的写法,项目集成了 redux dva 控制单向数据流,用immer来提供不可变数据,提升整体的性能,减少渲染。

初始化项目

taro init Taro_Mall

进入项目目录开始开发,可以选择小程序预览模式,或者 h5 预览模式,若使用微信小程序预览模式,则需要自行下载并打开微信开发者工具,选择预览项目根目录。

微信小程序编译和发布

yarn dev:weapp  // 编译预览
yarn build:weapp // 构建发布

h5编译和发布

yarn dev:h5  // 编译预览
yarn build:h5 // 构建发布

其它端可以查看package.json 提供的命令

到这里,我们已经把项目初始化完毕,接下来我们引入 dva-core 和 immer,引入dva-core包就可以,不需要引入dva包,dva 包是对 dva-core 和路由,请求库等做了一层封装

yarn add dva-core dva-imme --save

在src 目录下新建 dva.js 文件,文件内容如下, 在创建App的时候,我们把dva-immer插件引入其中。

import {create} from 'dva-core';
import {createLogger} from 'redux-logger';
// import createLoading from 'dva-loading';
import immer from 'dva-immer';

let app;
let store = {};
let dispatch;

function createApp(opt) {
  // opt.onAction = [createLogger()];  // 这里可以引入 redux-logger
  app = create(opt);
  // app.use(createLoading({}));
  app.use(immer()); // 引入 immer

  if (!global.registered) opt.models.forEach(model => app.model(model));
  global.registered = true;
  app.start();

  store = app._store;
  app.getStore = () => store;

  dispatch = store.dispatch;

  app.dispatch = dispatch;
  if (window) {
    window.g_app = app;
  }
  return app;
}

export default {
  createApp,
  getDispatch() {
    return app.dispatch;
  },
  dispatch: store.dispatch
}

接下来在入口文件当中引入我们的 dva 文件

import dva from './dva';
import models from './models';

const dvaApp = dva.createApp({
  initialState: {},
  models: models,
  onError(e, dispatch) {
    console.log('系统出错了!');
    // dispatch(action("sys/error", e));
  },
});
const store = dvaApp.getStore();

我们发现dva创建的时候需要引入models,我们在src目录创建models 来存放我们的 model 文件,来管理状态, 我们看下models 文件下的入口文件

import home from './home';
......

export default [
  home,demo, goods, catalog, search       // 导入我们的模块
]

我们可以写一个简单的model,例如: demo.js

import delay from '../utils/delay';

export default {
  namespace: 'demo',
  state: {
    list: [],
    counter: {
      num: 0,
    }
  },
  reducers: {
    add: (state, {payload}) => {
      state.counter.num ++;
    },

    dec: (state, {payload}) => {
      state.counter.num --;
    }

  },
  effects: {
    *asyncAdd(_, {all, call, put}) {
      yield call(delay, 2000);//增加延迟测试效果

      yield put({type: 'add'});
    },
  }
};

接下来,我们要在taro redux的中的Provider传入 store

<Provider store={store}>
        <Index />
 </Provider>

接下来对请求库做下简单的封装,这里主要封装了对错误消息和统一处理,和提供了get,post方法,如需其它方法,可自行封装

import Taro from '@tarojs/taro';
import {showErrorToast} from '../utils/util';

/**
 * 封封微信的的request
 */
function request(url, data = {}, method = "GET") {
  return new Promise(function(resolve, reject) {
    Taro.request({
      url: url,
      data: data,
      method: method,
      header: {
        'Content-Type': 'application/json',
        'X-Litemall-Token': Taro.getStorageSync('token')
      },
      success: function(res) {

        if (res.statusCode == 200) {

          if (res.data.errno == 501) {
            // 清除登录相关内容
            try {
              Taro.removeStorageSync('userInfo');
              Taro.removeStorageSync('token');
            } catch (e) {
              // Do something when catch error
            }
            // 切换到登录页面
            Taro.navigateTo({
              url: '/pages/auth/login/login'
            });
          } else if(res.data.errno == 0) {
            resolve(res.data.data);
          } else {
            // Taro.showModal({
            //   title: '错误信息',
            //   content: res.data.errmsg,
            //   showCancel: false
            // });
            showErrorToast(res.data.errmsg);
            reject(res.data.errmsg);
          }
        } else {
          reject(res.errMsg);
        }

      },
      fail: function(err) {
        reject(err)
      }
    })
  });
}

request.get = (url, data) => {
  return request(url, data, 'GET');
}

request.post = (url, data) => {
  return request(url, data, 'POST');
}

export default request;

现在我们基本就可以用我们熟悉的套路去做开发了

结束语

Taro 遵循 React 语法规范的 多端开发 解决方案。当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要。

github : Taro_Mall 如果对大家有帮助,请 star 一下

原文地址:https://www.cnblogs.com/qiaojie/p/12431670.html

时间: 2024-10-07 05:12:45

01 Taro_Mall 开源多端小程序框架设计的相关文章

零基础入门 实战mpvue2.0多端小程序框架

第1章 课程快速预览(必看!!!)在这一章节中,老师讲带领你快速预览课程整体.其中,涉及到为什么要做这么一门实战课程.制作一个小程序的完整流程是怎么样的,以及如何做项目的技术选型. 第2章 30 分钟快速入门微信小程序(已掌握,可略过)在这一章节中,老师讲带领你从如何注册微信小程序开发者账号.工具的下载开始,到完成第一个小程序,再到组件与 API 的使用整个过程,最后来总结微信原生小程序的缺点. 第3章 30 分钟快速入门 Vue.js 框架(已掌握,可略过)在这一章节中,老师将带领你从第一个

开源一个golang小程序商城后台(moshopserver)

开源一个golang小程序商城后台(moshopserver) golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一些资料,有些人说很容易上手,确实是这样,和C/C++比起来,少了很多乱七八糟的语法.学一门新的语言,最好的方法就是动手写一些东西,最近小程序也比较火,也想学一下,网络上搜索的一些开源项目,基本上没有golang实现的,大部分都是nodejs和java写的,那么我就来实现一个golang版的吧,一石二鸟. 开发小程序前后端都需要开发,自己的前端经验很少,搜索了一些开源

多端小程序、小游戏兼容

当下存在的小程序/小游戏 已经开放的 内测中或将要开放的 多平台兼容的问题 没有统一标准 开发工具黑盒.不统一 API平台互相不兼容,同一平台前后版本也不兼容 业务差异 平台规范不同 兼容问题总结 现有工具 小程序开发 小游戏开发 微信小程序转其它小程序 工具小结 理论上的兼容方式 API兼容库 开发转换工具 多平台入口 本方案总结 相对实际的方案 统一技术栈 多平台开发方式 老项目迁移 总结 目前,小程序/小游戏成为潮流,BAT等大公司纷纷推出了小程序/小游戏,我们的兼容问题,也就提上了日程

美团小程序框架mpvue蹲坑指南

美团小程序框架mpvue(花名:没朋友)蹲坑指南 第一次接触小程序大概是17年初,当时小程序刚刚内侧,当时就被各种限制折腾的死去活来的,单向绑定, 没有promise,请求数限制,包大小限制,各种反人类,...反正我是感受到了满满的恶意. 最近接到一个工程类的小程序项目,做技术选型的时候,又把以前的东西捡起来看了看,重新熟悉了一下, 感觉小程序还是有在努力的,支持大部分es6语法了,还出了一个类Vue的框架wepy,还支持redux状态管理, 就大致建了个demo,跑了起来,感觉虽然没有vue那

[转] 扩展微信小程序框架功能

通过第三方 JavaScript 库,扩展微信小程序框架功能. 扩展微信小程序框架功能(1)——Promise ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.112200)后, 移除了开发者工具对 ES6 中Promise 特性原生的支持, 需要引入第三方的 Promise 库. 扩展微信小程序框架功能(2)——Generator Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同. 扩展微信小程序框架功能(3)——函数功能增强

wepy是一个微信小程序框架

wepy是一个微信小程序框架,支持模块化开发,开发风格类似Vue.js.可搭配redux使用,能同时打包出web和小程序.官方文档地址 目录结构: sotre: redux(如果你创建项目时使用了redux的话) wepy.config.js: webpack配置文件 app.wpy: 入口文件 project.config.json: 小程序项目配置文件 index.template.html: web页面的入口文件 pages: 存放主页面 components: 存放组件 mixins:

mpvue最佳实践 , 美团出的一个小程序框架

看手机微信,看到说美团出了1个小程序框架,  mpvue 搜下来试试,看了网上的一个对比 ----------------- 以下为引用 我们对微信小程序.mpvue.WePY 这三个开发框架的主要能力和特点做了横向对比,帮助大家了解不同框架的侧重点,结合业务场景和开发习惯,确定技术方案.对于如何更好地使用 mpvue 进行小程序开发,我们总结了一些最佳实践. 使用 vue-cli 命令行工具创建项目,使用Vue 2.x 的语法规范进行开发 避免使用框架不支持的语法特性,部分 Vue.js语法在

美团小程序框架mpvue入门教程

自打写了 美团小程序框架mpvue蹲坑指南, 一发不可收拾,今天趁周末空闲,来写个mpvue(没朋友)的简单入门教程,本教程只针对新手,老鸟勿喷. 另外,我还专门为本文做了一个简单的项目,如果懒得从头开始搭项目的童鞋,可以直接去我的 github上克隆到本地, 安装一下依赖,即可直接在此基础在开发,不需要做任何配置.如果你觉得该项目对有帮助, 请顺便给我Star,你们的支持是我最大的动力,谢谢! 好了,我们进入主题,首先,请允许引用一下美团官方对mpvue的介绍 mpvue是一个使用 Vue.j

美团小程序框架mpvue入门

mpvue 主要特性 使用 mpvue 开发小程序,你将在小程序技术体系的基础上获取到这样一些能力: 1. 彻底的组件化开发能力:提高代码复用性 2. 完整的 Vue.js 开发体验 3. 方便的 Vuex 数据管理方案:方便构建复杂应用 4. 快捷的 webpack 构建机制:自定义构建策略.开发阶段 hotReload 5. 支持使用 npm 外部依赖 6. 使用 Vue.js 命令行工具 vue-cli 快速初始化项目 7. H5 代码转换编译成小程序目标代码的能力 如果你有过vue的开发