Node js

JavaScript on the server

 

Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.

Allows us to run JavaScript on the server

Primarily Designed "to build scalable network applications"

  • http
  • file system
  • comand line/console

Development Diagram

Node Application Structure

Just a script file

index.js

// Call the console.log function.
console.log("Hello World");

Node Server

// Load the http module to create an http server.
var http = require('http');

// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Hello World\n");
});

// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);

// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8000/");

Node Application

Module Loading

const PI = Math.PI;

exports.area = (r) => PI * r * r;

exports.circumference = (r) => 2 * PI * r;
const circle = require('./circle.js');

var area = circle.area(4);

console.log(`Area of circle of radius 4 is ' + area);

index.js

circle.js

Lab

NPM

Package Manager for JavaScript


                                    

    

 


{
 "name": "module-name",
 "version": "1.0.0",
 "devDependencies": {
    "jasmine": "*"
    "lodash": "3.9.3”
    },
 "dependencies":{}
}

npm install
npm install lodash --save

Unit Testing

Jasmine

  • Behavior-driven development framework for testing JavaScript code. It does not depend on any other JavaScript frameworks. 
  • Does not require a DOM
  • Simple syntax makes it easy to read and write tests

Basic Jasmine Test Suite






describe("A suite", function() {
  it("has a spec with an expectation", function() {
    expect(true).toBe(true);
  });
});

Suites

  • suites created with describe function
  • takes two parameters:
    • string :name or title for a suite
    • function: block of code that implements the suite

 






describe("A suite", function() {
  //it("has a spec with an expectation", 
    //function() {
    //    expect(true).toBe(true);
    //  });
});

Specs

  • specs created with jasmine it function
  • takes two parameters:
    • string :name or title for a spec
    • function: the spec/test itself
  • contains one or more expectations

 






//describe("A suite", function() {
  it("has a spec with an expectation", 
    function() {
    //    expect(true).toBe(true);
    });
//});

Expectations

  • assertion that is either true or false
  • compares expected value with actual value using matchers:
    • ​toBe
    • toEqual
    • toBeNull
    • toContain

 

 




//describe("A suite", function() {
  //it("has a spec with an expectation", 
    //function() {
        //expectation passes
        expect(true).toBe(true);

        //expectation fails
        expect(false).toBe(true);
    //});
//});

Spies

  • Jasmine's version of test doubles/mocks
  • spy stubs a function and tracks calls to it
  • have special matchers like
    • ​toHaveBeenCalled
    • toHaveBeenCalledWith

 

Test Runner

  • Automates your test runs
  • Can run tests in multiple browsers
  • Watches files and automatically reruns tests

lodash

A modern JavaScript utility library delivering modularity, performance, & extras.

lodash is a utilty library that helps with

  • Iterating arrays, objects, & strings
  • Manipulating & testing values
  • Creating composite functions

Lab

Angular 1.5

What is Angular?

Framework for building dynamic web apps

  • Data Binding
  • Dependency Injection
  • Routing (single page application)
  • Filters and Directives

We need to build client-side apps to consume our back-end services



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Sample HTML Page</title>
</head>
<body>
    This is a sample HTML page
</body>
</html>

Static HTML

Rendered Page

We want to build apps that can do more on the client-side

  • More fluid user experience
  • No page loads (Page will never reload inside of application)
  • Provide quicker feedback to users
  • Client side does processing (using less of server’s resources)

Data Binding

There are a lot of frameworks that do similar things

Modules

Container for different parts of your apps

  • components

  • services

  • filters  etc.


<html>
    <body>
        <div ng-app="myApp"></div>
    </body>
</html
var app = angular.module('myApp', [/*list of app's dependencies*/]);

//app variable is an instance of our module

//the Module api has methods we can use to create services, components etc.

app.service("myService", function(){
    //service code here
});

app.component("myComponent", function() {
    //component code here
});

//best practice though is to get reference to module as shown below

angular.module("myApp").service("someService", function(){});

app.js

index.html

Recommended Use for Modules

  • A module for each feature
  • A module for each reusable component (especially directives and filters)
  • And an application level module which depends on the above modules and contains any initialization code.

Lab

Components

Motivation

webcomponents

What Are Components?

Web Components

Spec gives us a way to create custom html elements

Web Site Is Tree of Components



//todo-app contents

<create-todo></create-todo>

<todo-list></todo-list>

<todo-filter></todo-filter>

...but still not fully supported in browsers

Angular Components

Allows Us To Create Apps In Way Similar To Using Web Components




<body ng-app>
    <menu></menu>
    <user-info></user-info>
    <message></message>
</body>

Component Combines

  • Template
  • Controller
  • Bindings

Registering Component With Module

Use the .component() method which takes two arguments

  • Name of the component (as string)
  • Component config object



angular.module('module')
    .component('myModule', {});

Component Syntax



var myComponent = {
    templateUrl: "my-template.html",
    template: "<div></div>"
    controller: MyController,
    bindings: {
        title: '<',
        description : '&'
    }
}

function MyController(){

}

angular.module("myModule").component("myComponent", myComponent);

One Component Per File

Naming

 

javascript: "my-component.component.js"

html: "my-component.component.html"

Template



var myComponent = {
    templateUrl: "my-template.html",
    template: "<div></div>"
    //controller: MyController,
    //bindings: {
    //    title: '<',
    //    description : '&'
    //}
}

//function MyController(){

//}

angular.module("myModule").component("myComponent", myComponent);

Template

This is the view for the controller

//component.html


<div>
    <p>
        {{$ctrl.text}} 
    </p>
</div>

Unless the template is very small, we will want to move template into it's own file and use templateUrl property

//component.js


var myComponent = {
    templateUrl: "component.html"
}

Controller



var myComponent = {
    //templateUrl: "my-template.html",
    //template: "<div></div>"
    controller: MyController,
    //bindings: {
    //    title: '<',
    //    description : '&'
    //}
}

function MyController(){

}

angular.module("myModule").component("myComponent", myComponent);

Controllers Are Used To

  • Set up initial state of the component
  • Add behavior to the component

Angular Calls "new" on Controller instance

Angular then makes the return value from calling "new Controller()" available to the view (our template) via a variable named "$ctrl"

  • $onInit()
  • $onChanges()
  • $onDestroy()
  • $postLink()

Best practice is to put any initialization code for component in the $onInit function

Component Lifecycle

 Components can implement "lifecycle hooks"

 These are methods that will be called at certain points in the life of the component

Lab

Bindings



var myComponent = {
    //templateUrl: "my-template.html",
    //template: "<div></div>"
    //controller: MyController,
    bindings: {
        title: '<',
        description : '&'
    }
}

//function MyController(){

//}

angular.module("myModule").component("myComponent", myComponent);

Bindings Are A Component's API

  • Inputs: '<' and '@'

  • Outputs: '&'

Components Should Only Modify Their Own Data

Components use '&' binding as outputs

These outputs can be things like callbacks or "Output Events"


var myComponent = {
    bindings: {
        onUpdate: '&',
        onDelete: '&'
    }
}

Directives

Directives are markers on a DOM element that tell Angular to attach a specified behavior to that DOM element

Directives can have the following types:

  • element names
  • attributes
  • class names
  • comments.


<my-dir></my-dir>

<span my-dir="exp"></span>

<!-- directive: my-dir exp -->

<span class="my-dir: exp;"></span>

Angular has a lot of built in directives

  • ng-app
  • ng-repeat
  • ng-if
  • ng-model
  • ng-click

Lab

Filters

Filters

A filter formats the value of an expression for display to the user.



{{expression | filter }}


//filters can take arguments

{{expression | filter : arg1 : arg2 }}

They are invoked with the pipe ('|') character

Built In Filters

  • currency
  • date
  • number
  • filter (used to select subset of items)
  • orderBy

Lab

Services

Purpose of Services

 

  • Controllers are instantiated when needed and discarded when they are not. Services give us a means for us to keep data around for lifetime of the app and to share data and logic across components.

 

  • Services provide interface for grouping related methods and allow us to share these methods across controllers.

 

  • Services are singleton objects and are lazily instantiated, meaning they are only loaded when a piece of our application depends on it.

Methods For Creating Services

  • service()

  • factory()

  • constant(key, value)

  • value(key, value)

    • difference between value and constant is constant can be injected into config function
    • values can also register objects and functions while constants can not
var app = angular.module('myApp', []);

app.service('myService', function(){});


app.factory('myService', function(){});


app.constant('myConstant', "a constant string");


app.value('myValue', "some value");

One Service Per File

File name follows pattern: "my-service.service.js"

Dependency Injection

Dependency Injection

  • Allows us to ask for dependencies - Can have them passed in
  • Simplifies Testing - Allows us to pass mocked objects in place of real ones

Methods For Declaring Dependencies

  • Using the inline array annotation 
  • Using the $inject property annotation
  • Implicitly from the function parameter names (has caveats)

There are also gulp/grunt tasks that will automatically create the $inject property annotation for you

var app = angular.module('myApp');

//inline array annotation
app.service('myService', 
    ['serviceA', function(serviceA){

}]);


//$inject property
function myService (serviceA){

}

myService.$inject = ["serviceA"];

app.service('myService', myService);


//implicit annotation
app.service('myService', function(serviceA){

});

Lab

Services -cont.

Built In Services

  • $http
    • wraps XMLHttpRequest object
  • $location
    • wraps accessing and updating the url in the browser
  • $q
    • promise service
  • $document
    • wrapper for browsers window.document object
  • $log
    • assists in logging errors, warnings etc.

 

Angular provides built-in services

  • $http
  • $window
  • $location

$http

Angular provides $http service which wraps the browser’s XMLHttpRequest object. The service is a function that takes in an object that configures an HTTP request

$http({ method: 'GET', url: '/api/sample/data'});

This method returns a promise 

Shorthand Methods


$http.get('/api/sample/data');

$http.post('/api/sample/data', data);

$http.put('/api/sample/data', data);

$http.delete('/api/sample/data', data);
  • get
  • put
  • post
  • delete

Caching

$http allows us to set a flag to cache results from requests we've already made




$http.get('/api/sample/data', { cache: true });


Promises

$http returns promise with following methods -

  • then(successCallback, errorCallback, notifyCallback)
  • catch(errorCallback)
  • finally(callback, notifyCallback)

Slack API

Get A Development Token

Postman

"Get" Request to Retrieve Messages

https://slack.com/api/channels.history?token=<token>&channel=<channelId>&count=<numberToGet>

Formatting Slack Messages

Lab

Routing

UI-Router

Routing framework for Angular that allows you to set up states within your application

Not packaged with Angular - has to be added as a dependency



//npm install angular-ui-router


angular.module('myApp', ['ui.router']);

States

  • A state corresponds to a “place” in the application, and describes what the app does and looks like at that “place”.
  • Use $stateProvider in your app.config to set up the "states" of your app
  • States can take parameters which can accessed later via the $routeParams service


$stateProvider
	.state('message', {
    	url: "/message/{id}",
    	template: '<message></message>' 	 
    });

ui-view

Tells UI-Router where to render the app's current state





<div ui-view="viewA"></div>

UI-Sref

Binds a link (<a> tag) to a state. If the state has an associated URL, the directive will automatically generate & update the href attribute

Clicking the link will trigger a state transition

 




<a ui-sref="home">Home</a>

Lab

Angular 2

TypeScript

Superset of JavaScript

Adds Types

Angular CLI

Grad Academy 2016

By perksadam

Grad Academy 2016

Slides for day two of JavaScript for Grad Academy 2016

  • 1,245