Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Как бежать быстрее с react.js

fwdays
April 29, 2014

Как бежать быстрее с react.js

Максим Климишин

fwdays

April 29, 2014
Tweet

More Decks by fwdays

Other Decks in Programming

Transcript

  1. Очень коротко о react.js • Библиотека для создания UI •

    UI и только UI. Говорят, V в MVC • Виртуальное DOM дерево и быстрый diff-алгоритм • One way data flow - биндинг данных в одну сторону
  2. А нахера это нужно? • Разделение ответственности (Separation of concerns)

    - уменьшать связанность между модулями, увеличивать связность внутри модуля • Шаблоны плохо соотносятся с принципом SoC Please, stop the bullshit © John Legere, T-Mobile CEO
  3. Cohesion vs coupling Если Вы хотите, чтобы собака побежала, глупо

    командовать ее ногами, лучше отдать команду собаке, а она уже разберётся со своими ногами сама.
  4. Закон Деметры (Law of Demetra, LoD) • модуль должен обладать

    ограниченным знанием о других модулях: знать о модулях, которые имеют «непосредственное» отношение к этому модулю. • должен взаимодействовать только с известными ему модулями «друзьями», не взаимодействовать с незнакомцами. • обращаться только к непосредственным «друзьям».
  5. Hello, John! /** @jsx React.DOM */! var HelloMessage = React.createClass({!

    render: function() {! return <div>Hello {this.props.name}</div>;! }! });! ! React.renderComponent(! <HelloMessage name="John" />, mountNode);!
  6. JSX или типа HTML внутри JS кода • Меньше файлов,

    проще удерживать контекст • Удобно для народа без понимания структуры приложения (дизайнеры, верстальщики) • Мы знаем HTML и оно тупо и понятно
  7. Синтетические события • React.js слушает события только с корневой ноды

    • Когда событие происходит, react.js ищет компонент, соответствующей ноде, которая сгенерировала событие
  8. • Работает идентично во всех браузерах • Нет проблем с

    bind/unbind событий • Возможность расширять (event plugins system) Чем хорошо
  9. Виртуальное DOM дерево • Virtual DOM - это объекты JS,

    которые описывают структуру UI • Реакт использует алгоритм, для нахождения минимального числа шагов модификаций DOM дерева в браузере
  10. Key for lists • Особый случай для списков - по

    умолчанию элементы списка ассоциируются последовательно • Для однозначного маппинга надо указывать ключ
  11. Rendering • Во время вызова setState реакт помечает его как

    “грязный” (dirty) и перестраивает виртуальное DOM дерево • На следующей итерации event loop-a происходит обновление
  12. Решаем сами, что рендерим • По желанию можно самостоятельно решать

    изменилось ли дерево boolean shouldComponentUpdate( object nextProps, object nextState)
  13. Сборка проекта (grunt) /*global module:false*/! module.exports = function(grunt) {! grunt.initConfig({

    ! react: {! jsx: {! files: [! { expand: true, cwd: 'public/js',! src: [ '**/*.jsx' ], dest: 'public/js', ext: '.js'}! ]}},! watch: {! react: {! files: 'public/js/**/*.jsx',! tasks: ['react']! }}});! ! grunt.loadNpmTasks('grunt-contrib-watch');! grunt.loadNpmTasks('grunt-react');! ! grunt.registerTask('default', ['react']);! };!
  14. Чем хорошо для дела • Практически нет гемора для поддержки

    зоопарка браузеров • Быстрая и “не распухающая” разработка новых фич • Легко внедряется в существующий и работающий код • Легко ре-использовать компоненты • Сложно написать “говнокод” - помогает односторонний data flow
  15. Производительность Based on: http://vuejs.org/perf/ Backbone React Plain JS 0 10

    20 30 40 Анимация 100 кружков, Chrome 34, ~ms на цикл