Статьи

Создание приложений с помощью Yeoman Workflow

Хитрый вопрос. Это не вещь. Это этот парень

Эй

По сути, он носит цилиндр, живет на вашем компьютере и ждет, когда вы скажете ему, какое приложение вы хотите создать. Например, строительные леса веб-приложения будут выглядеть примерно так:

йо-WebApp

Первое, что приходит на ум, это OMG, такой мечтательный. Во-вторых, спасибо, брат.

Все, что мы сделали, это сказали ему, что мы хотели, и он ответил конкретными вопросами, чтобы дать нам еще больший контроль.

Давайте вернемся на шаг назад. Не каждый новый компьютер поставляется с предустановленным Yeoman. Он живет в хранилище пакетов NPM. Вам нужно только попросить его один раз, затем он соберется и переместится на ваш жесткий диск. Убедитесь, что вы убираетесь, он любит новые и блестящие вещи.

Он человек с чувствами и мнениями, но с ним очень легко работать. Если вы думаете, что он слишком самоуверен, его легко убедить.

Давайте на секунду разберем, что на самом деле сделала команда yo webapp из предыдущего скриншота.

Это общесистемная команда для OS X, Linux и Windows, которая проверяет ваш жесткий диск на наличие установленных «генераторов», а затем дает им контроль на основе следующего аргумента:

На самом деле это отдельный плагин или «генератор», который называется generator-webapp . Yeoman распознает другие модули generator-____ Node, что открывает двери для использования Backbone, AngularJS и бесчисленных других генераторов you-name-it.

Что-то важное, что можно убрать из этого, — это модуль generator-webapp который задает нам вопросы. То же самое касается любых других генераторов, которые мы устанавливаем. Они поддерживаются сообществом, а не обязательно самими членами йоменской команды.

Используя Yeoman, вы не говорите: «Я хочу делать все по-своему, мастер. Поклонись », не имея никакого контроля. На самом деле это совсем наоборот. На самом деле вы говорите: «Я хочу создать приложение, которое будет следовать рекомендациям, которые были обнаружены частыми пользователями и участниками сообщества веб-разработчиков».

Серьезно, вы должны сказать это просто так, иначе это не сработает.

Если вы предпочитаете сделать что-то иначе, чем то, что он вам дает, вы просто измените код, который был сгенерирован для вас, или даже перейдете к источнику самого «генератора» и отправите свой вклад.


Наш приятель, у тебя есть несколько своих приятелей, и он думает, что вы все будете ладить за бесконечным чаем и улыбками. Если вы не слышали о Гранте или Бауэре , вот краткое изложение того, что они нам дают:

Grunt — это запускающий задачи на основе JavaScript, который делает грязные вещи. Как и yo , он также предоставляет базовый набор функций, а затем позволяет сообществу делиться своими собственными плагинами или «задачами», которые помогают выполнять общие задачи. Когда вы создаете приложение с помощью своего веб-приложения, yo webapp Grunt и некоторые другие задачи, такие как запуск вашего сайта в локальной среде разработки, объединение и минимизация кода, оптимизация изображений и многое другое. Задачи запускаются через командную строку, набирая grunt server , grunt build , grunt test и многое другое.

Задачи определяются и настраиваются в файле Gruntfile.js , который находится в корневом каталоге вашего проекта. Проверьте это, чтобы увидеть, что Yeoman настроил для вас.

Никто не любит заходить на GitHub или сайты случайных разработчиков, чтобы загрузить ZIP-архив с инструментом JavaScript. Как и при получении пакета Node с npm install ___ , Bower позволяет вам сказать bower install ___ . Затем компонент сохраняется в каталоге по вашему выбору, обычно app/bower_components/ для приложений, сгенерированных Yeoman. Предполагая, что вам нужен jQuery, вы должны выполнить команду bower install query , а затем включить соответствующий файл в ваш HTML-файл. В нашем случае <script src="bower_components/jquery/jquery.js"></script>


Давайте побезумствуем. Пришло время создать приложение.

Очень быстро, хотя, найдите ближайший терминал и убедитесь, что у вас установлено глобально:

1
$ npm install -g yo

Для создания веб-приложения вам также понадобится generator-webapp веб-приложение:

1
$ npm install -g generator-webapp

Создайте папку, в которой мы можем поиграть, затем запустите:

1
$ yo webapp

Вот что должно было случиться:

  • Целая куча вещей.

Сделал это? Хорошо!

Чтобы предотвратить прокрутку всего текста, который только что выплевывался на вас, вот обзор:

йо-WebApp длиной

Новое веб-приложение было защищено, а компоненты Bower и пакеты NPM были установлены автоматически.

Откройте все эти новые вещи в вашем любимом редакторе, и мы посмотрим, что у нас есть.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
├─ app/
│ ├─ images/
│ │ ├─ glyphicons-halflings.png
│ │ └─ glyphicons-halflings-white.png
│ ├─ scripts/
│ │ ├─ vendor/
│ │ │ └─ bootstrap.js
│ │ ├─ app.js
│ │ ├─ hello.coffee
│ │ └─ main.js
│ ├─ styles/
│ │ └─ main.css
│ ├─ .htaccess
│ ├─ 404.html
│ ├─ favicon.ico
│ ├─ index.html
│ └─ robots.txt
├─ node_modules/
│ ├─ so/
│ ├─ many/
│ └─ packages/
├─ test/
│ ├─ spec/
│ │ └─ test.js
│ ├─ .bowerrc
│ ├─ bower.json
│ └─ index.html
├─ .bowerrc
├─ .editorconfig
├─ .gitattributes
├─ .gitignore
├─ .jshintrc
├─ bower.json
├─ Gruntfile.js
└─ package.json

Если вы убрали что-то из этой статьи, пусть это будет красивое текстовое представление файла / папки выше. Это заняло целую горную росу моего времени.

Вернуться на трек. То, на что вы обращаете внимание, — это самая распространенная структура приложения, которую генерирует генератор Yeoman.

  • app/ — это место, где живет ваш чистый, не скомпилированный, не минимизированный исходный код.
  • app/scripts/ — это то, куда уходит ваш JavaScript. Вы можете создавать подкаталоги и даже использовать CoffeeScript, если это ваша чашка чая. Это не имеет смысла. Опять таки. Вы можете использовать TeaScript, если это ваша чашка кофе. Нет.
  • app/styles/ — это то, куда уходит ваш CSS. Опять же, подкаталоги, LESS, Sass, whatevs.
  • app/index.html — это не минимизированная версия index.html , которая в конечном итоге будет раздавлена ​​и доставлена ​​клиенту. Подробнее об этом позже.
  • Gruntfile.js все задачи сборки, сервера и тестирования.

На данный момент, вы сделали свою работу. Он дал вам все необходимое для запуска готового к работе веб-приложения. Давайте теперь переключим наше внимание на то, какие задачи Grunt он предварительно настроил для нас.

Запуск grunt build берет ваши файлы app/ исходного кода и превращает их в распространяемое приложение, которое заканчивается в dist/ .

Эта папка dist/ — это то, что вы передаете на свой сервер. dist/ будет свой собственный index.html со ссылками на минимизированные и сцепленные dist/scripts и dist/styles , а также оптимизированные dist/images . Ваши пользователи это оценят. Ваша телефонная карта, пользователи коммутируемого доступа по достоинству оценят это.

За кулисами grunt build — это задача, которая выполняет несколько подзадач. Одним из них является grunt-usemin , который ищет блоки внутри вашего app/index.html , например так:

app/index.html

1
2
3
4
<!— build:js scripts/main.js —>
<script src=»bower_components/jquery/jquery.js»></script>
<script src=»scripts/main.js»></script>
<!— endbuild —>

После того, как ваша задача grunt build завершена, вы получите следующее:

dist/index.html

1
<script src=»scripts/c155266f.main.js»></script>

Он всасывал эти скрипты, объединял их, минимизировал и даже ставил перед ними префиксы с уникальными хешами, чтобы браузеры не кэшировали устаревшие версии. Довольно мощный.

Это одна из ярких особенностей использования Yeoman. Вместо того, чтобы вручную определять, что вы хотите, чтобы ваш процесс сборки делал при каждом создании приложения, вы можете просто доверять Yo и выбранному вами генератору. Вместе они предоставят вам все необходимое для запуска готового к работе приложения.

Теперь, когда вы увидели, какой тип работы будет выполнять grunt build , когда ваше приложение будет завершено, вам, вероятно, следует начать работу над ним! Мы создадим его вместе всего за секунду, но сначала давайте посмотрим, какой у нас будет рабочий процесс. Как и grunt build , grunt server использует несколько других задач Grunt, чтобы сделать разработку максимально простой.

Попробуйте это:

йо-WebApp-пехотинец-сервер

Вышеупомянутые «несколько других задач Grunt»:

  • clean: Yeoman хранит некоторые вещи в папке .tmp . Это будет уничтожено.
  • coffee: Компилирует ваши файлы CoffeeScript из app/scripts .
  • compass: компилирует ваши файлы Sass из app/styles .
  • connect: создает локальный сервер, отслеживает изменения в ваших исходных файлах, затем запускает перезагрузку в вашем браузере.
  • open: открывает экземпляр сервера, обычно localhost:9000 в вашем браузере.

Сделайте правку или два в исходных файлах, чтобы увидеть изменения, отраженные в браузере. Как я уже говорил выше, это настолько просто, насколько это возможно. Это просто работает.


Я конечно имел ввиду закуски. Возьми сырные палочки, а потом встретимся.

Помой свои руки!


Чтобы узнать о некоторых других генераторах Yeoman, давайте попробуем Backbone. Мы создадим простое приложение To Do, используем Bower для наших зависимостей и познакомим вас с реальным рабочим процессом с Yeoman.

$ Sound good? (Y/n)

Я предполагаю, что вы ввели «Y». Мы едем! Но сначала:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
# install the Backbone generator:
$ npm install -g generator-backbone
 
# make another play directory, then do these things:
$ yo backbone
 
     _——_
    |
    |—(o)—|
   `———´ |
    ( _´U`_ ) |
    /___A___\ ‘__________________________’
     |
   __’.___.’__
 ´ ` |° ´ Y `
 
Out of the box I include HTML5 Boilerplate, jQuery, Backbone.js and Modernizr.
 
Would you like to include Twitter Bootstrap for Sass?
Would you like to include RequireJS (for AMD support)?

Откройте новое приложение в вашем редакторе. После нашего опыта работы с генератором веб-приложений все должно стать довольно знакомым. У вас все еще есть каталог app со scripts/ , styles/ и index.html .

Прежде чем мы начнем редактировать файлы, запустите:

1
$ grunt server

Как мы уже говорили ранее, это запускает сервер, настраивает наблюдение за нашими файлами, бла-бла, yipsie-doodle. Ваш браузер должен открыться, и вас должны встретить с:

Ну, стреляй, мы должны сохранить это. Это так мило. Однако давайте разберемся с другими вещами.

index.html

1
2
3
4
5
6
7
8
<div class=»container»>
    <div class=»hero-unit»>
        <h1>’Allo, ‘Allo!</h1>
        <section id=»todo-app»>
            <!— Where our To Do app will go —>
        </section>
    </div>
</div>

Когда вы сохраните, ваш браузер обновится, и у нас это есть! Просто, теплый «Алло, Алло».

Давайте составим план игры. Мы знаем, что собираемся создать приложение To Do, но как это может выглядеть? Будут ли нам нужны другие библиотеки, чтобы помочь нам?

Хм.

Прошло как минимум 4 секунды, и я не услышал ни одного ответа.

Хорошо, я возьму еще одну Росу после того, как дерево файлов выпило мою последнюю. Я дам вам знать, если что-нибудь придумаю.


B3. Ужасное место в торговом автомате для газированного напитка. Физз, пена, катастрофа.

Пока я в ванной мыла руки, у меня было видение.

1
2
3
4
5
6
7
8
9
[ Add a New To Do ] ← input
 
checkbox
— clicking will draw a line through the title of the to do item
 ↓
[x] To Do Item #1
[ ] To Do Item #2
    ↑ title
      — double clicking will trigger an «edit» mode

Или…

видение-большой

Давайте создадим себе структуру, которая воплотит это видение в жизнь.

generator-backbone поставляется с секретным оружием: субгенераторы. yo backbone нашего приложения, но вернитесь к своему терминалу и посмотрите, что могут сделать эти ребята:

Todo генерировать-модель

Проверьте ваш index.html:

1
2
3
4
5
6
7
8
<!— build:js scripts/main.js —>
<script src=»scripts/main.js»></script>
<script src=»scripts/templates.js»></script>
<script src=»scripts/collections/todos-collection.js»></script>
<script src=»scripts/models/todo-model.js»></script>
<script src=»scripts/views/todos-view.js»></script>
<script src=»scripts/views/todo-view.js»></script>
<!— endbuild —>

Как насчет этого! Он не только создавал и размещал файлы в соответствующих каталогах, он даже включал их в ваш HTML для вас.

Я создал репозиторий для нашего приложения To Do — посмотрите его . Мы вместе взглянем на файлы, но, пожалуйста, обратитесь к хранилищу, чтобы получить полный код.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
/*global backboneApp, $*/
 
window.backboneApp = {
    Models: {},
    Collections: {},
    Views: {},
    Routers: {},
    init: function () {
        new this.Views.TodosView({
            collection: new this.Collections.TodosCollection()
        });
    }
};
 
$(document).ready(function () {
    backboneApp.init();
});

Генератор Backbone устанавливает некоторые передовые практики, которые вы можете использовать прямо из коробки. Он взял имя вашего каталога, в моем случае «backboneApp», и открыл объектный литерал для хранения Моделей, Коллекций и других объектов Backbone, которые мы можем создать.

Генератор также включает JSHint в процесс сборки вашего приложения, гарантируя, что ваш код имеет самое высокое и наиболее стабильное качество. .jshintrc настроить ваши предпочтения в файле .jshintrc в корневом каталоге вашего проекта.

Наконец, $(document).ready вызовет backboneApp.init , который создает TodosCollection , а затем передает ее в TodosView . Я расскажу об этом более подробно в ближайшее время.

01
02
03
04
05
06
07
08
09
10
11
/*global backboneApp, Backbone*/
 
backboneApp.Collections.TodosCollection = Backbone.Collection.extend({
 
    localStorage: new Backbone.LocalStorage(‘backbone-generator-todos’),
 
    initialize: function () {
        this.model = backboneApp.Models.TodoModel;
    }
 
});

Если мы хотим, чтобы наше приложение To Do было несколько пригодным для использования, мы должны где-то хранить элементы To Do. Есть удобный адаптер Backbone, с которым вы, возможно, знакомы, называется Backbone.LocalStorage. Он будет перехватывать вызовы Backbone к удаленному бэкэнду по умолчанию и вместо этого использовать window.localStorage вашего браузера.

Мы знаем, что нам понадобится адаптер Backbone.LocalStorage, но куда нам его взять? Идея! Идея!

Мы не особо использовали Бауэр. Когда наше приложение было защищено, Bower использовался за кулисами для захвата Modernizr, Twitter Bootstrap, jQuery, Underscore и Backbone. Но что, если мы хотим добавить еще одну зависимость JavaScript?

Вернитесь в свой любимый терминал и попробуйте это:

1
$ bower search backbone
Беседки-поиск-магистральные

Хорошо вау Это много. Может быть, мы должны сузить это.

1
2
3
4
$ bower search backbone.localstorage
Search results:
 
    backbone.localStorage git://github.com/jeromegn/Backbone.localStorage.git

Вот и мы. Теперь нам осталось только установить его.

1
2
3
4
5
6
$ bower install backbone.localStorage —save
bower cloning git://github.com/jeromegn/Backbone.localStorage.git
bower cached git://github.com/jeromegn/Backbone.localStorage.git
bower fetching backbone.localStorage
bower checking out backbone.localStorage#v1.1.4
bower installing backbone.localStorage#v1.1.4

При работе с несколькими разработчиками может быть сложно убедиться, что у всех есть правильные зависимости и подходящие версии. Используя --save выше, мы говорим Bower запомнить эту новую зависимость, а затем написать об этом в нашем файле bower.json . Когда другой разработчик клонирует ваш проект, ему просто нужно запустить bower install чтобы загрузить все зависимости и синхронизировать всех. Вот почему app/bower_components указан в вашем файле .gitignore . Прошли те времена раздутых хранилищ!

Теперь, когда Bower отлично работает по всему нашему приложению, перейдите в app/index.html и обновите блок комментариев scripts/vendor.js :

1
2
3
4
5
6
<!— build:js scripts/vendor.js —>
<script src=»bower_components/jquery/jquery.js»></script>
<script src=»bower_components/underscore/underscore.js»></script>
<script src=»bower_components/backbone/backbone.js»></script>
<script src=»bower_components/backbone.localStorage/backbone.localStorage.js»></script>
<!— endbuild —>

Когда вы сохраните файл, ваш браузер обновится, и у вас будет новая библиотека, готовая к использованию. Точнее, TodosCollection будет готов к использованию.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
/*global backboneApp, Backbone*/
 
backboneApp.Models.TodoModel = Backbone.Model.extend({
 
    defaults: {
        title: »,
        completed: false
    },
 
    toggle: function () {
        this.save({
            completed: !this.get(‘completed’)
        });
    }
 
});

Это довольно простая базовая модель. Мы устанавливаем некоторые свойства по умолчанию для наших элементов To Do и определяем функцию toggle , просто используемую для переключения между состоянием «Complete» или «Incomplete».

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
/*global backboneApp, Backbone, JST*/
 
backboneApp.Views.TodosView = Backbone.View.extend({
 
    el: ‘#todo-app’,
 
    template: JST[‘app/scripts/templates/todos.ejs’],
 
    events: { /* … */ },
 
    initialize: function () { /* … */ },
 
    render: function () { /* … */ },
 
    createTodo: function () { /* … */ },
 
    addTodoItem: function () { /* … */ },
 
    addAllTodoItems: function () { /* … */ }
 
});

Это наш самый надежный Backbone View, поэтому, чтобы увидеть определения этих различных свойств и методов, пожалуйста, обратитесь к репозиторию .

Тем не менее, вот пара ключевых вещей:

1
el: ‘#todo-app’

Этот селектор соответствует элементу <section id="todo-app"></section> мы создали в нашем файле index.html . Это будет наш основной вид.

1
template: JST[‘app/scripts/templates/todos.ejs’]

Эта маленькая штука JST проникла, когда мы сказали, что yo backbone:view ____ . Когда был создан файл JavaScript нашего представления, суб-генератор Backbone создал для нас соответствующий файл шаблона: app/scripts/templates/todos.ejs .

Эти .ejs шаблона .ejs будут определять HTML наших Views. Когда мы запускаем наше приложение с grunt server или grunt build , наши файлы шаблонов будут раздроблены в объект JavaScript, JST . Когда в нашем файле представления указано template: JST['path/to/view/template.ejs'] , это относится к этому объекту.

1
2
3
4
5
6
7
<form class=»input-append»>
    <input type=»text» id=»new-todo» placeholder=»What do you need to do today?»>
    <input type=»submit» class=»btn» value=»Submit»>
</form>
<ul>
    <!— Where our To Do items will go —>
</ul>

Поскольку мы ответили «Да» на включение Twitter Bootstrap для Sass, когда мы создавали леса для нашего приложения, я добавил пару имен классов для улучшения нашего приложения. Не стесняйтесь styles/main.scss стиль своему сердцу содержание в файле styles/main.scss .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@import ‘sass-bootstrap/lib/bootstrap’;
 
.hero-unit {
    margin: 50px auto 0 auto;
    width: 300px;
}
 
form {
    margin-top: 10px;
}
 
ul,
li form {
    margin: 0;
    padding: 0;
}
 
ul {
    list-style: none;
}
 
li form {
    display: none;
}
 
.editing {
    span {
        display: none;
    }
 
    form {
        display: inline-block;
    }
}
 
input:checked ~ span {
    text-decoration: line-through;
}

Sass довольно крутой

Кроме того, довольно здорово, что браузер по-прежнему перезагружается, когда вы вносите изменения в файлы Sass. Если вы уже использовали Sass, вы знаете, что быстро настроить продуктивную среду разработки может быть непросто. Из окна Yeoman вы редактируете, просматриваете и перезагружаете без каких-либо вышеупомянутых хлопот. Улыбающееся лицо.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*global backboneApp, Backbone, JST*/
 
backboneApp.Views.TodoView = Backbone.View.extend({
 
    tagName: ‘li’,
 
    template: JST[‘app/scripts/templates/todo.ejs’],
 
    events: {
        ‘click input[type=»checkbox»]’: ‘toggle’,
        ‘dblclick span’: ‘toggleEdit’,
        ‘submit form’: ‘toggleEdit’
    },
 
    initialize: function () { /* … */ },
 
    render: function () { /* … */ },
 
    toggle: function () { /* … */ },
 
    toggleEdit: function () { /* … */ }
 
});

Этот TodoView будет представлять отдельный элемент. Это будет <li> с некоторыми пользовательскими функциями, обрабатывающими щелчок, двойной щелчок и отправку событий, что позволяет пользователю редактировать и сохранять элемент списка дел.

1
2
3
4
5
6
7
<input type=»checkbox» <% if (completed) { %>checked<% } %>>
<form>
    <input type=»text» value=»<%= title %>»>
</form>
<span>
    <%= title %>

Достаточно просто. Мы используем некоторые базовые шаблоны Underscore, чтобы выплевывать значения и переключать checked состояние на нашем флажке.


Наше приложение To Do уже готово! Он довольно простой по функциональности, но вы должны понимать, насколько естественным является разработка приложения с использованием Yeoman и его друзей из Generator. И хотя функциональность является базовой, ни один из методов, которые мы использовали для этого, не был «базовым». Мы используем умные, эффективные библиотеки (Sass, Backbone, Underscore) с тонко настроенным процессом разработки (Grunt, LiveReload, Compass), и нам потребовалось всего несколько команд терминала.

Если вы похожи на меня, вы, вероятно, захотите остановиться на материалах To Do и начать создавать свои собственные приложения. Если вы хотите пойти поиграть, пойти на это! Когда вы закончите генерировать как сумасшедший человек, вернитесь и давайте отправим наше приложение To Do.


Давайте поместим эту вещь в воду и посмотрим, плавает ли она! НЕ кладите компьютер в воду. Подождите, MacBook Air будет плавать? Нет, наверное нет. Хм …

Это был опасный абзац. Давайте просто подготовим наше приложение к производству, безопасное и сухое.

grunt server был потрясающим, но пришло время познакомиться с его братом, grunt build . Мы говорили о нем чуть раньше, но давайте рассмотрим еще несколько деталей.

Вот что задано в grunt build в вашем Gruntfile.js :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
grunt.registerTask(‘build’, [
    ‘clean:dist’, // Clears out your .tmp/ and dist/ folders
    ‘coffee’, // Compiles your CoffeeScript files (if any)
    ‘createDefaultTemplate’, // Creates a JS file that sets up your JST object
    ‘jst’, // Compiles your `scripts/templates/` files
    ‘compass:dist’, // Compiles your Sassiness
    ‘useminPrepare’, // Looks for those <!— special blocks —> in your HTML
    ‘imagemin’, // Optimizes your images!
    ‘htmlmin’, // Minifies your HTML files
    ‘concat’, // Task used to concatenate your JS and CSS
    ‘cssmin’, // Minifies your CSS files
    ‘uglify’, // Task used to minify your JS
    ‘copy’, // Copies files from .tmp/ and app/ into dist/
    ‘rev’, // Creates unique hashes and re-names your new JS/CSS files
    ‘usemin’ // Updates the references in your HTML with the new files
]);

Так что это вполне законно. Все эти задачи определены внутри Gruntfile.js , так что вы можете Gruntfile.js и настроить сборку вашего приложения. Весьма вероятно, что вам вообще не нужно будет делать какие-либо настройки, но они есть, если вам нужно.

О, еще одна вещь. grunt build фактически обернут внутри другой задачи.

Простой запуск grunt выполнит задачу по default :

1
2
3
4
5
grunt.registerTask(‘default’, [
    ‘jshint’,
    ‘test’,
    ‘build’
]);

Эти первые две задачи, jshint и test , легко пропустить, когда вы jshint приложение, но они очень важны.

Задача jshint свяжется с вашим файлом .jshintrc чтобы узнать ваши предпочтения, а затем просканирует все ваши файлы JS, чтобы убедиться, что ваши правила соблюдаются. Чтобы в полной мере воспользоваться вашими опциями с помощью JSHint, ознакомьтесь с документацией по JSHint .

test задание выглядит так:

1
2
3
4
5
6
7
8
9
grunt.registerTask(‘test’, [
    ‘clean:server’,
    ‘coffee’,
    ‘createDefaultTemplate’,
    ‘jst’,
    ‘compass’,
    ‘connect:test’,
    ‘mocha’
]);

В основном этого достаточно для создания и обслуживания вашего приложения для вашей тестовой среды Mocha для выполнения ваших тестов.

О дерьмо, тесты.

Рядом с вашими каталогами app/ и dist/ , этот маленький test/ buckaroo ждал нашего внимания. Оо.

Если вы откроете это, вы увидите, что test/ имеет свои собственные bower.json и index.html , а также каталог spec/ . Ваши тесты будут иметь свои собственные зависимости: библиотека утверждений Chai и среда тестирования Mocha .

Разверните этот каталог spec/ и вы увидите файл test.js который выглядит примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
/*global describe, it */
‘use strict’;
 
(function () {
    describe(‘Give it some context’, function () {
        describe(‘maybe a bit more context here’, function () {
            it(‘should run here few assertions’, function () {
 
            });
        });
    });
})();

Хорошо, похоже, мы могли бы использовать запрос на удаление для исправления некоторой грамматики. Кто-нибудь?

Если вы не написали свои собственные тесты до, вы увидите такие термины, как beforeEach , it , before , beforeEach , after и afterEach . ____Each представляет собой обертку для группы связанных тестов, ____Each является дополнительными функциями, которые будут выполняться before или after ваших тестов, и каждая из it является конкретным тестом.

Попробуйте запустить grunt test чтобы увидеть, как разворачивается магия.

ToDo-Грунт-тест

Вам стоит поиграть и посмотреть, сможете ли вы написать несколько тестов для нашего приложения To Do. Вот несколько идей для тестовых случаев:

  • Сохраняется ли создание нового элемента To Do в localStorage?
  • Обрезается ли заголовок нового элемента To Do (удаляя лишние пробелы)?
  • При редактировании элемента «Задачи» удаляет ли заголовок, а затем сохраняет элемент «Задачи» из localStorage?

Есть только одна вещь, которую нужно сделать.

1
$ grunt

Вы должны увидеть наши любимые слова: Done, without errors.


Йомен еще совсем молод; он только что повернулся один! Сейчас все довольно здорово, и они будут только лучше. Однако, как и все однолетние дети, Йоман все еще учится ходить без падений и разговаривать без слюни. Вы можете столкнуться с ошибкой или двумя. В такие времена думайте о нем, как о своем милом маленьком племяннике. Ему нужны положительные образцы для подражания в его жизни, поэтому помогите ему учиться!

Это стало настоящей детской книгой, очень быстро. Я вырасту немного: есть ошибки, и нам нужна ваша помощь, чтобы раздавить дуди из них (я сказал «немного»). Даже если это не ошибка, но вы говорите: «Я знаю НАМНОГО более быстрый плагин Grunt, который может использовать этот генератор», сообщите об этом соответствующему трекеру генератора.

Если вы хотите узнать больше о Yeoman или просто познакомиться с командой, вы найдете нас на всех следующих сайтах.

Если вы просто застряли, попробуйте один из следующих ресурсов для помощи.

Yeoman — это всего лишь одна часть всего стека — NPM , Node , Grunt и Bower . Это может быть пугающим, если вы не знакомы с ними, но важно не бояться кривой! Обучение должно произойти, и, как и всегда, оно, вероятно, должно пройти трудный путь, прежде чем оно действительно слипнется.

Psst, если вы используете sudo перед каждой командой, бегите, не ходите, к Node и NPM за 30 секунд . Там вы найдете несколько сценариев, которые вы можете запустить, чтобы вернуть управление своей учетной записи. Это также поможет вам установить Node и NPM, если вы начинаете с нуля.


Как и все инструменты, я считаю, что Yeoman — это то, что должен попробовать каждый разработчик. Если вы попробуете и обнаружите, что это не подходит для вашей задачи, я и остальная команда хотели бы услышать почему. Если тебе нужен приятель, который поможет тебе с твоим проектом, найди меня. Я всегда доступен по ссылкам выше или просто пингую меня в твиттере. Я @stephenplusplus или Стивен Соучук.

мне

Приятно встретить тебя.