JavaScript for Grownups
Part 1: node.js, npm, require, jest, pure functions
In this first part of the series we will learn about node.js, npm, require, jest and pure functions.
This post is better used as reference. To understand in a more complete way please refer to Dan Abramov’s “Getting Started with Redux” course at egghead until lesson “Pure and Impure Functions”.
This post is part of the JavaScript for Grownups series:
Prerequisites
- Node.js
- NPM
What is Node.js?
Runtime built on Chrome’s V8 JavaScript engine.
Hello World
file: index.js
console.log('Hello World!');
Command Line
node index.js
rm index.js
NPM
Command Line
mkdir javascript-adultswim
cd javascript-adultswim
file: README.md
# javascript-adultswim
Simple node.js script
Command Line
npm init --yes
file: package.json
{
"name": "javascript-adultswim",
"version": "1.0.0",
"description": "Simple node.js script",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
jest
Comand Line
npm install --save-dev jest
part of file: package.json
{
"scripts": {
"test": "jest"
}
}
counter.test.js
var counter = require('./counter');
test('should return initial state if state is undefined', function() {
expect(counter(undefined, {})).toBe(0);
});
test('increment state', function() {
expect(counter(0, { type: 'INCREMENT' })).toBe(1);
expect(counter(1, { type: 'INCREMENT' })).toBe(2);
});
test('decrement state', function() {
expect(counter(0, { type: 'DECREMENT' })).toBe(-1);
expect(counter(1, { type: 'DECREMENT' })).toBe(0);
});
test('should return current state for unknown action', function() {
expect(counter(1, { type: 'UKNOWN_TYPE' })).toBe(1);
});
Command Line
npm test -- --watch
counter.js
module.exports = function counter(state, action) {
if (state === undefined) return 0;
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
};
index.js
var counter = require('./counter');
console.log(counter(0, { type: 'INCREMENT' })); // 1
console.log(counter(1, { type: 'DECREMENT' })); // 0
Pure and impure functions
Pure function
- no side effects (database or network calls)
- idempotent (return value always the same for the same arguments)
- immutable (can’t change the argument received)
ps: the previous example is pure
Impure function
- not pure :-)