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
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)
Node Package Manager
I nodes ekosystem ingår NPM som är ett program för att installera paket.
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.
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;
const http = require('http');
http.createServer((req,res) => {
res.send("Hello!");
res.end();
}).listen(4000);
const http = require('http');
http.createServer((req,res) => {
res.writeHead(200, {'Content-Type': 'text/html'});
res.send("Hello!");
res.end();
}).listen(4000);
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);
});
Vi ska dock använda oss av andras moduler också
Som tur är har nodes ekosystem ett inbyggt program som hanterar delningen åt oss
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.
Samtliga brukar även ha en GitHub-sida
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
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.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!");
});
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
Vi kan tvinga dessa två funktioner att bli synchronous
let data = fs.readFileSync('data.txt');
fs.writeFileSync('data.txt', data);
Observera, inga callback
Options: encoding
fs.writeFileSync('data.txt','utf-8' , data)
fs.readFileSync('data.txt','utf-8')
Instruktioner för detta finns på GitHub + Zenit 17_bundler.md
+ extra instruktioner om du vill fördjupa dig i node: 16_node.md