NODE

.

JavaScript

Skapat under 10 dagar av Brendan Eich

För att ge Netscape ett övertag

Client-side, körde bara via browsern

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

Node.js plockar tolken (Chrome's V8) från browsern och gör så att den kan köras utan browsern.

Vi får JavaScript som kan köras server-side

Inget visuellt, html/css

Bara JavaScript

Ingen DOM

Ingen index.html som kopplar samman våra filer

Command Line Interface

När ett program har ett grafiskt gränssnitt snackar man om GUI (Graphical User Interface)

Vi använder oss utav flera olika program som körs från terminalen: CLI (Command Line Interface)

Nodejs.org

.

NPM

Node Package Manager

I nodes ekosystem ingår NPM som är ett program för att installera paket.

npmjs.org

Package/module/library

Färdigpaketerad kod som har en specifik uppgift att utföra

Ett paket kan t.ex. vara en funktion.

Moduler bygger på andra moduler: dependencies

node bygger på moduler

Men inte bara nerladdade moduler

Vi kan skapa våra egna moduler, dela upp vår kod i moduler.

Module system

Node runs

Det som länkar samman node-kod är dess modul-system

Varje modul får ett eget namespace

Vi kan välja exakt vad vi vill exportera

Det finns ett global namespace

//app.js
const myModule = require('./module.js');

console.log(myModule.name); //'Jesper'
myModule.sayHello();        //'Foolish mortals'
//module.js
const person = {
  name: "Jesper",
  sayHello: function(){
    console.log('Foolish mortals');
  }
}
module.exports = person;

HTTP

Simple HTTP-server

const http = require('http');

http.createServer((req,res) => {

  res.send("Hello!");
  res.end();
}).listen(4000);

Kan behöva sätta headers

const http = require('http');

http.createServer((req,res) => {
  res.writeHead(200, {'Content-Type': 'text/html'});  
  res.send("Hello!");
  res.end();
}).listen(4000);

Vi kan såklart skicka mer innehåll

const http = require('http');

http.createServer((req,res) => {
  res.writeHead(200, {'Content-Type': 'text/html'}); 
  res.send("<h1>Hello!</h1>");
  res.send("<p>Welcome to my krypin</p>");
  res.end();
}).listen(4000);

Vi kan även göra enklare get-requests med http-modulen

http.get(url, callback);
const http = require('http');
http.get('http://localhost:4000', (response) => {
  console.dir(response);
});

NPM

Vi ska dock använda oss av andras moduler också

Som tur är har nodes ekosystem ett inbyggt program som hanterar delningen åt oss

NPM

Istället för att ladda ner en installationsfil och dubbelklicka på den så skriver vi ett kommando i terminalen som gör allting åt oss.

Vi kan installera moduler globalt (som vanliga program)

Och vi kan installera moduler lokalt, installeras enbart i den mappen man står i.

KOLLA ALLTID VILKEN MAPP DU STÅR I!

NPM INIT

npm init
npm install

Alla paket finns på npms hemsida

https://www.npmjs.com

Samtliga brukar även ha en GitHub-sida

Read / Write

Man vill ju kunna läsa och skriva data från hårddisken: filer

Express kommer att underlätta detta moment men först tar vi en titt på hur det sköts i bakgrunden i ren node

const fs = require('fs'); //inbyggd modul
Node.js: fs

The Big Four

fs.readFile()

fs.readFile(file, options, callback)
fs.readFile('file.txt', 'utf-8', (error, data) => {
  if (error) console.log(error);
  console.log(data);
});

fs.writeFile()

fs.writeFile(file, data, options, callback)
let data ='Blorgons!!'
fs.writeFile('file.txt', data, (error) => {
  if (error) console.log(error);
  console.log('Success!');
});

fs.createReadStream();

fs.readFile samt fs.writeFile laddar in all data i minnet innan funktionen skriver/läser

Funkar oftast, dock vi större filer kan vi få problem.

Vi vill hellre filerna i delar som senare byggs ihop till en helhet: stream

fs.createReadStream(file, options)
 //Create stream
let streamable = fs.createReadStream('file.txt');
let data = ''; //Somewhere to save the data





fs.createReadStream(file, options)
 //Create stream
let streamable = fs.createReadStream('file.txt');
let data = ''; //Somewhere to save the data
streamable.on('data', (chunk) => {
  data += chunk; //sent in blocks of data!
});


fs.createReadStream(file, options)
 //Create stream
let streamable = fs.createReadStream('file.txt');
let data = ''; //Somewhere to save the data
streamable.on('data', (chunk) => {
  data += chunk; //sent in blocks of data!
});
streamable.on('end', () => { //It ends here!
  console.log(data);
});
let dataToWrite = "Blorgons!!!";
let writeStream = fs.createWriteStream('output.txt');




let dataToWrite = "Blorgons!!!";
let writeStream = fs.createWriteStream('output.txt');
writeStream.write(dataToWrite, 'UTF8');



let dataToWrite = "Blorgons!!!";
let writeStream = fs.createWriteStream('output.txt');
writeStream.write(dataToWrite, 'UTF8');
writeStream.end();
writeStream.on('finish', function(){
  console.log("I just finished writing!");
});

Två varianter

fs.writeFileSync() / fs.readFileSync()

Non-blocking event-driven I/0

Betyder att typ allt är async by default

Vi har callbacks på t.ex. fs.readFile() för att koden är async

Must watch: What The Hell is the event loop anyway

Vi kan tvinga dessa två funktioner att bli synchronous

let data = fs.readFileSync('data.txt');
fs.writeFileSync('data.txt', data);

Observera, inga callback

att tänka på

Options: encoding

fs.writeFileSync('data.txt','utf-8' , data)
fs.readFileSync('data.txt','utf-8')
Parcel - Getting Started Webpack Webpack Boilerplate

Instruktioner för detta finns på GitHub + Zenit 17_bundler.md

+ extra instruktioner om du vill fördjupa dig i node: 16_node.md