Rails + Webpack

51
Rails/Webpack Khor, @neth_6, re:Culture, Xenon Ventures 2017-03-08

Transcript of Rails + Webpack

Page 1: Rails + Webpack

Rails/WebpackKhor, @neth_6, re:Culture, Xenon Ventures

2017-03-08

Page 2: Rails + Webpack

Goal● Rubyists be comfortable with Javascript

○ Installing webpack onto Rails app○ Directory structure conventions○ Configuration options○ Simple javascript web app

Page 3: Rails + Webpack

Agenda● Rails & Javascript History● Why Webpack● ‘Live-coding’ from scratch to simple app

Page 4: Rails + Webpack

# Gemfilegem 'jquery-rails'

The gem Way

Page 5: Rails + Webpack

The gem Way - Noooo!

● gem creation● gem updated

Page 6: Rails + Webpack

The cowboy Way ● app/assets/javascripts● lib/assets/javascripts● vendor/assets/javascripts

Page 7: Rails + Webpack

The cowboy way - sidekickvendorer gem

Page 8: Rails + Webpack

Dependencies

The cowboy way - Noooo!

Page 9: Rails + Webpack

JS package names

Page 10: Rails + Webpack

Can require JS, CSS, etc.

Page 11: Rails + Webpack

The rails-assets Way

JS packages

RubyGem

Manage dependencies Convert JS into Gem

Page 12: Rails + Webpack

The rails-assets Way - Future● Will bower be around?● Will rails-assets be around?● Tested in JS but not tested in Rails assets?

Page 13: Rails + Webpack

Browserify, Webpack, etc.

Page 14: Rails + Webpack

Rails+Relay+GraphQL+React+Browserify

https://medium.com/react-weekly/relay-facebook-on-rails-8b4af2057152

Page 15: Rails + Webpack
Page 16: Rails + Webpack

Rails/Webpack

Page 17: Rails + Webpack
Page 18: Rails + Webpack

Javascript as First-class Citizen

Page 19: Rails + Webpack

First-class Citizen

Javascript tools do packaging, manage dependencies, etc.

Page 20: Rails + Webpack

What You Already Know> curl -sSL https://get.rvm.io | bash -s stable --ruby

> rvm install 2.3.0

> rvm use 2.3.0@global

> gem install bundle

> rvm use 2.3.0

> rvm gemset create rails_webpack

> rvm gemset use rails_webpack

> gem install rails

rvm

bundler

gem

Page 21: Rails + Webpack
Page 22: Rails + Webpack

Live Coding> rails new rails_webpack

> echo 2.3.0 > rails_webpack/.ruby-version

> echo rails_webpack > rails_webpack/.ruby-gemset

> cd rails_webpack

> echo “gem ‘webpacker’, github: ‘rails/webpacker’” >> Gemfile

> echo “gem ‘foreman’” >> Gemfile

> bundle install

> rails webpack:install

rails app

webpack

rails env

Page 23: Rails + Webpack

rails webpack:install

Page 24: Rails + Webpack

Webpack config

Webpack config

Page 25: Rails + Webpack

config/webpack/shared.js entry: glob.sync(path.join('app', 'javascript', 'packs', '*.js*')).reduce( (map, entry) => { const basename = path.basename(entry, extname(entry)) const localMap = map localMap[basename] = path.resolve(entry) return localMap }, {} ),

output: { filename: '[name].js', path: path.resolve('public', ‘packs’) },

Bundle entry points

Generated bundles

Page 26: Rails + Webpack

config/webpack/production.jsmodule.exports = merge(sharedConfig.config, { output: { filename: '[name]-[chunkhash].js' },

plugins: [ new webpack.LoaderOptionsPlugin({ minimize: true }), new webpack.optimize.UglifyJsPlugin(), new CompressionPlugin({ asset: '[path].gz[query]', algorithm: 'gzip', test: /\.js$/ })

Do stuff required for production

Page 27: Rails + Webpack

Javascript Code

Where JS code lives

Webpack config

Page 28: Rails + Webpack

app/javascriptCommon structure:

+-- app/javascript/ | +-- <app name>/ | +-- components/ +-- index.js

Page 29: Rails + Webpack

app/javascript/simple/index.jsimport _ from 'lodash';

function component () { var element = document.createElement('div');

/* lodash is required for the next line to work */ element.innerHTML = _.join(['Woohoo','webpack'], ' ');

return element;}

document.body.appendChild(component());

Page 30: Rails + Webpack

Bundle Entry Points

Where JS code livesBundle entry points

Refers to code

Webpack config

Page 31: Rails + Webpack

app/javascript/packs/simple.js// Refers to code in app/javascript

import ‘../simple’

Page 32: Rails + Webpack

Bundle Output

Where JS code livesBundle entry points

Refers to code

/public/packsOutputs to

Webpack config

Page 33: Rails + Webpack

public/packs/simple.js/******/ (function(modules) { // webpackBootstrap/******/ // The module cache/******/ var installedModules = {};....

function component() { var element = document.createElement('div'); /* lodash is required for the next line to work */ element.innerHTML = __WEBPACK_IMPORTED_MODULE_0_lodash___default.a.join(['Woohoo', 'webpack'], ' '); return element;}

Page 34: Rails + Webpack
Page 35: Rails + Webpack

Live Coding (cont.)> rails g controller page index rails view

Page 36: Rails + Webpack

app/views/pages/index.html.erb<%= javascript_pack_tag 'simple' %>

Page 37: Rails + Webpack

Tada….the most meaningless web app

Page 38: Rails + Webpack

Tada….the most meaningless web app

<%= javascript_pack_tag 'simple' %> <html> <body>

…. < assets stuff > ...

<script src="/packs/simple.js"></script>

</body></html>

Page 39: Rails + Webpack
Page 40: Rails + Webpack

Webpack Wrappers

Where JS code livesBundle entry points

Refers to code

/public/packsOutputs to

Webpack config

WebpackWrappers

Page 41: Rails + Webpack

Webpack Wrapper (cont.)● bin/webpack

○ Compiling bundles

● bin/webpack-watcher○ Watch for bundle changes and re-compile with Webpack into public/packs

● bin/webpack-dev-server○ Live-reloading

■ Watch for bundle changes, re-compile with Webpack, and refresh■ Can serve pages from public/packs

Manual compile (e.g., production deploy): rails webpack:compile

Page 42: Rails + Webpack

Procfile

# Run Rails & Webpack concurrentlyrails: bundle exec puma -p $PORTwpwatcher: ./bin/webpack-watcher

Page 43: Rails + Webpack
Page 44: Rails + Webpack

Procfile (webpack-dev-server)# Run Rails & Webpack concurrentlyrails: bundle exec puma -p $PORTwebpack-dev-server: ./bin/webpack-dev-server

# config/environments/development.rb

# For webpack-dev-serverconfig.x.webpacker[:dev_server_host] = "http://localhost:8080"

Page 45: Rails + Webpack

Other webpacker commands

rails webpack:install - Compile assetsrails webpack:install:react - Install react

Page 46: Rails + Webpack

Is CoffeeScript Gone?// config/webpack/shared.js

module: { rules: [ { test: /\.coffee(\.erb)?$/, loader: 'coffee-loader' }, ... },}

Page 47: Rails + Webpack

Accessing Assets from Javascript// config/webpack/shared.js

module: { rules: [ { test: /\.js(\.erb)?$/, exclude: /node_modules/, loader: 'babel-loader', options: { presets: [ ['env', { modules: false }] ] } },

Page 48: Rails + Webpack

Accessing Assets from Javascript (cont.)// app/javascript/simple/index.js.erb

<% helpers = ActionController::Base.helpers %>var railsImagePath = "<%= helpers.image_path('rails.png') %>";

Page 49: Rails + Webpack

References● Unholy Javascript:

○ http://railsapps.github.io/rails-javascript-include-external.html

● Webpacker: ○ https://medium.com/statuscode/introducing-webpacker-7136d66cddfb

Page 50: Rails + Webpack

Thank You!

Page 51: Rails + Webpack

Convox Tokyo Meetup 23 Mar 2017https://www.meetup.com/Convox-Meetup/events/237726139/