腾讯新闻评论区最多的就是喷子 發表於 2020-3-6 23:24:00

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

<h2 id="项目介绍">项目介绍</h2>
<p>Taro_Mall是一款多端开源在线商城应用程序,后台是基于litemall基础上进行开发,前端采用Taro框架编写,现已全部完成小程序和h5移动端,后续会对APP,淘宝,头条,百度小程序进行适配。Taro_Mall已经完成了 litemall 前端的所有功能</p>
<h2 id="扫码体验">扫码体验</h2>
<blockquote>
<p>由于小程序没有认证,只发布了一个预览版,只能加15个人,如有需要,请点击小程序申请</p>
</blockquote>
<p><img src="https://gitee.com/qiaojie/taro-mall/raw/master/public/xiaochengxu.jpg" width="150" height="150" style="margin-right: 80px"><img src="https://gitee.com/qiaojie/taro-mall/raw/master/public/mobile.png" width="150" height="150"></p>
<p><span style="margin-right: 200px; margin-left: 20px">小程序</span>    h5移动端</p>
<h2 id="项目架构">项目架构</h2>
<p>项目用Taro做跨端开发框架,Taro基本采用React的写法,项目集成了 redux dva 控制单向数据流,用immer来提供不可变数据,提升整体的性能,减少渲染。</p>
<p>初始化项目</p>
<pre><code>taro init Taro_Mall
</code></pre>
<p>进入项目目录开始开发,可以选择小程序预览模式,或者 h5 预览模式,若使用微信小程序预览模式,则需要自行下载并打开微信开发者工具,选择预览项目根目录。</p>
<p>微信小程序编译和发布</p>
<pre><code>yarn dev:weapp// 编译预览
yarn build:weapp // 构建发布
</code></pre>
<p>h5编译和发布</p>
<pre><code>yarn dev:h5// 编译预览
yarn build:h5 // 构建发布
</code></pre>
<p>其它端可以查看package.json 提供的命令</p>
<p>到这里,我们已经把项目初始化完毕,接下来我们引入 dva-core和 immer,引入dva-core包就可以,不需要引入dva包,dva 包是对 dva-core 和路由,请求库等做了一层封装</p>
<pre><code>yarn add dva-core dva-imme --save
</code></pre>
<p>在src 目录下新建 dva.js 文件,文件内容如下, 在创建App的时候,我们把dva-immer插件引入其中。</p>
<pre><code>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 = ;// 这里可以引入 redux-logger
app = create(opt);
// app.use(createLoading({}));
app.use(immer()); // 引入 immer

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

store = app._store;
app.getStore = () =&gt; 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
}

</code></pre>
<p>接下来在入口文件当中引入我们的 dva 文件</p>
<pre><code>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();
</code></pre>
<p>我们发现dva创建的时候需要引入models,我们在src目录创建models 来存放我们的 model 文件,来管理状态, 我们看下models 文件下的入口文件</p>
<pre><code>import home from './home';
......

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

</code></pre>
<p>我们可以写一个简单的model,例如: demo.js</p>
<pre><code>import delay from '../utils/delay';

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

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

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

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

</code></pre>
<p>接下来,我们要在taro redux的中的Provider传入 store</p>
<pre><code>&lt;Provider store={store}&gt;
      &lt;Index /&gt;
&lt;/Provider&gt;
</code></pre>
<p>接下来对请求库做下简单的封装,这里主要封装了对错误消息和统一处理,和提供了get,post方法,如需其它方法,可自行封装</p>
<pre><code>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) =&gt; {
return request(url, data, 'GET');
}

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

export default request;

</code></pre>
<p>现在我们基本就可以用我们熟悉的套路去做开发了</p>
<h2 id="结束语">结束语</h2>
<p>Taro 遵循 React 语法规范的 多端开发 解决方案。当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要。</p>
<p>github : <font color="#1890ff" size="6">Taro_Mall</font>如果对大家有帮助,请 star 一下</p><br><br>
来源:https://www.cnblogs.com/qiaojie/p/12431670.html
頁: [1]
查看完整版本: 01 Taro_Mall 开源多端小程序框架设计