React + Meteor

Maciej Stasiełuk

ReactJS Wrocław #3

02.02.16

Tło na licencji CC: Trevor Bexon

Czym jest Meteor?

Platforma do budowania aplikacji 

Dlaczego warto zwrócić na niego uwagę?

Jest stabilny - jeden z pierwszych izomorficznych frameworków, a obecnie najpopularniejszy. Duża waga jest przyłożona do kompatybilności wstecznej.

 

Nie zniknie tak łatwo - duża społeczność, wiele produkcyjnych aplikacji, ponad 31 milionów dolarów dofiansowania ;-)

 

Łatwy do nauki - wiele rozwiązań działa out-of-the-box

 

W całości oparty i podporządkowany koncepcji reaktywnych danych - znakomity do budowania aplikacji gdzie jest to potrzebne

Zalety używania Meteora z Reactem

  • Dane aktualizują się "same" po zmianie w bazie danych
  • Optimistic UI działa domyślnie bez dodatkowej konfiguracji
  • Współdzielenie kodu pomiędzy klientem a serwerem
  • Hot code reload
  • Build system ze wsparciem dla Babel, Less, SASS...
  • Łatwe pisanie asynchronicznego kodu po stronie serwera

Przepływ danych

Grafika: Sashko Stubailo

Przepływ danych

Grafika: Sashko Stubailo

Przepływ danych

Zarządzenie stanem w komponentach

Meteor 1.2


meteor add react

Meteor 1.3


npm install react

Instalacja

(obecnie w fazie beta)

+ różne oddolne próby połączenia Meteora z Webpackiem

Zarządzanie stanem

Tymczasowe oficjalne rozwiązanie: ReactMeteorData mixin

const MyComponent = React.createClass({
  mixins: [ReactMeteorData],

  getMeteorData() {
    Meteor.subscribe('tasks');

    return {
      tasks: Tasks.find({}).fetch()
    }
  },

  render() {
    return this.data.tasks.map((task) => {
      return <Task key={task._id} task={task} />;
    });
  }
});

Zarządzanie stanem

Wersja Vazco: AutorunMixin

const MyComponent = React.createClass({
  mixins: [AutorunMixin],

  autorun () {
    Meteor.subscribe('tasks');

    const tasks = Tasks.find().fetch() || [];
    this.setState({tasks});
  },

  render () {
    return this.state.tasks.map((task) => {
      return <Task key={task._id} task={task} />;
    });
  }
});

Pochodzi z paczki universe:utilities-react

Zarządzanie stanem

Przykładowe użycie Reduxa

const { connect } = ReactRedux;

TaskList = class TaskList extends React.Component {
  getMeteorData() {
    const {visibilityFilter} = this.props;
    Meteor.subscribe('tasks', visibilityFilter);
    return {
      tasks: Tasks.find({}).fetch() || []
    }
  }
  render () {
    const { dispatch } = this.props;
    return this.data.tasks.map((task) => {
      return <Task key={task._id} task={task}
                   onClick={() => dispatch(toggleTodo(todo._id))} />;
    });
  }
};
reactMixin(TaskList.prototype, ReactMeteorData);
const mapStateToProps = (state) => {
  return { visibilityFilter: state.visibilityFilter}
};
TaskList = connect(mapStateToProps)(TaskList);

Tutorial z wyjaśnieniem, przykładowe repo

Zarządzanie stanem

Mantra

import TasksList from '../components/tasklist/index.jsx';
import {useDeps} from 'react-simple-di';
import {composeWithTracker, composeAll} from 'react-komposer';

export const composer = ({context}, onData) => {
  const {Meteor, Tasks} = context();

  if (Meteor.subscribe('tasks').ready()) {
    const tasks = Tasks.find().fetch();
    onData(null, {tasks});
  }
};

export default composeAll(
  composeWithTracker(composer),
  useDeps()
)(TaskList);

Oficjalna strona, przykładowy projekt a także tutorial

Zarządzanie stanem

Co przyniesie przyszłość?

Meteor Development Group zapowiedziało wsparcie dla
Reactive GraphQL

 

Użycie na poziomie komponentów będzie prawdopodobnie zbliżone do Relay, ale ma być też łatwe wsparcie dla Reduxa i innych rozwiązań

 

Po stronie serwera pojawi się możliwość obsługi dodatkowych baz danych

Kompletny przykład aplikacji Meteor + React

Demo

repo z kodem źródłowym

Dzięki!

Pytania?

React + Meteor

By Maciej

React + Meteor

Keynote for ReactJS Wrocław #3 meetup

  • 1,218