SlideShare a Scribd company logo
Introducing Rendr:
Run your Backbone.js apps
on the client and server

Spike Brehm
@spikebrehm

HTML5DevConf
April 1, 2013
2008
Introducing Rendr: Run your Backbone.js apps on the client and server
2013

Recommended for you

Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점

Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점은 Angular 2.0에서 컴포넌트 기반 아키텍처로 변경되었다고 설명했습니다. Angular 2.0에서는 타입스크립트를 사용하며 컴포넌트, 디렉티브, 템플릿 등의 개념이 도입되었습니다. 또한 Angular 2.0

angular2angularjs
How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0

The presentation slide for Vue.js meetup http://abeja-innovation-meetup.connpass.com/event/38214/ That contains mainly about SSR (Server side rendering) + SPA with isomorphic fetch and client hydration

vue.js
Modern Web Application Development Workflow - EclipseCon Europe 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014Modern Web Application Development Workflow - EclipseCon Europe 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014

The document discusses modern web application development workflows. It begins by looking at past workflows that lacked structure and organization. It then introduces Node.js as a JavaScript runtime and describes how JavaScript tools like Yeoman, Bower, Grunt and Gulp help provide structure, manage dependencies, automate tasks and enforce best practices. The document provides an overview of how these tools work and how they can be used to improve development workflows.

Introducing Rendr: Run your Backbone.js apps on the client and server
Exciting times in the
world of web apps.


<your framework here>
Client-side
MVC
Introducing Rendr: Run your Backbone.js apps on the client and server

Recommended for you

No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...

This document provides summaries of 4 macros: 1. The "response-time" macro displays response time data from a specified page. 2. The "color-table" macro applies alternating row coloring to tables with the "confluenceTable" class. 3. The "watermark" macro adds a watermark image to the page with options to specify the image, repetition, and minimum height. 4. The "draft-watermark" macro inserts a "Draft" watermark image on the page by calling the "watermark" macro.

summitconfluenceatlassian
Managing JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJSManaging JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJS

This document discusses how to manage JavaScript dependencies using RequireJS. It begins by showing the many different types of JavaScript dependencies that exist, such as libraries, frameworks, plugins, and custom code. It then outlines some of the problems that arise from having many script tags, including increased complexity. The document proceeds to explain how RequireJS uses an Asynchronous Module Definition (AMD) approach to define modules and their dependencies. It provides a code example of validating a mailing list signup form, breaking it into modules for jQuery, a validation plugin, and the main application script. Finally, it discusses how RequireJS can improve page load performance by loading scripts asynchronously on demand.

javascript
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...

No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluence Charles Hall, Astrium & Jim Severino, Atlassian

atlassiansummit 2010
+
Poor SEO; not crawlable
Performance hit to download
and parse JS
Duplicated application logic
Context switching
It’s still a PITA to build
fast, maintainable
rich-client apps.
We started thinking...

What if our JavaScript
app could run on both
sides?

Recommended for you

Refactoring Large Web Applications with Backbone.js
Refactoring Large Web Applications with Backbone.jsRefactoring Large Web Applications with Backbone.js
Refactoring Large Web Applications with Backbone.js

Have you ever starting working on a large, existing web application and jQuery spaghetti-code is all over the place? Your mind swirls as you try to figure out what code belongs to what component on what page. There are no JavaScript unit tests and you're terrified of making a change and breaking everything? I'm going to talk through the real life story of how Backbone.js helped to bring organization/structure, modularity, and testability to a large multi-page web application.

backbone.jsjasminebrowserify
An Introduction To Testing In AngularJS Applications
An Introduction To Testing In AngularJS Applications An Introduction To Testing In AngularJS Applications
An Introduction To Testing In AngularJS Applications

This document provides an overview of testing Angular JS applications. It discusses the limitations of jQuery for building web applications and how Angular JS addresses these through its MVC-based framework. It then covers unit testing Angular JS applications using Jasmine, including suites, specs, matchers, spies, mocks and stubs. The document also discusses end-to-end testing with Protractor and tools for automating testing like Karma, Yeoman, Grunt and IDE plugins.

angulajsangulartesting
Introduction to Angularjs
Introduction to AngularjsIntroduction to Angularjs
Introduction to Angularjs

AngularJS is a JavaScript framework for building dynamic web applications. It augments HTML with custom attributes and directives to bind data and behaviors to the DOM. Key features include two-way data binding, reusable components, dependency injection, routing, and templating. AngularJS uses an MVC or MVVM pattern, with scopes providing the view model. The framework enhances HTML, encourages test-driven development, and makes single page apps possible.

angularjsintroductionhtml5
Client +
server
MVC
aka “The Holy Grail”
Provides SEO
Initial pageload is drastically
faster
Consolidated application logic
Has anyone already
done this?
Meteor: client/server, but no
server-side rendering; owns data
layer
Derby: client+server rendering,
but owns data layer
Mojito: client+server rendering,
but full stack, and... YUI.

Recommended for you

Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVC

Migrating MVC to the Front-end using Backbone JS. Planbox is a single-page web application for Agile project management. It was built using the traditional MVC stack with CodeIgniter (PHP) and jQuery (Javascript). AJAX was heavily used to update DOM elements to offer a dynamic user experience. UX logic code quickly became spread across Javascript and PHP. The application code base quickly became unmanageable and scaling functionality became difficult. Things had to change. A decision was made to change architecture: bring all the UX logic in the front-end, and turn the back-end into an engine in charge of business logic. This talk is about this experience. How we moved the MVC stack from the back-end to the front-end. How we used Backbone JS as the foundation of our front-end framework and built on top. How the backend became a black-box with a Restful API. What lessons we learned, what benefits we gained, and what reflections we made about the future of MVC in Javascript.

backbonefont-endmvc
Javascript Frameworks for Well Architected, Immersive Web Apps
Javascript Frameworks for Well Architected, Immersive Web AppsJavascript Frameworks for Well Architected, Immersive Web Apps
Javascript Frameworks for Well Architected, Immersive Web Apps

Immersive web applications involve sophisticated interactivity within the browser, connected to models and data persistence on the server. The structure of the application is clearly delimited between client-side and server-side, but the available tools for building web applications have often blurred this distinction. The result is applications that are difficult to design and maintain.

#bcn11
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II

Workshop AngularJS (2/3) Creación de nuevas funcionalidades custom. Presentado por ingenieros: Enrique Oriol y Héctor Canto

single page applicationvisualenginsoftware development
Okay... how hard can
it be?
Introducing Rendr: Run your Backbone.js apps on the client and server
+
+

Recommended for you

Getting Started with Angular JS
Getting Started with Angular JSGetting Started with Angular JS
Getting Started with Angular JS

This is an effort towards teaching Angular JS from what an average Javascript developer already know. The presentation tries to fill the gap rather than posing Angular as a magical framework.

mvcangularjsjavascript
AngularJS 101 - Everything you need to know to get started
AngularJS 101 - Everything you need to know to get startedAngularJS 101 - Everything you need to know to get started
AngularJS 101 - Everything you need to know to get started

In this presentation, you will find everything need to get started with AngularJS. For more details, have a look at my blog (http://stephanebegaudeau.tumblr.com) or follow me on twitter (@sbegaudeau)

angularangularjsjavascript
MVC on the server and on the client
MVC on the server and on the clientMVC on the server and on the client
MVC on the server and on the client

The document discusses integrating Spring MVC on the server side with Backbone.js on the client side for building Model-View-Controller (MVC) applications. It provides an overview of MVC patterns and how they are implemented in Spring MVC using Java and in Backbone.js using JavaScript. Key aspects covered include using Backbone models and collections to represent and manipulate data, views to render templates and handle user interactions, and routers to manage client-side routing and application states. RESTful APIs are also discussed as a way to communicate between the client-side Backbone code and the server-side Spring MVC application.

mvcjavajavascript
Rendr.
What it is.
What it is.
JavaScript MVC on client & server
Backbone & Handlebars
BaseView, BaseModel,
BaseCollection, BaseApp,
ClientRouter, ServerRouter...
Express middleware
Minimal glue between client & server
What it ain’t.

Recommended for you

Spring MVC
Spring MVCSpring MVC
Spring MVC

The document describes the Spring MVC request lifecycle and how requests are handled in Spring MVC. It discusses how the DispatcherServlet receives requests and uses handler mappings to determine which controller should handle each request. It then describes how controllers process requests, returning a ModelAndView which is used to render the view. It also provides details on configuring controllers, view resolvers, and handler mappings, as well as examples of different types of controllers like command, form, and multi-action controllers.

emprovisespringmvc
Vue business first
Vue business firstVue business first
Vue business first

Vue is JavaScript framework for building component based UI. Why it became popular and what makes Vue business-first.

vuevue.jssoftware development
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics

Server Side Rendering (SSR) involves running and serving an Angular application from the server. This provides benefits like fast initial loading, SEO/crawlability since search engines can't run JavaScript. The document discusses SSR strategies like partial rendering and avoiding duplicate requests. It also covers challenges like unsupported features and outlines steps to implement SSR like generating a Universal module and rendering on the server with Express. SSR can improve performance but requires more complex setup and deployment.

angularangular 2server side rendering
What it ain’t.

Batteries-included web framework
Finished
Design goals:
•   Write application logic agnostic to
    environment.
•   Library, not a framework.
•   Minimize   if (server) {...} else {...}.

•   Hide complexity in library.
•   Talk to RESTful API.
•   No server-side DOM.
•   Simple Express middleware.
Classes:
- BaseApp < Backbone.Model
- BaseModel < Backbone.Model
- BaseCollection < Backbone.Collection
- BaseView < Backbone.View
- AppView < BaseView
- ClientRouter < BaseRouter
- ServerRouter < BaseRouter
- ModelStore < MemoryStore
- CollectionStore < MemoryStore
- Fetcher
Rendr directory structure
|- client/
|- shared/   } Sent to client
|- server/

Recommended for you

Building a dashboard using AngularJS
Building a dashboard using AngularJSBuilding a dashboard using AngularJS
Building a dashboard using AngularJS

AngularJS is a JavaScript MVC framework created by Google to build maintainable web applications. It focuses on the HTML side of web apps and allows separating an application into different logical modules like controllers that handle application behavior and views that define what the user sees. The framework uses directives, templates, and controllers to structure an app and bind these to a model to power the application.

dashboardbuild an awesome dashangularjs
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...

Are you ready for production? Are you sure? Is your application prefetchable? Is it readable for search engine robots? Will it fit into Content Delivery Network? Do you want to make it even faster? Meet the Server-Side Rendering concept. Learn how to bring first meaningful paint immediately, work with server-side Angular code, optimize API calls and more!

Reactive application using meteor
Reactive application using meteorReactive application using meteor
Reactive application using meteor

Meteor is a reactive web application framework that uses JavaScript on both the client and server. It provides reactivity through Tracker.autorun, which re-runs functions automatically when reactive data sources change. Meteor uses DDP for client-server communication and Minimongo, a MongoDB implementation, for client-side data caching. The document provides steps for creating a basic Meteor application with user accounts, routing, schemas, forms, and template helpers to display posts data reactively.

node.jsmongodbjavascript
App directory structure
|- app/
|- public/
|- server/
App directory structure




                    }
|- app/
|--- collections/
|--- controllers/
|--- models/            Entire app dir
|--- templates/         gets sent to
|--- views/
|--- app.js
                        client
|--- router.js
|--- routes.js
|- public/
|- server/
CommonJS using Stitch

On the server:
var User = require(‘app/models/user’);
var BaseView = require(‘rendr/shared/base/view’);


On the client:
var User = require(‘app/models/user’);
var BaseView = require(‘rendr/shared/base/view’);
app/routes.js


 module.exports = function(match) {
    match('',          'home#index');
    match('users',     'users#index');
    match('users/:id', 'users#show');
 };

Recommended for you

Aurelia Meetup Paris
Aurelia Meetup ParisAurelia Meetup Paris
Aurelia Meetup Paris

Aurelia is a next generation JavaScript client framework that leverages modern web technologies like ES6/7, Web Components, and JSPM/SystemJS. It provides features like dependency injection, routing, data binding, and composition out of the box. To get started, install dependencies like JSPM and generate an Aurelia app using the Aurelia CLI. Views are defined in HTML templates and connected to view models using data binding. Routing is configured via routes and navigation is done programmatically. Custom elements can be created to encapsulate and reuse UI components.

aureliajavascriptes2015
Mini-Training: AngularJS
Mini-Training: AngularJSMini-Training: AngularJS
Mini-Training: AngularJS

This document provides an overview of AngularJS, including: - AngularJS is a JavaScript MVVM framework for building dynamic web apps, developed by Google. - It uses Scopes to bind models to views and directives to extend HTML syntax. - Key components include modules, controllers, services and routing to organize an app. - Batarang is a Chrome plugin that helps debug and inspect AngularJS apps.

angularjsjavascriptframework
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJSAngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS

First part of AngularJS Training. Covers details of AngularJs community and answers - Why AngularJS ? - What is AngularJS ? - Getting started - Basic Application layout and anatomies - Data-binding, Existing Directives, Filters, Controllers - Hosting on local (NodeJS) HTTPServer Code samples available at https://github.com/murtazahaveliwala/technext-angularjs-demo/tree/master/demos/static/angular-apps

trainingangularjstechnology
app/routes.js


 module.exports = function(match) {
    match('',          'home#index');
    match('users',     'users#index');
    match('users/:id', 'users#show');
 };


                     controller
app/routes.js


 module.exports = function(match) {
    match('',          'home#index');
    match('users',     'users#index');
    match('users/:id', 'users#show');
 };


                        action
Render lifecycle,
server.
•   On server startup, parse routes file and mount as
    Express routes
•   GET /users/1337
•   Router matches "/users/:id" to "users#show" with
    params = {"id": 1337}
•   Router finds controller:
    require("app/controllers/users_controller")
•   Router executes show action with params = {"id": 1337}
•   The show action says to fetch User#1337 and use
    UsersShowView view class
•   Router instantiates new UsersShowView with data
•   Router calls view.getHtml()
•   Hands HTML to Express, which decorates with layout
    and serves response

Recommended for you

A gently introduction to AngularJS
A gently introduction to AngularJSA gently introduction to AngularJS
A gently introduction to AngularJS

The document discusses various aspects of single-page applications built with AngularJS including data binding, modules, controllers, directives, services, dependency injection, routing, and events. It provides code examples for defining a module, controller, directive, filter, and service as well as injecting services into controllers and emitting and broadcasting events. The document encourages joining the AngularJS community by testing apps, following style guides, reading publications, and subscribing to newsletters to learn more about building single-page apps with AngularJS.

beginnersangularjsclean code
AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014
AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014
AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014

Single Page Applications (SPAs) are all the rage now days but if you've built a true SPA you know that they can be fairly involved to create. There are typically a lot of moving parts and scripts ranging from history, to navigation, to data access. Have you thought through maintenance of the application down the road and how simple or complex it will be to make modifications as scripts change? In this session Dan Wahlin will introduce a solid introduction to the AngularJS SPA framework and demonstrate many of the built-in SPA features it provides. If you like to work with views, controllers, modules, plus tie into existing framework features without having to focus on all of the scripts under the cover then this is definitely a framework to check out!

spadan wahlinangularjs
Optimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page AppsOptimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page Apps

This document discusses strategies for optimizing Angular performance, including minimizing watchers, reducing digest cycle time, optimizing load time, and caching templates. It recommends avoiding unnecessary watches, using track by in ng-repeat, keeping controllers small and logic in services, caching requests, and pre-caching templates during build to reduce the number of HTTP requests.

javascriptangularsingle page apps
Render lifecycle,
client.
•   On page load, Router parses routes file and mounts
    Backbone routes
•   pushState /users/1337
•   Router matches "/users/:id" to "users#show" with
    params = {"id": 1337}
•   Router finds controller:
    require("app/controllers/users_controller")
•   Router executes show action with params = {"id": 1337}
•   The show action says to fetch User#1337 and use
    UsersShowView view class
•   Router instantiates new UsersShowView with data
•   Router calls view.render()
•   Insert into DOM
•   On page load, Router parses routes file and mounts
    Backbone routes
•   pushState /users/1337
•   Router matches "/users/:id" to "users#show" with
    params = {"id": 1337}
•   Router finds controller:
    require("app/controllers/users_controller")
•   Router executes show action with params = {"id": 1337}
•   The show action says to fetch User#1337 and use
    UsersShowView view class
•   Router instantiates new UsersShowView with data
•   Router calls view.render()
•   Insert into DOM
•   On page load, Router parses routes file and mounts
    Backbone routes
•   pushState /users/1337
•   Router matches "/users/:id" to "users#show" with
    params = {"id": 1337}
•   Router finds controller:
    require("app/controllers/users_controller")
•   Router executes show action with params = {"id": 1337}
•   The show action says to fetch User#1337 and use
    UsersShowView view class
•   Router instantiates new UsersShowView with data
•   Router calls view.render()
•   Insert into DOM

Recommended for you

Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications  Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications

Dev-day presented at Redu Educational Technologies about Ember.js. It points some Ember.js' benefits and gives an overview.

mvcjavascriptemberjs
AngularJS
AngularJSAngularJS
AngularJS

This document provides an overview of AngularJS, including: - AngularJS is an open-source framework for developing single-page web applications using MVC and JavaScript. - It supports data binding, scopes, controllers, services, filters, directives, templates and routing to switch between views. - Examples demonstrate using services to load data from an API, routing to different templates, and a hands-on user management application. - Exercises include working through the AngularJS tutorial and building a movie application using the Finnkino API.

angularjsweb applications
Angular js routing options
Angular js routing optionsAngular js routing options
Angular js routing options

A presentation made for the NG-CONF Israel that took place in jun 2014 at Google TLV Campus (http://ng-conf.gdg.co.il/) its an overview of how to use ngRoute and UI-Router in your app this slideshow contain a link for a working demo

angularjsjavascriptng-conf
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     callback(null, 'users_show_view');
   }
};
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     callback(null, 'users_show_view');
   }
};
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     callback(null, 'users_show_view');
   }
};
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     callback(null, 'users_show_view');
   }
};

Recommended for you

Android app development basics
Android app development basicsAndroid app development basics
Android app development basics

The document provides an overview of basic Android application development concepts including getting set up with the Android SDK, creating a "Hello World" app, and exploring core application components like Activities, Services, Intents, and the AndroidManifest file. It describes setting up the development environment, building a simple app, and diving deeper into how Activities, Services, Intents, and the manifest are used to build the user interface and functionality of an Android application.

Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2

Angular is a web application framework developed in 2009. It allows developers to create single page applications using HTML enhanced with Angular specific directives and by associating angular components like controllers, services and filters with HTML. The document provides an overview of key Angular concepts like controllers, services, filters and routing and how they are used to build interactive single page applications. It also demonstrates how to make HTTP requests to backend services and handle promises using the $http service and $q.

AngularJs-training
AngularJs-trainingAngularJs-training
AngularJs-training

This document provides an overview of key AngularJS concepts including modules, controllers, directives, services, routing, and more. It covers: - Defining modules, controllers, services, providers, and directives - Data binding, expressions, and controller syntax - Working with forms, validation, and animations - Connecting to REST APIs and working with JSON - Using directives, isolate scopes, and the link function - Routing applications with UI Router - Promises, events, and advanced Angular topics The document is a tutorial that explains AngularJS fundamentals while providing code examples for common tasks like routing, working with forms, using services, and creating directives.

developmentwebangularjs
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     callback(null, 'users_show_view');
   }
};




Most simple case: no fetching of
data.
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     callback(null, 'users_show_view');
   }
};




But we want to fetch the user.
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     var spec = {
        model: {model: ‘User’, params: params}
     };
     this.app.fetch(spec, function(err, results) {
        callback(err, 'users_show_view', results);
     });
   }
};
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     var spec = {
        model: {model: ‘User’, params: params}
     };
     this.app.fetch(spec, function(err, results) {
        callback(err, 'users_show_view', results);
     });
   }
};

Recommended for you

Dundee University HackU 2013 - Mojito
Dundee University HackU 2013 - MojitoDundee University HackU 2013 - Mojito
Dundee University HackU 2013 - Mojito

Mojito is a model-view-controller framework built on YUI 3 that allows developers to create cross-platform applications using JavaScript. It uses a single language across both server-side and client-side runtimes and supports progressive enhancement and localization. A Mojito application is organized using a directory structure that separates code by mojits. Configuration files define settings for different devices and routes. Controllers handle data and views display it using templating. Major companies like AT&T and Yahoo! use Mojito to build mobile and web applications.

dundeehackuhacku 2013
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0

The document provides instructions for building an Angular application with a Golang API and PostgreSQL database. It includes steps to set up the Angular and API projects, configure services and routing in Angular, and build components for item purchase, display, and reporting. The Angular app uses the Golang API to perform CRUD operations on a PostgreSQL database and display the data.

angulargolangpostgresql
Asp.Net Mvc
Asp.Net MvcAsp.Net Mvc
Asp.Net Mvc

This document provides an introduction and overview of ASP.NET MVC architecture. It compares MVC to traditional ASP.NET web forms, describing advantages of MVC such as separation of concerns and better support for test-driven development. It outlines the core MVC components - Model, View, Controller - and how they interact. It also covers routing, passing data between controllers and views, form processing, unit testing, and includes examples of popular MVC sites.

asp.netmvc
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     var spec = {
        model: {model: ‘User’, params: params}
     };
     this.app.fetch(spec, function(err, results) {
        callback(err, 'users_show_view', results);
     });
   }
};
app/controllers/users_controller.js

module.exports = {
   show: function(params, callback) {
     var spec = {
        model: {model: ‘User’, params: params}
     };
     this.app.fetch(spec, function(err, results) {
        callback(err, 'users_show_view', results);
     });
   }
};
app/views/users_show_view.js

var BaseView = require('rendr/shared/base/view');

module.exports = BaseView.extend({
  className: 'users_show_view'
});
module.exports.id = 'users_show_view';
app/views/users_show_view.js

var BaseView = require('rendr/shared/base/view');

module.exports = BaseView.extend({
  className: 'users_show_view'
});
module.exports.id = 'users_show_view';

Recommended for you

Building Web Apps with Express
Building Web Apps with ExpressBuilding Web Apps with Express
Building Web Apps with Express

An introduction to Express, the Sinatra-inspired MVC framework for Node.JS. You'll learn how Express manages and processes routes, how to use the Jade template engine, and how to design data models aimed to play nice with Express.

node.jsnodejavascript
Managing Through Chaos (w/ presenter notes)
Managing Through Chaos (w/ presenter notes)Managing Through Chaos (w/ presenter notes)
Managing Through Chaos (w/ presenter notes)

Spike Brehm's talk at Asbury Agile 2019. Includes presenter notes, because the slides are designed to be spoken over.

Managing Through Chaos
Managing Through ChaosManaging Through Chaos
Managing Through Chaos

This document discusses managing teams through chaos and cultivating psychological safety. It recommends focusing on emotional intelligence, building empathy, and giving feedback. Google research found that psychological safety, where team members feel safe speaking their mind without embarrassment, is important for effective teams. Creating an environment with ambiguity and risk can increase psychological safety. Tools like Range Labs Icebreaker can help teams build trust and safety. Resources mentioned include "The Five Dysfunctions of a Team" and Google's re:Work on effective team management.

app/views/users_show_view.js

var BaseView = require('rendr/shared/base/view');

module.exports = BaseView.extend({
  className: 'users_show_view'
});
module.exports.id = 'users_show_view';
app/views/users_show_view.js

var BaseView = require('rendr/shared/base/view');

module.exports = BaseView.extend({
  className: 'users_show_view'
});
module.exports.id = 'users_show_view';
app/views/users_show_view.js

var BaseView = require('rendr/shared/base/view');

module.exports = BaseView.extend({
  className: 'users_show_view',

  events: {
   'click p': 'handleClick'
  },

  handleClick: function() {...}
});
module.exports.id = 'users_show_view';
app/templates/users_show_view.hbs



<h1>User: {{name}}</h1>

<p>From {{city}}.</p>

Recommended for you

The Evolution of Airbnb's Frontend
The Evolution of Airbnb's FrontendThe Evolution of Airbnb's Frontend
The Evolution of Airbnb's Frontend

Over the last few years, Airbnb’s frontend architecture has evolved to keep pace with the rapid advancement happening the JavaScript world. Starting as a humble Rails 2 + Prototype.js app in 2008, the frontend stack powering airbnb.com has gone through a few revisions, including a push towards single-page app architecture with Backbone.js and Handlebars.js, an adventure into isomorphic JavaScript with Rendr (our library for using Node.js to server-render Backbone SPAs), and most recently, a move toward React.js and a re-envisioning of our build pipeline to take advantage of CommonJS, ES6, and a Node.js-based transform system. Spike Brehm, software engineer on the @AirbnbNerds team, will walk through how we approached and executed on these changes. Plus, get excited to see a preview of our new approach to isomorphic JavaScript, allowing us to server-render React components from our Rails app. Spike Brehm is a software engineer at Airbnb who specializes in building rich web experiences. As a JavaScript nerd, he has spent the last few years shipping web apps and prototyping Airbnb’s front-end stack, experimenting with “isomorphic JavaScript” — apps that have the flexibility to run on both the client and sever using the same codebase.

airbnbnode.jsrails
Integrating Browserify with Sprockets
Integrating Browserify with SprocketsIntegrating Browserify with Sprockets
Integrating Browserify with Sprockets

This document discusses integrating Browserify and CommonJS dependency management into Rails' asset pipeline Sprockets. It describes: 1) Limitations of Sprockets for managing JavaScript dependencies and the benefits of using Browserify and CommonJS. 2) How to integrate Browserify into Sprockets using a custom Tilt template that runs Browserify to bundle dependencies. 3) Enhancing the build pipeline to transpile ES6 code using a Browserify transform.

jsjavascriptrails
Building Isomorphic Apps (JSConf.Asia 2014)
Building Isomorphic Apps (JSConf.Asia 2014)Building Isomorphic Apps (JSConf.Asia 2014)
Building Isomorphic Apps (JSConf.Asia 2014)

Over the past year or so, we’ve seen the emergence of a new way of building JavaScript web apps that share code between the web browser and the server, using Node.js — a technique that has come to be known as "isomorphic JavaScript.” There are a variety of use cases for isomorphic JavaScript; some apps render HTML on both the server and the client, some apps share just a few small bits of application logic, while others share the entire application runtime between client and server to provide advanced offline and realtime features. Why go isomorphic? The main benefits are performance, maintainability, reusability, and SEO. This talk shares examples of isomorphic JavaScript apps running in the wild, explore the exploding ecosystem of asset building tools, such as Browserify, Webpack, and Gulp, that allow developers to build their own isomorphic JavaScript apps with open-source libraries, demonstrate how to build an isomorphic JavaScript module from scratch, and explore how libraries like React and Flux can be used to build a single-page app that renders on the server.

javascriptisomorphicjsconfasia
Rendered HTML

<div class="users_show_view"
     data-view="users_show_view"
     data-model_name="user"
     data-model_id="1337">

  <h1>User: Spike</h1>

  <p>From San Francisco.</p>
</div>
Rendered HTML

<div class="users_show_view"
     data-view="users_show_view"
     data-model_name="user"
     data-model_id="1337">

  <h1>User: Spike</h1>

  <p>From San Francisco.</p>
</div>
Rendered HTML

<div class="users_show_view"
     data-view="users_show_view"
     data-model_name="user"
     data-model_id="1337">

  <h1>User: Spike</h1>

  <p>From San Francisco.</p>
</div>
Rendered HTML

<div class="users_show_view"
     data-view="users_show_view"
     data-model_name="user"
     data-model_id="1337">

  <h1>User: Spike</h1>

  <p>From San Francisco.</p>
</div>

Recommended for you

JSConf US 2014: Building Isomorphic Apps
JSConf US 2014: Building Isomorphic AppsJSConf US 2014: Building Isomorphic Apps
JSConf US 2014: Building Isomorphic Apps

Slides from Spike Brehm's talk at JSConf US 2014. Topics include the etymology of "Isomorphic JavaScript", examples is isomorphic apps in the wild, reasons behind the growing trend towards isomorphic apps, and how to build an isomorphic module using Browserify & NPM.

jsconfjavascriptjs
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript AppsIn Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps

This document discusses isomorphic JavaScript, which allows JavaScript code to run on both the client and server sides. It explains that isomorphic JavaScript is environment-agnostic and does not depend on browser- or server-specific properties. Popular libraries like Handlebars, Backbone, and React can be used isomorphically. Building isomorphic apps improves performance, enables search engine crawling of single-page apps, reduces code duplication, and increases flexibility. The document outlines how tools like Browserify and build systems like Grunt can be used to bundle code for both environments.

node.jshtml5web
General Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScriptGeneral Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScript

The document discusses isomorphic JavaScript, which allows JavaScript code to run on both the client and server. It provides examples using libraries like Underscore.js and Handlebars.js isomorphically. Frameworks like Meteor, Mojito, and Rendr are introduced that support building isomorphic apps. The benefits are around performance, SEO, and code maintainability. The presentation concludes with a demo of building features into an sample isomorphic blog application.

node.jsjavascriptweb
Where’d the data come from?
Where’s the render method?
How do I customize what gets
passed to the template?
Sensible defaults.
app/views/users_show_view.js
var BaseView = require('rendr/shared/base/view');

module.exports = BaseView.extend({
  className: 'users_show_view',

  getTemplateData: function() {

  }
});
app/views/users_show_view.js
var BaseView = require('rendr/shared/base/view');

module.exports = BaseView.extend({
  className: 'users_show_view',

  getTemplateData: function() {
    var data = BaseView.prototype.getTemplateData 
      .call(this);
  }
});
app/views/users_show_view.js
var BaseView = require('rendr/shared/base/view');

module.exports = BaseView.extend({
  className: 'users_show_view',

  getTemplateData: function() {
    var data = BaseView.prototype.getTemplateData 
      .call(this);
    // `data` is equivalent to this.model.toJSON()

  }
});

Recommended for you

Isomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassIsomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master Class

1) Isomorphic JavaScript allows code to run on both the client and server by being environment-agnostic or shimmed for different environments. 2) It improves performance by enabling faster initial page loads and improves SEO by allowing search engines to crawl single page apps. 3) Popular libraries like Underscore, Backbone, Handlebars, and React can be used isomorphically, and isomorphic applications exist on a spectrum from sharing small parts of code to entire applications.

isomorphicnode.jsjavascript
Building a Single-Page App: Backbone, Node.js, and Beyond
Building a Single-Page App: Backbone, Node.js, and BeyondBuilding a Single-Page App: Backbone, Node.js, and Beyond
Building a Single-Page App: Backbone, Node.js, and Beyond

The document discusses building a single-page application using Backbone.js, Node.js and other technologies. It describes how Airbnb built a wish lists feature as a single-page app using Backbone for the model-view architecture, Handlebars for templating, and Bootrap for UI/layout. The app fetches data from an API on demand and handles routing through a Backbone router to update the content view.

node.jsjavascriptruby on rails
Extending Apostrophe to build a variable-based CMS for rendering PDF brochures
Extending Apostrophe to build a variable-based CMS for rendering PDF brochuresExtending Apostrophe to build a variable-based CMS for rendering PDF brochures
Extending Apostrophe to build a variable-based CMS for rendering PDF brochures

This document summarizes a proposal to extend the Apostrophe CMS to build a variable-based CMS for rendering PDF brochures for SunRun, a solar power company. The CMS would allow the sales team to maintain complex sales documents across 25 partners, 13 markets, and 24 utilities while reusing content through variables. It would introduce a "Flapjack" CMS built with Symfony, Doctrine, and extensions of Apostrophe's slots and blog plugins to support custom data models for documents, pages, blocks, widgets, and variables with visibility filters.

phpflapjackapostrophe
app/views/users_show_view.js
var BaseView = require('rendr/shared/base/view');

module.exports = BaseView.extend({
  className: 'users_show_view',

  getTemplateData: function() {
    var data = BaseView.prototype.getTemplateData 
      .call(this);
    // `data` is equivalent to this.model.toJSON()
    return _.extend(data, {
      nameUppercase: data.name.toUpperCase()
    });
  }
});
app/templates/users_show_view.hbs



<h1>User: {{nameUppercase}}</h1>

<p>From {{city}}.</p>
Rendered HTML


<div class="users_show_view" data-...>
  <h1>User: SPIKE</h1>

  <p>From San Francisco.</p>
</div>
Rendered HTML with layout
<!doctype html>
<html lang="en">
<head>...</head>

<body>
<div id="content">
  <div class="users_show_view" data-view="users_show_view"
       data-model_name="user" data-model_id="1337">

    <h1>User: SPIKE</h1>

    <p>From San Francisco.</p>
  </div>
</div>

<script>
(function() {
var App = window.App = new (require('app/app'));
App.bootstrapData({
  "model":{"summary":{"model":"user","id":1337},
  "data":{"name":"Spike","city":"San Francisco", ...}
});
App.start();
})();
</script>
</body></html>

Recommended for you

Quality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of TimeQuality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of Time

Is your patent a vanity piece of paper for your office wall? Or is it a reliable, defendable, assertable, property right? The difference is often quality. Is your patent simply a transactional cost and a large pile of legal bills for your startup? Or is it a leverageable asset worthy of attracting precious investment dollars, worth its cost in multiples of valuation? The difference is often quality. Is your patent application only good enough to get through the examination process? Or has it been crafted to stand the tests of time and varied audiences if you later need to assert that document against an infringer, find yourself litigating with it in an Article 3 Court at the hands of a judge and jury, God forbid, end up having to defend its validity at the PTAB, or even needing to use it to block pirated imports at the International Trade Commission? The difference is often quality. Quality will be our focus for a good chunk of the remainder of this season. What goes into a quality patent, and where possible, how do you get it without breaking the bank? ** Episode Overview ** In this first episode of our quality series, Kristen Hansen and the panel discuss: ⦿ What do we mean when we say patent quality? ⦿ Why is patent quality important? ⦿ How to balance quality and budget ⦿ The importance of searching, continuations, and draftsperson domain expertise ⦿ Very practical tips, tricks, examples, and Kristen’s Musts for drafting quality applications https://www.aurorapatents.com/patently-strategic-podcast.html

patentspatent applicationpatent prosecution
Manual | Product | Research Presentation
Manual | Product | Research PresentationManual | Product | Research Presentation
Manual | Product | Research Presentation

Manual Method of Product Research | Helium10 | MBS RETRIEVER

product researchhelium10 | mbs retriever
Calgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptxCalgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptx

MuleSoft Meetup on APM and IDP

mulesoftai
Rendered HTML with layout
<!doctype html>
<html lang="en">
<head>...</head>

<body>
<div id="content">
  <div class="users_show_view" data-view="users_show_view"
       data-model_name="user" data-model_id="1337">

    <h1>User: SPIKE</h1>

    <p>From San Francisco.</p>
  </div>
</div>

<script>
(function() {
var App = window.App = new (require('app/app'));
App.bootstrapData({
  "model":{"summary":{"model":"user","id":"wycats"},
  "data":{"name":"Spike","city":"San Francisco", ...}
});
App.start();
})();
</script>
</body></html>
View hydration.
1. Find DOM els with data-view attribute.
var viewEls = $("[data-view]");
2. Determine model or collection based on
data-model_name, data-model_id, etc.

var modelName = viewEl.data(‘model_name’),
    modelId   = viewEl.data(‘model_id’);

console.log(modelName, modelId);
 => “user” 1337

Recommended for you

Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...

Slide of the tutorial entitled "Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Emerging Trends" held at UMAP'24: 32nd ACM Conference on User Modeling, Adaptation and Personalization (July 1, 2024 | Cagliari, Italy)

user modelinguser profilinguser model
20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf

Support en anglais diffusé lors de l'événement 100% IA organisé dans les locaux parisiens d'Iguane Solutions, le mardi 2 juillet 2024 : - Présentation de notre plateforme IA plug and play : ses fonctionnalités avancées, telles que son interface utilisateur intuitive, son copilot puissant et des outils de monitoring performants. - REX client : Cyril Janssens, CTO d’ easybourse, partage son expérience d’utilisation de notre plateforme IA plug & play.

genaicloudrgpd
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly DetectionAdvanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly Detection

Cybersecurity is a major concern in today's connected digital world. Threats to organizations are constantly evolving and have the potential to compromise sensitive information, disrupt operations, and lead to significant financial losses. Traditional cybersecurity techniques often fall short against modern attackers. Therefore, advanced techniques for cyber security analysis and anomaly detection are essential for protecting digital assets. This blog explores these cutting-edge methods, providing a comprehensive overview of their application and importance.

cybersecurityanomaly detectionadvanced techniques
3. Fetch model/collection data from
ModelStore/CollectionStore.
var model = modelStore.get(modelName,
              modelId);
4. Find view class.
var viewName, ViewClass;
viewName = viewEl.data(‘view’);
ViewClass = require('app/views/' + viewName);
5. Instantiate view instance with model.
var view = new ViewClass({
  model: model,
  ...
});
6. Attach to DOM el.
view.setElement(viewEl);

Recommended for you

Coordinate Systems in FME 101 - Webinar Slides
Coordinate Systems in FME 101 - Webinar SlidesCoordinate Systems in FME 101 - Webinar Slides
Coordinate Systems in FME 101 - Webinar Slides

If you’ve ever had to analyze a map or GPS data, chances are you’ve encountered and even worked with coordinate systems. As historical data continually updates through GPS, understanding coordinate systems is increasingly crucial. However, not everyone knows why they exist or how to effectively use them for data-driven insights. During this webinar, you’ll learn exactly what coordinate systems are and how you can use FME to maintain and transform your data’s coordinate systems in an easy-to-digest way, accurately representing the geographical space that it exists within. During this webinar, you will have the chance to: - Enhance Your Understanding: Gain a clear overview of what coordinate systems are and their value - Learn Practical Applications: Why we need datams and projections, plus units between coordinate systems - Maximize with FME: Understand how FME handles coordinate systems, including a brief summary of the 3 main reprojectors - Custom Coordinate Systems: Learn how to work with FME and coordinate systems beyond what is natively supported - Look Ahead: Gain insights into where FME is headed with coordinate systems in the future Don’t miss the opportunity to improve the value you receive from your coordinate system data, ultimately allowing you to streamline your data analysis and maximize your time. See you there!

Recent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS InfrastructureRecent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS Infrastructure

Recent advancements in the NIST-JARVIS infrastructure: JARVIS-Overview, JARVIS-DFT, AtomGPT, ALIGNN, JARVIS-Leaderboard

jarvisjarvis-dftalignn
20240705 QFM024 Irresponsible AI Reading List June 2024
20240705 QFM024 Irresponsible AI Reading List June 202420240705 QFM024 Irresponsible AI Reading List June 2024
20240705 QFM024 Irresponsible AI Reading List June 2024

Everything that I found interesting last month about the irresponsible use of machine intelligence

quantumfaxmachine
7. Delegate events.
view.delegateEvents();
8. Profit!
alert(“That wasn’t so hard, right?”)
Rendr is available
starting today.
github.com/airbnb/rendr
TODO

•   Share routing logic between client &
    server.

•   Lazy load views, templates, etc as needed.

•   Support other templating languages.

•   Break down into smaller modules.

•   Rewrite in vanilla JavaScript.

•   much more...

Recommended for you

BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALLBLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL

Blockchain technology is transforming industries and reshaping the way we conduct business, manage data, and secure transactions. Whether you're new to blockchain or looking to deepen your knowledge, our guidebook, "Blockchain for Dummies", is your ultimate resource.

blockchainweb3blockchain technology
Comparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdfComparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdf

To help you choose the best DiskWarrior alternative, we've compiled a comparison table summarizing the features, pros, cons, and pricing of six alternatives.

data recoverydatadiskwarrior
The Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU CampusesThe Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU Campuses

CIO Council Cal Poly Humboldt September 22, 2023

national research platformdistributed supercomputerdistributed systems
Hackers
wanted.
Thanks!
@spikebrehm
  @rendrjs
@AirbnbNerds

More Related Content

What's hot

Vue, vue router, vuex
Vue, vue router, vuexVue, vue router, vuex
Vue, vue router, vuex
Samundra khatri
 
Angular js
Angular jsAngular js
Angular js
Behind D Walls
 
Vuex
VuexVuex
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Jeado Ko
 
How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0
Takuya Tejima
 
Modern Web Application Development Workflow - EclipseCon Europe 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014Modern Web Application Development Workflow - EclipseCon Europe 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014
Stéphane Bégaudeau
 
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
Atlassian
 
Managing JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJSManaging JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJS
Den Odell
 
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
Atlassian
 
Refactoring Large Web Applications with Backbone.js
Refactoring Large Web Applications with Backbone.jsRefactoring Large Web Applications with Backbone.js
Refactoring Large Web Applications with Backbone.js
Stacy London
 
An Introduction To Testing In AngularJS Applications
An Introduction To Testing In AngularJS Applications An Introduction To Testing In AngularJS Applications
An Introduction To Testing In AngularJS Applications
Rohan Chandane
 
Introduction to Angularjs
Introduction to AngularjsIntroduction to Angularjs
Introduction to Angularjs
Manish Shekhawat
 
Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVC
Acquisio
 
Javascript Frameworks for Well Architected, Immersive Web Apps
Javascript Frameworks for Well Architected, Immersive Web AppsJavascript Frameworks for Well Architected, Immersive Web Apps
Javascript Frameworks for Well Architected, Immersive Web Apps
dnelson-cs
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II
Visual Engineering
 
Getting Started with Angular JS
Getting Started with Angular JSGetting Started with Angular JS
Getting Started with Angular JS
Akshay Mathur
 
AngularJS 101 - Everything you need to know to get started
AngularJS 101 - Everything you need to know to get startedAngularJS 101 - Everything you need to know to get started
AngularJS 101 - Everything you need to know to get started
Stéphane Bégaudeau
 
MVC on the server and on the client
MVC on the server and on the clientMVC on the server and on the client
MVC on the server and on the client
Sebastiano Armeli
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
Emprovise
 
Vue business first
Vue business firstVue business first
Vue business first
Vitalii Ratyshnyi
 

What's hot (20)

Vue, vue router, vuex
Vue, vue router, vuexVue, vue router, vuex
Vue, vue router, vuex
 
Angular js
Angular jsAngular js
Angular js
 
Vuex
VuexVuex
Vuex
 
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
Angular를 활용한 웹 프론트단 개발과 2.0에서 달라진점
 
How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0
 
Modern Web Application Development Workflow - EclipseCon Europe 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014Modern Web Application Development Workflow - EclipseCon Europe 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014
 
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
 
Managing JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJSManaging JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJS
 
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
 
Refactoring Large Web Applications with Backbone.js
Refactoring Large Web Applications with Backbone.jsRefactoring Large Web Applications with Backbone.js
Refactoring Large Web Applications with Backbone.js
 
An Introduction To Testing In AngularJS Applications
An Introduction To Testing In AngularJS Applications An Introduction To Testing In AngularJS Applications
An Introduction To Testing In AngularJS Applications
 
Introduction to Angularjs
Introduction to AngularjsIntroduction to Angularjs
Introduction to Angularjs
 
Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVC
 
Javascript Frameworks for Well Architected, Immersive Web Apps
Javascript Frameworks for Well Architected, Immersive Web AppsJavascript Frameworks for Well Architected, Immersive Web Apps
Javascript Frameworks for Well Architected, Immersive Web Apps
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II
 
Getting Started with Angular JS
Getting Started with Angular JSGetting Started with Angular JS
Getting Started with Angular JS
 
AngularJS 101 - Everything you need to know to get started
AngularJS 101 - Everything you need to know to get startedAngularJS 101 - Everything you need to know to get started
AngularJS 101 - Everything you need to know to get started
 
MVC on the server and on the client
MVC on the server and on the clientMVC on the server and on the client
MVC on the server and on the client
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Vue business first
Vue business firstVue business first
Vue business first
 

Similar to Introducing Rendr: Run your Backbone.js apps on the client and server

Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
Eliran Eliassy
 
Building a dashboard using AngularJS
Building a dashboard using AngularJSBuilding a dashboard using AngularJS
Building a dashboard using AngularJS
RajthilakMCA
 
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
OdessaJS Conf
 
Reactive application using meteor
Reactive application using meteorReactive application using meteor
Reactive application using meteor
Sapna Upreti
 
Aurelia Meetup Paris
Aurelia Meetup ParisAurelia Meetup Paris
Aurelia Meetup Paris
Ahmed Radjdi
 
Mini-Training: AngularJS
Mini-Training: AngularJSMini-Training: AngularJS
Mini-Training: AngularJS
Betclic Everest Group Tech Team
 
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJSAngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
murtazahaveliwala
 
A gently introduction to AngularJS
A gently introduction to AngularJSA gently introduction to AngularJS
A gently introduction to AngularJS
Gregor Woiwode
 
AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014
AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014
AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014
FalafelSoftware
 
Optimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page AppsOptimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page Apps
Morgan Stone
 
Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications  Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications
Juliana Lucena
 
AngularJS
AngularJSAngularJS
AngularJS
Pasi Manninen
 
Angular js routing options
Angular js routing optionsAngular js routing options
Angular js routing options
Nir Kaufman
 
Android app development basics
Android app development basicsAndroid app development basics
Android app development basics
Anton Narusberg
 
Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2
Christoffer Noring
 
AngularJs-training
AngularJs-trainingAngularJs-training
AngularJs-training
Pratchaya Suputsopon
 
Dundee University HackU 2013 - Mojito
Dundee University HackU 2013 - MojitoDundee University HackU 2013 - Mojito
Dundee University HackU 2013 - Mojito
smartads
 
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
Frost
 
Asp.Net Mvc
Asp.Net MvcAsp.Net Mvc
Asp.Net Mvc
micham
 
Building Web Apps with Express
Building Web Apps with ExpressBuilding Web Apps with Express
Building Web Apps with Express
Aaron Stannard
 

Similar to Introducing Rendr: Run your Backbone.js apps on the client and server (20)

Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
 
Building a dashboard using AngularJS
Building a dashboard using AngularJSBuilding a dashboard using AngularJS
Building a dashboard using AngularJS
 
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
 
Reactive application using meteor
Reactive application using meteorReactive application using meteor
Reactive application using meteor
 
Aurelia Meetup Paris
Aurelia Meetup ParisAurelia Meetup Paris
Aurelia Meetup Paris
 
Mini-Training: AngularJS
Mini-Training: AngularJSMini-Training: AngularJS
Mini-Training: AngularJS
 
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJSAngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
 
A gently introduction to AngularJS
A gently introduction to AngularJSA gently introduction to AngularJS
A gently introduction to AngularJS
 
AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014
AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014
AngularJS in 60ish Minutes - Dan Wahlin | FalafelCON 2014
 
Optimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page AppsOptimizing Angular Performance in Enterprise Single Page Apps
Optimizing Angular Performance in Enterprise Single Page Apps
 
Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications  Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications
 
AngularJS
AngularJSAngularJS
AngularJS
 
Angular js routing options
Angular js routing optionsAngular js routing options
Angular js routing options
 
Android app development basics
Android app development basicsAndroid app development basics
Android app development basics
 
Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2
 
AngularJs-training
AngularJs-trainingAngularJs-training
AngularJs-training
 
Dundee University HackU 2013 - Mojito
Dundee University HackU 2013 - MojitoDundee University HackU 2013 - Mojito
Dundee University HackU 2013 - Mojito
 
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
Building an angular application -1 ( API: Golang, Database: Postgres) v1.0
 
Asp.Net Mvc
Asp.Net MvcAsp.Net Mvc
Asp.Net Mvc
 
Building Web Apps with Express
Building Web Apps with ExpressBuilding Web Apps with Express
Building Web Apps with Express
 

More from Spike Brehm

Managing Through Chaos (w/ presenter notes)
Managing Through Chaos (w/ presenter notes)Managing Through Chaos (w/ presenter notes)
Managing Through Chaos (w/ presenter notes)
Spike Brehm
 
Managing Through Chaos
Managing Through ChaosManaging Through Chaos
Managing Through Chaos
Spike Brehm
 
The Evolution of Airbnb's Frontend
The Evolution of Airbnb's FrontendThe Evolution of Airbnb's Frontend
The Evolution of Airbnb's Frontend
Spike Brehm
 
Integrating Browserify with Sprockets
Integrating Browserify with SprocketsIntegrating Browserify with Sprockets
Integrating Browserify with Sprockets
Spike Brehm
 
Building Isomorphic Apps (JSConf.Asia 2014)
Building Isomorphic Apps (JSConf.Asia 2014)Building Isomorphic Apps (JSConf.Asia 2014)
Building Isomorphic Apps (JSConf.Asia 2014)
Spike Brehm
 
JSConf US 2014: Building Isomorphic Apps
JSConf US 2014: Building Isomorphic AppsJSConf US 2014: Building Isomorphic Apps
JSConf US 2014: Building Isomorphic Apps
Spike Brehm
 
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript AppsIn Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
Spike Brehm
 
General Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScriptGeneral Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScript
Spike Brehm
 
Isomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassIsomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master Class
Spike Brehm
 
Building a Single-Page App: Backbone, Node.js, and Beyond
Building a Single-Page App: Backbone, Node.js, and BeyondBuilding a Single-Page App: Backbone, Node.js, and Beyond
Building a Single-Page App: Backbone, Node.js, and Beyond
Spike Brehm
 
Extending Apostrophe to build a variable-based CMS for rendering PDF brochures
Extending Apostrophe to build a variable-based CMS for rendering PDF brochuresExtending Apostrophe to build a variable-based CMS for rendering PDF brochures
Extending Apostrophe to build a variable-based CMS for rendering PDF brochures
Spike Brehm
 

More from Spike Brehm (11)

Managing Through Chaos (w/ presenter notes)
Managing Through Chaos (w/ presenter notes)Managing Through Chaos (w/ presenter notes)
Managing Through Chaos (w/ presenter notes)
 
Managing Through Chaos
Managing Through ChaosManaging Through Chaos
Managing Through Chaos
 
The Evolution of Airbnb's Frontend
The Evolution of Airbnb's FrontendThe Evolution of Airbnb's Frontend
The Evolution of Airbnb's Frontend
 
Integrating Browserify with Sprockets
Integrating Browserify with SprocketsIntegrating Browserify with Sprockets
Integrating Browserify with Sprockets
 
Building Isomorphic Apps (JSConf.Asia 2014)
Building Isomorphic Apps (JSConf.Asia 2014)Building Isomorphic Apps (JSConf.Asia 2014)
Building Isomorphic Apps (JSConf.Asia 2014)
 
JSConf US 2014: Building Isomorphic Apps
JSConf US 2014: Building Isomorphic AppsJSConf US 2014: Building Isomorphic Apps
JSConf US 2014: Building Isomorphic Apps
 
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript AppsIn Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
 
General Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScriptGeneral Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScript
 
Isomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassIsomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master Class
 
Building a Single-Page App: Backbone, Node.js, and Beyond
Building a Single-Page App: Backbone, Node.js, and BeyondBuilding a Single-Page App: Backbone, Node.js, and Beyond
Building a Single-Page App: Backbone, Node.js, and Beyond
 
Extending Apostrophe to build a variable-based CMS for rendering PDF brochures
Extending Apostrophe to build a variable-based CMS for rendering PDF brochuresExtending Apostrophe to build a variable-based CMS for rendering PDF brochures
Extending Apostrophe to build a variable-based CMS for rendering PDF brochures
 

Recently uploaded

Quality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of TimeQuality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of Time
Aurora Consulting
 
Manual | Product | Research Presentation
Manual | Product | Research PresentationManual | Product | Research Presentation
Manual | Product | Research Presentation
welrejdoall
 
Calgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptxCalgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptx
ishalveerrandhawa1
 
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Erasmo Purificato
 
20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf
Sally Laouacheria
 
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly DetectionAdvanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Bert Blevins
 
Coordinate Systems in FME 101 - Webinar Slides
Coordinate Systems in FME 101 - Webinar SlidesCoordinate Systems in FME 101 - Webinar Slides
Coordinate Systems in FME 101 - Webinar Slides
Safe Software
 
Recent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS InfrastructureRecent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS Infrastructure
KAMAL CHOUDHARY
 
20240705 QFM024 Irresponsible AI Reading List June 2024
20240705 QFM024 Irresponsible AI Reading List June 202420240705 QFM024 Irresponsible AI Reading List June 2024
20240705 QFM024 Irresponsible AI Reading List June 2024
Matthew Sinclair
 
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALLBLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
Liveplex
 
Comparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdfComparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdf
Andrey Yasko
 
The Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU CampusesThe Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU Campuses
Larry Smarr
 
Mitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing SystemsMitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing Systems
ScyllaDB
 
Quantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLMQuantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLM
Vijayananda Mohire
 
Password Rotation in 2024 is still Relevant
Password Rotation in 2024 is still RelevantPassword Rotation in 2024 is still Relevant
Password Rotation in 2024 is still Relevant
Bert Blevins
 
Pigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdfPigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdf
Pigging Solutions
 
The Rise of Supernetwork Data Intensive Computing
The Rise of Supernetwork Data Intensive ComputingThe Rise of Supernetwork Data Intensive Computing
The Rise of Supernetwork Data Intensive Computing
Larry Smarr
 
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyyActive Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
RaminGhanbari2
 
find out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challengesfind out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challenges
huseindihon
 
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdfWhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
ArgaBisma
 

Recently uploaded (20)

Quality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of TimeQuality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of Time
 
Manual | Product | Research Presentation
Manual | Product | Research PresentationManual | Product | Research Presentation
Manual | Product | Research Presentation
 
Calgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptxCalgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptx
 
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
 
20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf
 
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly DetectionAdvanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
 
Coordinate Systems in FME 101 - Webinar Slides
Coordinate Systems in FME 101 - Webinar SlidesCoordinate Systems in FME 101 - Webinar Slides
Coordinate Systems in FME 101 - Webinar Slides
 
Recent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS InfrastructureRecent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS Infrastructure
 
20240705 QFM024 Irresponsible AI Reading List June 2024
20240705 QFM024 Irresponsible AI Reading List June 202420240705 QFM024 Irresponsible AI Reading List June 2024
20240705 QFM024 Irresponsible AI Reading List June 2024
 
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALLBLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
 
Comparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdfComparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdf
 
The Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU CampusesThe Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU Campuses
 
Mitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing SystemsMitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing Systems
 
Quantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLMQuantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLM
 
Password Rotation in 2024 is still Relevant
Password Rotation in 2024 is still RelevantPassword Rotation in 2024 is still Relevant
Password Rotation in 2024 is still Relevant
 
Pigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdfPigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdf
 
The Rise of Supernetwork Data Intensive Computing
The Rise of Supernetwork Data Intensive ComputingThe Rise of Supernetwork Data Intensive Computing
The Rise of Supernetwork Data Intensive Computing
 
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyyActive Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
 
find out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challengesfind out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challenges
 
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdfWhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
 

Introducing Rendr: Run your Backbone.js apps on the client and server

  • 1. Introducing Rendr: Run your Backbone.js apps on the client and server Spike Brehm @spikebrehm HTML5DevConf April 1, 2013
  • 6. Exciting times in the world of web apps. <your framework here>
  • 9. +
  • 10. Poor SEO; not crawlable Performance hit to download and parse JS Duplicated application logic Context switching
  • 11. It’s still a PITA to build fast, maintainable rich-client apps.
  • 12. We started thinking... What if our JavaScript app could run on both sides?
  • 14. Provides SEO Initial pageload is drastically faster Consolidated application logic
  • 16. Meteor: client/server, but no server-side rendering; owns data layer Derby: client+server rendering, but owns data layer Mojito: client+server rendering, but full stack, and... YUI.
  • 17. Okay... how hard can it be?
  • 19. +
  • 20. +
  • 23. What it is. JavaScript MVC on client & server Backbone & Handlebars BaseView, BaseModel, BaseCollection, BaseApp, ClientRouter, ServerRouter... Express middleware Minimal glue between client & server
  • 25. What it ain’t. Batteries-included web framework Finished
  • 26. Design goals: • Write application logic agnostic to environment. • Library, not a framework. • Minimize if (server) {...} else {...}. • Hide complexity in library. • Talk to RESTful API. • No server-side DOM. • Simple Express middleware.
  • 27. Classes: - BaseApp < Backbone.Model - BaseModel < Backbone.Model - BaseCollection < Backbone.Collection - BaseView < Backbone.View - AppView < BaseView - ClientRouter < BaseRouter - ServerRouter < BaseRouter - ModelStore < MemoryStore - CollectionStore < MemoryStore - Fetcher
  • 28. Rendr directory structure |- client/ |- shared/ } Sent to client |- server/
  • 29. App directory structure |- app/ |- public/ |- server/
  • 30. App directory structure } |- app/ |--- collections/ |--- controllers/ |--- models/ Entire app dir |--- templates/ gets sent to |--- views/ |--- app.js client |--- router.js |--- routes.js |- public/ |- server/
  • 31. CommonJS using Stitch On the server: var User = require(‘app/models/user’); var BaseView = require(‘rendr/shared/base/view’); On the client: var User = require(‘app/models/user’); var BaseView = require(‘rendr/shared/base/view’);
  • 32. app/routes.js module.exports = function(match) { match('', 'home#index'); match('users', 'users#index'); match('users/:id', 'users#show'); };
  • 33. app/routes.js module.exports = function(match) { match('', 'home#index'); match('users', 'users#index'); match('users/:id', 'users#show'); }; controller
  • 34. app/routes.js module.exports = function(match) { match('', 'home#index'); match('users', 'users#index'); match('users/:id', 'users#show'); }; action
  • 36. On server startup, parse routes file and mount as Express routes • GET /users/1337 • Router matches "/users/:id" to "users#show" with params = {"id": 1337} • Router finds controller: require("app/controllers/users_controller") • Router executes show action with params = {"id": 1337} • The show action says to fetch User#1337 and use UsersShowView view class • Router instantiates new UsersShowView with data • Router calls view.getHtml() • Hands HTML to Express, which decorates with layout and serves response
  • 38. On page load, Router parses routes file and mounts Backbone routes • pushState /users/1337 • Router matches "/users/:id" to "users#show" with params = {"id": 1337} • Router finds controller: require("app/controllers/users_controller") • Router executes show action with params = {"id": 1337} • The show action says to fetch User#1337 and use UsersShowView view class • Router instantiates new UsersShowView with data • Router calls view.render() • Insert into DOM
  • 39. On page load, Router parses routes file and mounts Backbone routes • pushState /users/1337 • Router matches "/users/:id" to "users#show" with params = {"id": 1337} • Router finds controller: require("app/controllers/users_controller") • Router executes show action with params = {"id": 1337} • The show action says to fetch User#1337 and use UsersShowView view class • Router instantiates new UsersShowView with data • Router calls view.render() • Insert into DOM
  • 40. On page load, Router parses routes file and mounts Backbone routes • pushState /users/1337 • Router matches "/users/:id" to "users#show" with params = {"id": 1337} • Router finds controller: require("app/controllers/users_controller") • Router executes show action with params = {"id": 1337} • The show action says to fetch User#1337 and use UsersShowView view class • Router instantiates new UsersShowView with data • Router calls view.render() • Insert into DOM
  • 41. app/controllers/users_controller.js module.exports = { show: function(params, callback) { callback(null, 'users_show_view'); } };
  • 42. app/controllers/users_controller.js module.exports = { show: function(params, callback) { callback(null, 'users_show_view'); } };
  • 43. app/controllers/users_controller.js module.exports = { show: function(params, callback) { callback(null, 'users_show_view'); } };
  • 44. app/controllers/users_controller.js module.exports = { show: function(params, callback) { callback(null, 'users_show_view'); } };
  • 45. app/controllers/users_controller.js module.exports = { show: function(params, callback) { callback(null, 'users_show_view'); } }; Most simple case: no fetching of data.
  • 46. app/controllers/users_controller.js module.exports = { show: function(params, callback) { callback(null, 'users_show_view'); } }; But we want to fetch the user.
  • 47. app/controllers/users_controller.js module.exports = { show: function(params, callback) { var spec = { model: {model: ‘User’, params: params} }; this.app.fetch(spec, function(err, results) { callback(err, 'users_show_view', results); }); } };
  • 48. app/controllers/users_controller.js module.exports = { show: function(params, callback) { var spec = { model: {model: ‘User’, params: params} }; this.app.fetch(spec, function(err, results) { callback(err, 'users_show_view', results); }); } };
  • 49. app/controllers/users_controller.js module.exports = { show: function(params, callback) { var spec = { model: {model: ‘User’, params: params} }; this.app.fetch(spec, function(err, results) { callback(err, 'users_show_view', results); }); } };
  • 50. app/controllers/users_controller.js module.exports = { show: function(params, callback) { var spec = { model: {model: ‘User’, params: params} }; this.app.fetch(spec, function(err, results) { callback(err, 'users_show_view', results); }); } };
  • 51. app/views/users_show_view.js var BaseView = require('rendr/shared/base/view'); module.exports = BaseView.extend({ className: 'users_show_view' }); module.exports.id = 'users_show_view';
  • 52. app/views/users_show_view.js var BaseView = require('rendr/shared/base/view'); module.exports = BaseView.extend({ className: 'users_show_view' }); module.exports.id = 'users_show_view';
  • 53. app/views/users_show_view.js var BaseView = require('rendr/shared/base/view'); module.exports = BaseView.extend({ className: 'users_show_view' }); module.exports.id = 'users_show_view';
  • 54. app/views/users_show_view.js var BaseView = require('rendr/shared/base/view'); module.exports = BaseView.extend({ className: 'users_show_view' }); module.exports.id = 'users_show_view';
  • 55. app/views/users_show_view.js var BaseView = require('rendr/shared/base/view'); module.exports = BaseView.extend({ className: 'users_show_view', events: { 'click p': 'handleClick' }, handleClick: function() {...} }); module.exports.id = 'users_show_view';
  • 57. Rendered HTML <div class="users_show_view" data-view="users_show_view" data-model_name="user" data-model_id="1337"> <h1>User: Spike</h1> <p>From San Francisco.</p> </div>
  • 58. Rendered HTML <div class="users_show_view" data-view="users_show_view" data-model_name="user" data-model_id="1337"> <h1>User: Spike</h1> <p>From San Francisco.</p> </div>
  • 59. Rendered HTML <div class="users_show_view" data-view="users_show_view" data-model_name="user" data-model_id="1337"> <h1>User: Spike</h1> <p>From San Francisco.</p> </div>
  • 60. Rendered HTML <div class="users_show_view" data-view="users_show_view" data-model_name="user" data-model_id="1337"> <h1>User: Spike</h1> <p>From San Francisco.</p> </div>
  • 61. Where’d the data come from? Where’s the render method? How do I customize what gets passed to the template? Sensible defaults.
  • 62. app/views/users_show_view.js var BaseView = require('rendr/shared/base/view'); module.exports = BaseView.extend({ className: 'users_show_view', getTemplateData: function() { } });
  • 63. app/views/users_show_view.js var BaseView = require('rendr/shared/base/view'); module.exports = BaseView.extend({ className: 'users_show_view', getTemplateData: function() { var data = BaseView.prototype.getTemplateData .call(this); } });
  • 64. app/views/users_show_view.js var BaseView = require('rendr/shared/base/view'); module.exports = BaseView.extend({ className: 'users_show_view', getTemplateData: function() { var data = BaseView.prototype.getTemplateData .call(this); // `data` is equivalent to this.model.toJSON() } });
  • 65. app/views/users_show_view.js var BaseView = require('rendr/shared/base/view'); module.exports = BaseView.extend({ className: 'users_show_view', getTemplateData: function() { var data = BaseView.prototype.getTemplateData .call(this); // `data` is equivalent to this.model.toJSON() return _.extend(data, { nameUppercase: data.name.toUpperCase() }); } });
  • 67. Rendered HTML <div class="users_show_view" data-...> <h1>User: SPIKE</h1> <p>From San Francisco.</p> </div>
  • 68. Rendered HTML with layout <!doctype html> <html lang="en"> <head>...</head> <body> <div id="content"> <div class="users_show_view" data-view="users_show_view" data-model_name="user" data-model_id="1337"> <h1>User: SPIKE</h1> <p>From San Francisco.</p> </div> </div> <script> (function() { var App = window.App = new (require('app/app')); App.bootstrapData({ "model":{"summary":{"model":"user","id":1337}, "data":{"name":"Spike","city":"San Francisco", ...} }); App.start(); })(); </script> </body></html>
  • 69. Rendered HTML with layout <!doctype html> <html lang="en"> <head>...</head> <body> <div id="content"> <div class="users_show_view" data-view="users_show_view" data-model_name="user" data-model_id="1337"> <h1>User: SPIKE</h1> <p>From San Francisco.</p> </div> </div> <script> (function() { var App = window.App = new (require('app/app')); App.bootstrapData({ "model":{"summary":{"model":"user","id":"wycats"}, "data":{"name":"Spike","city":"San Francisco", ...} }); App.start(); })(); </script> </body></html>
  • 71. 1. Find DOM els with data-view attribute. var viewEls = $("[data-view]");
  • 72. 2. Determine model or collection based on data-model_name, data-model_id, etc. var modelName = viewEl.data(‘model_name’), modelId = viewEl.data(‘model_id’); console.log(modelName, modelId); => “user” 1337
  • 73. 3. Fetch model/collection data from ModelStore/CollectionStore. var model = modelStore.get(modelName, modelId);
  • 74. 4. Find view class. var viewName, ViewClass; viewName = viewEl.data(‘view’); ViewClass = require('app/views/' + viewName);
  • 75. 5. Instantiate view instance with model. var view = new ViewClass({ model: model, ... });
  • 76. 6. Attach to DOM el. view.setElement(viewEl);
  • 78. 8. Profit! alert(“That wasn’t so hard, right?”)
  • 79. Rendr is available starting today. github.com/airbnb/rendr
  • 80. TODO • Share routing logic between client & server. • Lazy load views, templates, etc as needed. • Support other templating languages. • Break down into smaller modules. • Rewrite in vanilla JavaScript. • much more...