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

Give a second change to Rails frontend!

Give a second change to Rails frontend!

Oh, the shenanigans in the front-end community lately! It's hard to say if they are caused by the "fatigue or enlightenment" from JavaScript, but one thing is clear — front-end development is ahead of the curve, devouring everything in its path.

At the same time, web projects are business as usual. Rails' approach to front-end development is hopelessly outdated: building assets via Sprockets is slow, uncomfortable and inflexible.

In my talk, I will touch base on the current state of front-end development and speak about acute Rails assets building problems. We'll have an insight into modern build systems, such as Webpack, Gulp, Brunch and Rollup — and into how does one integrate them with the Rails ecosystem, through real-world examples.

The talk is intended for back-end and front-end developers, and may also be useful for project managers with an interest in improving their software development process.

Alexey Taktarov

October 22, 2016

Transcript

51 slides
  1. theseguys.io · Uses Rails, React, Ember.js · Worked in Smartomato

    and Evil Martians Who is Alexey Taktarov? · Code Hipsters community and ficus.io · Now one of These Guys, working on resume.io
  2. Famous record setter Sir Malcom Campbell with a Bugatti in

    a garage setting, http://theoldmotor.com/ Sprockets — is a traditional way to build assets in Rails
  3. |-- vendor `-- assets |-- javascripts |-- cookie.js |-- fontfaceobserver.js

    |-- imagesloaded.js `-- uri.js Gemfile jquery-rails
  4. H. G. J. Moseley in the Balliol-Trinity Laboratories, Oxford, 1910.

    http://akkadium.com/ What about require order? How do I include images/fonts? Is it scalable?
  5. Everybody is tired of JavaScript… This weekend I wanted to

    make a feather app with the service worker containing the logic and virtual DOM inside. First day I was looking for a library which computes diffs and makes patching separately, the second day I was fighting Rollup and Buble making a conclusion that I cannot avoid Webpack no matter how much I wanted to. Victor Suzdalev · Code Hipsters
  6. React VirtualDOM Babel Webpack Promise ES2016 ServiceWorker fetch module bundler

    NPM yarn tree shaking async/await Redux isomorphic web app Flow GraphQL ble Immut TypeS deco s
  7. React Redux react-redux-rails Rails 㱺 A Rails wrapper for the

    react-redux React wrapper for redux <%= react_component('HelloMessage', name: 'John') %> React Rails react-rails ̣ 3,505 㱺 Ember Rails ember-rails ̣ 1,384 㱺
  8. Package manager bower, npm, yarn Tests and test-runners mocha, karma

    … Linters eslint, stylelint … Builders and module bundlers Grunt, Gulp, Brocolli, Brunch, Webpack …
  9. JS JS JS CSS PNG CSS JS JS WOFF https://frontend.center/

    Webpack it can load everything, just write a loader
  10. C C A B C A B Commons Chunk Extraction

    C A B Hot Module Replacement C A B C* A B C
  11. C C A B C A B Commons Chunk Extraction

    C A B Hot Module Replacement C A B C* A B C A Code Splitting A B C A B async require.ensure async require.ensure
  12. # public # `-- webpack # |-- application-14dc232d.js # `--

    manifest.json def webpack_asset_paths(bundle) manifest = Manifest.load if manifest.build_errors? # ... show build errors end if Rails.env.production? # ~> public/webpack/application-14dc232d.js manifest.path_for(bundle) else # ~> http://localhost:3808/webpack/application.js manifest.dev_server_path_for(bundle) end end
  13. Texas, 1939 Public Domain Your frontend guy feels at home

    You can use webpack-rails or homemade solution (like Evil Martians do)
  14. multiple entry points Webpack allows to use global dependencies through

    expose loader Use Commons Chunk extraction to reduce file sizes
  15. |-- javascripts |-- components | |-- top-bar.js.es6 | |-- trix-editor.js.es6

    | ... `-- views |-- account-view.js.es6 |-- contact-view.js.es6 ...
  16. class AccountView { constructor (el) { this.rootEl = el //

    listen for events } handleLogoClick (event) { // ... } } document.addEventListener('DOMContentLoaded', () => { const viewEl = document.querySelector('.account-view') if (viewEl) { const view = new AccountView(viewEl) } })
  17. Chinatown by Roman Polanski tools you use should be simple

    and understandable choose them based on team size and the budget frontend = first-class citizen
  18. |-- app |-- front | |-- src | | `--

    application.js | `-- webpack.config.js |-- node_modules `-- package.json localhost:3808/webpack/application.js |-- app | - packs | |-- editor.js | `-- payment.js |-- config | - webpack.config.js |-- public | - packs | |-- editor.js | `-- payment.js `-- vendor |-- node_modules `-- package.json rails/webpacker resume.io RAILS_ENV=development
  19. rails/webpacker resume.io RAILS_ENV=production |-- app | - packs | |--

    editor.js | `-- payment.js |-- config | - webpack.config.js |-- public | - packs | |-- editor-8c3423.js | `-- payment-f92348.js `-- vendor |-- node_modules `-- package.json |-- app |-- front | |-- src | | `-- application.js | `-- webpack.config.js |-- node_modules |-- package.json `-- public `-- webpack |-- application-087e34.js `-- manifest.json

More Decks by Alexey Taktarov

Other Decks in Programming