Владимир Алаев "Разработка на node.js: инструменты,...

Post on 29-Nov-2014

5.118 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

http://bit.ly/9Z97rEJetBrains WebStorm

10

10

http://bit.ly/gixPIwSublime Text 2

11

11

Которые мы используемИнструменты

12

— Что использовать для редактирования кода?

— npm

12

http://npmjs.orgnpm

13

13

$ 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 <peimei@ya.ru>', 'veged <veged@mail.ru>', 'fedor.indutny <fedor.indutny@gmail.com>', 'scf <scf2k@yandex.ru>', 'afelix <skryzhanovsky@gmail.com>' ], author: 'Sergey Berezhnoy <veged@mail.ru> (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/ometajsbem@0.4.2 ../node_modules/bem!"" q-wrap@0.0.1!"" inherit@1.0.4!"" qq@0.3.3!"" coa@0.3.5!"" q@0.7.2 (event-queue@0.2.0)#"" borschik@0.0.10 (q@0.8.5, q-fs@0.1.27, cssp@1.0.5)

Установка модуляnpm install

16

16

$ npm uninstall bem

Удаление модуляnpm uninstall

17

17

Полезно знатьnpm

18

— ls

18

/usr/local/lib!"" async@0.1.0 !"" v8-profiler@3.6.2-1 !"$ winston@0.5.9 % !"" async@0.1.15 % !"" colors@0.6.0-1 % !"" eyes@0.1.7 % !"$ loggly@0.3.11 % % !"" request@2.9.100 % % #"" timespan@2.2.0 % !"" pkginfo@0.2.3 % #"" stack-trace@0.0.6 #"$ xjst@0.2.21 ...

npm ls -gГлобальные модули

19

19

bem@0.5.10 /Users/scf/Projects/bem-tools!"" apw@0.3.4 !"" async@0.1.22 !"$ winston@0.5.10 % !"" colors@0.6.0-1 % !"" eyes@0.1.7 % !"$ loggly@0.3.11 % % !"" request@2.9.202 % % #"" timespan@2.2.0 % !"" pkginfo@0.2.3 % #"" stack-trace@0.0.6 #"$ xjst@0.2.21 ...

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

http://bit.ly/cEceO0node-inspector

32

32

Которые мы используемИнструменты

33

— Что использовать для редактирования кода?

— npm

— git

— node-inspector

— JSHint

33

http://jshint.comJSHint

34

34

Установка и использованиеJSHint

35

— npm install -g jshint

— jshint myscript.js

35

36

36

Дмитрий Щадей на Я.Субботнике в Киеве, 5 мая 2012 года

http://bit.ly/PIGC4B

Зачем и как мы используем JSLint

37

37

Библиотеки

38

38

http://bit.ly/v0QE1fWinston

39

39

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

http://bit.ly/v0QE1fWinston

48

48

http://bit.ly/trTtVGMocha

49

49

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

http://bit.ly/trTtVGMocha

72

72

Хочешь классический ООП?

73

73

Множество фреймворковООП в JavaScript

74

— joose

— MooTools

— class-js

— Sslac

— comb

— UberClass

— ease.js

...

74

inherit

75

• Простой и понятный код

• __base

• __self

75

http://bit.ly/x7htNfinherit

76

76

Колбек на колбеке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

http://bit.ly/hnNcpUQ

81

81

Консольные утилиты

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

Command Option Argument

http://bit.ly/zaRCDk

COA

87

87

Сервисы

88

88

Даже ее мама знает про github

89

89

Чем полезен github

— Готовый git репозиторий

— Открытая разработка

— It’s social!

— Code review

90

90

91

91

92

92

http://travis-ci.org

93

93

Travis build history

94

94

Travis build log

95

95

http://travis-ci.org

96

96

97

97

Владимир Алаев scff@yandex-team.ru

@scf2k

http://fb.com/scf2k

98

top related