On Github cbetta / slides-techsylvania-2016
with Rollup, Riot and Redux
Cristiano Betta
Hacker @ betta.io
Hire me!2x @ Techsylvania!
former PayPal/Braintree
Ruby/JS Developer
Consultant @ Work Betta
Code Monkey @ punch.rocks
<script src="punch.js" charset="utf-8"></script> <div id='registration'></div> <script type="text/javascript"> punch.setup({ id: "19acb1ab...53fd459280d", type: 'popover', element: '#registration' }); </script>
NodeJS dependencies in the bowser
Browserify lets you require('modules') in the browser by bundling up all of your dependencies.
browserify main.js -o bundle.js
Older
JS Only
No ES6 import/export
Not the smallest result
A bundler for javascript and friends.
webpack input.js output.js
Newer
Handles many assets
No ES6 import/export
Not always smallest result
Not the simplest
The next-generation JavaScript module bundler
rollup input.js --output output.js
Newer
JS Only
No ES6 import/export
Tree shaking
Simple to use
The next-generation JavaScript module bundler
Write ES6 (aka ES2015)
Bundle into single file
Smaller than Browserify and Webpack
Export to AMD, CommonJS, ES2015, Globals, UMD
Tree shaking!
import fs from 'fs'; class AwesomeSauce { constructor() { // some code } makeIt() { // some code } } export default AwesomeSauce;
import AwesomeSauce from 'awesome-sauce'; let sauce = new AwesomeSauce(); sauce.makeIt();
class AwesomeSauce { // 100 lines of code } class EnterpriseSauce { // 2000 lines of code } export EnterpriseSauce; export default AwesomeSauce;
//import 2000 lines of code! import { EnterpriseSauce } from 'awesome-sauce'; let sauce = new EnterpriseSauce(); sauce.makeItSecureButSlow();
// main.js import { cube } from './maths.js'; console.log( cube( 5 ) );
// maths.js // unused function export function square ( x ) { return x * x; } // included function export function cube ( x ) { return x * x * x; }
function cube ( x ) { return x * x * x; } console.log( cube( 5 ) );
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory() : typeof define === 'function' && define.amd ? define(factory) : (factory()); }(this, function () { 'use strict'; function cube ( x ) { return x * x * x; } console.log( cube( 5 ) ); }));
// package.json { ... "scripts": { "dist:js": "rollup -c rollup/dist.js", ... } }
// rollup/dist.js export default { entry: 'js/index.js', dest: 'dist/punch.js', format: 'umd', moduleName: 'punch', plugins: [ riot(), npm({ browser: true }), commonjs(), babel(), uglify() ] };
// js/index.js import Dropin from './dropin/main.js'; let dropin = new Dropin(); export var setup = dropin.setup; // punch.setup() from earlier! export var destroyAll = dropin.destroyAll; export var instances = dropin.instances;
<script src="punch.js" charset="utf-8"></script> <div id='registration'></div> <script type="text/javascript"> punch.setup({ id: "19acb1ab...53fd459280d", type: 'popover', element: '#registration' }); </script>
Nothing can be said to be certain
except death and taxes
and JS frameworks
HTML enhanced for web apps!
~50kb (compressed)
A Javascript Library for building user interfaces
~146kb (compressed)
A React-like user interface micro-library
~9.18kb (compressed)
A React-like user interface micro-library
Custom Tags
Virtual Dom
Enjoyable Syntax
No IE8 support
Tiny Size!
<!-- index.html --> <div id='element'></div>
// dropin.js import './tags/punch-dropin.tag'; import riot from 'riot'; riot.mount('#element', "punch-dropin");
<!-- punch-dropin.tag --> <punch-dropin> <h1>Hello World</h1> </punch-dropin>
<!-- punch-dropin.tag --> <punch-dropin> <punch-loader></punch-loader> <punch-form></punch-form> </punch-dropin>
There are two hard things in computer science: cache invalidation and naming things.
There are two hard things in computer science: cache invalidation and naming things and state management
There are three hard things in computer science: cache invalidation and naming things and state management
There are two hard things in computer science: cache invalidation, naming things and state management
Redux is a predictable state container for JavaScript apps.
2kb
Including dependencies!
Before uglifying/compression!!
Riot compatible!!!
npm install redux
// dropin.js import './tags/punch-dropin.tag'; import riot from 'riot'; import { createStore } from 'redux'; import StoreMixin from 'riot-redux-mixin'; let state = ... let store = createStore(state); riot.mixin('redux', new StoreMixin(store)); riot.mount('#element', "punch-dropin");
<!-- punch-dropin.tag --> <punch-dropin> <h1>Counter: { state.count }</h1> <script type="text/javascript"> this.mixin('redux'); this.subscribe(function(state){ this.state = state; }.bind(this)) </script> </punch-dropin>
// dropin.js let state = function counter(count = 0, action) { switch (action) { case 'increment': return count + 1 case 'decrement': return count - 1 default: return count }
<!-- punch-dropin.tag --> <punch-dropin> <h1 onClick={ increment }>Counter: { state.count }</h1> <script type="text/javascript"> this.mixin('redux'); this.increment = function() { this.store.dispatch('increment'); } this.subscribe(function(state){ this.state = state; }.bind(this)) </script> </punch-dropin>
Rollup: 12k
WebPack 2: 13k
All results in bytes, Gzipped
babel + browserify + uglify => 3915
webpack@2 + babel + uglify => 3632
babel + rollup + uglify => 3440
typescript + webpack => 3245
closure => 2890
More results
source - 37,304 bytes
bundled => 180,345 bytes
uglified => 57,171 bytes
gzipped => 18,561 bytes
Most of these are personal opinion
ES6 is lovely
RiotJS is easy and really small
Riot+Redux makes apps easy to comprehend
Rollup + NPM scripts beats Gulp and Grunt
Some stuff isn't there yet
Rollup+Riot breaks sourcemaps
WebPack Chunks are awesome
Riot Routes needs to be added
Hard to scientifically compare sizes