Владимир Алаев "Разработка на node.js: инструменты,...
DESCRIPTION
Платформа Node.js становится все более популярной. Для нее уже создано много библиотек и инструментов. Рассказ о том, какие из них и для чего мы используем.TRANSCRIPT
Я.Субботник, Санкт-Петербург, 30 июня 2012 года
РазработчикВладимир Алаев
Разработка на Node.js: инструменты, библиотеки, сервисы
1
Разработка на Node.js
— Инструменты
— Библиотеки
— Сервисы
2
2
Инструменты
3
3
Которые мы используемИнструменты
4
— Что использовать для редактирования кода?
4
JavaScript в Node.js
— Это все тот же JavaScript
— Используй свой любимый редактор
— NetBeans, Aptana, vim, TextMate, Visual Studio, ...
— Но!
5
5
6
6
Отладка Node.js приложений
7
7
Знает о структуре Node.js модулей
8
8
9
Это не реклама! O:-)
9
Которые мы используемИнструменты
12
— Что использовать для редактирования кода?
— npm
12
$ npm search loggingNAME DESCRIPTION ain Syslog logging for node.js ain-tcp Syslog logging for node.js, with syslog/TCPbeaver CLI tool for piping a log's tail over TCP bolt-logger simple logging for bolt book flexible node.js logging library book-email email transport for book logging framework book-file file transport for book logging framework book-git git middleware for book logging framework
Поиск модуляnpm search
14
14
$ npm show bem{ name: 'bem', description: 'BEM Tools', 'dist-tags': { latest: '0.4.2', stable: '0.2.5', unstable: '0.5.10' }, maintainers: [ 'arikon <[email protected]>', 'veged <[email protected]>', 'fedor.indutny <[email protected]>', 'scf <[email protected]>', 'afelix <[email protected]>' ], author: 'Sergey Berezhnoy <[email protected]> (http://github.com/veged)',...
Информация о модулеnpm show
15
15
$ npm install bemnpm http GET https://registry.npmjs.org/bemnpm http GET https://registry.npmjs.org/coanpm http GET https://registry.npmjs.org/qnpm http GET https://registry.npmjs.org/inheritnpm http GET https://registry.npmjs.org/borschiknpm http 304 https://registry.npmjs.org/[email protected] ../node_modules/bem!"" [email protected]!"" [email protected]!"" [email protected]!"" [email protected]!"" [email protected] ([email protected])#"" [email protected] ([email protected], [email protected], [email protected])
Установка модуляnpm install
16
16
$ npm uninstall bem
Удаление модуляnpm uninstall
17
17
Полезно знатьnpm
18
— ls
18
/usr/local/lib!"" [email protected] !"" [email protected] !"$ [email protected] % !"" [email protected] % !"" [email protected] % !"" [email protected] % !"$ [email protected] % % !"" [email protected] % % #"" [email protected] % !"" [email protected] % #"" [email protected] #"$ [email protected] ...
npm ls -gГлобальные модули
19
19
[email protected] /Users/scf/Projects/bem-tools!"" [email protected] !"" [email protected] !"$ [email protected] % !"" [email protected] % !"" [email protected] % !"$ [email protected] % % !"" [email protected] % % #"" [email protected] % !"" [email protected] % #"" [email protected] #"$ [email protected] ...
cd bem-tools; npm lsЛокальные модули bem-tools
20
20
Полезно знатьnpm
21
— ls
— shrinkwrap
21
"dependencies": { "coa": "0.3.x", "inherit": "1.0.x", "q": "~0.8.2", "q-fs": "0.1", "cssp": "1.0.x"}
До и послеnpm shrinkwrap
22
"dependencies": { "coa": "0.3.5", "inherit": "1.0.4", "q": "0.8.5", "q-fs": "0.1.27", "cssp": "1.0.5",}
22
Полезно знатьnpm
23
— ls
— shrinkwrap
— publish
23
Необходим package.jsonnpm publish
— Создать с помощью npm init
— Написать руками
24
24
Полезно знатьnpm
25
— ls
— shrinkwrap
— publish
— version
25
Обновляет версию пакетаnpm version
— На конкретно заданную
— major
— minor
— patch
26
26
Которые мы используемИнструменты
27
— Что использовать для редактирования кода?
— npm
— git
27
Ты не используешь git?!
28
28
Которые мы используемИнструменты
29
— Что использовать для редактирования кода?
— npm
— git
— node-inspector
29
Отладка Node.js приложений
— Интегрированный отладчик
— WebStorm
— node-inspector
30
30
31
31
Которые мы используемИнструменты
33
— Что использовать для редактирования кода?
— npm
— git
— node-inspector
— JSHint
33
Установка и использованиеJSHint
35
— npm install -g jshint
— jshint myscript.js
35
36
36
Дмитрий Щадей на Я.Субботнике в Киеве, 5 мая 2012 года
http://bit.ly/PIGC4B
Зачем и как мы используем JSLint
37
37
Библиотеки
38
38
Winston
40
— Разные транспорты
40
var winston = require('winston');
// Добавляем вывод в консольwinston.add(winston.transports.Console, options);
// Добавляем вывод в файл my.logwinston.add(winston.transports.File, { filename: 'my.log' });
ТранспортыWinston
41
npm search winston
41
Winston
42
— Разные транспорты
— Уровни логирования
42
var winston = require('winston');
winston.log('debug', 'выделение памяти для чтения файла');
winston.log('info', 'читается файл данных');
winston.log('error', 'ошибка чтения файла');
Уровни логированияWinston
43
43
Winston
44
— Разные транспорты
— Уровни логирования
— Выделение цветом
44
Выделение цветомWinston
45
45
Winston
46
— Разные транспорты
— Уровни логирования
— Выделение цветом
— Профилирование
46
winston.profile('test');
someFunctionWeWantToProfile();
winston.profile('test');
// "30 Jun 16:00:00 - info: test duration=1200ms"
ПрофилированиеWinston
47
47
Mocha
50
— Тестирование асинхронного кода
— Разные виды репортов
50
Dot MatrixРепортеры Mocha
51
51
SpecРепортеры Mocha
52
52
TAPРепортеры Mocha
53
53
Landing StripРепортеры Mocha
54
54
ListРепортеры Mocha
55
55
ProgressРепортеры Mocha
56
56
JSONРепортеры Mocha
57
57
HTMLРепортеры Mocha
58
58
NyanРепортеры Mocha
59
59
Mocha
60
— Тестирование асинхронного кода
— Разные виды репортов
— Ваша любимая библиотека ассертов
60
var user = { name: 'tj', pets: ['tobi', 'loki', 'jane', 'bandit']};
user.should.have.property('name', 'tj');
user.should.have.property('pets').with.lengthOf(4);
ShouldАссерты
61
61
var user = { name: 'tj', pets: ['tobi', 'loki', 'jane', 'bandit']};
expect(user).to.have.property('name', 'tj');
expect(user).to.have.property('pets').to.have.length(4);
ExpectАссерты
62
62
var user = { name: 'tj', pets: ['tobi', 'loki', 'jane', 'bandit']};
assert.equal(user.name, 'tj');
assert.length(user.pets, 4);
Node.js AssertАссерты
63
63
ChaiАссерты
64
Все три варианта: should, expect, assert
64
Mocha
65
— Тестирование асинхронного кода
— Разные виды репортов
— Ваша любимая библиотека ассертов
— Несколько стилей описания тестов
65
describe('Array', function(){ before(function(){ // ... });
describe('#indexOf()', function(){
it('should return -1 when not present', function(){
[1,2,3].indexOf(4).should.equal(-1);
}); });
BDDСтили тестов
66
66
suite('Array', function(){ setup(function(){ // ... });
suite('#indexOf()', function(){
test('should return -1 when not present', function(){
assert.equal(-1, [1,2,3].indexOf(4));
}); });
TDDСтили тестов
67
67
module.exports = { before: function(){ // ... },
'Array': { '#indexOf()': { 'should return -1 when not present': function(){ [1,2,3].indexOf(4).should.equal(-1); } } }};
ExportsСтили тестов
68
68
function ok(expr, msg) { if (!expr) throw new Error(msg);}
suite('Array');
test('#indexOf()', function(){ var arr = [1,2,3]; ok(arr.indexOf(4) == -1);});
QUnitСтили тестов
69
69
Mocha
70
— Тестирование асинхронного кода
— Разные виды репортов
— Ваша любимая библиотека ассертов
— Несколько стилей описания тестов
— Test coverage
70
Test coverage
71
71
Хочешь классический ООП?
73
73
Множество фреймворковООП в JavaScript
74
— joose
— MooTools
— class-js
— Sslac
— comb
— UberClass
— ease.js
...
74
inherit
75
• Простой и понятный код
• __base
• __self
75
Колбек на колбекеJavaScript
77
77
ПодходыАсинхронный код
78
— Fibers (Kberize, Kbers, sync)
— Препроцессоры (streamline, Jscex)
— Control Flow (async, begin, groupie, $N, seq, Slide)
— Promises (deferred, promise, node-promise, when, Q)
78
Почему Promises?— Не требует препроцессинга
— Читабельный код
— Единообразие
— Позволяет писать плоский код
— Внутри все та же асинхронность
Но...
79
79
Нужно немного поломать мозги :)
80
80
Консольные утилиты
82
— Команды, опции, аргументы
— Помощь
— Автокомплит
— API для использования из программ
Все это есть в COA!
82
require('coa').Cmd() .name(process.argv[1]) .title('Test COA util') .helpful() .opt() .name('version') // name for use in API .title('Version') // title for use in text messages .short('v') // short key: -v .long('version') // long key: --version .flag() // for options without value .only() // act as command .act(function(opts) { // add action for option return "COA util 2.3.1"; }) .end() // end option chain and return to main command
83
83
.cmd() // subcommand declaration .name('greet').title('Test greet command').helpful() .opt() .name('name').title('who to greet, required') .short('n').long('name') .val(function(v) { // validator function return v || 'Unknown' }) .req() // make option required .end() // end option chain and return to command .act(function(opts, args){ console.log('Hello, ' + opts.name + '!!!'); }) .end() // end subcommand chain .completable() // make possible generate completion script .act(function(){ // default handler when run with no params console.log('run with --help to see help') }) .run(process.argv.slice(2)); // parse and run on process.argv
84
84
$ node coa.jsrun with --help to see help
85
$ node coa.js --helpTest COA util
Usage: coa.js COMMAND [OPTIONS] [ARGS] coa.js [OPTIONS] [ARGS]
Commands: greet : Test greet command completion : Shell completion
Options: -h, --help : Help -v, --version : Version
$ node coa.js -vCOA util 2.3.1
85
$ node coa.js greetMissing required option: -n NAME, --name=NAME : who to greet, required
86
$ node coa.js greet -n vegedHello, veged!!!
$ node coa.js completion###-begin-coa.js-completion-##### coa.js command completion script## Installation: coa.js completion >> ~/.bashrc (or ~/.zshrc)# Or, maybe: coa.js completion > /usr/local/etc/bash_completion.d/coa.js#...
86
Сервисы
88
88
Даже ее мама знает про github
89
89
Чем полезен github
— Готовый git репозиторий
— Открытая разработка
— It’s social!
— Code review
90
90
91
91
92
92
Travis build history
94
94
Travis build log
95
95
97
97