Introduction to SPA
Mykhailo Churilov
Senior JS Developer
History


Tim Berners-Lee

WWW
1989 (1991)

Brendan Eich

JavaScript
1995

Ajax: A New Approach to Web Applications 2005
(Jesse James Garrett)

var r = new XMLHttpRequest();
r.open("POST", "webservice", true);
r.onreadystatechange = function () {
if (r.readyState != 4 || r.status != 200) return;
console.log(r.responseText);
};
r.send("a=1&b=2&c=3");
DOM manipulation
Animation
Events
Promises
AJAX
JSON parsing
Cross-browser support
$.ajax({
url: "webservice",
type: "POST",
data: "a=1&b=2&c=3",
success: function(d) {
console.log(d);
}
});

2008
V8 engine optimization


Common.js
(AMD)

Internet Birth 1991
JavaScript 1995
AJAX 2005
jQuery 2006
Google Chrome 2008
Node.js 2009
AMD 2009
SPA: WTF?
HTML/CSS/JS/JSON
Separate client/server
Pure data communication
Client side templating
NO page reloads


Quality Over Quantity
No page refresh
Mobile preffered
Scaling
Long pageload
Higher risks
Web Frameworks



There is no silver bullet...
Data binding
Routing
Structure
Templating
Performance
Building Tools


Why we need them?
Concatination
Minifying
Template caching
CSS compiling
Image spriting
Running tests
So...
Automation
Grunt
module.exports = function(grunt) {
grunt.initConfig({
jshint: {
files: ['**.js'],
options: JSON.parse(require('fs').readFileSync('./.jshinrc'))
}
});
grunt.loadNpmTasks('grunt-contrib-jshint');
};
Grunt

Grunt

Gulp
var jshint = require('gulp-jshint');
var gulp = require('gulp');
gulp.task('jshint', function() {
return gulp.src('**.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
Gulp

Gulp

NPM
"devDependencies": {
"jshint": "latest",
},
"scripts": {
"lint": "jshint **.js"
}
NPM

Bower
front-end package manager

npm start
npm test

bower i

gulp less
gulp images
gulp fonts
gulp vendors
gulp lint
gulp js
gulp views
// Rebuild only files that change
var gulp = require('gulp');
var sass = require('gulp-sass');
var watch = require('gulp-watch');
gulp.task('default', function() {
return gulp.src('sass/*.scss')
.pipe(watch('sass/*.scss'))
.pipe(sass())
.pipe(gulp.dest('dist'));
});
Q & A
(function() {
'use strict';
angular.module('linked', ['angularLinkedLists'])
.controller('LinkedController', LinkedController);
function LinkedController() {
this.data = [{
id: 213,
title: 'Ukraine',
}, {
id: 1,
title: 'Andorra'
}, {
id: 34,
title: 'Great Britain'
}, {
id: 75,
title: 'United States'
}];
this.selected = [this.data[0]];
this.updateOnServer = updateOnServer;
function updateOnServer() {
console.log('updateOnServer');
};
};
})();
<div ng-controller="LinkedController as link">
<h2>Data out of directive</h2>
<pre>{{ link.data }}</pre>
<pre>{{ link.selected }}</pre>
<h2>Data in directive</h2>
<linked-lists data="link.data"
selected="link.selected"
selection-updated="link.updateOnServer()"
filterable>
</linked-lists>
</div>
Introduction to SPA
By Mikki Churilov
Introduction to SPA
Building modern single page application for reality
- 678