MEAN (розшифровується як MongoDB, Express.js, Angular.js, Node.js) - це набір програмного забезпечення для веб розробки. Його перевагою є те, що всі компоненти використовують програми написані на JavaScript, тому можна запрограмувати всю програму використовуючи єдину мову.

Як почати проект ред.

Є теорія, що найлегше щось вчити - коли знаєш для чого вчишся. (Див. статтю Потяг до програмування). Але з програмуванням є проблема - навіть якщо людина знає що вона хоче - не факт що того що вона хоче можна досягти програмуванням. А людина дуже часто навіть не знає чого хоче. Ввесь процес програмування - це зближення двох точок - того чого хочеш і того що маєш/можеш.

Тому ви можете не переживати що колись комп’ютери стануть такі розумні що зможуть робити все що їм скаже людина і програмісти стануть непотрібні. Тоді стануть потрібними спеціалісти які зможуть дізнатись що ж все таки людина хоче, і нормально пояснити це комп’ютеру. Хоча такі спеціалісти існують і зараз, та називаються бізнес-аналітиками. Їхнє завдання - витягнути з замовника вимоги щодо проекту, і пояснити їх програмістам.

І тому корисно вибрати щось що ви хочете зробити. Це допоможе вам спостерегти як ваші бажання змінюються і уточнюються в процесі розширення ваших можливостей. А спостереження за тим як ваш проект стає все кращим і кращим додасть мотивації вчитися.

Хостинг проектів ред.

В наш час більшість проектів окрім комп’ютера програміста зберігаються на якомусь хостингу для проектів. Окрім того що це дозволяє не втратити напрацьоване коли комп’ютер ламається, це допомагає краще організовувати роботу, і отримувати допомогу від колег.

Тут ми розглядатимемо дуже популярний хостинг проектів GitHub, який працює з дуже популярною системою керування версій Git. Про керування версіями трохи далі, а вам раджу зайти на https://github.com/ і зареєструватись там. Тоді ви зможете створювати репозиторії. Знайдіть кнопку "New repository" і натисніть її.

  1. Code
  2. Issues

Приєднання сертифікатів ред.

Git ред.

GitHub Pages ред.

Github також дозволяє створити собі маленький статичний сайт. Статичний, в тому розумінні що корстувачі які з ним взаємодіють, не зможуть нічого на ньому зберегти. Тобто якщо ви наприклад захочете додати коментарі - їх доведеться додавати за допомогою якогось зовнішнього сервісу на зразок Disqus.

Існує два способи створити сторінку на Github. Перший - завести репозиторій що називається username.github.io, де, звісно, замість username має стояти ваше ім’я. Наприклад bunyk. Тоді за адресою https://bunyk.github.io/ з’явиться вміст файлу index.htm вашого репозиторію. Якщо в репозиторії є директорії з іншими файлами - на сайті з’являться й відповідні сторінки.

Другий спосіб - завести в якомусь з ваших репозиторіїв гілку gh-pages. І тоді за адресою https://username.github.io/project-name/ теж з’явиться вміст файлу index.html та всіх інших файлів в цій гілці.

Інсталяція Node.js ред.

Ubuntu ред.

На Ubuntu все як завжди ставиться дуже просто:

sudo apt-get install nodejs

Docker ред.

Хоча середовище розробки варто було б ізолювати і помістити в якийсь акуратний контейнер. Правда треба час аби придумати як це найкраще зробити.


Модулі Node.js ред.

Модулі в Node.js - це звичайні файли. Ввесь код всередині модуля виглядає так ніби він загорнутий в функцію. Тобто всі змінні і функції які ви опишете - приватні. Крім об’єкта exports.

Приклад:

// my_module.js 

exports.hello = function hello() {
    console.log('Привіт, світе!');
};
// app.js 

hello_module = require('./my_module')

hello_module.hello()

Якщо треба щоб exports був функцією, або задати його одним присвоєнням об’єкта - присвойте його module.exports. Напряму присвоїти нове значення змінній exports не вийде, бо це створить нову локальну змінну в модулі, і ззовні нічого не буде доступно.

Приклад:

// my_module.js 

module.exports = function hello() {
    console.log('Привіт, світе!');
};
// app.js 

hello_module = require('./my_module')

hello_module()

Щоб визначити чи модуль запускається напряму (node module.js) чи імпортується з іншого модуля (require(module)), можна використовуючи умову require.main == module

Якщо require отримує назву директорії, то require завантажить те що написано в полі "main" в розділі package.json. Інакше треба дивитись index.js, index.json або index.node (двійковий файл).

Знайомство з фреймворком Express.js ред.

Ініціалізація проекту ред.

Для початку створімо директорію проекту, і перейдімо туди. Нехай наш проект називається animals.

~$ mkdir animals 
~$ cd animals

Тепер ініціалізуємо проект, створивши в ньому файл package.json. Для цього використовується команда

~/animals$ npm init

Вона задасть вам кілька питань, на всі з яких підходить стандартна відповідь і створить файл з подібним вмістом:

{
  "name": "animals",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Тепер потрібно додати в наш проект залежність від фреймворка Express. Це робить команда:

~/animals$ npm install express --save

Вона завантажує всі файли фреймворка в піддиректорію проекту node_modules, а опція --save вказує на те, що залежність від цього пакета треба записати в нашому файлі проекту package.json:

-  "license": "ISC"
+  "license": "ISC",
+  "dependencies": {
+    "express": "^4.13.4"
+  }

Таким чином ми можемо поширювати з нашим проектом лише файл package.json а не всю директорію node_modules, і при потребі встановити всі залежності однією командою з кореневого каталогу проекту:

~/animals$ npm install

Привіт, світе! ред.

Що ж, все встановлено, давайте писати код!

 
Молодець, дай п’ять!

Ось код що створює сервер який повертає текст "Hello, world!" для початкової сторінки:

var express = require('express')

var app = express();

app.get('/', function(req, res) {
    res.send('Hello, world!');
});

app.listen(3000);
console.log('Server listening on 3000');

MongoDB ред.

npm install --save mongodb
var mongodb = require('mongodb');

var uri = 'mongodb://localhost:27017/example'

mongodb.MongoClient.connect(uri, function(error, db) {
    if(error) {
        console.log(error);
        process.exit(1);
    }
    db.collection('users').insert(
        {name: 'taras'},
        function(error, result) {
            if(error) {
                console.log(error);
                process.exit(1);
            }
            if(result) {
                console.log(result);
                process.exit(1);
            }
        }
    );
});

Mongoose ред.

npm install --save mongoose
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;

var userSchema = require('./user');

mongoose.connect('mongodb://localhost:27017/example');

var User = mongoose.model('User', userSchema, 'user');

var user =  new User({
    name: 'Taras',
    email: 'tbunyk@gmail.com',
}); 

user.save(function(err, res) {
    console.log(err, res);
    process.exit();
});

OAuth авторизація ред.

Facebook ред.

npm install --save express-session
npm install --save passport passport-facebook

Функціональне тестування з Protractor ред.

Protractor (з англійської - транспортир) - бібліотека для написання автоматизованих тестів, які використовують браузер і намагаються моделювати поведінку користувача, тобто натискають кнопки, відкривають сторінки, вводять текст в поля і т.п.

Інсталяція ред.

Для керування браузером нам потрібен Selenium webdriver, який працює на Java, тому переконайтесь що у вас встановлено Java Development Kit (вивід команди java -version)[1]

npm install -g protractor

В цьому пакеті містяться скрипти protractor (який запускає тести) та webdriver-manager (який запускає сервер що керує браузером), і якого потрібно оновити:

webdriver-manager update

А тоді запустити:

webdriver-manager start
  1. angularjs - Protractor - error when starting webdriver-manager, seleniumProcess.pid: undefined. Stack Overflow. Процитовано 12 березня 2016.