High-Quality JavaScript

57
High quality

description

The said coding with JavaScript is for toying also. There no way to do serious software engineering with JavaScript. The JS community proved that quote is wrong - this talk argues the same way.

Transcript of High-Quality JavaScript

Page 1: High-Quality JavaScript

High quality

Page 2: High-Quality JavaScript

Marc BächingerPrincipal consultant, HTML5 Evangelist

talk powered by Zühlke JS crew !

Michael SchnyderSoftware Engineer, Drone pilot

Page 3: High-Quality JavaScript

THEY SAID: „JAVASCRIPT IS THE FUTURE OF COMPUTING“

Page 4: High-Quality JavaScript

THEY SAID: „JAVASCRIPT IS THE FUTURE OF COMPUTING“

Page 5: High-Quality JavaScript
Page 6: High-Quality JavaScript

dynamic typing

very-late binding

Page 7: High-Quality JavaScript

dynamic typing

very-late binding

must run to be verified!

Page 8: High-Quality JavaScript

BONE AND BANE OF JS

$.ajax({ url: "person/2", dataType: "json", success: function (obj) { var person = new Person(); $.extend(person, obj); global.person.push(person); } });

Page 9: High-Quality JavaScript

BONE AND BANE OF JS

$.ajax({ url: "person/42", dataType: "json", success: function (obj) { $.extend(Person.prototype, obj); } });

Page 10: High-Quality JavaScript

BONE AND BANE OF JS$.ajax({ url: "person/2", dataType: "json", success: function (obj) { var person = new Person(); if (someCondition(obj)) { $.extend(person, { getFullname: function () { return first + " " + last; } }); } global.person.push(person); } });

Page 11: High-Quality JavaScript

COUNTERMEASURES!

Page 12: High-Quality JavaScript

DEVELOPMENT CYCLE

findbugs, checkstyle

IDEcompile

testing

jUnit

selenium

Java

Page 13: High-Quality JavaScript

DEVELOPMENT CYCLE

findbugs, checkstyle

IDEcompile

testing

jUnit

selenium

Java

Page 14: High-Quality JavaScript

DEVELOPMENT CYCLE

static code analysis

development

productionalizing

concatenate

minimize

testing

unit test

component tests

JavaScriptfindbugs, checkstyle

IDEcompile

testing

jUnit

selenium

Java

Page 15: High-Quality JavaScript

ARCHITECTURE AND DESIGN

Page 16: High-Quality JavaScript

MODULES!

require(["app/services"], function(services) { // use services } );

Page 17: High-Quality JavaScript

TOOL CHAIN

Page 18: High-Quality JavaScript

!

TOOL PARADE

jshint

uglify

esprima

require.js

less

bower

istanbul

karma

jasmine

Page 19: High-Quality JavaScript
Page 20: High-Quality JavaScript

DEVELOPMENT CYCLE

grunt jshint

IDE/Editor/CI

productionalizing

cssmin

htmlcompress

testing

jasmine

qunit

uglify

concatenate

Page 21: High-Quality JavaScript

JSHINT - NOT A COMPILER

app/scripts/domain-factory.js !line 4 col 3 Missing "use strict" statement. line 11 col 47 'suffix' is defined but never used. line 16 col 22 Missing semicolon. line 35 col 5 'person' is not defined. line 37 col 11 Expected '===' and instead saw '=='. line 38 col 5 Expected '{' and instead saw 'c'. line 38 col 5 Expected 'c' to have an indentation at 7 instead at 5. line 43 col 24 Missing 'new' prefix when invoking a constructor.

Page 22: High-Quality JavaScript

RELEASE WITH GRUNT

jshint

copy

concat

uglify cssmin htmlprocessor

karma

checkstyle findbugs

copy web files to distribution directory

concatenate file (js, css)

minimize

run tests

Page 23: High-Quality JavaScript

GRUNT AS OFTEN AS IT GETSjshint

copy

concat

uglify cssmin htmlprocessor

karma

Page 24: High-Quality JavaScript

GRUNT AS OFTEN AS IT GETSjshint

copy

concat

uglify cssmin htmlprocessor

karma

on local file change

Page 25: High-Quality JavaScript

GRUNT AS OFTEN AS IT GETSjshint

copy

concat

uglify cssmin htmlprocessor

karma

on local file change

on push to repository

Page 26: High-Quality JavaScript

TOOL INTEGRATION

Page 27: High-Quality JavaScript

BARE BONE BUILD------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

Editor

Browser

Page 28: High-Quality JavaScript

CI MIT JENKINS

Page 29: High-Quality JavaScript

CI MIT JENKINS

Page 30: High-Quality JavaScript

WEBSTORM IDE

Page 31: High-Quality JavaScript

MICROSOFT

What is Microsofts answer for developing Enterprise JavaScript Applications?

Page 32: High-Quality JavaScript
Page 33: High-Quality JavaScript
Page 34: High-Quality JavaScript

JAVASCRIPT FOR VISUAL STUDIO

“Enable efficient SPA development on the .NET platform by providing a proven,

enterprise-ready toolchain”

Page 35: High-Quality JavaScript

ZÜHLKE SPA STACK

Page 36: High-Quality JavaScript

HIGH QUALITY JAVASCRIPT ?

Page 37: High-Quality JavaScript

WHAT TO DO ?leverage JavaScript build tools

tool integration

continuous integration

unit testing

architecture and design

Page 38: High-Quality JavaScript
Page 39: High-Quality JavaScript

thx!

@marcbaechinger

Page 40: High-Quality JavaScript

BACKUP SLIDES

Page 41: High-Quality JavaScript

GRUNTFILE.JSmodule.exports = function(grunt) { var DOC_ROOT = "public_html", DIST_DIR = "build"; grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), copy: { dist: { files: [ { expand: true, src: [DOC_ROOT + '/**'], dest: DIST_DIR } ] } }, [...] } };

Page 42: High-Quality JavaScript

GRUNT: BASE{ "name": "jquery-app", "version": "0.0.0", "devDependencies": { "grunt": "~0.4.1", "grunt-contrib-jshint": "~0.6.0", "grunt-contrib-nodeunit": "~0.2.0", "grunt-contrib-concat": "~0.1.3", "grunt-contrib-uglify": "~0.2.0", "grunt-contrib-copy": "~0.4.1", "grunt-contrib-clean": "~0.4.1", "grunt-contrib-cssmin": "~0.6.1", "grunt-htmlcompressor": "~0.1.8", "grunt-contrib-watch": "~0.3.1", "grunt-regarde": "~0.1.1", "grunt-contrib-connect": "0.1.2", "grunt-contrib-livereload": "0.1.1" "grunt-open": "~0.2.2", "grunt-karma": "~0.6.1", "karma": "~0.10.1", "karma-chrome-launcher": "~0.1.0", "karma-jasmine": "~0.1.0", "karma-qunit": "~0.1.0", "karma-html2js-preprocessor": "~0.1" } }

Page 43: High-Quality JavaScript

GRUNT: LIVE RELOAD{ "name": "jquery-app", "version": "0.0.0", "devDependencies": { "grunt": "~0.4.1", "grunt-contrib-jshint": "~0.6.0", "grunt-contrib-nodeunit": "~0.2.0", "grunt-contrib-concat": "~0.1.3", "grunt-contrib-uglify": "~0.2.0", "grunt-contrib-copy": "~0.4.1", "grunt-contrib-clean": "~0.4.1", "grunt-contrib-cssmin": "~0.6.1", "grunt-htmlcompressor": "~0.1.8", "grunt-contrib-watch": "~0.3.1", "grunt-regarde": "~0.1.1", "grunt-contrib-connect": "0.1.2", "grunt-contrib-livereload": "0.1.1" "grunt-open": "~0.2.2", "grunt-karma": "~0.6.1", "karma": "~0.10.1", "karma-chrome-launcher": "~0.1.0", "karma-jasmine": "~0.1.0", "karma-qunit": "~0.1.0", "karma-html2js-preprocessor": "~0.1" } }

Page 44: High-Quality JavaScript

GRUNT: LIVE RELOAD------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

Editor

Browser

Page 45: High-Quality JavaScript

GRUNT: LIVE RELOAD------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

Editor

Browserwatches1

Page 46: High-Quality JavaScript

GRUNT: LIVE RELOAD------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

Editor

Browser

save

2

watches1

Page 47: High-Quality JavaScript

GRUNT: LIVE RELOAD------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

Editor

Browser

save

2

watches1

request reload

3

Page 48: High-Quality JavaScript

GRUNT: LIVE RELOAD------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

Editor

Browser

save

2

watches1

request reload

3

load

4

Page 49: High-Quality JavaScript

GRUNT: KARMA{ "name": "jquery-app", "version": "0.0.0", "devDependencies": { "grunt": "~0.4.1", "grunt-contrib-jshint": "~0.6.0", "grunt-contrib-nodeunit": "~0.2.0", "grunt-contrib-concat": "~0.1.3", "grunt-contrib-uglify": "~0.2.0", "grunt-contrib-copy": "~0.4.1", "grunt-contrib-clean": "~0.4.1", "grunt-contrib-cssmin": "~0.6.1", "grunt-htmlcompressor": "~0.1.8", "grunt-contrib-watch": "~0.3.1", "grunt-regarde": "~0.1.1", "grunt-contrib-connect": "0.1.2", "grunt-contrib-livereload": "0.1.1" "grunt-open": "~0.2.2", "grunt-karma": "~0.6.1", "karma": "~0.10.1", "karma-chrome-launcher": "~0.1.0", "karma-jasmine": "~0.1.0", "karma-qunit": "~0.1.0", "karma-html2js-preprocessor": "~0.1" } }

Page 50: High-Quality JavaScript

GRUNT: KARMA------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

fooSpec.jsbarSpec.jsbarSpec.js

Chrome Firefox

Android

iOS

fooSpec.jsbarSpec.jsbarSpec.js

fooSpec.jsbarSpec.jsbarSpec.jsfooSpec.jsbarSpec.jsfooSpec.js

Karma

Page 51: High-Quality JavaScript

GRUNT: KARMA------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

fooSpec.jsbarSpec.jsbarSpec.js

Chrome Firefox

Android

iOS

fooSpec.jsbarSpec.jsbarSpec.js

fooSpec.jsbarSpec.jsbarSpec.jsfooSpec.jsbarSpec.jsfooSpec.js

Karma

watches 1

Page 52: High-Quality JavaScript

GRUNT: KARMA------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

fooSpec.jsbarSpec.jsbarSpec.js

Chrome Firefox

Android

iOS

fooSpec.jsbarSpec.jsbarSpec.js

fooSpec.jsbarSpec.jsbarSpec.jsfooSpec.jsbarSpec.jsfooSpec.js

Karma

watches 1register

2

Page 53: High-Quality JavaScript

GRUNT: KARMA------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

fooSpec.jsbarSpec.jsbarSpec.js

Chrome Firefox

Android

iOS

fooSpec.jsbarSpec.jsbarSpec.js

fooSpec.jsbarSpec.jsbarSpec.jsfooSpec.jsbarSpec.jsfooSpec.js

Karma

watches 1register

2

3changed

Page 54: High-Quality JavaScript

GRUNT: KARMA------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

fooSpec.jsbarSpec.jsbarSpec.js

Chrome Firefox

Android

iOS

fooSpec.jsbarSpec.jsbarSpec.js

fooSpec.jsbarSpec.jsbarSpec.jsfooSpec.jsbarSpec.jsfooSpec.js

Karma

watches 1register

2

request rerun 4

3changed

Page 55: High-Quality JavaScript

GRUNT: KARMA------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

fooSpec.jsbarSpec.jsbarSpec.js

Chrome Firefox

Android

iOS

fooSpec.jsbarSpec.jsbarSpec.js

fooSpec.jsbarSpec.jsbarSpec.jsfooSpec.jsbarSpec.jsfooSpec.js

Karma

watches 1register

2

request rerun 4

execute5

3changed

Page 56: High-Quality JavaScript

GRUNT: KARMA------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

*.html *.js *.css

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

------------------------------ --------------- --------------- ---------------

fooSpec.jsbarSpec.jsbarSpec.js

Chrome Firefox

Android

iOS

fooSpec.jsbarSpec.jsbarSpec.js

fooSpec.jsbarSpec.jsbarSpec.jsfooSpec.jsbarSpec.jsfooSpec.js

Karma

watches 1register

2

request rerun 4

execute5

test report

6

3changed

Page 57: High-Quality JavaScript

RUNNING GRUNT WITH MAVEN

• yeoman-maven-plugin

• Exec Maven plugin