meteor 可以快速构建 pc,移动端,桌面端应用。

最大的优点是:数据库的数据发生变化时,可以实时推送到前端,非常适用于实时展示的应用开发。

在 react,react-native 应用中,可以仅使用同一个 meteor 后台,实时向前端推送数据。

github 代码地址

metaor 安装

windows 安装 meteor

官方推荐 chocolatey 安装 meteor。

  1. 先从 chocolatey 安装 chocolatey
  2. 然后在命令行中运行 choco install meteor

但是 meteor 安装速度非常慢,一顿搜索之后,找到了 Windows 下通过二进制包安装的下载地址 install.meteor.com/windows,搜索来源 github.com/meteor/docs…

OSX/Linux 安装 meteor

安装非常简单

curl https://install.meteor.com/ | sh
复制代码

验证安装

命令行输入

meteor --version
复制代码

输出版本号,表示安装成功

Meteor 1.8.1
复制代码

mongodb 安装

windows 安装 mongodb

www.mongodb.com/ 下载安装包安装

OSX 安装 mongodb

brew install mongod
复制代码

或者下载二进制包安装

mongod ,不是 mongodb

mongodb 图形界面

推荐 robomongo.org/, 易于使用,也是免费的。

meteor DDP

react,react-native 使用同一个 meteor 后台,所以 meteor 后台要与前端应用分开编写。

这就涉及到 meteor 中后台与前端的数据交互,meteor 中定义了一个 DDP协议

DDP协议定义了 meteor 后台发布数据,客户端订阅数据的操作。

本应用使用已经编写好了的 DDP 协议库,地址如下: github.com/mondora/ddp…。

创建 meteor 项目

meteor create --bare [project-name]
复制代码

更多创建参数

meteor help create
复制代码

meteor 连接 mongodb

meteor 项目启动命令如下:

meteor run
复制代码

配置端口

meteor run --port 9090
复制代码

meteor 连接自己的 mongodb

meteor 安装包中集成了 mongodb,默认启动的是集成的 mongodb。 为了连接自己的 mongodb,需要传入参数

MONGO_URL=mongodb://username:password@localhost:27017/[database-name]?authSource=admin meteor  run --port 9090
复制代码

刚开始没加上 authSource=admin 参数,一直连接不上 mongodb,加上之后就好了,根据需要加。

更多连接参数

编写 meteor 后台

import {Meteor} from 'meteor/meteor';
// mongodb 的 todo collection
const Todo = new Meteor.Collection('todo');
// 发布数据,前端就可以调用
Meteor.publish('todo', () => {return Todo.find();
});
/*** 定义前端调用的方法*/
Meteor.methods({// 查找一条数据getTodo(id) {return Todo.findOne(id);},// 查找所有数据getAllTodo() {return Todo.find().fetch();},// 新增addTodo(item) {return Todo.insert(item);},// 删除removeTodo(id) {return Todo.remove({_id: id});},// 编辑editTodo(item) {return Todo.update({_id: item.id}, {$set: item});},/**** @param {number 当前页面 从 1 开始} currentPage* @param {number 单次请求总条数} pageSize*/getPageTodo(currentPage = 1, pageSize = 10) {if (page < 1) {return null;}// meteor 对 mongodb 的操作方法做了封装// 更多操作请查看 meteor 官方文档const total = Todo.find().count();const list = Todo.find({},{skip: (currentPage - 1) * pageSize,limit: pageSize,}).fetch();return {total, data: list};},
});
// 定义对 mongodb 的操作权限
// 若没有定义,则是允许所有增删改查操作
Todo.deny({// 是否允许 mongodb 的新增操作, 返回 true 表示允许,否则不允许insert() {return true;},update() {return true;},remove() {return true;},
});export default Todo;
复制代码

前端调用

定义高阶组件

为了代码复用,定义了高阶组件,react 与 react-native 可以共用

// meteor.js
import React, {Component} from 'react';
import DDP from 'ddp.js';
/*** meteor 连接选项*/
const meteorOptions = {endpoint: 'ws://192.168.31.121:9090/websocket',// react-native 不支持 localhost,127.0.0.1,请替换为自己的 IPv4 地址SocketConstructor: WebSocket,reconnectInterval: 10000,// 重连间隔autoConnect: true,// 是否自动连接autoReconnect: true,// 是否自动重连
};
const PUBLIC_EVENTS = [// 'ready',// 'nosub','added','changed','removed',// 'result',// 'updated',// 'error',
];
export default (WrapperComponent, {collectionName, methodName}) => {class MeteorWrapper extends Component {ddp = new DDP(meteorOptions);lockRequest = falserecordSubscriptions = {};state = {meteorList: [],initOver: false,};componentDidMount() {if (!this.ddp) {console.error(`数据推送未连接上服务器!`);return;}// 添加订阅this.addSubscription();}componentWillUnmount() {// 取消订阅this.removeSubscription();// 断开连接this.ddp.disconnect();}getDataResult() {// 防止初始化请求次数过多if (this.lockRequest) {return}this.lockRequest = trueconst {ddp} = this;const self = this;/*** 调用后台定义的方法, 前端传递数组参数,meteor 后台接受到的是列表参数*/ddp.method(methodName, [1, 10]);ddp.on('result', data => {const {result} = data;console.log(data);self.setState({meteorList: result,initOver: true,});self.lockRequest = false});}componentDidCatch(error, info) {console.error(error, info);}addSubscription() {if (!collectionName) {console.error('mongodb collection 为空!');return;}const {ddp} = this;const self = this;// 订阅数据self.recordSubscriptions[collectionName] = ddp.sub(collectionName);PUBLIC_EVENTS.forEach(event => {ddp.on(event, () => {console.log(event)self.getDataResult();});});ddp.on('error', error => {console.error(`服务器推送数据错误,错误消息:${error}`)});ddp.on('ready', () => {self.getDataResult();});}removeSubscription() {this.ddp.unsub(this.recordSubscriptions[collectionName]);}render() {return <WrapperComponent {...this.props} {...this.state} />;}}return MeteorWrapper;
};复制代码

react 使用示例

import React, {Component} from 'react';
import {List, Skeleton} from 'antd';
import './App.css';
import MeteorWrapper from './meteor'function App(props) {const {meteorList = [], initOver} = propsreturn (<div className="App"><ListitemLayout="horizontal"dataSource={meteorList}renderItem={item => (<List.Item key={item.id}><Skeleton loading={!initOver} active avatar><List.Item.Metatitle={item.name}description={item.desc}/></Skeleton></List.Item>)}/></div>);
}export default MeteorWrapper(App, {collectionName:'todo',methodName:'getAllTodo'
})复制代码

react-native 使用示例

import React  from 'react';
import {StyleSheet, Text, View, FlatList} from 'react-native';
import MeteorWrapper from './meteor'function App(props) {const {meteorList = [], initOver} = propsreturn (<View style={styles.container}><FlatListdata={meteorList}renderItem={({item}) => (<View style={styles.item}><View style={styles.name}><Text>{item.name}</Text></View><View style={styles.desc}><Text>{item.desc}</Text></View></View>)}/></View>);
}export default MeteorWrapper(App, {collectionName:'todo',methodName:'getAllTodo'
})
const styles = StyleSheet.create({container: {flex: 1,backgroundColor: '#fff',fontSize: 14,lineHeight: 2,},item: {padding: 10,borderColor: '#ccc',borderBottomWidth: 1,borderStyle: 'solid',},name: {color: '#000',fontWeight: "900",fontSize: 24},desc: {color: '#666'}
});
复制代码

开启远程调试

运行命令

adb shell input keyevent 82
复制代码

点击 dev setting 然后点击 Debug server host & port for device 设置为 127.0.0。1:8081

再次运行

adb shell input keyevent 82
复制代码

点击 Debug js remote ,就会自动弹出调试页面。

IOS 运行报错

错误信息如下,请查看解决 React-Native mac10.14.4 运行报错 error Failed to build iOS project

error Failed to build iOS project. We ran "xcodebuild" command but it exited with error code 65. To debug build logs further, consider building your app with Xcode.app, by opening reactNative.xcodeproj
复制代码

转载于:https://juejin.im/post/5cbc30aee51d456e8a12efac

React 与 React-Native 使用同一个 meteor 后台相关推荐

  1. 用react-service做状态管理,适用于react、react native

    转载自:https://blog.csdn.net/wo_shi_ma_nong/article/details/100713151 . react-service是一个非常简单的用来在react.r ...

  2. dispatch作用 react_「React系列」手把手带你撸后台系统(Redux与路由鉴权)

    [React系列]手把手带你撸后台系统(Redux与路由鉴权) 来源:https://juejin.im/post/5d9b5ddee51d45781b63b8f7 上一篇我们介绍了系统架构,这一篇将 ...

  3. 掌握 React 与 React Native

    今天面试被人问到React 与 React Native ,废话不多说,直接上干货. React Native官网:https://reactnative.cn/ React Native App 页 ...

  4. 小谈React、React Native、React Web

    React有三个东西,React JS 前端Web框架,React Native 移动终端Hybrid框架,React Web是一个源码转换工具(React Native 转 Web,并之所以特别提出 ...

  5. 用于React,React Native,JavaScript和生产力的顶级VSCode扩展

    I've used VSCode full-time since 2016. Before I was using Visual Studio and I was looking for lighte ...

  6. React+Next JS 电商主题前台后台模板前端

    React+Next JS 电商主题前台后台模板前端 next.js+react GraphQL + ts (type)案例源码 next.js+react GraphQL + ts (type)案例 ...

  7. 【React】React 详细教程

    前言 1.react与vue的对比 1.1.什么是模块化 是从代码的角度来进行分析的 把一些可复用的代码抽离为单独的模块:便于项目的维护和开发 1.2.什么是组件化 是从UI界面角度来进行分析的 把一 ...

  8. 【尚硅谷React】——React全家桶笔记

    文章目录 第1章 React简介 1.1 React的特点 1.2 引入文件 1.3 JSX 1.3.1 为什么要用JSX 1.3.2 JSX语法规则 1.4 虚拟DOM 1.5 模块与组件 1.5. ...

  9. 初识React及React开发依赖介绍

    文章目录 初识React React介绍 React特点 React的依赖介绍 React的开发依赖 Babel和React的关系 React的依赖引入 初识React React介绍 React是什 ...

  10. 【React】React全栈脚手架搭建-苹果篮子示例

    接着上一章,脚手架已经搭建完毕,接下来便可以编写组件,先上效果图: 对苹果篮子页面进行组件切割 根据视图,我们可以将其切割为两部分 AppleItem:里面的苹果列表项 AppleBasket:包着苹 ...

最新文章

  1. 什么?程序员还要了解经济学?!
  2. ARTS打卡计划第三周-Tips
  3. php用重写算出圆柱体的体积,圆柱的体积
  4. Non-zero exit code (1)
  5. SAP Spartacus core模块的单元测试
  6. python变量、运算符、要求从键盘输入用户名和密码,校验格式是否符合规则,如果不符合,打印出不符合的原因,并提示重新输入练习
  7. Day704.Tomcat内存溢出的原因分析及调优 -深入拆解 Tomcat Jetty
  8. 毕业设计 基于STM32停车管理系统 - 物联网
  9. 谍影追踪:全球首例UEFI_BIOS木马分析
  10. 软键盘遮挡edittext_Android软键盘遮挡的四种解决方案
  11. leetcode-买卖股票的最佳时机含手续费
  12. 使用FFmpeg转录网络直播流
  13. Java去掉字符串首尾的““
  14. 力扣 179. 最大数
  15. 企业基因决定企业命运
  16. MySQL:索引原理
  17. net.sf.cglib.beans.BeanCopier用途
  18. 360浏览器怎么导入html,如何将360浏览器收藏网页导入到火狐浏览器中
  19. 【Rust日报】2020-10-02 移动操作系统SailfishOS支持Rust了
  20. PS2019计算机丢失,小编教您ps2019中如何调出历史记录

热门文章

  1. 基于 Flink 的典型 ETL 场景实现方案
  2. 国庆在家太无聊, 用Java爬了上千张小姐姐照片...
  3. 动图:七分钟帮你理解什么是KMP算法?
  4. 两步集成TV移动框架,从未如此简单
  5. python的pandas行数和索引_python – 使用索引值访问Pandas Data Frame行
  6. golangd 报错信息梳理
  7. go语言中常用的关于文件目录的操作
  8. python实训报告pygame_20192418 2019-2020-2 《Python程序设计》实验4报告
  9. pppoe路由桥混合模式_192.168.1.1路由器怎么设置和登陆
  10. 使用Nativefier将web页面打包为桌面应用