Содержание

(снова) время попробовать / Хабр

Я написал эту статью по мотивам выступления, которое я делал на встрече Berlin.js. В последнее время выходит мало русскоязычных материалов об этом довольно популярном и стабильном фреймворке и я решил немного исправить эту ситуацию.

Вы учите Ember.js один раз, а потом применяете эти знания на всех Ember.js проектах. Этот тезис я попытаюсь раскрыть под катом.


Коротко о моем опыте. Впервые я попробовал Ember.js в 2014 году на своей первой работе в качестве фронт-энд разработчика. Фреймворк тогда еще был построен в парадигме MVC и не использовал CLI. В силу отсутствия большого опыта судить о сильных и слабых сторонах было сложно. В целом, мои впечатления хорошо передаются этим лайв-батлом 2013 года между Ember.js и Angular.js. Да, в гугловском фреймворке было много из коробки, но в Ember легко интегрировать сторонние библиотеки, вроде moment.js или jQuery-плагины, вроде datatables.net, что сделало его намного более гибким.

Потом я перешел в другую компанию и год работал с Can. js и React.js, но в 2016 году у меня появилась возможность выбирать, и я дал шанс старому товарищу. К тому моменту парадигма сменилась на Data Down Actions Up, появились сервисы и компоненты. Однако в целом все осталось знакомо и понятно, поэтому особых проблем с адаптацией не было.

С тех пор Ember.js мой основной инструмент. И на мой взгляд, этот фреймворк стоит того, чтобы рассматривать его как основной выбор, если вы разрабатываете SPA.


Опрос Npm 2018 зафиксировал некоторую усталость js-сообщества от многочисленных инструментов, необходимых в разработке:


all of our survey respondents would like to see less tooling, less configuration required to get started, and better documentation of the tools that do exist

Это понятное явление, учитывая, что React.js — это мейнстрим. Когда дело доходит до маркетинга, библиотека позиционируется как очень «легкий» инструмент, а значит, простой в освоении и очень гибкий. Но это обманчивая гибкость тривиальности. Представьте, что вы приходите покупать машину, а вместо этого вам предлагают купить только двигатель со словами: «Вы можете сделать с этим двигателем отличную машину. Большую, маленькую, зеленую, синюю, хэтчбэк или универсал. Для такси, для езды по городу или по сельской местности. Подойдет для любой машины!». Это прекрасно, что подойдет. Но хотелось бы сесть и поехать. Только для этого понадобится еще подобрать коробку передач, найти кузов и к тому же(!) выбрать цвет. И маркетинг об этом умалчивает.

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

Так вот, дорогие читатели, у меня для вас хорошие новости. Ember-сообщество намного меньше страдает от мук выбора в силу «конструктивных особенностей» фреймворка. Как написал один из респондентов последнего опроса Ember-сообщества :


You can learn Ember once and apply your knowledge in any other Ember project… Ember is always a coherent experience as all addons can be authored and consumed via the same tools. Spending less brainpower on tooling, setting up a testing environment, or writing testable code is a very good thing.

что переводится как


Вы учите Ember.js один раз, а потом применяете эти знания на всех Ember.js проектах.… С Ember вы получаете цельный опыт, так как все эддоны могут быть созданы и интегрированы одним и тем же набором инструментов. Экономия ментальной энергии на освоение инструментов, развертывания тестового окружения или написание поверяемого кода — это хорошая вещь.

Далее я объясню, почему с Ember вы получаете этот цельный опыт, но сначала ответим на один нужный вопрос.


В наше время редко встретишь живой js-фреймворк, разработка которого не прекращалась на протяжении последних 5 лет. Но Ember один из них.

Активная разработка не прекращалась никогда, а вот адаптация стагнировала в 2016 году. Если мы обратимся к тому же опросу Npm 2018, то там упоминается следующий график:

Как мы видим, в 2017 году произошел разворот, и Ember снова начал расти, опережая средние темпы. Этому феномену есть простое объяснение. В 2017 году компания LinkedIn решила провести редизайн и выбрала Ember.js для реализации обеих (desktop и mobile) версий своего основного сайта. Это событие дало энергию для развития и создало текущий тренд.

Надо отметить, что помимо LinkedIn, фреймворк используют таких известных компаниях, как Microsoft, Netflix, Travis CI (весь их фронт выложен в open-source ), Intercom, Heroku и другие.

В общем, фреймворк жив и здоров).


Ниже вы можете увидеть ни на что не претендующий, неполный и субъективный список разных аспектов фронтенд разработки, цель которого просто показать примерное положение Ember.js среди других библиотек. Синяя и зеленые линии относятся к React.js и Vue.js, серая и оранжевая к Angular и Ember.js:

Ember.js по «коробочному» функционалу ближе к Angular, стараясь предоставить дефолтную реализацию и инструменты для всех задач, которые встают, когда мы хотим создать новое SPA. Если что-то не устраивает или чего-то не хватает, вы ищите для этого соответствующий эддон (ну или пишите его сами). Об эддонах чуть ниже.



React.js

Если вы приходите из мира React.js, то для вас будет знакомо разбиение страницы на иерархию компонентов. В Ember вы также будете думать, как лучше разбить вашу страницу на компоненты и инкапсулировать в них локальные состояния.
Если вы знакомы с React-router, то роутер в Ember вам также покажется знакомым. Изначально роутер в React был скопирован с эмберовского, хотя сейчас проект уже давно живет своей жизнью.
Наконец, если вы комфортно чувствуете себя в работе с Redux и/или GraphQL, вы также можете использовать их с Ember.js (см тут и тут)

Также на последнем EmberConf было выступление, посвященное сравнению паттернов для React и Ember.


Vue.js

Естественно, вам так же как и людям из React, будет знакома парадигма разбиения интерфейса на компоненты. Помимо этого, вам будут знакомы концепции шаблонов и computed properties.


Angular.js

Тем, кто хорошо знает этот фреймворк, знакомым покажутся сервисы и механизм Dependency Injection. Также вам наверняка понравятся декораторы, которые будут официально выпущены в релизе 3.10, и использование которых сейчас возможно с помощью полифила. Также вам наверняка захочется использоваться Typescript (см тут), который становится все более популярным в Ember-сообществе.


Теперь давайте перейдем к частям, которые наверняка покажутся незнакомыми и которые скорее всего возникнут вопросы.


Ember-cli, а не Webpack

Стандартным инструментом для генерации приложения является Ember-cli. Практически все и всегда используют именно его. С помощью Ember-cli вы будете генерировать новые приложения и файлы в существующем приложении. Инструмент отвечает за компиляцию ресурсов и развертывание среды разработки с live-reload и тестами. Для этого создано много расширений, покрывающих все основные жизненные ситуации (вплоть до fingerprinting, CSP или SRI). Также его можно использовать для выкладки на боевые среды.

Для многих может показаться необычным, что инструмент не использует webpack. Вместо этого применяется broccoli.js. В целом от этого, во время разработки приложения вам не будет ни жарко, ни холодно.

Ember-cli — это стабильный и удобный инструмент. И во многом из-за этого сообщество не страдает от мук с выбором.


Жесткая структура файлов

Этот момент часто повергает незнакомых с фреймворком людей в шок. Посмотрите на структуру файлов стандартного Ember-приложения:

Что вы скажете, узнав, что ее нельзя поменять? Нельзя переложить файлы в другие папки и назвать их по-своему. Однажды из-за этого я даже услышал эпитет «фашистский» по отношению к фреймворку).

Однако такое ограничение было введено специально. Вот пруф:

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

На мой взгляд, это элегантное и эффективное архитектурное решение, имеющее огромное влияние. И каждый раз, когда я открываю любое Ember-приложение любого уровня сложности, я не смотрю на него, как баран на новые ворота, а знаю, где лежат компоненты, где лежат шаблоны, сервисы, тесты и прочее, прочее. Это экономит много времени и душевных сил.


Эддоны (Addons)

Время показало, что у решения иметь жесткую структуру папок есть и еще одно преимущество. Попробую раскрыть его на упрощенном примере.

Допустим, вам нужно использовать один и тот же компонент в нескольких приложениях (ну вдруг). Тогда, если вы знаете, что компоненты всегда лежат в папке app/components/, вы можете выделить этот компонент в отдельный npm-пакет, добавить его в зависимости, и умный Ember-cli подтянет этот компонент в приложение на стадии компиляции. И вы сможете переиспользовать его в ваших приложениях.

Но это не самое удивительное. Удивительное здесь то, что ВСЕ остальные Ember-приложения также смогут использовать его, если вы опубликуете этот пакет в open-source. И все такие npm-пакеты, выложенные другими разработчиками, вы можете использовать во всех своих приложениях, не прикладывая дополнительных усилий на интеграцию.

Сообщество уже давно поняло эту идею, поэтому вы можете найти такие пакеты на все, что угодно. UI-библиотеки (куда без них), инструменты компиляции, расширения для релиза, библиотеки для аутентификации, адаптеры для работы с бэк-эндом и прочее. Для таких пакетов создан сайт EmberObserver, где вы можете найти тот пакет, что нужен вам.

Эддоны — это то, как Ember-разработчики делятся функциональностью с другими. И из-за того, что эддоны работают во всех приложениях, все используют более менее один и тот же набор. Поэтому, когда вы приходите в уже устоявшийся проект, вы, скорее всего, знаете 90% эддонов, которые он использует. Приложение вам знакомо, даже если вы видите его код первый раз в жизни.


Коммуникация с BE

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

Обычно, если вы работаете в парадигме ресурсов, в Ember для работы с данными вы будете использовать библиотеку Ember-data. Она опциональна, но по умолчанию добавляется во все новые приложения. В ней описан DSL для работы с моделями, который выглядит примерно так:

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

Если же вам не повезет, то Ember-data предоставляет вам необходимые абстракции, например, Adapter и Serializer. Эти абстракции помогут писать чистый код, чтобы не вышло как на картинке:

По умолчанию, Ember-data придерживается спецификации JSON:API (здесь о сравнении с GraphQL и REST). По своему опыту могу сказать, что использование JSON:API экономит уйму времени и моральных сил для вас и ваших бэкэнд-разработчиков. Вы НЕ обсуждаете, какие должны быть URL, в кэмелКейсе или в кебаб-кейсе должны быть атрибуты и параметры, PATCH или PUT использовать для изменения, какой должна быть структура JSON в запросе и ответе для вложенных ресурсов. Вы обсуждаете только модели, их отношения и бизнес-правила у атрибутов. Это еще один случай, когда ограничение выбора позитивно сказывается на продуктивности.


Независимо от того, опытный вы разработчик или нет, я советую начать знакомство с Ember открыв официальный туториал.

Он поэтапно познакомит вас со всеми основными моментами:


  • Как создавать приложение используя ember-cli
  • Как создавать компоненты, пути, модели и тд
  • Как использовать Ember-data
  • Как написать сложный компонент
  • Как встроить стороннюю библиотеку
  • Как задеплоить

Основным каналом общения Ember-разработчиков является twitter Discord сервер. Там всегда тусуются опытные программисты, которые помогут вам с непонятными моментами. Есть и русскоязычный канал. И не забывайте, что архитектура всех Ember-приложений одинакова и все используют одни и те же инструменты. Это сильно повышает вероятность быстрого ответа на ваш вопрос.

Другие каналы общения можно найти на оф сайте.

UPDATE: На русском про Ember можно спрашивать в телеграмм канале ember_js


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

Спасибо за внимание!

Ember.js — идеальный фреймворк для веб приложений | by Dan Steshenko | devSchacht

Перевод статьи Graham Cox:Ember.js: The Perfect Framework for Web Applications.

Ember.js — зрелый фронтенд фреймворк, получивший много внимания в последнее время. Это статья познакомит вас с основными концепциями фреймворка на примере создания простого приложения и покажет, что с его помощью можно сделать.

Мы собираемся написать приложение Dice Roller, позволяющее кинуть кости и посмотреть историю всех совершенных бросков. Полностью работающие приложение можно увидеть на GitHub.

Ember.js вобрал в себя множество современных JavaScript концепций и технологий. Вот их неполный список:

  • Транспайлер Babel для полноценной поддержки ES2015 синтаксиса.
  • Поддержка юнит, интеграционного и приемочного тестирований с помощью Testem и QUnit.
  • Brocolli.js для сборки ассетов.
  • Поддержка live-reload для сокращения отклика во время разработки.
  • Шаблонизация с использованием Handlebars.
  • Навигация в любую часть приложения благодаря системе роутинга.
  • Полная поддержка JSON API, но при этом присутствует возможность использовать любой API, который вам необходим.

Для работы с Ember.js предполагается, что у вас установлены свежие версии Node.js и npm. Если нет, то их можно скачать и установить с сайта Node.js.

Также стоит упомянуть, что Ember — исключительно фронтенд фреймворк. Есть множество способов взаимодействия с бэкендом на ваш выбор, но сам бэкенд никак не управляется Ember.

Немало возможностей Ember.js связано с его интерфейсом командной строки или CLI. Этот инструмент, известный как ember-cli, управляет большой частью процесса разработки: от создания приложения и добавления различного функционала и до запуска тестов и деплоя на продакшен.

Практически всё во время разработки Ember.js приложения будет в какой-то степени связано с этим инструментом, поэтому важно понимать как им пользоваться. Мы будем использовать его при создании нашего приложения.

Первым делом нужно убедиться, что ember-cli установлен и актуален. Устанавливаем его c помощью npm:

$ npm install -g ember-cli

и проверяем успешность установки:

$ ember --version
ember-cli: 2.15.0-beta.1
node: 8.2.1
os: darwin x64

С установленным ember-cli мы готовы приступить к созданию нашего приложения. В первый раз мы будем использовать ember-cli для того, чтобы создать всю структуру приложения и сделать первоначальные настройки.

Наше приложение создалось и готово. У нас даже настроился Git, как система контроля версий.

Примечание: Вы можете отключить интеграцию с Git, а также использовать Yarn вместо npm. Используйте команду ember new --help для более подробной информации.

Запуск сервера Ember.js приложения для целей разработки делается также с помощью ember-cli:

Всё готово. Приложение запущено по адресу http://localhost:4200 и выглядит следующим образом:

Также запустился LiveReload сервер, автоматически наблюдающий за изменениями в файловой системе. Это значит, что любое изменение в коде приведёт к автоматической перезагрузке нашего приложения в браузере. А изменения картинок или CSS применяется даже без перезагрузки.

Начальная страница подсказывает нам, что делать. Давайте изменим её и посмотрим, что произойдет. Мы собираемся изменить файл app/templates/application.hbs, чтобы он выглядел так:

Примечание: {{outlet}} — это часть того, как роутинг работает в Ember. Мы еще вернемся к этому позже.

Первое, на что стоит обратить внимание, это результат работы ember-cli:

Это говорит нам о том, что сервер заметил наши изменения в шаблоне, перезапустил всё без каких-либо действий с нашей стороны.

Теперь давайте посмотрим в браузер. LiveReload обновил страницу браузера с примененными изменениями и нам также ничего не нужно больше делать.

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

В дополнение, у нас уже все готово для запуска тестов. Для этого мы вновь можем воспользоваться ember-cli таким образом:

Заметьте, что в выводе консоли упоминается PhantomJS. Это потому, что Ember имеет полную поддержку запуска интеграционных тестов в браузере и по умолчанию использует безголовый браузер PhantomJS (прим. пер., с версии 2.15 по умолчанию используется headless chrome). Вы можете настроить запуск тестов в любом браузере по вашему желанию. Например при настройке непрерывной интеграции (CI) будет полезно воспользоваться этим, чтобы удостовериться, что приложение корректно работает во всех поддерживаемых вами браузерах.

Перед тем, как мы приступим к написанию кода, давайте изучим структуру нашего приложения в файловой системе. Команда ember new, используемая нами ранее, создаёт целую директорию с файлами и папками. Понимание структуры этой директории необходимо для эффективной работы с инструментом и создания удивительных проектов.

В корне директории вы можете увидеть следующие файлы и папки:

  • README.md — стандартный файл, описывающий ваше приложение.
  • package.json — стандартный файл пакетного менеджера npm, также описывающий ваше приложение, но с точки зрения зависимостей. В нем описаны зависимости вашего приложения и их версии, чтобы они устанавливались корректно.
  • ember-cli-build.js — конфигурационный файл для ember-cli.
  • testem.js — конфигурационный файл для тестирующего фреймворка Testem. Он позволяет, среди прочего, определить в каких браузерах будут запускаться тесты.
  • app/ — здесь хранится логика приложения. Многое происходит в этой папке и мы рассмотрим это ниже.
  • config/ — конфигурация нашего приложения:
  • config/targets.js — содержит список поддерживаемых браузеров. Это необходимо для Babel, чтобы он транспилировал ваш код в работающий во всех необходимых вам браузерах.
  • config/environment.js — содержит необходимые настройки приложения, отличающиеся в различных окружениях.
  • public/ — любые статические ресурсы, которые необходимы вашему приложению. Например, картинки или шрифты.
  • vendor/ — сюда можно сложить любые зависимости, которые не будут управляться системой сборки.
  • tests/ — это место для тестов:
  • tests/unit — все юнит тесты приложения.
  • tests/integration — все интеграционные тесты.

Пока мы не зашли слишком далеко, давайте добавим на нашу страницу немного разметки. А чтобы она смотрелась хорошо, будем использовать Materialize CSS framework.

Добавление подобного стороннего контента может быть осуществленно несколькими способами:

  • Указанием ссылки на внешний CDN сервис
  • С помощью пакетных менеджеров вроде npm или Bower
  • Подключив напрямую в приложение из папки vendor/
  • Использовать Ember Addon, если такой имеется

К сожалению, аддон для Materialize пока что не совместим с последней версией Ember, поэтому мы просто добавим ссылку на него. Чтобы сделать это, мы обновим app/index.html файл, являющийся корневой страницей, в которую будет отрендерено наше приложение. Мы хотим добавить ссылки на CDN для jQuery, Google Icon Font и Materialize.

Теперь мы можем обновить нашу главную страницу, добавив разметки. Для этого отредактируем файл app/templates/application.hbs:

Мы добавили шапку, а также контейнер с тэгом {{outlet}} упомянутым ранее.

В браузере это должно выглядеть так:

Так, что же такое outlet тэг? Ember работает на основе роутов, где каждый роут является ребенком другого роута. Самый верхний роут в этой иерархии обрабатывается Ember автоматически и рендерит шаблон app/templates/application.hbs.

Тэг outlet определяет, где Ember отрендерит следующий роут в текущей иерархии. Таким образом роут первого уровня будет отрендерен в добавленный нами тэг в application.hbs, а роут второго уровня будет отрендерен в такой же тэг в темплейте роута первого уровня. И так далее.

В Ember.js приложении каждая посещаемая страница доступна с помощью роута. Существует прямая связь между адресной строкой (URL) в браузере и роутом в приложении.

Проще показать это на примере. Давайте добавим новый роут в наше приложение, позволяющий пользователю бросать кости. И вновь это делается с помощью ember-cli:

Что создалось с помощью этой команды?

  • Обработчик для роута — app/routes/roll.js
  • Шаблон для роута — app/templates/roll.hbs
  • Тест для роута tests/unit/routes/roll-test.js
  • Новый роут добавился в файл конфигурации роутера — app/router.js

Давайте посмотрим на это в действии. Для начала мы хотим создать довольно простую страницу, позволяющую нам получить число после броска костей. Для этого обновим файл app/templates/roll.hbs:

Результат будет доступен в браузере по адресу http://localhost:4200/roll:

Теперь нам нужна возможность попадать на эту страницу с главной страницы. Ember позволяет сделать это очень просто с помощью хелпера link-to, который принимает первым аргументом имя роута и рендерится в разметку, позволяющую нашему пользователю попасть на нужный роут.

В нашем случае нужно обновить файл app/templates/application.hbs, чтобы он содержал следующее:

Это добавит ссылку на роут roll в шапку страницы, как мы и задумывали:

Если на данном этапе вы попробовали протестировать наше приложение, то могли заметить одну проблему. Переход по ссылке в роут roll работает корректно, но метки элементов форм не выстраиваются правильно. Это происходит потому что Materialize нужно использовать JavaScript, чтобы поставить метки на свои места, после того как они будут отрендерены. Но динамический роутинг предполагает, что страница не будет перезагружена. Таким образом, у нас пока что нет места, где можно инициализировать этот JavaScript код.

На помощь приходят компоненты. Компоненты — это частички интерфейса пользователя, имеющие свой жизненный цикл, с которым мы можем взаимодействовать и в который мы можем встроить необходимый нам JavaScript код. Также они используются для создания переиспользуемых элементов интерфейса, но к этому мы ещё вернёмся.

Пока что мы собираемся создать компонент, представляющий собой форму для броска костей. Как обычно, создание компонента тоже можно осуществить с помощью ember-cli:

$ ember generate component roll-dice
installing component
create app/components/roll-dice.js
create app/templates/components/roll-dice.hbs
installing component-test
create tests/integration/components/roll-dice-test.js

Мы получили:

  • app/components/roll-dice.js — код, управляющий компонентом
  • app/templates/components/roll-dice.hbs — шаблон компонента, где мы определим, как он выглядит
  • tests/integration/components/roll-dice-test.js — тест, чтобы удостовериться, что компонент работает правильно

Мы перенесём всю разметку из роута roll в компонент, что не повлияет на работу приложения в целом, но позволит нам использовать всю силу компонент.

Обновим шаблон компонента app/templates/components/roll-dice.hbs:

А также шаблон роута app/templates/roll.hbs:

Тэг roll-dice в шаблоне говорит Ember, где отрендерить наш компонент.

Компоненты в Ember имеют заданный жизненный цикл, которому они следуют, с множеством хуков, вызываемых на различных стадиях. Мы используем хук didRender, который будет вызван после того, как компонент будет отрендерен (в первый раз или в любые последующие), чтобы попросить Materialize обновить метки элементов форм.

Сделать это можно, обновив код компонента app/components/roll-dice.js таким образом:

Теперь при любом заходе в роут roll нужный нам код отработает и Materialize исправит отображение меток.

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

Каждая частичка данных, с которой мы хотим взаимодействовать, имеет свое собственное поле в классе компонента. Когда мы хотим показать поля ввода, мы используем специальные хелперы в шаблоне компонента, связывающие поля ввода с переменными/полями в классе компонента. Таким образом, мы взаимодействует с полями ввода напрямую, не беспокоясь о работе с DOM.

В нашем случае у нас есть три поля ввода, поэтому нам нужно добавить три строчки внутри класса компонента в файле app/components/roll-dice.js:

Затем мы обновим наш шаблон, заменив HTML разметку полей ввода на специальные хелперы.

Обратите внимание, что атрибут value имеет слегка странный синтаксис. Подобный синтаксис может быть использован с любым атрибутом хелпера, не только с value. Вообще существует три способа передачи значения в атрибут:

  • Как строку в кавычках (значением будет эта строка
  • Как строку без кавычек (в этом случае значение будет взято из одноименного поля в классе компоненты, но компонента никогда не обновится)
  • С использованием (mut <name>) (значение также возьмется из одноименного поля в классе компонента, но компонент будет изменяться, когда значение изменится в браузере)

Всё вышеизложенное означает, что теперь мы можем обращаться к добавленным в компонент полям как к значениям полей ввода, а всё остальное сделает Ember.

Следующим шагом мы хотим добавить компоненту интерактивность. Например, хорошо бы обрабатывать нажатие кнопки «Бросить кость». Для этого в Ember есть экшены. Это методы, описанные в классе компонента, которые могут быть подключены в шаблон компонента. Обычно методы описывают в специальном объекте компонента actions.

Добавим экшен в наш компонент app/components/roll-dice.js:

Мы возвращаем false, чтобы предотвратить всплытие события. Это довольно стандартная процедура в веб-приложениях и в данном случае предотвращает отправку формы и перезагрузку страницы.

Вы можете заметить, что мы ссылаемся на поля, которые мы ранее объявили в классе, чтобы иметь доступ к значениям полей ввода. Здесь нет никакого взаимодействия с DOM: мы оперируем только JavaScript переменными.

Осталось подключить наш экшен. В шаблоне нам нужно сказать тэгу формы, что ему нужно вызвать triggerRoll экшен, когда случится событие onsubmit. Это делается добавлением всего одного атрибута с использованием action хелпера. В шаблоне app/templates/components/roll-dice.hbs это выглядит так:

Заполнив поля формы и нажав на кнопку, мы увидим диалоговое окно с результатом нашего ввода.

Следующим шагом будет написание логики настоящего броска кости. Это требует взаимодействия с сервером, так как сервер ответственен за запоминание результата броска кости.

Мы хотим достичь следующего:

  • Пользователь определяет параметры для броска кости
  • Пользователь нажимает на кнопку «Бросить кость»
  • Приложение выполняет логику броска кости и отправляет результат и параметры совершенного броска на сервер
  • Сервер запоминает результат и сообщает клиенту об удачном сохранении
  • Браузер отображает результат броска

Звучит довольно просто. И конечно, с Ember, это действительно так.

Ember управляет этим, используя встроенную концепцию хранилища — Store, наполненного моделями — Models. Хранилище — единственный источник знаний о данных во всем приложении, а модель представляет часть этих данных в хранилище. Модели сами знают как сохранить себя на сервер, а хранилище знает как создавать и управлять моделями.

Очень важно сохранять инкапсуляцию во всем нашем приложении. Роуты (и контроллеры, о которых мы не будем говорить здесь) имеют доступ к хранилищу. Компоненты — нет.

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

Для начала переместим логику показа диалогового окна из компонента в роут. Для этого нам нужно изменить некоторые части нашего кода.

В классе, ответственном за управление роутом app/routes/roll.js зарегистрируем экшен saveRoll, которым мы собираемся выполнить:

И перепишем логику экшена компонента. Теперь мы хотим вызвать другой экшен в нашем компоненте, передав параметры броска в его аргументы. Это делается с помощью метода sendAction, доступного в классе компонента.

Осталось связать экшен из роута и экшен компонента. Для этого изменим внешний вид вызова компонента в шаблоне роута app/templates/roll.hbs:

Это даст знать компоненту, что свойство roll теперь связано с экшеном saveRoll внутри роута. Теперь при вызове roll внутри компонента, управление передастся в экшен saveRoll. Имя roll весьма подходящее в рамках компонента, потому что компонент знает только то, что ему нужно запросить бросок костей, но для него не имеет значения как остальной код будет обрабатывать этот запрос и переданную информацию.

И вновь, всё сделанное нами никак не повлияло на работу приложения, но теперь все части в правильных местах.

Прежде чем мы сохраним данные в хранилище, нам необходимо определить модель, представляющую эти данные. Используя наш надежный инструмент ember-cli, создадим структуру модели и затем заполним её.

Чтобы создать модель, выполним команду:

Теперь мы можем заполнить модель app/models/roll.js атрибутами, необходимыми для представления наших данных:

DS.attr вызывается чтобы определить атрибут модели заданного типа. Эти типы в Ember называются преобразователями (transform). Варианты преобразователей по умолчанию: "string", "number", "data"или "boolean". Но при необходимости вы всегда можете добавить свой.

Используем эту модель для создания броска кости в хранилище и сохранения на бэкенд. Для этого нам нужно получить доступ к хранилищу в классе роута app/routes/roll.js:

Если мы сейчас попробуем выполнить этот код, нажав на кнопку «Бросить кость», это приведёт к сетевому вызову на наш сервер. И это не сработает, потому что у нас нет сервера.

Не будем беспокоиться об этом, потому что мы не затрагиваем здесь тему реализации бэкенда. Но если вам нужно разрабатывать Ember приложение совсем без бэкенда, есть различные варианты, например, использование аддона ember-localstorage-adapter, чтобы сохранять данные в local-storage браузера. Также можно использовать аддоны ember-cli-mirage или emberfire.

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

Ember неявно использует роут под названием index для отображения первоначальной страницы приложения. Если для этого роута нет никаких файлов, то никакой ошибки не произойдет: просто на главной страницы ничего не будет отрендерено. Мы будем использовать этот роут для отображения всех совершенных бросков из хранилища.

Так как index роут уже существует, то нам не нужно вызывать никаких команд с помощью ember-cli, мы просто создадим файл app/routes/index.js, в который добавим:

Наш роут напрямую обращается в хранилище и, используя метод findAll, загружает все сохраненные в нем броски кости. Затем мы предоставляем эти данные в шаблон с помощью хука роута model.

Создадим файл app/templates/index.hbs и добавим в него разметку:

В шаблоне мы имеем доступ к модели, возвращённой роутом, и, итерируясь по ней, создаём таблицу, которая выглядит так:

На данный момент, благодаря относительно небольшим усилиям, мы создали приложение, позволяющее нам бросать кости и просматривать историю бросков. Это включает в себя связывание данных из нашей формы, сохранение данных в хранилище и чтение их из него, шаблоны для показа всех страниц и навигацию с помощью URL роутинга. Такое приложение может быть создано с нуля за час.

Использование Ember может очень сильно повысить эффективность разработки фронтенда. В противоположность библиотекам, вроде React, Ember даёт вам весь необходимый функционал без дополнительных усилий. Использование ember-cli и настроенных процессов сборки приложения выводит его на следующий уровень, делая процесс невероятно простым и безболезненным от начала и до конца. Добавив сюда поддержку сообщества практически не остается задач, которые не могли бы быть решены.

К сожалению, может быть сложно использовать Ember вместе с уже существующим проектом. Это работает прекрасно для старта нового проекта. Также Ember работает из коробки только с несколькими вариантами API бэкенда и если ваш бэкенд не соответствует им, то вы можете потратить много времени либо переписывая бекенд, либо настраивая Ember на работу с вашим API.

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

Ember.js или Vue.js: какой фреймворк выбрать?

Изначально JavaScript создавался для работы с веб-приложениями, однако теперь он используется для создания мобильных приложений. Фреймворки на основе JavaScript популярны среди разработчиков, поскольку они упрощают процесс разработки.

Использование определенного фреймворка определяет скорость и уровень сложности создания приложения. Таким образом, для достижения успешного результата необходимо выбрать лучший вариант для приложения. Приведем сравнение Ember.js и Vue.js — двух фреймворков, которые выделяются среди других.

Зачем выбирать определенный фреймворк?

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

● Код должен быть прост для понимания.

● Фреймворк должен обеспечивать максимальную мощность при наименьшем объеме кода.

● Фреймворк должен предоставлять хорошо изложенную структуру для работы.

● Поддерживает ли фреймворк встроенный или внешний маршрутизатор?

● Фреймворк должен предоставлять возможность передачи большего количества данных при полной загрузке страницы для создания одностраничного приложения.

● Фреймворк должен обладать возможностью маршрутизации на основе URL-адреса в случае, если пользователям необходимо обмениваться ссылками на подэкраны в интерфейсе в одностраничных архитектурах.

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

● Фреймворк должен работать исправно со сторонними библиотеками.

● Тестирование кода внутри фреймворка не должно вызывать затруднений.

● Фреймворк должен предоставлять клиентский сервис HTTP для вызовов AJAX.

● Документация должна быть полной и актуальной.

● Фреймворк должен быть совместим с последней версией браузера.

● Фреймворк должен удовлетворять вышеуказанным условиям для упрощения создания приложения.

Особенности Vue.js

● Чистая архитектура Vue.js упрощает интеграцию с другими приложениями.

● Vue.js легкий и быстрый. Уменьшить его размер можно, выполнив развертывание только интерпретатора.

● Предоставляет возможность разделения компилятора и виртуального шаблона DOM.

● Благодаря легкости интеграции его можно использовать для внесения изменений в существующие приложения.

● Для восполнения недостатков можно подключить любую библиотеку.

● Поскольку Vue.js использует потоковую визуализацию на стороне сервера, пользователи могут быстро получать ответы.

● Рендеринг на стороне сервера также помогает повысить рейтинг в поисковых системах.

● Благодаря простой структуре его может использовать даже начинающий разработчик.

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

● Предоставляет возможность проверки всех существующих состояний.

● Подробная документация также ускоряет создание веб-страницы или приложения.

Особенности Ember.js

● Ember.js — это open-source MVVM фреймворк для разработки сложных многостраничных приложений на основе модели.

● Он предлагает как новейшие, так и старые функции.

● Это плотно структурированный, негибкий фреймворк.

● Благодаря усовершенствованной системе управления можно с легкостью интегрироваться с новыми версиями.

● Есть строгое руководство по избежанию устаревших версий API.

● API Ember упрощает использование сложных функций.

● Поскольку фреймворк позволяет браузеру выполнять аналогичные функции вместе, для каждой задачи пересчет не выполняется.

● С помощью промисов можно писать модульный и простой код, используя любой API Ember.js.

● Ember.js — это полностью загруженный фронтэнд-фреймворк.

● Это стабильный фреймворк, поскольку все компоненты обладают одинаковыми функциями и свойствами.

● Четко определенные ограничения предотвращают усложнение приложения.

● Язык Handlebars, используемый Ember.js, упрощает чтение и понимание шаблонов, а также ускоряет их загрузку.

● Handlebars обновляет шаблон при каждом добавлении и удалении данных.

● Активное сообщество Ember.js регулярно обновляет фреймворк и упрощает обратную совместимость.

Сравнение Ember.js и Vue.js

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

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

Vue.js позволяет использовать синтаксис разных видов и упрощает написание кода. Он также оптимизирован для SEO. Ember — это полностью загруженный фронтэнд-фреймворк для быстрого создания приложений. Однако он не подходит для разработки небольших проектов.

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

Читайте также:


Перевод статьи eSparkBiz: Which Framework Works Better For You — Ember.js or Vue.js?

Ember.js: идеальная платформа для веб-приложений

Ember.js — это продуманный внешний интерфейс JavaScript, который в последнее время вызывает большой интерес. Эта статья познакомит вас с некоторыми ключевыми понятиями фреймворка при создании простого приложения, чтобы показать базовый пример того, что он способен производить.

В качестве примера приложения мы будем использовать Dice Roller, включая возможность бросать некоторые кости и просматривать историю всех бросков костей, которые были выполнены до настоящего времени. Полностью рабочая версия этого приложения доступна от Github

Среда Ember.js объединяет множество современных концепций и технологий JavaScript в один пакет, включая, но не ограничиваясь:

  • Использование транспортера инструмента Babel , для поддержки ES2016 во всем.
  • Поддержка тестирования на уровне Unit, Integration и Acceptance в стандартной комплектации на базе Testem и QTest .
  • Создание активов с использованием Broccoli.js .
  • Поддержка перезагрузки в реальном времени, для сокращения времени цикла разработки.
  • Создание шаблонов с использованием синтаксиса разметки Handlebars .
  • URL Routing — первая разработка, обеспечивающая полную поддержку глубоких ссылок.
  • Полный слой данных, построенный на основе JSON API , но подключаемый для любого доступа к API, который вам необходим.

Понять Ember за 30 минут

Приложения с Ember JavaScript Framework

Для работы с Ember.js предполагается, что у вас установлена ​​последняя версия Node.js и npm. Если нет, то их можно загрузить и установить с веб-сайта Node.js.

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

Представляем ember-cli

Большая часть возможностей Ember.js заключается в его интерфейсе командной строки (CLI). Этот инструмент, известный как ember-cli, поддерживает большую часть жизненного цикла разработки приложения Ember.js, начиная с создания приложения, добавляя в него функциональность вплоть до запуска тестовых наборов и запуска реального проекта в режиме разработки.

Практически все, что вы делаете во время разработки приложения Ember.js, будет включать этот инструмент на каком-то уровне, поэтому важно понять, как его лучше всего использовать. Мы будем использовать это всюду по этой статье.

Первое, что нам нужно сделать, это убедиться, что Ember.js CLI правильно установлен и обновлен. Это делается путем установки из npm следующим образом:

$ npm install -g ember-cli 

и мы можем проверить, что он был успешно установлен, выполнив следующую команду:

 $ ember --version ember-cli: 2.15.0-beta.1 node: 8.2.1 os: darwin x64 

Создание вашего первого приложения Ember.js

После установки ember-cli вы готовы приступить к созданию приложения. Это первое место, где мы будем использовать инструмент CLI Ember.js — он создает всю структуру приложения, настраивая все готово к работе.

 $ ember new dice-roller installing app create .editorconfig create .ember-cli create .eslintrc.js create .travis.yml create .watchmanconfig create README.md create app/app.js create app/components/.gitkeep create app/controllers/.gitkeep create app/helpers/.gitkeep create app/index.html create app/models/.gitkeep create app/resolver.js create app/router.js create app/routes/.gitkeep create app/styles/app.css create app/templates/application.hbs create app/templates/components/.gitkeep create config/environment.js create config/targets.js create ember-cli-build.js create .gitignore create package.json create public/crossdomain.xml create public/robots.txt create testem.js create tests/.eslintrc.js create tests/helpers/destroy-app.js create tests/helpers/module-for-acceptance.js create tests/helpers/resolver.js create tests/helpers/start-app.js create tests/index.html create tests/integration/.gitkeep create tests/test-helper.js create tests/unit/.gitkeep create vendor/.gitkeep NPM: Installed dependencies Successfully initialized git. $ 

Это привело к созданию целого приложения, которое готово к запуску. Он даже настроил Git в качестве источника контроля для отслеживания вашей работы.

Примечание: если вы хотите, вы можете отключить интеграцию с Git, и вы можете предпочесть пряжу над npm. Помощь для инструмента описывает это и многое другое.

Теперь посмотрим, как это выглядит. Запуск приложения Ember для целей разработки — еще раз — также выполняется с помощью ember-cli:

 $ cd dice-roller $ ember serve Livereload server on http://localhost:49153 'instrument' is imported from external module 'ember-data/-debug' but never used Warning: ignoring input sourcemap for vendor/ember/ember.debug.js because ENOENT: no such file or directory, open '/Users/coxg/source/me/writing/repos/dice-roller/tmp/source_map_concat-input_base_path-2fXNPqjl.tmp/vendor/ember/ember.debug.map' Warning: ignoring input sourcemap for vendor/ember/ember-testing.js because ENOENT: no such file or directory, open '/Users/coxg/source/me/writing/repos/dice-roller/tmp/source_map_concat-input_base_path-Xwpjztar.tmp/vendor/ember/ember-testing.map' Build successful (5835ms) – Serving on http://localhost:4200/ Slowest Nodes (totalTime => 5% ) | Total (avg) ----------------------------------------------+--------------------- Babel (16) | 4625ms (289 ms) Rollup (1) | 445ms 

Теперь мы готовы к работе. Приложение работает на http: // localhost: 4200 и выглядит так:

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

Давай попробуем?

Начальная страница уже говорит нам, что делать, так что давайте пойдем и изменим главную страницу и посмотрим, что произойдет. Мы собираемся изменить файл app/templates/application.hbs чтобы он выглядел следующим образом.

 This is my new application. {{outlet}} 

Примечание. Тег {{outlet}} является частью работы Routing в Ember. Мы рассмотрим это позже.

Первое, на что нужно обратить внимание, это вывод ember-cli, который должен выглядеть следующим образом:

 file changed templates/application.hbs Build successful (67ms) – Serving on http://localhost:4200/ Slowest Nodes (totalTime => 5% ) | Total (avg) ----------------------------------------------+--------------------- SourceMapConcat: Concat: App (1) | 9ms SourceMapConcat: Concat: Vendor /asset... (1) | 8ms SimpleConcatConcat: Concat: Vendor Sty... (1) | 4ms Funnel (7) | 4ms (0 ms) 

Это говорит нам о том, что мы заметили, что мы изменили шаблон, перестроили и перезапустили все. У нас было нулевое участие в этой части.

Теперь давайте посмотрим на браузер. Если у вас установлен и запущен LiveReload, вам даже не понадобится обновлять браузер, чтобы его можно было поднять, в противном случае вам потребуется перезагрузить текущую страницу.

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

Кроме того, мы получаем полностью настроенный набор тестов, готовый к запуску. Неудивительно, что это также выполняется с помощью инструмента Ember:

 $ ember test ⠸ Building'instrument' is imported from external module 'ember-data/-debug' but never used ⠴ BuildingWarning: ignoring input sourcemap for vendor/ember/ember.debug.js because ENOENT: no such file or directory, open '/Users/coxg/source/me/writing/repos/dice-roller/tmp/source_map_concat-input_base_path-S8aQFGaz.tmp/vendor/ember/ember.debug.map' ⠇ BuildingWarning: ignoring input sourcemap for vendor/ember/ember-testing.js because ENOENT: no such file or directory, open '/Users/coxg/source/me/writing/repos/dice-roller/tmp/source_map_concat-input_base_path-wO8OLEE2.tmp/vendor/ember/ember-testing.map' cleaning up... Built project successfully. Stored in "/Users/coxg/source/me/writing/repos/dice-roller/tmp/class-tests_dist-PUnMT5zL.tmp". ok 1 PhantomJS 2.1 - ESLint | app: app.js ok 2 PhantomJS 2.1 - ESLint | app: resolver.js ok 3 PhantomJS 2.1 - ESLint | app: router.js ok 4 PhantomJS 2.1 - ESLint | tests: helpers/destroy-app.js ok 5 PhantomJS 2.1 - ESLint | tests: helpers/module-for-acceptance.js ok 6 PhantomJS 2.1 - ESLint | tests: helpers/resolver.js ok 7 PhantomJS 2.1 - ESLint | tests: helpers/start-app.js ok 8 PhantomJS 2.1 - ESLint | tests: test-helper.js 1..8  

Обратите внимание, что вывод говорит о PhantomJS . Это связано с тем, что имеется полная поддержка интеграционных тестов, которые выполняются в браузере, и по умолчанию они выполняются без использования браузера PhantomJS. При желании имеется полная поддержка их запуска в других браузерах, и при настройке непрерывной интеграции (CI) стоит сделать это, чтобы убедиться, что ваше приложение работает корректно во всех поддерживаемых браузерах.

Как структурировано приложение Ember.js

Прежде чем мы приступим к написанию нашего приложения, давайте рассмотрим, как оно структурировано в файловой системе. Приведенная выше команда ember new создаст целую структуру каталогов на вашем компьютере, с множеством различных частей. Понимание всего этого важно для эффективной работы с инструментом и создания удивительных проектов.

На самом верхнем уровне вы заметите следующие файлы и каталоги:

  • README.md — это стандартный файл readme, описывающий приложение
  • package.json — это стандартный файл конфигурации npm, описывающий ваше приложение. Это используется в первую очередь для правильной установки зависимостей.
  • ember-cli-build.js — это конфигурация инструмента Ember CLI для поддержки нашей сборки.
  • testem.js — это конфигурация для тестовой среды. Это позволяет вам, помимо прочего, определить браузеры, которые следует использовать для запуска тестов в различных средах.
  • приложение / — это фактическая логика приложения. Здесь много чего будет описано ниже.
  • config / — это конфигурация для приложения
    • config / target.js — это список поддерживаемых браузеров. Это используется Бабелем для обеспечения того, чтобы Javascript передавался таким образом, чтобы все они работали.
    • config / environment.js — это основная конфигурация для вашего приложения. Все, что необходимо для приложения, но может варьироваться в зависимости от среды, должно быть здесь.
  • public / — это любые статические ресурсы, которые вы хотите включить в свое приложение. Например, изображения и шрифты.
  • vendor / — это то место, куда переходят любые зависимости внешнего интерфейса, которые не управляются системой сборки
  • тесты / — это то, где все тесты идут
    • tests / unit — это все модульные тесты для приложения
    • тесты / интеграция — это все интеграционные тесты для приложения

Общая структура страницы (включая стороннее содержимое)

Прежде чем мы зайдем слишком далеко, давайте дадим нашей странице некоторую форму структуры. В этом случае мы собираемся добавить в CSS-среду Materialise, чтобы улучшить внешний вид.

Добавление поддержки стороннего контента, подобного этому, может быть выполнено несколькими способами:

  • Прямая ссылка на контент на внешнем сервисе, таком как CDN
  • Использование менеджера пакетов, такого как npm или Bower, чтобы установить его для нас
  • Включая это прямо в нашем приложении.
  • Использование Ember Addon, если оно есть

К сожалению, аддон для Materialize еще не работает с последней версией Ember.js, поэтому вместо этого мы просто будем ссылаться на ресурсы CDN с нашей главной страницы. Чтобы добиться этого, мы собираемся обновить app/index.html , который является структурой главной страницы, в которую отображается наше приложение. Мы просто добавим ссылки CDN для jQuery, Google Icon Font и Materialize.

  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.1/css/materialize.min.css">  <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.1/js/materialize.min.js"></script> 

Теперь мы можем обновить главную страницу, чтобы показать наш основной шаблон. Это делается путем редактирования app/templates/application.hbs так:

 <nav> <div> <a href="#"> <i>filter_6</i> Dice Roller </a> <ul> </ul> </div> </nav> <div> {{outlet}} </div> 

Это дает нам Materialize Nav в верхней части экрана с контейнером, содержащим упомянутый ранее тег {{outlet}} .

Это выглядит так при посещении в вашем браузере:

Так что же это за outlet ? Ember работает вне маршрутов, где каждый маршрут считается дочерним по отношению к какому-либо другому маршруту. Самый верхний маршрут обрабатывается Ember автоматически и отображает шаблон app/templates/application.hbs .

outlet тег указывает, где Ember будет отображать следующий маршрут в текущей иерархии — поэтому маршрут первого уровня отображается в этом теге в application.hbs , маршрут второго уровня отображается в этом теге в этом шаблоне первого уровня и так далее.

Создание нового маршрута

В приложении Ember.js каждая страница, которую можно посетить, доступна через маршрут. Существует прямое сопоставление между URL-адресом, который открывает браузер, и маршрутом, который отображает приложение.

Самый простой способ убедиться в этом на примере. Давайте добавим новый маршрут в наше приложение, позволяющее пользователю фактически бросить несколько кубиков. Еще раз, это делается с помощью инструмента ember-cli.

 $ ember generate route roll installing route create app/routes/roll.js create app/templates/roll.hbs updating router add route roll installing route-test create tests/unit/routes/roll-test.js 

Эта команда дала нам следующее:

  • Обработчик маршрута — app/routes/roll.js
  • Шаблон для маршрута — app/templates/roll.hbs
  • Тест для маршрута — tests/unit/routes/roll-test.js
  • Обновлена ​​конфигурация маршрутизатора, чтобы узнать об этом новом маршруте — app/router.js

Давайте посмотрим это в действии. На данный момент у нас будет очень простая страница, позволяющая нам бросать несколько кубиков. Для этого обновите app/templates/roll.hbs следующим образом:

 <div> <form> <div> <div> <input placeholder="Name" type="text"> <label for="roll_name">Name of Roll</label> </div> </div> <div> <div> <input placeholder="Number of dice" type="number" value="1"> <label for="number_of_dice">Number of Dice</label> </div> <div> <input placeholder="Number of sides" type="number" value="6"> <label for="number_of_sides">Number of Sides</label> </div> </div> <div> <button type="submit" name="action"> Roll Dice <i>send</i> </button> </div> </form> </div> {{outlet}} 

Затем зайдите на http: // localhost: 4200 / roll и посмотрите результат:

Теперь мы должны быть в состоянии добраться сюда. Ember делает это очень просто, используя тег link-to . Это берет (среди прочего) имя маршрута, на который мы отправляем пользователя, и затем создаем разметку, чтобы туда попасть.

В нашем случае мы будем обновлять app/templates/application.hbs чтобы он содержал следующее:

 <ul> {{#link-to 'roll' tagName="li"}} <a href="roll">Roll Dice</a> {{/link-to}} </ul> 

Что делает нашу панель заголовка выглядит следующим образом:

Затем эта новая ссылка приводит пользователя к маршруту «/ roll», который мы только что настроили, именно так, как нужно.

Создание модульных компонентов

Если вы до сих пор тестируете приложение, вы заметите одну проблему. Открытие домашней страницы и посещение ссылки «/ roll» работает, но метки в форме не выстраиваются должным образом. Это связано с тем, что Materialise должен запускать некоторый JavaScript, чтобы разобраться, но динамическая маршрутизация означает, что страница не перезагружается. Нам нужно немного помочь здесь.

Введите компоненты. Компоненты — это части пользовательского интерфейса, которые имеют полный жизненный цикл и с которыми можно взаимодействовать. Они также являются способом создания многократно используемых элементов пользовательского интерфейса, если вам нужно это сделать — мы увидим это позже.

На данный момент мы собираемся создать один компонент, представляющий форму Roll Dice. Как всегда, генерация компонента выполняется с помощью нашего инструмента ember-cli следующим образом:

 $ ember generate component roll-dice installing component create app/components/roll-dice.js create app/templates/components/roll-dice.hbs installing component-test create tests/integration/components/roll-dice-test.js 

Это дало нам:

  • app / components / roll-dice.js — код, который питает компонент
  • app / templates / components / roll-dice.hbs — шаблон, управляющий тем, как он будет выглядеть
  • tests / интеграции / компоненты / roll-dice-test.js — тест для проверки правильности работы компонента

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

Обновите app/templates/components/roll-dice.hbs следующим образом:

 <form> <div> <div> <input placeholder="Name" type="text"> <label for="roll_name">Name of Roll</label> </div> </div> <div> <div> <input placeholder="Number of dice" type="number" value="1"> <label for="number_of_dice">Number of Dice</label> </div> <div> <input placeholder="Number of sides" type="number" value="6"> <label for="number_of_sides">Number of Sides</label> </div> </div> <div> <button type="submit" name="action"> Roll Dice <i>send</i> </button> </div> </form> 

А затем обновите app / templates / roll.hbs следующим образом:

 <div> {{roll-dice}} </div> {{outlet}} 

Шаблон для нашего компонента — это именно та разметка, которая была у нас ранее в нашем маршруте, и теперь наш маршрут значительно упрощен. Тег roll-dice — это то, что говорит Ember для рендеринга нашего компонента в нужном месте.

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

Жизненный цикл компонента

У компонентов Ember есть определенный жизненный цикл, за которым они следуют, с несколькими хуками, которые могут запускаться на разных этапах. Мы собираемся использовать хук didRender который вызывается после рендеринга компонента — либо в первый раз, либо в любой последующий раз — чтобы попросить Materialize обновить метки в текстовых полях.

Это делается путем обновления кода за компонентом, который находится внутри app/components/roll-dice.js , чтобы он выглядел следующим образом:

  import Ember from 'ember'; export default Ember.Component.extend({ didRender() { Materialize.updateTextFields(); } }); 

Теперь каждый раз, когда вы посещаете маршрут «/ roll» — будь то с помощью глубокой ссылки на него или с помощью ссылки на заголовок — этот код запускается, и Materialise обновляет метки для правильной передачи.

Привязка данных

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

Каждый фрагмент данных, с которым мы хотим взаимодействовать, существует в классе Component как его собственное поле. Затем мы используем некоторые помощники для рендеринга наших полей ввода в нашем компоненте, которые выполняют функцию связывания этих полей ввода с переменными компонента, чтобы мы могли взаимодействовать с ними напрямую, даже не заботясь о действиях DOM.

В этом случае у нас есть три поля, поэтому нам нужно добавить следующие три строки в app/components/roll-dice.js , прямо внутри определения компонента:

  rollName: '', numberOfDice: 1, numberOfSides: 6, 

Затем мы обновляем наш шаблон для рендеринга с использованием хелперов вместо прямой рендеринга HTML-разметки. Для этого замените теги <input> следующим образом:

 <div> <div>  {{input placeholder="Name" value=(mut rollName)}} <label for="roll_name">Name of Roll</label> </div> </div> <div> <div>  {{input placeholder="Number of dice" type="number" value=(mut numberOfDice)}} <label for="number_of_dice">Number of Dice</label> </div> <div>  {{input placeholder="Number of sides" type="number" value=(mut numberOfSides)}} <label for="number_of_sides">Number of Sides</label> </div> </div> 

Обратите внимание, что атрибут value имеет слегка странный синтаксис. Этот синтаксис можно использовать для любого атрибута тега, а не только для value . Это можно использовать тремя способами:

  • В качестве строки в кавычках — значение используется как есть
  • Как строка без кавычек — значение заполняется из этого фрагмента данных компонента, но компонент никогда не обновляется
  • As (mut <name>) — значение заполняется из этого фрагмента данных компонента, а компонент изменяется при изменении значения в браузере.

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

Компонент действия

Следующее, что мы хотим сделать, это взаимодействовать с компонентом. В частности, было бы хорошо справиться, когда нажата наша кнопка «Roll Dice». Ember обрабатывает это с помощью Actions — фрагментов кода в вашем компоненте, которые можно подключить к вашему шаблону. Действия просто определяются как функции в нашем классе компонентов внутри специального поля, называемого actions , которые реализуют нашу желаемую функциональность.

Сейчас мы просто расскажем пользователю, что он хочет делать, но на самом деле ничего не делаем — это будет дальше. При этом будет использоваться действие « Отправить» на самой форме, что означает, что она запускается, если они нажимают на кнопку или нажимают клавишу ввода в одном из полей.

Наш блок кода действий внутри app/components/roll-dice.hbs будет выглядеть следующим образом:

  actions: { triggerRoll() { alert(`Rolling ${this.numberOfDice}D${this.numberOfSides} as "${this.rollName}"`); return false; } } 

Мы возвращаем false чтобы предотвратить появление событий . Это довольно стандартное поведение в приложениях HTML, и в этом случае необходимо, чтобы при отправке формы не происходила перезагрузка страницы.

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

Теперь нам просто нужно подключить это. В нашем шаблоне нам нужно сообщить тегу формы, что он должен запускать это действие при onsubmit события onsubmit . Это просто добавление одного атрибута к тегу формы с помощью помощника Ember, чтобы подключить его к нашему действию. Это выглядит следующим образом внутри app/templates/components/roll-dice.hbs :

 <form onsubmit={{action 'triggerRoll'}}> 

Теперь мы можем нажать на кнопку, заполнив нашу форму, и получить всплывающее окно с предупреждением о том, что мы сделали.

Управление данными между клиентом и сервером

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

Наш желаемый поток здесь:

  • Пользователи определяют кости, которые они хотят бросить
  • Пользователь нажимает кнопку «Roll Dice»
  • Браузер отправляет данные на сервер
  • Сервер бросает кости, запоминает результат и отправляет результаты обратно клиенту
  • Браузер отображает результаты броска костей

Звучит достаточно просто. И, конечно же, с Эмбер это действительно так.

Ember обрабатывает это, используя встроенную концепцию Store, заполненную моделями. Магазин — это единый источник знаний во всем приложении, а каждая Модель — это единая информация в магазине. Все модели знают, как сохранить себя на сервере, а Магазин знает, как создавать и получать доступ к Моделям.

Передача управления от компонентов к маршрутам

Во всем нашем приложении важно сохранять правильность инкапсуляции. Маршруты (и контроллеры, которые мы не рассмотрели) имеют доступ к магазину. Компонентов нет.

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

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

В логике нашего маршрута — app/routes/roll.js — нам нужно добавить следующий блок, чтобы зарегистрировать действие, которое мы собираемся выполнить.

 actions: { saveRoll: function(rollName, numberOfDice, numberOfSides) { alert(`Rolling ${numberOfDice}D${numberOfSides} as "${rollName}"`); } } 

В логике нашего компонента — app/components/roll-dice.js — нам нужно запустить действие для нашего компонента, когда мы сами сработаем. Это делается с sendAction механизма sendAction внутри нашего существующего обработчика действий.

 triggerRoll() { this.sendAction('roll', this.rollName, this.numberOfDice, this.numberOfSides); return false; } 

И, наконец, нам нужно подключить действие. Это делается в шаблоне для маршрута — app/templates/roll.hbs — путем изменения способа отображения нашего компонента:

 {{roll-dice roll="saveRoll" }} 

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

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

Сохранение в магазине

Прежде чем мы сможем сохранить данные в нашем хранилище, нам нужно определить модель для их представления. Это делается с помощью нашего надежного инструмента ember-cli, чтобы снова создать структуру и затем заполнить ее.

Для создания класса модели мы выполняем:

 $ ember generate model roll installing model create app/models/roll.js installing model-test create tests/unit/models/roll-test.js 

Затем мы рассказываем нашей модели об атрибутах, которые ей необходимо понять. Это делается путем изменения app/models/roll.js чтобы он выглядел следующим образом:

 import DS from 'ember-data'; export default DS.Model.extend({ rollName: DS.attr('string'), numberOfDice: DS.attr('number'), numberOfSides: DS.attr('number'), result: DS.attr('number') }); 

DS.attr определяют новый атрибут указанного типа, называемый Transform in Ember. Здесь используются параметры по умолчанию: «строка», «число», «дата» и «логическое значение», хотя при необходимости вы можете указать свои собственные.

Теперь мы можем использовать это для создания или проката. Это делается путем доступа к магазину из нашего действия, которое мы теперь имеем в app/routes/roll.js :

 saveRoll: function(rollName, numberOfDice, numberOfSides) { let result = 0; for (let i = 0; i < numberOfDice; ++i) { result += 1 + (parseInt(Math.random() * numberOfSides)); } const store = this.get('store');  

Если мы попробуем это, мы увидим, что нажатие кнопки « Roll Dice» вызывает сетевой вызов на наш сервер. Это терпит неудачу, потому что наш сервер еще не ожидает этого, но это прогресс.

Мы не фокусируемся здесь на бэкэнде, поэтому будем заниматься этим. Если вам нужно разработать приложение Ember без какого-либо бэкэнда, тогда есть варианты, такие как ember-localstorage-adapter, которые будут полностью работать в браузере. В качестве альтернативы вам просто нужно написать соответствующий сервер и убедиться, что сервер и клиент размещены правильно и все будет работать.

Загрузка из магазина

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

У Ember неявно есть маршрут с именем index который используется для визуализации начальной страницы приложения. Если файлы для этого маршрута не существуют, то ошибка не возникает, но вместо этого ничего не отображается. Мы собираемся использовать этот маршрут для рендеринга всех исторических рулонов из нашего магазина.

Поскольку индексный маршрут уже неявно существует, нет необходимости использовать инструмент ember-cli — мы можем напрямую создавать файлы, и он уже подключен.

Наш обработчик маршрута перейдет в app/routes/index.js и будет выглядеть следующим образом:

 import Ember from 'ember'; export default Ember.Route.extend({ model() { return this.get('store').findAll('roll'); } }); 

Здесь наш маршрут имеет прямой доступ к хранилищу и может использовать метод findAll для загрузки каждого оставшегося броска. Затем мы предоставляем их шаблону с использованием метода model .

Наш шаблон перейдет в app/templates/index.hbs следующим образом:

 <table> <thead> <tr> <th>Name</th> <th>Dice Rolled</th> <th>Result</th> </tr> </thead> <tbody> {{#each model as |roll|}} <tr> <td>{{roll.rollName}}</td> <td>{{roll.numberOfDice}}D{{roll.numberOfSides}}</td> <td>{{roll.result}}</td> </tr> {{/each}} </tbody> </table> {{outlet}} 

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

Резюме

На данный момент, после сравнительно небольшой работы, мы разработали приложение, которое позволит нам бросать кости и просматривать историю всех бросков. Это включает в себя привязку данных из нашей формы, сохранение данных в хранилище и их считывание, шаблонную поддержку для отображения всех страниц и полную маршрутизацию URL. Это приложение может быть разработано с нуля менее чем за час.

Использование Ember может значительно повысить эффективность разработки вашего интерфейса. В отличие от таких библиотек, как React, Ember предоставляет вам полный набор функциональных возможностей, необходимых для создания полнофункционального приложения без дополнительных инструментов. Добавление ember-cli и ember-cli настроек выводит это на новый уровень, делая процесс невероятно простым и безболезненным от начала до конца. В сочетании с поддержкой сообщества почти ничего не может быть достигнуто.

К сожалению, может быть сложно вставить Ember в существующий проект. Лучше всего работает при запуске нового проекта. Установка его в существующий может быть трудной или невозможной. Ember также работает из коробки с очень специфическим способом работы с бэкэндами, и если ваш существующий бэкэнд не соответствует этому, то вы можете потратить много времени и усилий, либо переработав бэкэнд, либо найдя / написав плагины поговорить с существующим.

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

Как пользоваться руководствами — Начало работы

Что такое Ember?

Ember.js — это производительный, проверенный в боях JavaScript-фреймворк для создания современных веб-приложений. Он включает в себя все необходимое для создания многофункциональных пользовательских интерфейсов, работающих на любом устройстве. Это достигается путем предоставления разработчикам множество функций, которые необходимы для управления сложностью современных веб-приложений, а также интегрированный инструментарий разработки, обеспечивающий быструю итерацию.

Некоторые из этих функций, о которых вы узнаете в руководствах:

  • Ember CLI — надежный инструментарий разработки для создания, разработки и сборки приложений Ember.Изучите основные команды из руководств по интерфейсу командной строки.
  • Компоненты — фундаментальная конструкция, используемая в приложениях Ember, используемая для создания многоразовых элементов пользовательского интерфейса и определения макета и функциональности приложения.
  • Маршрутизация — центральная часть приложения Ember. Позволяет разработчикам управлять состоянием приложения из URL-адреса.
  • Services — способ хранить долгосрочное состояние в вашем приложении и передавать его.
  • Ember Data — Ember Data обеспечивает согласованный способ связи с внешними API и управления состоянием приложения
  • Ember Inspector — расширение браузера или букмарклет для проверки вашего приложения в реальном времени.Это также полезно для обнаружения приложений Ember в дикой природе, попробуйте установить его и откройте веб-сайт НАСА!

Организация

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

Руководства содержат практические объяснения того, как создавать приложения Ember, ориентируясь на наиболее широко используемые функции Ember.js. Для получения исчерпывающей документации по каждой функции и API Ember см. Документация по API Ember.js.

Руководства начинаются с объяснения того, как начать работу с Ember, с последующим руководством по созданию вашего первого приложения Ember. Если вы новичок в Ember, мы рекомендуем вам начать с изучения этих первых двух разделов Руководств.

Допущения

В то время как мы пытаемся сделать руководства как можно более удобными для новичков, мы должны установите базовый уровень, чтобы гиды могли сосредоточиться на Ember.js функциональность. Мы постараемся ссылаться на соответствующую документацию всякий раз, когда представлена ​​концепция.

Чтобы извлечь максимальную пользу из руководств, вы должны иметь практические знания HTML, CSS и JavaScript — строительные блоки веб-страниц. Ты можешь найти подробнее о каждой из этих технологий см. Работа с HTML, CSS и JavaScript. руководство, включая некоторые специальные функции, которые использует Ember, например, класс поля и декораторы.

Доступность

Если вы используете программу чтения с экрана при просмотре руководств, мы рекомендуем использовать Firefox и NVDA или Safari и VoiceOver для наилучшего взаимодействия.

Сообщение о проблеме

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

Некоторые из наиболее распространенных способов сообщить о проблеме с руководствами:

  • Использование значка карандаша в правом верхнем углу каждой страницы руководства
  • Открытие вопроса или запроса на перенос в репозиторий GitHub

Нажав на значок карандаша, вы попадете в редактор GitHub для этого руководство, чтобы вы могли редактировать прямо сейчас, используя язык разметки Markdown.Это самый быстрый способ исправить опечатку, пропущенное слово или ошибку в образец кода.

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

Если у вас есть какие-либо вопросы по поводу стиля или процесса участия, вы можете ознакомиться с нашим руководством. Если ваш вопрос не устранен, напишите нам на канале # dev-ember-learning в сообществе Ember в Discord.

Удачи!

Ember.js · GitHub

Ember.js · GitHub
  1. Ember.js — JavaScript-фреймворк для создания амбициозных веб-приложений.

    JavaScript Бег 21,9 км 4,2 км

  2. Библиотека сохранения данных для Ember.js.

    JavaScript 3k 1,3 км

  3. Добавляет вкладку Ember в Инструменты разработчика браузера, которая позволяет вам проверять объекты Ember в вашем приложении.

    JavaScript 941 272

  4. RFC для изменений в Ember

    Оболочка 735 407

  5. Протокол встречи от Ember.js основные команды

    138 39

  6. Помощники, не зависящие от тестовой платформы, для тестирования приложений Ember.js

    JavaScript 164 215

Репозитории

  • уголь.js

    Ember.js — JavaScript-фреймворк для создания амбициозных веб-приложений.

    JavaScript Массачусетский технологический институт 4 241 21 938 315 (По 15 вопросам нужна помощь) 107 Обновлено 29 июля 2021 г.
  • JavaScript 215 164 51 (Требуется помощь по 1 проблеме) 14 Обновлено 29 июля 2021 г.
  • основные заметки

    Протокол встречи от Ember.js основные команды

  • данные

    Библиотека сохранения данных для Ember.js.

    JavaScript 1,301 2 982 116 50 Обновлено 28 июля 2021 г.
  • тлеющий инспектор

    Добавляет вкладку Ember в Инструменты разработчика браузера, которая позволяет вам проверять объекты Ember в вашем приложении.

    JavaScript Массачусетский технологический институт 272 941 58 (Требуется помощь по 4 вопросам) 11 Обновлено 28 июля 2021 г.
  • JavaScript Массачусетский технологический институт 9 3 6 15 Обновлено 27 июля 2021 г.
  • JavaScript Массачусетский технологический институт 7 9 8 20 Обновлено 26 июля 2021 г.
  • уголь-мокко

    Помощники Mocha для тестирования Ember.js приложения

    JavaScript Apache-2.0 59 130 10 29 Обновлено 26 июля 2021 г.
  • rfcs

    RFC для изменений в Ember

    Оболочка 406 735 145 88 Обновлено 22 июля 2021 г.
  • официанты

    Надстройка Ember, позволяющая @ ember / test-helpers управлять асинхронными операциями.

    Машинопись Массачусетский технологический институт 11 18 5 8 Обновлено 13 июля 2021 г.
  • JavaScript 2 1 2 5 Обновлено 9 июля 2021 г.
  • JavaScript Массачусетский технологический институт 78 106 16 15 Обновлено 1 июля 2021 г.
  • JavaScript Массачусетский технологический институт 134 256 10 10 Обновлено 1 июля 2021 г.
  • JavaScript Массачусетский технологический институт 10 39 6 (Требуется помощь по 1 проблеме) 9 Обновлено 1 июля 2021 г.
  • JavaScript Массачусетский технологический институт 0 0 0 25 Обновлено 1 июля 2021 г.
  • JavaScript Массачусетский технологический институт 7 14 5 12 Обновлено 1 июля 2021 г.
  • JavaScript Массачусетский технологический институт 4 4 0 7 Обновлено 18 июня 2021 г.
  • JavaScript Массачусетский технологический институт 20 71 11 5 Обновлено 18 июня 2021 г.
  • JavaScript Массачусетский технологический институт 4 2 0 3 Обновлено 12 июня 2021 г.
  • JavaScript Массачусетский технологический институт 1 3 0 7 Обновлено 10 июня 2021 г.
  • уголь

    Уголь.js модуль npm

    JavaScript 2 0 1 1 Обновлено 23 мая 2021 г.
  • JavaScript Массачусетский технологический институт 0 1 0 1 Обновлено 11 мая 2021 г.
  • JavaScript Массачусетский технологический институт 8 7 1 15 Обновлено 10 мая 2021 г.
  • JavaScript Массачусетский технологический институт 7 3 1 8 Обновлено 9 мая 2021 г.
  • Рубин Массачусетский технологический институт 155 0 0 0 Обновлено 25 января 2021 г.
  • JavaScript 0 0 0 0 Обновлено 10 нояб.2020 г.
  • JavaScript 1 5 6 0 Обновлено 3 ноября 2020 г.
  • .github

    Файлы работоспособности по умолчанию для всех репозиториев в организации emberjs

    0 0 0 0 Обновлено 29 сентября 2020 г.
  • JavaScript Массачусетский технологический институт 6 8 0 2 Обновлено 12 сентября 2020 г.
  • JavaScript Массачусетский технологический институт 3 7 3 (Требуется помощь по 2 вопросам) 0 Обновлено 20 декабря 2019 г.
Вы не можете выполнить это действие в настоящее время.Вы вошли в систему с другой вкладкой или окном. Перезагрузите, чтобы обновить сеанс. Вы вышли из системы на другой вкладке или в другом окне. Перезагрузите, чтобы обновить сеанс.

Ember.js в 2021 году — маяк производительности | Блог

Simpleabs ❤️ Ember

Чтобы быть полностью прозрачным, я сильно склоняюсь к Эмбер. С помощью simpleabs я основал то, что сейчас ведущая консалтинговая компания Ember в Европе. Мы помогли многим команды успешно создают, развивают и поддерживают большие приложения с помощью Ember over года.Некоторые члены нашей команды входят в основную команду Ember, и мы поддерживать ряд широко распространенных библиотек в экосистеме. Мы даже являемся одним из официальных спонсоров фреймворка. Имея весь этот опыт, а также некоторый опыт работы с командами, использующими другие стеки технологий, я думаю, что у нас есть взгляд на разработку внешнего интерфейса, может немного отличаться от взглядов других команд, и поэтому стоит обмен.

Статус-кво фронтенд-инжиниринга

В мире фронтенд-инжиниринга достигнут огромный прогресс. последние 10 лет или около того.Когда был впервые выпущен Ember, jQuery (а иногда даже Prototype) по-прежнему оставались популярными решениями для изготовления в противном случае статические и отображаемые на сервере страницы динамические. И пока jQuery остается самая используемая библиотека JavaScript в Интернете на сегодняшний день, методы, впервые представленные Ember и Angular.js (а затем React и другими) в настоящее время широко приняты и приняты. Хотя фронтенд-инжиниринг был чем-то что многие «настоящих» разработчиков смотрели бы свысока всего несколько лет назад, и что часто было просто запоздалой мыслью, эта область была профессионализирована значительно и теперь получает то внимание, которого заслуживает.Это не только признать тот факт, что разработка внешнего интерфейса является чрезвычайно сложной задачей, но также его значение для бизнеса из-за прямого воздействия на конечных пользователей опыт.

Однако в мире фронтенд-разработки дела не замедлились. По факту, как раз наоборот — мы наблюдаем инновации и изменения на чрезвычайно высоком уровне. и, похоже, все еще набирает обороты. JavaScript стал доминирующий язык в мире и является ответом по умолчанию, который многие разработчики должны делать практически все, что они могут иметь дело в сети (теперь вы даже можете написать свой CSS на JS 🙀).И хотя инновации, изучение возможностей и новых подходов — это здорово, тот факт, что огромное сообщество разработчиков коллективно ищет следующая большая вещь, и все только ждут, чтобы вскочить на следующую подножку приносит больше вреда, чем может показаться на первый взгляд. Легко недооценивать затраты, связанные с оттоком клиентов, из-за которых используются новые подходы. чрезмерно охотно приносит с собой, что часто бывает только для того, чтобы позже понять, что шумиха снова сменил направление, и то, на что вы делаете ставку, теперь превратилось в тупик.

Фетиш сложности

Я думаю, что во внешнем интерфейсе сложность в некотором роде фетишизируется — в основном из-за двух настроений. Один — просто эго. Как вирусологи и эпидемиологи скажем (и все мы узнали в прошлом году), «нет славы в профилактика «. И вот так (на удивление) мало славы можно найти в стабильной доставке реальной стоимости продукта на основе решений общих проблем другие нашли до вас и закодировали в рамках, основанных на сильных условности.С другой стороны, вся инженерная слава можно найти в найти лучший ™ способ решения конкретной проблемы и укротить низкоуровневые сложность, даже если вся эта работа не способствует выполнению продукта и бизнес-видение — решение таких проблем часто делается только ради славы, независимо от того, была ли проблема решена ранее или даже представляет собой вызов в соответствующем проекте вообще. Пошагово портировав приложение React перейти от Redux к MobX к хукам и далее в течение последних нескольких лет, вероятно, было увлекательным инженерным путешествием и принесло с собой целую кучу интересная и интересная работа.Однако соотношение затрат и выгод всех время, потраченное на это начинание, может быть сомнительным.

Крис Мэнсон из Simpleabs и Команды Ember Learning Core недавно рассказали мне история инженера, с которым он разговаривал на конференции. Они поняли и полностью согласен с ценностью, которую Ember предоставил как полнофункциональную, батареи включены интерфейсные приложения, которые позволяют командам создавать небоскребы начиная с 20 этажа вместо того, чтобы начинать закладку Фонд.Тем не менее, они сказали, что никогда не предложат схему своему начальнику потому что тогда они не смогли бы написать столько кода для решения низкоуровневых проблемы, которые они сочли особенно интересными, потому что «Ember делает все за вас» . Хотя то, что может быть веской причиной не выбирать техническое решение на раз, в большинстве случаев доставка важна и должна быть основной движущей силой для решения.

Другое мнение, которое, как я считаю, способствует фетишу сложности, — это желание контролировать каждый аспект и каждую деталь своего приложения.Частично это могло быть вызвано сообществом Node — в моем понимании это вызывает большие сомнения. мнение — любовные отношения с микропакетами, в которых составляются заявки тщательно подобранной комбинации крошечных библиотек, которые идеально подходят для особых потребностей конкретного приложения — или, в большинстве случаев, личных предпочтения инженера (-ов), создающего проект. Многие команды, с которыми я разговаривал на протяжении многих лет твердо придерживались мнения о том, какая именно библиотека маршрутизации им нужно, почему они не могут использовать шаблоны управления состоянием фреймворка X, но придется использовать другую микробиблиотеку и т. д.И хотя многие из этих аргументов будет иметь смысл с чисто технической точки зрения, практическое влияние чаще всего пренебрежимо или даже неактуально. Хотя что определенно что все время и усилия, потраченные на сборку (и последующее обслуживание) этих узкоспециализированные специальные рамки — это , а не , которые будут строиться и улучшаться реальные продукты для реальных пользователей.

Ember: превращая сложность в простоту

В отличие от этого, Эмбер принимает эти низкие и в основном неважные решения об отказе от велосипеда из рук разработчиков.Это полнофункциональный фреймворк с батарейками. и, как аналогичные решения для бэкэнда, такие как Ruby on Rails, он предоставляет все, что нужно для создания приложения согласованным образом с помощью согласованного API где отдельные части работают вместе безупречно, так как они предназначены для работать вместе с самого начала. Из-за этого не допускается уровень свобода и детальный контроль над каждой мелкой деталью, которую многие ищут для внешнего мира, как упоминалось выше. И хотя это может звучать непривлекательный для многих, на самом деле это его самая сильная сторона, поскольку позволяет командам сосредоточиться на реализации своего видения продукта и компании и доставке реальной стоимости для своих пользователей.

Существенная и случайная сложность

Написание любой программной системы означает столкновение с большим количеством сложностей. Эта сложность проявляется в двух формах (см. Знаменитая статья Фреда Брукса по этой теме): существенная сложность и случайная сложность. Существенная сложность в том, насколько сложно что-то нужно делать, независимо от опыта, используемой технологии и т. д. Это неотъемлемое свойство проблемы, которую вы решаете. Сложение двух чисел — это как правило, задача относительно невысокой сложности при построении социальной сети имеет намного более высокая сложность по сравнению.С другой стороны, случайная сложность часть сложности, которая не присуща проблеме, которую вы решаете но введен как часть решения. Добавление двух чисел в C ++ — это больше сложнее, чем делать то же самое в JavaScript, как и в C ++, вам нужно беспокоиться насчет управления памятью, вам нужно компилировать и т. д. — все это не обязательно для JavaScript, что, таким образом, снижает случайную сложность.

Фреймворки

, такие как Ember, призваны снизить количество случайных сложностей. что разработчикам приходится иметь дело.Поскольку Эмбер заботится обо всем или огромном большинство аспектов приложения, которые не являются существенной частью проблемная область конкретного приложения (например, маршрутизация, загрузка данных и т. д.), это устраняет всю случайную сложность, связанную с этими аспектами руки разработчиков. Вместо этого они могут сосредоточиться на решении важных только сложность. Четкое разделение аспектов, которые контролирует разработчик от всего остального поэтому освобождающее принуждение — это позволяет разработчикам не отвлекаться и тратить время на несущественные аспекты и позволяет им тратить свое время и силы там, где они действительно добавить ценность.В отличие от этого, опираясь на микропакеты и стремясь к детальный контроль над всеми аспектами приложения обязательно всплыть на поверхность все случайные сложности, связанные с ними, и положить ответственность за них снова в руках разработчиков. Теперь им нужно иметь дело с конфигурациями веб-пакетов, интеграцией между пакетами и т. д. Все усилия и время, потраченное на эти задачи, не влияет на реальную ценность продукта. пользователей.

Мы видели, как многие команды в simpleabs борются со всеми видами проблем в веб-проекты и помогли им преодолеть эти проблемы.Ни в одном из этих случаев проблемы, вызванные тем, как такие фреймворки, как Ember или Rails, обрабатывают несущественные аспекты приложений. В большинстве случаев проблемы возникают из-за команд. изо всех сил пытается организовать код поддерживаемым и расширяемым способом в областях, где фреймворки оставляют свободу и не содержат строгих условностей (типичные примеры формирование и оркестровка компонентов в Ember или организация бизнес-логики в приложениях Rails) — на самом деле худшие проблемы обычно возникают там, где команды создают свои собственные расширения для фреймворков, которые добавляют большое количество случайные сложности и создают больше проблем, чем решают.Я видел в минимум восемь различных подходов к организации бизнес-логики в индивидуальном строит в приложениях Rails в течение моей карьеры, и каждый в конечном итоге в тупик. То же самое можно сказать и об изобретении пользовательского управления данными. библиотеки вместо того, чтобы полагаться на такие решения, как ember-data или Orbit.

С помощью Ember мы создали согласованную базу кода из пары приложений и аддоны. Его разделяют 25 интерфейсных инженеров, разбросанных по нескольким командам. В На раннем этапе мы могли бы сосредоточиться на предоставлении новых функций нашим клиентам.Потом, сохраняя этот фокус, мы могли бы развивать кодовую базу без прерывания работы способ.

Ember и его экосистема дали нам достаточно стабильности, чтобы инвестировать в нашу продукта и в развитии навыков наших инженеров. Сирил Дэвид, руководитель отдела фронт-энда, Qonto

Устойчивость без застоя

Тот факт, что Эмбер скрывает большую часть случайной сложности и берет на себя управление по этим аспектам приложений не означает, что ничего не может измениться в рамки и никакого прогресса не может быть. — это устойчивый и прочный прогресс в структуре, но Ember защищает разработчиков от необходимости иметь дело с вовлеченный отток как можно больше. Вместо этого Ember постоянно отправляет улучшения в обратно совместимых минорных выпусках с четкими путями обновления, следуя своей стратегии выпуска, которая подчеркивает стабильность. Это позволяет командам идти в ногу с последними разработками и получать выгоду от инноваций в области внешнего интерфейса при минимизации понесенных затрат, таких как команда CLARK:

Все изменения в самом Ember проходят через RFC, проверены и протестированы в реальных условиях. приложения через канарейку и бета-версии перед их развертыванием в сообщество.Как только это произойдет, предыдущие API останутся доступными, но будут устарело вместе с обширной документацией по переходу на новые парадигмы (и во многих случаях будут кодмоды даже для автоматизации задачи; есть также специальное приложение, в котором перечислены изменения между две версии и изменения, необходимые для обновления). Так что вместо каждого единая команда, оплачивающая затраты на исследования и эксперименты, фреймворк и сообщество оплачивает эту стоимость один раз, чтобы потом все общество получило выгоду.Это то, что сообщество Ember также называет безопасность стада.

За прошедшие годы Ember претерпела множество существенных изменений в своих основных концепциях:

Каждое из этих изменений было существенным обновлением модели программирования Ember. Тем не менее, каждый из них был выпущен таким образом, чтобы облегчить задачу для всего сообщества. следовать. Вся экосистема вращается вокруг одного определенного набора методы и практики, гарантируя, что ни один проект не останется позади и не застрянет на старых шаблонах предотвращает фрагментацию.У каждого в сообществе есть коллективный интерес в поддержке, поддержании и развитии одного и того же набора инструменты и все сообщество будут вместе следить за тем, чтобы они продолжали работать работать и работать хорошо для всех, кто использует Ember. Нет никакого риска для личности команды и проекты, оставленные сами по себе, потому что они сделали ставку не на ту лошадь это в конечном итоге не поддерживается активно, так что команды либо взять на себя обслуживание или переключиться на другое решение, которое часто приводил к большим рефакторингу, снова тратя время и усилия на иметь дело со случайной сложностью, а не с существенной сложностью, и создание ценности продукта.

Как указано выше, Ember — это полнофункциональный фреймворк, содержащий согласованные строительные блоки и концепции для всех аспектов реального мира сталкиваются приложениями, и которые по своей сути не связаны с их проблемной областью. В то время как Ember инкапсулирует внутреннее устройство этих концепций, разработчики не приходится иметь дело с ними, все эти концепции все еще присутствуют и вносят свой вклад в общедоступный API фреймворка и общая архитектура, которую можно увидеть, когда работаю над проектом Ember.Это часто приводит к критике, сосредоточенной на факте что есть чему поучиться с Ember, и что-то или многое из этого может не быть необходимо для конкретного проекта

Я просто хочу создать виджет калькулятора для своего статического сайта — зачем мне беспокоиться о маршрутизации, загрузке данных, состояниях ошибок и т. д. для этого?

— тот, кто должен был выбрать React

Подобные комментарии сложно опровергнуть. Конечно, нет веской причины, почему кто-нибудь должен создать структура маршрута вместе с иерархия шаблонов или понять что переходники или сериализаторы когда приложение, которое они создают, в любом случае не нуждается в этом.В в действительности, однако, это не означает, что Ember излишне раздут или чрезмерно сложный, но жалующийся человек обратился к инструменту, который служит другому цель, а не то, что им нужно в первую очередь для конкретной работы.

Даже несмотря на то, что границы иногда размыты, все же существует значительный разница между статическими или частично динамическими веб-сайтами (например, ваш сайт любимого новостного издания или большинство сайтов электронной коммерции) и полнофункциональные веб-приложения (например, социальные сети, такие как Facebook или LinkedIn, или приложения в стиле панели инструментов, такие как пользовательский интерфейс онлайн-банкинга, который разрабатывает Qonto).Эти разные варианты использования также имеют разные характеристики и требования с точки зрения интерактивность, производительность (время загрузки) и ожидания пользователей. Арал Балкан написал ан интересный пост в 2013 году по теме, в которой он вводит то, что он называет «Континуум от документов к приложениям» — и то, что он сказал почти 8 лет назад, все еще применяется сегодня. Лучшее место для Ember — это «Applications» . сторона этого спектра:

Есть много других, лучших вариантов для других типов проектов (и для сайтов со статическим контентом я бы сказал, что любая клиентская среда неправильная выбор в любом случае чаще, чем нет — однако, надо признать, мы прошли через упражнение по полной переработке статического сайта а также узнать это на собственном горьком опыте).Дело в том, что , если вы не строите веб-приложение, не смотрите на фреймворк веб-приложения для его создания. Тем не менее, многие команды сделали бы это, а затем были бы разочарованы тем, что фреймворк, который они попробовал, не оказалось, подходит. Для меня это немного похоже на жалобу Ракеты SpaceX не подходят для покупок в продуктовых магазинах. Ракета не является идеальный выбор для этой задачи не означает, что это плохая ракета, просто продвинутая технология, предназначенная для решения сложных задач, не обязательно также отлично подходит для более простых задач.

Продуктивное будущее с Ember

Эмбер никогда не был самым крутым ребенком в округе и, вероятно, никогда им не станет. Опираясь на решения, которые другие нашли до вас, не особо привлекательная перспектива для многих разработчиков. Требуется немало опыта и отражение, чтобы отпустить свое тщеславие и признать, что чем меньше вы делаете сами и чем больше вы будете опираться на существующие, проверенные решения, тем лучше инженерная работа, которую вы на самом деле делаете, и тем лучше ваша работа в интерес компании, которую вы создаете или работаете, в конечном итоге приоритет, так как это то, что оплачивает счета и зарплаты.Разработчики Ember часто являются самыми высокооплачиваемыми и старшими в ежегодном обзоре состояния JS. и я не думаю, что это совпадение.

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

Qonto и CLARK — два отличных примера команд, неуклонно и устойчиво воплощающих в жизнь свое видение продукта.В компании — две из самых успешных и быстрорастущих финтех-компаний в Европе. и значительно расширили свои команды за последние несколько лет, пока продолжая поставлять стабильно и устойчиво. Но они не единственные конечно, успешно используют Ember — есть и другие компании, создающие амбициозные приложений с крупными и растущими командами, такими как LinkedIn, Apple, Square, Heroku, Домофон и многое другое. Все эти команды могут вызвать мало шума и шумихи, но постоянно доставлять стоимость продукта и будет продолжать делать это на основе Ember, которая продолжит поднимать их к новым высотам в ближайшее время.

Что такое Ember.js ?. Ember.js — это MVC… | редактором | Aeturnum

Ember.js — это JavaScript-фреймворк MVC (модель-представление-контроллер), используемый для разработки больших клиентских веб-приложений. По сравнению с другими фреймворками JavaScript MVC он дает вам возможность писать организованный и структурированный код. Согласно веб-сайту Ember.js, это позволяет создавать «амбициозные» веб-приложения.

В Ember.js маршрут используется как модель, шаблон ручки, поскольку представления и контроллеры манипулируют данными в модели.

Если вы хотите создать одностраничное веб-приложение, которое расширяет границы возможного в Интернете, Ember.js — правильный выбор.

Рис. 1.0. Структура раннего Интернета (слева) по сравнению с обещанием Ajax (в центре) по сравнению с современным веб-приложением

Ранние веб-сайты полагались на подход полностраничного обновления, показанный слева на рис. 1.0. С появлением асинхронного вызова появилась возможность отправлять определенные части веб-сайта для каждого ответа, как показано на рисунке 1.0 (средний).

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

Давайте подробнее рассмотрим каждый из компонентов MVC.

· Уровень контроллера — Построен с комбинацией маршрутов и контроллеров

· Слой представления — Построен с комбинацией шаблонов и представлений

· Слой модели — Построен с комбинацией модели и данных ember.

Рисунок 2.0 Части, из которых состоит Ember.js, и их соответствие шаблону MVC

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

Модель Ember использует данные Ember, чтобы значительно упростить код, одновременно повышая надежность и производительность приложения.

Слой между моделью и представлением — это уровень контроллера. Есть несколько контроллеров, в первую очередь «Ember.ObjectController »и« Ember.ArrayController ».

Ember Router — это механизм, который обновляет URL-адреса ваших приложений и отслеживает изменения URL-адресов. У каждого маршрута может быть несколько подмаршрутов, и вы можете использовать маршрутизатор для навигации между состояниями в вашем приложении.

Слой представления отвечает за рисование элементов на экране. Ember.js имеет сложную систему для создания, управления и рендеринга иерархии представлений, которые подключаются к DOM браузера. Представления отвечают за реагирование на пользовательские события, такие как щелчки, перетаскивание и прокрутка, а также за обновление содержимого DOM при изменении данных, лежащих в основе представления.

Ember.js использует Handlebars.js в качестве механизма шаблонов. Handlebars.js предоставляет возможности, необходимые для эффективного создания семантических шаблонов без каких-либо проблем.

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

Ember включает в себя отличный маршрутизатор и дополнительный уровень данных, называемый данными ember. В отличие от фреймворков AngularJS и BackboneJS, которые имеют очень минимальный уровень данных (коллекция / модель Backbone и ресурс $ Angular), Ember выходит из коробки с полным модулем данных, который действительно хорошо интегрируется с серверной частью Ruby-on-Rails или любой другой RESTful JSON API, который следует простому набору соглашений. Он также обеспечивает поддержку настройки фикстур для разработки на основе ложного API и тестирования.

Когда дело доходит до дизайна Ember.js, производительность является главной целью. Такие концепции, как цикл выполнения, который гарантирует, что обновленные данные вызывают только одно обновление DOM, даже если один и тот же фрагмент данных обновлялся несколько раз, наряду с кэшированием вычисленных свойств и возможностью предварительной компиляции шаблонов HandleBars во время сборки или на вашем сервере, помогает загружать и поддерживать работу вашего приложения быстро.

AngularJS и EmberJS — похожие фреймворки на нескольких уровнях, но также разные в нескольких элементах.AngularJS, например, будет отображать большой набор статических данных быстрее, чем EmberJS, но EmberJS упростит добавление интерактивности к этому большому набору данных и будет более эффективно обрабатывать изменения. Более того, хотя оба являются самоуверенными фреймворками, EmberJS занимает несколько более сильную позицию, чем AngularJS, что может затруднить выполнение некоторых задач по переносу существующего приложения. В конце концов, у любой архитектуры есть свои компромиссы, и определение того, какой фреймворк подходит вам, просто вопрос оценки потребностей вашего приложения в сравнении с сильными сторонами каждого фреймворка.

«Ember CLI» — это инструмент командной строки для быстрого создания структуры веб-приложений. Интерфейс командной строки — очень полезный инструмент, который, вероятно, станет стандартным способом создания приложений ember в будущем. Использование Ember CLI немного меняет способ написания приложения.

Сначала вы должны загрузить и установить «node.js» на свой компьютер.

После установки узла вы можете получить ember-CLI, открыв командную строку и запустив:

 $ npm install -g ember-cli 

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

 $ ember новое имя-проекта 

Это создаст папку с именем Release со всем необходимым для начала кодирования.Измените текущий каталог на выпуски и запустите:

 $ ember server 

Теперь вы сможете посетить « http: // localhost: 4200 » и увидеть очень простую страницу.

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

Прежде всего давайте выясним, что подразумевается под Equivalence Partitioning (EP). Основная идея EP довольно проста. Если вы ожидаете одинакового результата от двух тестов, достаточно запустить один из них. Но эта идея основана на двух предположениях.

1. Каждый тестовый вход можно разделить на несколько классов.

2. Система обрабатывает все возможные входные значения в классе точно так же, как и все остальные входные значения в классе.

(Обратите внимание, что результаты тестирования также могут рассматриваться как те же, что и выше)

Например: Банковская система принимает клиентов в возрасте 55 лет и младше. Все остальные потенциальные клиенты не принимаются. Возрасты вводятся в тестируемую систему целыми годами.

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

1. Будут приняты клиенты в возрасте 55 лет и младше (мы называем этот класс действительным классом)

2. Клиенты в возрасте 56 лет и старше будут отклонены (мы назовите этот класс недопустимым классом)

При использовании EP в приведенном выше примере мы можем протестировать систему со следующими тестовыми значениями.

1. 15 для представления действительного класса

2. 75 для представления недопустимого класса

Обратите внимание, что приведенные выше значения выбраны произвольно из-за предположений, которые мы делаем в отношении метода EP. Также можно было выбрать значения 20 и 80 или 40 и 65.

Давайте узнаем, что такое анализ граничных значений (BVA). Во время тестирования было обнаружено, что некоторые дефекты, казалось, группировались вокруг значений, очерчивающих классы эквивалентности (границы). Границы включаются в программный код во время программирования.В приведенном выше примере с акцентом на границу «младше или равной 55 годам» код может говорить как «ЕСЛИ возраст <= 55».

Поскольку эта граница является кодом, здесь наиболее вероятно может произойти ошибка программирования. В методе тестирования анализа граничных значений (BVA) это означает тестирование с тестовыми значениями на, чуть ниже и чуть выше границы для обнаружения любой возможной ошибки программирования, сделанной в рациональном операторе (<, <=, =,>,> =, < >). Дефект мог существовать относительно ошибок программирования рационального оператора в знаке <=.Этот оператор мог быть ошибочно запрограммирован как>,> =, =, <, <> или = вместо <=. Давайте проверим, можно ли найти ошибку оператора, используя три значения с учетом BVA.

Вкратце, использование BVA сводится к следующему:

1. Определите классы эквивалентности.

2. Определите граничные значения.

3. Задайте тестовые примеры, используя три значения для каждой границы.

Но BVA часто используется в тестировании черного ящика, и профессионалы в области тестирования не имеют представления о реализации функционального дизайна, приведенного выше. Пример также может быть закодирован как «IF age <56».Если да, то давайте найдем те же три значения, достаточные для обнаружения неисправности.

Как показано в таблице выше, если «<> 56» было (ошибочно) запрограммировано вместо предполагаемого «<56», фактические результаты и ожидаемые результаты идентичны для всех трех тестовых случаев BVA. Следовательно, ошибка не будет обнаружена при тестировании черного ящика.

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

Определите классы эквивалентности.

Согласно примеру
IF Age <= 55 является допустимым классом. (Возраст <56)
ЕСЛИ Возраст> 55 — недопустимый класс.
Получите ближайшее значение для граничного значения из каждого допустимого и недопустимого класса.
Из действительного EP (55)
Из недействительного EP (56)
Получите следующее ближайшее значение для выбранных значений на шаге № 2.
Из действительного EP (54)
Из недействительного EP (57)
Задайте тестовые случаи, используя четыре тестовых значения на границу.

Давайте применим определенные тестовые значения для примера.

При добавлении дополнительного тестового значения (57) неисправность (вместо «<» программируется «<>»), даже при использовании анализа граничных значений в качестве метода черного ящика будет найдено .

Когда мы проводим тестирование BB с использованием методов EP и BVA, мы используем только три тестовых значения, и я доказал, что мы могли пропустить некоторые сбои. Чтобы избежать и увеличить вероятность обнаружения ошибок, мы могли бы использовать четыре тестовых значения, которые берутся из каждого действительного EP и недопустимого EP, ближайшего к граничному значению.

Практическое правило:

Выбраны четыре тестовых значения:

· Два значения из действительного EP, которые наиболее близки к граничному значению,

· Два значения из недопустимого EP, которые наиболее близки к граничному значению
,

Начало работы с Ember — Изучение веб-разработки

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

Предварительные требования:

Как минимум рекомендуется, чтобы вы были знакомы с основными языками HTML, CSS и JavaScript, а также владели терминалом / командной строкой.

Более глубокое понимание современных функций JavaScript (таких как классы, модули и т. Д.) Будет чрезвычайно полезным, поскольку Ember активно их использует.

Цель: Чтобы узнать, как установить Ember и создать начальное приложение.

Ember — это инфраструктура компонентных служб, которая фокусируется на общем опыте разработки веб-приложений, сводя к минимуму тривиальные различия между приложениями, при этом являясь современным и легким слоем поверх собственного JavaScript. Ember также имеет огромную обратную и прямую совместимость, чтобы помочь компаниям оставаться в курсе последних версий Ember и последних соглашений, основанных на сообществе.

Что значит быть структурой компонент-сервис? Компоненты — это отдельные наборы поведения, стиля и разметки — очень похожие на то, что предоставляют другие интерфейсы, такие как React, Vue и Angular.Сторона службы обеспечивает долговременное общее состояние, поведение и интерфейс для интеграции с другими библиотеками или системами. Например, Маршрутизатор (который будет упомянут позже в этом руководстве) — это служба. Компоненты и сервисы составляют большую часть любого приложения EmberJS.

Как правило, EmberJS хорошо работает для создания приложений, которым требуются одна или обе из следующих черт:

  • Одностраничные приложения, включая нативные веб-приложения и прогрессивные веб-приложения (PWA)
    • Ember лучше всего работает, когда он представляет собой весь интерфейс вашего приложения.
  • Повышение сплоченности многих технологических стеков команд
    • «Лучшие практики», поддерживаемые сообществом, позволяют ускорить долгосрочную разработку.
    • Ember имеет четкие условные обозначения, которые полезны для обеспечения согласованности и помогают членам команды быстро освоиться.

Ember с надстройками

EmberJS имеет архитектуру подключаемых модулей, что означает, что надстройки могут быть установлены и обеспечивают дополнительную функциональность без особой настройки, если таковая имеется.

Примеры включают:

  • ПРЕДВАРИТЕЛЬНАЯ ИНФОРМАЦИЯ: Отображение статического веб-сайта для блогов или маркетингового контента.
  • FastBoot: рендеринг на стороне сервера, включая улучшение поисковой оптимизации (SEO) или повышение производительности начального рендеринга сложных, высокоинтерактивных веб-страниц.
  • empress-blog: создание постов в блогах с уценкой при оптимизации для SEO с помощью PREmber.
  • ember-service-worker: настройка PWA, чтобы приложение можно было установить на мобильных устройствах, как и приложения из соответствующего магазина приложений устройства.

Собственные мобильные приложения

Ember также можно использовать с собственными мобильными приложениями с собственным мобильным мостом к JavaScript, например, предоставляемым Corber.

EmberJS — один из самых самоуверенных интерфейсных фреймворков. Но что значит быть самоуверенным? В Ember мнения — это набор соглашений, которые помогают повысить эффективность разработчиков за счет того, что им приходится изучать эти соглашения. Поскольку соглашения определены и распространены, мнения, поддерживающие эти соглашения, помогают уменьшить мелкие различия между приложениями — общая цель для всех самоуверенных фреймворков на любом языке и в любой экосистеме.Таким образом, разработчикам становится проще переключаться между проектами и приложениями без необходимости полностью заново изучать архитектуру, шаблоны, соглашения и т. Д.

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

Ember основан на технологиях JavaScript и представляет собой тонкий слой поверх традиционного объектно-ориентированного программирования, при этом позволяя разработчикам использовать методы функционального программирования.

Ember использует два основных синтаксиса:

  • JavaScript (или, опционально, TypeScript)
  • Собственный язык шаблонов Ember, который частично основан на Handlebars.

Язык шаблонов используется для оптимизации сборки и выполнения, которые иначе были бы невозможны. Что наиболее важно, это надмножество HTML — это означает, что любой, кто знает HTML, может внести значимый вклад в любой проект Ember с минимальным страхом взлома кода.Дизайнеры и другие лица, не являющиеся разработчиками, могут вносить свой вклад в шаблоны страниц без каких-либо знаний JavaScript, а интерактивность может быть добавлена ​​позже.

Этот язык также обеспечивает более легкую полезную нагрузку ресурсов благодаря компиляции шаблонов в «байтовый код», который может быть проанализирован быстрее, чем JavaScript. Glimmer VM обеспечивает чрезвычайно быстрое отслеживание изменений DOM без необходимости управлять и различать кэшированное виртуальное представление (что является распространенным подходом к уменьшению медленного ввода-вывода изменений DOM).

Для получения дополнительной информации о технических аспектах виртуальной машины Glimmer в репозитории github есть некоторая документация — в частности, могут быть интересны ссылки и валидаторы.

Все остальное в Ember — это всего лишь JavaScript. В частности, классы JavaScript. Именно здесь вступает в игру большинство «рамочных» частей, поскольку существуют суперклассы, где каждый тип объекта имеет различное назначение и другое ожидаемое местоположение в вашем проекте.

Вот демонстрация влияния Ember на JavaScript в типичных проектах:
Гэвин Демонстрирует, как <20% написанного JS специфично для Ember.

Остальной материал Ember, который вы найдете здесь, состоит из многостраничного руководства, в котором мы создадим версию классического примера приложения TodoMVC, научив вас использовать основы фреймворка Ember вместе с способ. TodoMVC — это базовое приложение для отслеживания дел, реализованное во многих различных технологиях.

Вот завершенная версия Ember для справки.

Примечание о TodoMVC и специальных возможностях

У проекта TodoMVC есть несколько проблем с точки зрения соблюдения доступных / стандартных веб-практик.В семействе проектов TodoMVC есть несколько открытых проблем на GitHub:

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

Тем не менее, поскольку в этом руководстве основное внимание уделяется стороне JavaScript при создании небольшого веб-приложения, ценность TodoMVC заключается в предоставлении готового CSS и рекомендуемой структуры HTML, что устраняет небольшие различия между реализациями, что упрощает сравнение.Позже в этом руководстве мы сосредоточимся на добавлении кода в наше приложение, чтобы исправить некоторые из самых серьезных ошибок TodoMVC.

Ember использует инструмент интерфейса командной строки (CLI) для создания и формирования частей вашего приложения.

  1. Перед установкой ember-cli вам потребуются установленные node и npm. Перейдите сюда, чтобы узнать, как установить node и npm, если у вас их еще нет.

  2. Теперь введите в терминал следующее, чтобы установить ember-cli:

     npm install -g ember-cli 

    Этот инструмент предоставляет программу ember в вашем терминале, которая используется для создания, сборки, разработки, тестирования и формирования вашего приложения (запустите ember --help , чтобы получить полный список команд и их параметров).

  3. Чтобы создать новое приложение, введите в терминале следующее. Это создает новый каталог внутри текущего каталога, в котором вы находитесь, с именем todomvc, содержащий каркас для нового приложения Ember. Убедитесь, что вы перешли в нужное место в терминале, прежде чем запускать его. (Хорошими предложениями являются каталоги «рабочего стола» или «документов», чтобы их было легко найти):

    Или в Windows:

      npx ember-cli новый todomvc  

Создает готовую к работе среду разработки приложений, которая по умолчанию включает следующие функции:

  • Сервер разработки с живой перезагрузкой.
  • Плагин-архитектура, которая позволяет сторонним пакетам значительно улучшить ваше приложение.
  • Новейший JavaScript через интеграцию Babel и Webpack.
  • Автоматизированная среда тестирования, которая запускает ваши тесты в браузере, что позволяет тестировать как пользователь .
  • Транспиляция и минификация как CSS, так и JavaScript для производственных сборок.
  • Соглашения для минимизации различий между приложениями (что упрощает переключение мысленного контекста).

Прежде чем продолжить работу с новым проектом, вам понадобится редактор кода. Если у вас еще нет настроенного редактора, в The Ember Atlas есть несколько руководств по настройке различных редакторов.

Установка общих ресурсов для проектов TodoMVC

Установка общих ресурсов, как мы собираемся сделать, обычно не является обязательным шагом для новых проектов, но позволяет нам использовать существующий общий CSS, поэтому нам не нужно попробуйте угадать, какой CSS нужен для создания стилей TodoMVC.

  1. Сначала войдите в свой каталог todomvc в терминале, например, используя cd todomvc в macOS / Linux.

  2. Теперь выполните следующую команду, чтобы разместить в приложении общий CSS-код todomvc:

      npm install --save-dev todomvc-app-css todomvc-common  
  3. Затем найдите файл ember-cli-build.js в каталоге todomvc (он прямо внутри корня) и откройте его в выбранном вами редакторе кода.ember-cli-build.js отвечает за настройку деталей о том, как построен ваш проект, включая объединение всех ваших файлов вместе, минимизацию ресурсов и создание исходных карт с разумными значениями по умолчанию, поэтому вам обычно не нужно беспокоиться об этом файле.

    Однако мы добавим строки в файл ember-cli-build.js для импорта наших общих файлов CSS, чтобы они стали частью нашей сборки без необходимости явно @import их в файл app.css (это потребует перезаписи URL во время сборки и, следовательно, будет менее эффективным и более сложным в настройке).

  4. В ember-cli-build.js найдите следующий код:

      let app = new EmberApp (по умолчанию, {
        
      });  
  5. Перед сохранением файла добавьте под ним следующие строки:

      app.import ('node_modules / todomvc-common / base.css');
      app.import ('node_modules / todomvc-app-css / index.css');  

    Для получения дополнительной информации о том, что делает ember-cli-build.js , а также о других способах настройки сборки / конвейера, в руководствах Ember есть страница, посвященная надстройкам и зависимостям.

  6. Наконец, найдите app.css , расположенный в app / styles / app.css , и вставьте следующее:

     : фокус,
    .view label: фокус,
    .todo-list li .toggle: focus + label,
    .toggle-all: focus + label {
      
      наброски: # d86f95 solid! important;
    }  

Этот CSS переопределяет некоторые стили, предоставляемые пакетом todomvc-app-css npm, что позволяет видеть фокус клавиатуры. Это в некоторой степени способствует исправлению одного из основных недостатков доступности стандартного приложения TodoMVC.

Запуск сервера разработки

Вы можете запустить приложение в режиме development , набрав следующую команду в своем терминале, находясь внутри каталога todomvc :

Это должно дать вам результат, подобный следующему:

 Успешная сборка (190 мс) - обслуживание на http: // localhost: 4200 /

Самые медленные узлы (totalTime> = 5%) | Итого (средн.)
----------------------------------------- + -------- ---
BroccoliMergeTrees (17) | 35 мс (2 мс)
Пакет / активы / поставщик.js (1) | 13 мс
Concat: стили / активы / вендор ... (1) | 12 мс 

Сервер разработки запускается по адресу http: // localhost: 4200 , который вы можете посетить в своем браузере, чтобы проверить, как выглядит ваша работа на данный момент.

Если все работает правильно, вы должны увидеть такую ​​страницу:

Пока все хорошо. Мы подошли к тому моменту, когда мы можем начать создавать наше примерное приложение TodoMVC в Ember. В следующей статье мы рассмотрим создание структуры разметки нашего приложения как группы логических компонентов.

Подробное сравнение JS-фреймворков

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

Когда дело доходит до разработки приложений, разработчики используют довольно много фреймворков для разработки бесшовных решений.И наиболее широко используемые инструменты JavaScript — это React JS и Ember JS. Но в Интернете ведутся дискуссии о том, какой из них лучше, чем другой. Особенно те, кто ищет нанять разработчиков React JS в Индии, больше озабочены этими двумя инструментами.

Сегодня мы рассмотрим основные функции, преимущества, недостатки и простое сравнение React Js и Ember JS. Если вы искали лучший инструмент для использования, читайте дальше, чтобы узнать о различных аспектах двух инструментов, чтобы вы могли выбрать тот, который соответствует вашим потребностям и бюджету.

Итак, начнем без лишних слов.

Сравнение React JS и Ember JS —

1. Производительность

React JS —

React — это библиотека JavaScript с открытым исходным кодом, которая предлагает полный пакет экономичной архитектуры и рабочего процесса на основе компонентов. Таким образом, это считается легкой платформой, которая обычно работает на уровне представления, дополняя многочисленные элементы приложения. Кроме того, когда у вас есть различные элементы, это позволяет повторно использовать компоненты и отображать страницы JavaScript.Все это способствует его высокой скорости и отличным характеристикам.

Ember JS —

Ember, огромная библиотека данных, отстает от легких фреймворков, таких как React, и работает немного медленно. Это позволяет создавать крупномасштабные приложения с регулярными обновлениями, поскольку обнаружение изменений происходит медленнее. Таким образом, это влияет на рендеринг, делая его впервые очень медленным. Поскольку существует бесчисленное множество компонентов, Ember имеет дело с самыми сложными функциями, а показатель производительности отличается от других.

Читайте также: React vs Angular Что лучше и как

2. Архитектура

React JS-

В React JS нет архитектуры по умолчанию, поэтому вам придется искать в зависимости от внешних библиотек, таких как Redux и Flux. Архитектура React with Flux обычно используется в комбинации для разработки веб-приложений. Если вы хотите построить бесшовную архитектуру, React JS — отличный вариант, который вы можете использовать для разработки клиентских веб-приложений.Разработчики могут положиться на комбинацию React и Flux для разработки компетентного веб-приложения и предоставить пользователям потрясающий пользовательский интерфейс.

Эмбер JS-

Когда вы работаете с последней версией Ember, она поставляется с архитектурой компонент-сервис. Однако предыдущая версия Ember следовала шаблону MVC. Если вы хотите создавать приложения с большим количеством нативных функций, то Ember может быть лучшим выбором. Веб-приложения с собственными функциями делают их более уникальными, и самое приятное то, что Ember также поддерживает функцию URL-адреса в структуре графического пользовательского интерфейса (GUI).

Можно сказать, что Ember JS способен управлять взаимодействием приложения с данными. Он может приспособиться к быстрому процессу разработки. Кроме того, он позволяет использовать множество представлений, асинхронное программирование и использовать передовые принципы, необходимые для современных веб-приложений.

Читайте также: PWA — новая доза витаминов для рынка электронной коммерции

3. Код ремонтопригодности

React JS —

Еще одним основанием для сравнения является ремонтопригодность кода, когда React JS может поддерживать структуру кода приложения благодаря своей компонентной архитектуре.Все это снижает сложность кода и снижает время, затрачиваемое на разработку приложений. При разработке приложений с использованием React JS вы можете акцентировать внимание на аспектах пользовательского интерфейса. Кроме того, вы можете создавать собственные перехватчики и повторно использовать условную логику снова и снова.

Более того, вы можете изолировать компоненты приложения определенным образом, который поддерживает разработку приложений React JS. Вы можете создавать легко тестируемые компоненты и разделять приложения на определенные части для доступности.

Эмбер JS-

Если вы хотите следовать передовым методам кодирования, то Ember JS может стать отличным выбором, поскольку он предпочитает соглашения, а не конфигурацию.Когда вы используете Ember CLI и встроенные инструменты для разработки своих приложений, это помогает вам сохранить тот же макет проектов и следовать стандартным настройкам.

Конфигурация Ember JS поддерживает код и помогает снизить сложность кода. Таким образом, обеспечивается правильная организация кода. Все это способствует беспроблемной отладке. Более того, он позволяет получить доступ к любому коду, который легко понять и не требует помощи разработчика.

4. Пользовательский опыт

React JS —

React JS оптимизирует UX, правильно согласовывая методы разработки и дизайн.Здесь вы найдете несколько проектов, ориентированных на разработчиков, в которых основное сообщество неуклонно работает над обеспечением единообразия взаимодействия с пользователем. Выделенные разработчики React JS в Индии должны проявлять осторожность, не забивая веб-приложения ненужными кодами, что называется общей абстракцией. Самое приятное то, что состав компонентов в React Js определен таким образом, что малейшие изменения не вызывают никаких проблем и не нарушают целостность кодовой базы. Таким образом, обеспечивается простая совместимость.

Ember JS —

Поскольку Ember JS похож на огромную библиотеку данных и инструментов, вы получите здесь множество инструментов; так что вы можете использовать их все для разработки веб-приложения по своему усмотрению. Если вы хотите разработать предварительно тестируемый пользовательский интерфейс, вы можете создать его, используя интерфейс командной строки Ember и надстройки. Они действуют как макеты рабочих и API для тестирования пользовательского интерфейса. Когда вы используете Ember CLI, у вас есть возможность использовать эксклюзивные функции, которые не предоставляются по умолчанию. Кроме того, вы можете использовать для добавления дополнительных многоразовых элементов пользовательского интерфейса.

Более того, Ember JS поставляется с архитектурой на основе продукта, которая имеет упреждающие функции, что делает его способным обеспечить лучший пользовательский опыт в больших приложениях.

Читайте также: Разница между UI и UX-дизайном

5. Варианты использования

React JS —

  • React JS используется для создания одностраничных приложений
  • Он предлагает интерактивные пользовательские интерфейсы
  • Инструмент обеспечивает точность поисковой системы
  • Если вы ищете легкое приложение для работы в реальном времени, React JS предлагает лучшие возможности.
  • Если вас беспокоит уровень дизайна и представления, вы должны рассмотреть React JS для разработки мобильных и веб-приложений .

Ember JS —

  • Ember JS используется для создания приложений с одним приложением
  • Если вы планируете долгосрочные проекты, рассмотрите Ember JS, так как он подходит для долгосрочных проектов
  • Он обеспечивает отличную платформу для бесшовной интеграции сложных функций.

Читайте также: React JS vs Angular JS

6. Поддержка сообщества

React JS —

Являясь популярной библиотекой JavaScript, React JS любят миллионы разработчиков по всему миру.Благодаря своей простоте вы найдете отличную поддержку сообщества. React JS имеет более 150 звезд и вопросов на GitHub.

Эмбер JS-

Ember JS имеет прочную основу и стабильную поддержку сообщества. Таким образом, это популярная библиотека, которую предпочитают разработчики и технические гиганты. Он поставляется с более чем 20 тысячами звезд на GitHub и вопросами о переполнении стека, которые помогли ему закрепиться в качестве платформы для разработки приложений среди разработчиков.

Читайте также: Преимущества найма преданных разработчиков

Преимущества и недостатки React Js и Ember Js

Преимущества React JS

  • Когда дело доходит до React JS, компоненты можно легко импортировать без особой зависимости.
  • Вы получаете простой дизайн интерфейса вместе с легким для понимания и изучения API.
  • Создание универсальных веб-приложений возможно благодаря рендерингу на стороне сервера.
  • Если вы рассматриваете возможность отладки JavaScript, React JS — лучший вариант.
  • React JS допускает повторное использование кода.
  • Вы получите отличную поддержку от среды React, если хотите улучшить производительность сложных и проблемных компонентов.
  • Полностью компонентная архитектура снижает фрагментацию кода.

Недостатки React JS

  • React JS нельзя назвать законченным фреймворком. Вместо этого это библиотека.
  • React JS требует крутого обучения, многословного и сложного. Его документация сложна.
  • Требуется много настроек, если вы хотите интегрировать React JS с обычным фреймворком MVC. Отличный пример этого — Rails.

Читайте также: Что такое зона Ar?

Кому подойдет React JS?

Для всех, кто ищет скорость и эффективность по времени, React JS может стать отличным выбором.React JS отличается от других языков благодаря модульной структуре и помогает упростить весь процесс, вытаскивая части пользовательского интерфейса, а затем просто переделывая его. Поскольку React JS имеет простую библиотеку, это снижает проблемы со стороны веб-приложений.

Преимущества Ember JS

  • Ember JS поставляется с мощным уровнем данных, который легко интегрируется с Java.
  • Он предлагает объектную модель, которая представляет базовые данные и облегчает наблюдение за ключом.
  • Ember Js поддерживает URL. Кроме того, вы получаете удобную документацию и API.
  • Когда дело доходит до использования Ember JS, вы получаете возможность работать с лучшими встроенными практиками. Здесь вы сможете использовать мудрость сообщества разработчиков программного обеспечения и воспользоваться опытом других.
  • Для тех, кто думает долгое время, Ember JS — лучший фреймворк, над которым можно работать, поскольку вы получаете стабильность без какого-либо застоя.
  • Ember Js предлагает быструю загрузку, что помогает при рендеринге на стороне сервера, что делает ваше приложение доступным для поисковых систем, curl и других парсеров.

Недостатки Ember JS

  • При использовании Ember JS вы можете столкнуться с кучей устаревшего контента, который может больше не работать.
  • Вы не можете повторно использовать компоненты, когда работаете над фреймворком Ember Js.
  • Ember JS — один из самых жестких и тяжелых фреймворков.
  • Не подходит для небольших проектов.

Хотите нанять преданных делу разработчиков? Проконсультируйтесь с нами сейчас

Кому следует использовать Ember?

Ember JS — лучший фреймворк для амбициозных разработчиков, желающих работать над долгосрочными проектами.Сегодня вы увидите множество перспективных приложений, доступных на рынке, и все они в основном созданы с использованием фреймворка Ember Js. Поскольку Ember JS поставляется со всеми инструментами, это отличный выбор для тех, кто хочет, чтобы все работало хорошо.

Кто побеждает в игре?

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

Что ж, многие считают React JS сверхбыстрым подходом к разработке приложений, и он даже не ложится тяжелым грузом на ваш карман. Однако это зависит от нанятых вами агентств. Между тем, если вы ищете Hire React JS Developers India , подумайте о Graffersid. Это помогло технологическим стартапам вырасти в 5 раз, обеспечивая исключительную ценность. Вы полагаетесь на их опыт и знания в своем проекте.

Ember.js: идеальный фреймворк для веб-приложений

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

В нашем примере приложение будет роликом для игры в кости, включая возможность бросать несколько кубиков и просматривать историю всех бросков кубиков, которые были выполнены до настоящего времени.Полностью рабочая версия этого приложения доступна на Github

.

Фреймворк Ember.js объединяет множество современных концепций и технологий JavaScript в один пакет, включая, помимо прочего:

  • Использование транспилятора Babel для поддержки ES2016 во всем.
  • Поддержка тестирования на уровнях Unit, Integration и Acceptance в стандартной комплектации, при поддержке Testem и QTest.
  • Создание активов с использованием Broccoli.js.
  • Поддержка перезагрузки в реальном времени для сокращения времени цикла разработки.
  • Создание шаблонов с использованием синтаксиса разметки Handlebars.
  • URL Routing — первая разработка, обеспечивающая полную поддержку глубинных ссылок.
  • Полный уровень данных, построенный на основе JSON API, но подключаемый для любого необходимого доступа к API.

Для работы с Ember.js предполагается, что у вас установлена ​​последняя версия Node.js и npm. В противном случае их можно загрузить и установить с веб-сайта Node.js.

Также следует отметить, что Ember — это чисто интерфейсный фреймворк.У него есть несколько способов взаимодействия с сервером по вашему выбору, но этот бэкэнд никоим образом не обрабатывается самим Ember.

Представляем ember-cli

Большая часть возможностей Ember.js заключается в его интерфейсе командной строки (CLI). Этот инструмент, известный как ember-cli, обеспечивает большую часть жизненного цикла разработки приложения Ember.js, начиная с создания приложения, добавляя в него функциональные возможности, вплоть до запуска наборов тестов и запуска реального проекта в режиме разработки.

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

Первое, что нам нужно сделать, это убедиться, что интерфейс командной строки Ember.js правильно установлен и обновлен. Это делается путем установки из npm следующим образом:

  $ npm install -g ember-cli
  

, и мы можем проверить, что он был успешно установлен, выполнив следующую команду:

  $ ember --version
уголек-cli: 2.15.0-beta.1
узел: 8.2.1
ОС: Дарвин x64
  

Создание вашего первого приложения Ember.js

После установки ember-cli вы готовы приступить к созданию своего приложения. Это первое место, где мы будем использовать инструмент командной строки Ember.js — он создает всю структуру приложения, настраивая все готовое к запуску.

  $ ember новый игра в кости
установка приложения
  создать .editorconfig
  создать .ember-cli
  создать .eslintrc.js
  создать .travis.yml
  создать .watchmanconfig
  создать README.мкр
  создать app / app.js
  создать приложение / компоненты / .gitkeep
  создать приложение / контроллеры / .gitkeep
  создать приложение / помощники / .gitkeep
  создать приложение / index.html
  создать приложение / модели / .gitkeep
  создать приложение / resolver.js
  создать app / router.js
  создать приложение / маршруты / .gitkeep
  создать приложение / стили / app.css
  создать приложение / шаблоны / application.hbs
  создать приложение / шаблоны / компоненты / .gitkeep
  создать config / environment.js
  создать config / targets.js
  создать ember-cli-build.js
  создать .gitignore
  создать package.json
  создать паблик / кроссдомен.xml
  создать общедоступный / robots.txt
  создать testem.js
  создать тесты / .eslintrc.js
  создать тесты / помощники / destroy-app.js
  создать tests / helpers / module-for-accept.js
  создать тесты / помощники / resolver.js
  создать тесты / помощники / start-app.js
  создать тесты / index.html
  создать тесты / интеграция / .gitkeep
  создать тесты / test-helper.js
  создать тесты / unit / .gitkeep
  создать поставщика / .gitkeep
NPM: установленные зависимости
Успешно инициализирован git.

$
  

Это привело к созданию всего приложения, готового к запуску.Он даже настроил Git в качестве системы управления версиями для отслеживания вашей работы.

Примечание: При желании вы можете отключить интеграцию Git и предпочесть Yarn вместо npm. Справка по инструменту описывает это и многое другое.

А теперь посмотрим, как это выглядит. Запуск приложения Ember для целей разработки — опять же — также выполняется с помощью ember-cli:

  $ cd игра в кости
$ угольная подача
Сервер Livereload на http: // localhost: 49153
'instrument' импортируется из внешнего модуля 'ember-data / -debug', но никогда не используется
Предупреждение: игнорирование исходной карты ввода для vendor / ember / ember.debug.js, потому что ENOENT: нет такого файла или каталога, откройте '/Users/coxg/source/me/writing/repos/dice-roller/tmp/source_map_concat-input_base_path-2fXNPqjl.tmp/vendor/ember/ember.debug.map '
Предупреждение: игнорирование исходной карты ввода для vendor / ember / ember-testing.js, потому что ENOENT: нет такого файла или каталога, откройте '/ Users / coxg / source / me / writing / repos / dice-Roller / tmp / source_map_concat-input_base_path-Xwpjztar .tmp / vendor / ember / ember-testing.map '

Успешная сборка (5835 мс) - обслуживание на http: // localhost: 4200 /



Самые медленные узлы (totalTime => 5%) | Итого (средн.)
---------------------------------------------- + --- ------------------
Вавилон (16) | 4625 мс (289 мс)
Накопительный пакет (1) | 445 мс
  

Теперь мы готовы к работе.Приложение работает на http: // localhost: 4200 и выглядит так:

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

Давай попробуем?

На начальной странице уже сказано, что делать, так что давайте сменим главную страницу и посмотрим, что произойдет. Мы собираемся изменить файл app / templates / application.hbs , чтобы он выглядел следующим образом.

  Это мое новое приложение.

{{торговая точка}}
  

Примечание. Тег {{outlet}} является частью того, как работает маршрутизация в Ember. Мы поговорим об этом позже.

Первое, на что следует обратить внимание, это вывод ember-cli, который должен выглядеть следующим образом:

  файл изменен templates / application.hbs

Успешная сборка (67 мс) - обслуживание на http: // localhost: 4200 /

Самые медленные узлы (totalTime => 5%) | Итого (средн.)
---------------------------------------------- + --- ------------------
SourceMapConcat: Concat: Приложение (1) | 9 мс
SourceMapConcat: Concat: Поставщик / актив... (1) | 8 мс
SimpleConcatConcat: Concat: Производитель Sty ... (1) | 4 мс
Воронка (7) | 4 мс (0 мс)
  

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

Теперь посмотрим на браузер. Если у вас установлен и запущен LiveReload, вам даже не нужно обновлять браузер, чтобы это было возможно, иначе вам придется перезагрузить текущую страницу.

Не очень интересно, но мы добились этого без особых усилий с нашей стороны.

Кроме того, мы получаем полностью настроенный набор тестов, готовый к запуску. Неудивительно, что это также выполняется с помощью инструмента Ember, а именно:

  $ тлеющий тест
⠸ Building'instrument 'импортируется из внешнего модуля' ember-data / -debug ', но никогда не используется
⠴ BuildingWarning: игнорирование исходной карты ввода для vendor / ember / ember.debug.js, потому что ENOENT: нет такого файла или каталога, откройте '/ Users / coxg / source / me / writing / repos / dice-Roller / tmp / source_map_concat-input_base_path- S8aQFGaz.tmp / vendor / ember / ember.debug.map '
⠇ BuildingWarning: игнорирование исходной карты ввода для vendor / ember / ember-testing.js, потому что ENOENT: нет такого файла или каталога, откройте '/ Users / coxg / source / me / writing / repos / dice-Roller / tmp / source_map_concat-input_base_path- wO8OLEE2.tmp / vendor / ember / ember-testing.map '
убираться...
Создан проект успешно. Хранится в "/Users/coxg/source/me/writing/repos/dice-roller/tmp/class-tests_dist-PUnMT5zL.tmp".
ок 1 PhantomJS 2.1 - ESLint | приложение: app.js
ok 2 PhantomJS 2.1 - ESLint | приложение: решатель.js
ok 3 PhantomJS 2.1 - ESLint | приложение: router.js
ok 4 PhantomJS 2.1 - ESLint | тесты: помощники / destroy-app.js
ok 5 PhantomJS 2.1 - ESLint | тесты: helpers / module-for-accept.js
ok 6 PhantomJS 2.1 - ESLint | тесты: помощники / resolver.js
ok 7 PhantomJS 2.1 - ESLint | тесты: помощники / start-app.js
ok 8 PhantomJS 2.1 - ESLint | тесты: test-helper.js

1..8






  

Обратите внимание, что в выходных данных говорится о PhantomJS. Это связано с тем, что существует полная поддержка интеграционных тестов, которые выполняются в браузере, и по умолчанию они выполняются без заголовка в браузере PhantomJS.Существует полная поддержка их запуска в других браузерах, если вы хотите, и при настройке непрерывной интеграции (CI) стоит сделать это, чтобы убедиться, что ваше приложение работает правильно во всех поддерживаемых браузерах.

Как устроено приложение Ember.js

Прежде чем мы приступим к написанию нашего приложения, давайте рассмотрим, как оно структурировано в файловой системе. Приведенная выше команда ember new создаст на вашем компьютере целую структуру каталогов с множеством различных частей.Понимание всего этого важно для эффективной работы с инструментом и создания потрясающих проектов.

На самом верхнем уровне вы увидите следующие файлы и каталоги:

  • README.md — это стандартный файл readme, описывающий приложение
  • package.json — это стандартный файл конфигурации npm, описывающий ваше приложение. Это используется в первую очередь для правильной установки зависимостей.
  • ember-cli-build.js — это конфигурация инструмента Ember CLI для работы нашей сборки
  • testem.js — это конфигурация тестовой среды. Это позволяет вам, помимо прочего, определять браузеры, которые следует использовать для запуска тестов в различных средах.
  • приложение / — это фактическая логика приложения. Здесь происходит многое, о чем будет рассказано ниже.
  • config / — это конфигурация для приложения
    • config / target.js — это список поддерживаемых браузеров. Это используется Babel для обеспечения того, чтобы Javascript транслировался таким образом, чтобы все они работали.
    • config / environment.js — это основная конфигурация для вашего приложения. Все, что необходимо приложению, но может варьироваться от одной среды к другой, должно быть помещено сюда.
  • public / — это любые статические ресурсы, которые вы хотите включить в свое приложение.Например, изображения и шрифты.
  • vendor / — сюда входят любые зависимости внешнего интерфейса, которые не управляются системой сборки
  • тестов / — Здесь проходят все тесты
    • тестов / модуль — это все модульные тесты для приложения
    • тесты / интеграция — это все интеграционные тесты для приложения

Общая структура страницы (включая сторонний контент)

Прежде чем мы забегаем слишком далеко вперед, давайте структурируем нашу страницу.В этом случае мы собираемся добавить фреймворк Materialize CSS, чтобы он выглядел лучше.

Добавить поддержку стороннего контента, подобного этому, можно несколькими способами:

  • Прямая ссылка на контент внешней службы, например CDN
  • Использование менеджера пакетов, такого как npm или Bower, чтобы установить его для нас
  • Включая его прямо в наше приложение.
  • Использование аддона Ember, если он есть

К сожалению, надстройка для Materialize еще не работает с последней версией Ember.js, поэтому вместо этого мы просто собираемся ссылаться на ресурсы CDN с нашей главной страницы. Для этого мы собираемся обновить app / index.html , который является основной структурой страницы, в которой отображается наше приложение. Мы собираемся просто добавить ссылки CDN для jQuery, Google Icon Font и Materialize.

    

Теперь мы можем обновить главную страницу, чтобы показать наш основной шаблон. Это делается путем редактирования app / templates / application.hbs , чтобы он выглядел так:

  

{{торговая точка}}

Это дает нам Materialize Nav в верхней части экрана с контейнером, содержащим упомянутый ранее тег {{output}} .

Это будет выглядеть так при посещении в вашем браузере:

Так что это за бирка розетка ? Ember работает на основе маршрутов, где каждый маршрут считается дочерним по отношению к другому маршруту. Самый верхний маршрут обрабатывается Ember автоматически и отображает шаблон app / templates / application.hbs .

Тег выхода указывает, где Ember будет отображать следующий маршрут в текущей иерархии, поэтому маршрут первого уровня отображается в этом теге в приложении .hbs , маршрут второго уровня отображается в этом теге в этом шаблоне первого уровня и так далее.

Создание нового маршрута

В приложении Ember.js каждая страница, которую можно посетить, доступна через Маршрут. Существует прямое соответствие между URL-адресом, который открывает браузер, и маршрутом, отображаемым приложением.

Самый простой способ убедиться в этом — на примере. Давайте добавим в наше приложение новый маршрут, позволяющий пользователю фактически бросить кости. Опять же, это делается с помощью инструмента ember-cli.

  $ ember создать свиток маршрута
установка маршрута
  создать приложение / маршруты / roll.js
  создать приложение / шаблоны / roll.hbs
обновление роутера
  добавить прокрутку маршрута
установка route-test
  создать tests / unit / routes / roll-test.js
  

Эта команда дала нам:

  • Обработчик маршрута — app / routes / roll.js
  • Шаблон для маршрута — app / templates / roll.hbs
  • Тест для маршрута — тестов / unit / routes / roll-test.js
  • Обновлена ​​конфигурация маршрутизатора, чтобы узнать об этом новом маршруте — app / router.js

Давайте посмотрим на это в действии. На данный момент у нас будет очень простая страница, позволяющая бросать несколько кубиков. Для этого обновите app / templates / roll.hbs следующим образом:

  
<форма>
{{торговая точка}}

Затем посетите http: // localhost: 4200 / roll и посмотрите результат:

Теперь нам нужно добраться сюда.В Ember это очень просто сделать с помощью тега link-to . Он берет (среди прочего) имя маршрута, на который мы отправляем пользователя, а затем отображает разметку, чтобы направить пользователя туда.

В нашем случае мы обновим app / templates / application.hbs , добавив в него следующее:

  
  

В результате панель заголовка выглядит следующим образом:

Эта новая ссылка затем ведет пользователя к маршруту «/ roll», который мы только что настроили, в точном соответствии с желанием.

Создание модульных компонентов

Если вы действительно протестируете приложение, вы заметите одну проблему. Открытие домашней страницы и переход по ссылке «/ roll» работают, но метки в форме не совпадают. Это связано с тем, что Materialize должен запускать некоторый JavaScript, чтобы разобраться, но динамическая маршрутизация означает, что страница не перезагружается. Здесь нам нужно немного помочь.

Введите компоненты. Компоненты — это части пользовательского интерфейса, которые имеют полный жизненный цикл и с которыми можно взаимодействовать.Они также позволяют вам создавать повторно используемые элементы пользовательского интерфейса, если вам это нужно — мы увидим это позже.

На данный момент мы собираемся создать единственный компонент, представляющий форму Roll Dice. Как всегда, создание компонента выполняется с помощью нашего инструмента ember-cli, как показано ниже:

  $ ember генерирует компонент ролл-кости
установка компонента
  создать приложение / компоненты / roll-dice.js
  создать приложение / шаблоны / компоненты / roll-dice.hbs
установка компонента-теста
  создать тесты / интеграция / компоненты / roll-dice-test.js
  

Это дало нам:

  • app / components / roll-dice.js — Код, обеспечивающий работу компонента
  • app / templates / components / roll-dice.hbs — Шаблон, определяющий, как он будет выглядеть
  • tests / integration / components / roll-dice-test.js — Тест для проверки правильности работы компонента

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

Обновите app / templates / components / roll-dice.hbs , чтобы он читался следующим образом:

  <форма>
    

А потом обновите app / templates / roll.hbs следующим образом:

  
{{игральная кость}}
{{торговая точка}}

Шаблон для нашего компонента — это точно такая же разметка, которую мы использовали ранее в нашем маршруте, и теперь наш маршрут значительно проще. Тег roll-dice — это то, что говорит Ember отрисовывать наш компонент в нужном месте.

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

Жизненный цикл компонента

Компоненты

Ember имеют определенный жизненный цикл, которому они следуют, с рядом перехватчиков, которые могут запускаться на разных этапах. Мы собираемся использовать хук didRender , который вызывается после рендеринга компонента — либо в первый раз, либо в любой последующий раз — чтобы попросить Materialize обновить метки в текстовых полях.

Это делается путем обновления кода компонента, находящегося в app / components / roll-dice.js , чтобы он выглядел так:

 
импортировать Ember из ember;

экспорт по умолчанию Ember.Component.extend ({
    didRender () {
        Materialize.updateTextFields ();
    }
});
  

Теперь каждый раз, когда вы посещаете маршрут «/ roll» — будь то путем глубокой ссылки на него или с помощью нашей ссылки в заголовке — этот код запускается, и Materialize обновляет метки, чтобы они работали правильно.

Привязка данных

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

Каждый фрагмент данных, с которым мы хотим взаимодействовать, существует в классе Component как собственное поле. Затем мы используем некоторые помощники для визуализации наших полей ввода в нашем компоненте, которые выполняют работу по привязке этих полей ввода к переменным компонента, чтобы мы могли взаимодействовать с ними напрямую, не беспокоясь о действиях DOM.

В этом случае у нас есть три поля, поэтому нам нужно добавить следующие три строки в app / components / roll-dice.js , внутри определения компонента:

  rollName: '',
    numberOfDice: 1,
    кол-во сторон: 6,
  

Затем мы обновляем наш шаблон для рендеринга с использованием помощников вместо непосредственного рендеринга HTML-разметки. Для этого замените теги следующим образом:

  
{{input placeholder = "Name" value = (mut rollName)}}
{{input placeholder = "Number of dice" type = "number" value = (mut numberOfDice)}}
{{input placeholder = "Количество сторон" type = "number" value = (mut numberOfSides)}}

Обратите внимание, что атрибут value имеет немного странный синтаксис.Этот синтаксис можно использовать для любого атрибута тега, а не только для значения и . Это можно использовать тремя способами:

  • Как строка в кавычках — значение используется как есть
  • Как строка без кавычек — значение заполняется из этого фрагмента данных в компоненте, но компонент никогда не обновляется
  • Как (mut ) — значение заполняется из этой части данных в компоненте, а компонент — mut , когда значение изменяется в браузере

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

Действия компонентов

Следующее, что мы хотим сделать, — это взаимодействовать с компонентом. В частности, было бы хорошо обрабатывать, когда нажимается наша кнопка «Бросить кости». Ember обрабатывает это с помощью действий — фрагментов кода в вашем компоненте, которые можно подключить к вашему шаблону. Действия просто определяются как функции в нашем классе компонентов внутри специального поля под названием actions , которые реализуют желаемую функциональность.

На данный момент мы просто собираемся сказать пользователю, что он хочет сделать, но на самом деле ничего не делать — это будет дальше.Это будет использовать действие On Submit в самой форме, что означает, что оно запускается, если они нажимают кнопку или , они нажимают Enter в одном из полей.

Наш блок кода действий внутри app / components / roll-dice.hbs будет выглядеть так:

  действий: {
        triggerRoll () {
            alert (`Прокрутка $ {this.numberOfDice} D $ {this.numberOfSides} как" $ {this.rollName} "`);
            вернуть ложь;
        }
    }
  

Мы возвращаем false , чтобы предотвратить всплытие событий.Это довольно стандартное поведение в приложениях HTML, и в этом случае важно, чтобы форма не перезагружала страницу.

Обратите внимание, что мы ссылаемся на наши поля, которые мы ранее определили для доступа к полям ввода. Здесь вообще нет доступа к DOM — все просто взаимодействует с переменными JavaScript.

Теперь нам просто нужно подключить это. В нашем шаблоне нам нужно сообщить тегу формы, что он должен запускать это действие, когда запускается событие onsubmit .Это просто добавление одного атрибута к тегу формы с помощью помощника Ember, чтобы связать его с нашим действием. Это выглядит следующим образом внутри app / templates / components / roll-dice.hbs :

  

Теперь мы можем нажать на кнопку, заполнив нашу форму, и получить всплывающее окно с предупреждением о том, что мы сделали.

Управление данными между клиентом и сервером

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

Наш желаемый поток здесь:

  • Пользователи указывают кубики, которые они хотят бросить
  • Пользователь нажимает кнопку «Бросить кости»
  • Браузер отправляет данные на сервер
  • Сервер бросает кости, запоминает результат и отправляет результаты обратно клиенту
  • Браузер отображает результаты броска костей

Звучит достаточно просто.И, конечно же, с Ember это действительно так.

Ember справляется с этим, используя встроенную концепцию магазина, заполненного моделями. Магазин — это единый источник знаний для всего приложения, а каждая Модель — это единый фрагмент информации в магазине. Все модели знают, как сохранить себя на сервере, а Магазин знает, как создавать модели и получать к ним доступ.

Передача управления от компонентов к маршрутам

На протяжении всего нашего приложения важно поддерживать правильную инкапсуляцию.Маршруты (и контроллеры, которые мы не рассмотрели) имеют доступ к магазину. Компонентов нет.

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

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

В логике нашего маршрута — app / routes / roll.js — нам нужно добавить следующий блок, чтобы зарегистрировать действие, которое мы собираемся выполнить.

  действий: {
    saveRoll: function (rollName, numberOfDice, numberOfSides) {
        alert (`Прокрутка $ {numberOfDice} D $ {numberOfSides} как" $ {rollName} "`);
    }
}
  

В логике нашего компонента — app / components / roll-dice.js — нам нужно запустить действие в нашем компоненте, когда мы сами запускаем. Это делается с помощью механизма sendAction внутри нашего уже существующего обработчика действий.

  triggerRoll () {
    this.sendAction ('бросок', this.rollName, this.numberOfDice, this.numberOfSides);
    вернуть ложь;
}
  
 
  

И, наконец, нам нужно подключить действие. Это делается в шаблоне маршрута — app / templates / roll.hbs — путем изменения способа визуализации нашего компонента:

  {{roll-dice roll = "saveRoll"}}
  

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

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

Сохраняется в магазине

Прежде чем мы сможем сохранять данные в нашем хранилище, нам нужно определить модель для их представления.Это делается с помощью нашего надежного инструмента ember-cli еще раз, чтобы создать структуру и затем заполнить ее.

Для создания класса модели выполняем:

  $ ember generate model roll
установка модели
  создать приложение / модели / roll.js
установка модельного теста
  создать тесты / unit / models / roll-test.js
  

Затем мы сообщаем нашей модели атрибуты, которые она должна понимать. Для этого нужно изменить app / models / roll.js , чтобы он выглядел следующим образом:

  импорт DS из 'ember-data';

экспортировать DS по умолчанию.Model.extend ({
    rollName: DS.attr ('строка'),
    numberOfDice: DS.attr ('число'),
    numberOfSides: DS.attr ('число'),
    результат: DS.attr ('число')
});
  

Вызов DS.attr определяет новый атрибут указанного типа, называемый Transform в Ember. Параметры по умолчанию здесь — «строка», «число», «дата» и «логическое значение», хотя при необходимости вы можете определить свои собственные.

Теперь мы можем использовать это для создания или катания. Это делается путем доступа к магазину из нашего действия, которое теперь находится в app / routes / roll.js :

  saveRoll: function (rollName, numberOfDice, numberOfSides) {
    пусть результат = 0;
    for (let i = 0; i  

Если мы попробуем это сделать, то теперь мы увидим, что нажатие кнопки Roll Dice вызывает сетевой вызов к нашему серверу.Это не удается, потому что наш сервер еще этого не ожидает, но все идет вперед.

Мы не фокусируемся здесь на серверной части, поэтому мы займемся этим. Если вам нужно разработать приложение Ember вообще без бэкэнда, есть варианты, такие как адаптер ember-localstorage, который будет работать полностью в браузере. В качестве альтернативы вам просто нужно написать соответствующий сервер и убедиться, что сервер и клиент размещены правильно, и все будет работать.

Загрузка из магазина

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

Ember неявно имеет маршрут под названием index , который используется для визуализации начальной страницы приложения. Если файлы для этого маршрута не существуют, то ошибка не возникает, а вместо этого ничего не отображается. Мы собираемся использовать этот маршрут для визуализации всех исторических роллов из нашего магазина.

Поскольку индексный маршрут уже неявно существует, нет необходимости использовать инструмент ember-cli - мы можем напрямую создавать файлы, и он уже подключен.

Наш обработчик маршрута войдет в app / routes / index.js и будет выглядеть следующим образом:

  импорт Ember из «уголька»;

экспорт по умолчанию Ember.Route.extend ({
    model () {
        вернуть this.get ('store'). findAll ('roll');
    }
});
  

Здесь наш маршрут имеет прямой доступ к магазину и может использовать метод findAll для загрузки каждого сохраненного рулона.Затем мы передаем их в шаблон с помощью метода model .

Затем наш шаблон перейдет в app / templates / index.hbs следующим образом:

  <таблица>
    
        
             Имя 
             Брошенные кости 
             Результат 
        
    
    
    {{#each model as | roll |}}
        
             {{ролл.rollName}} 
             {{roll.numberOfDice}} D {{roll.numberOfSides}} 
             {{roll.result}} 
        
    {{/каждый}}
    



{{торговая точка}}
  

Это может получить доступ к модели напрямую из маршрута, а затем выполнить итерацию по ней для создания строк таблицы. Тогда это будет выглядеть следующим образом:

Сводка

На данный момент, после относительно небольшой работы, мы разработали приложение, которое позволит нам бросать кости и просматривать историю всех бросков.Это включает в себя привязку данных из нашей формы, сохранение данных в хранилище и их чтение обратно, поддержку шаблонов для отображения всех страниц и полную маршрутизацию URL-адресов. Это приложение можно разработать с нуля менее чем за час.

Использование Ember может значительно повысить эффективность разработки веб-интерфейса. В отличие от таких библиотек, как React, Ember предоставляет вам весь набор функций, необходимых для создания полнофункционального приложения без каких-либо дополнительных инструментов.Добавление ember-cli и готовой настройки выводит это на новый уровень, делая процесс невероятно простым и безболезненным от начала до конца. В сочетании с поддержкой сообщества практически ничего нельзя сделать.

К сожалению, вставить Ember в существующий проект может быть сложно. Лучше всего это работает при запуске нового проекта. Вставить его в существующий может быть сложно или невозможно. Ember также работает из коробки с очень специфическим способом работы с бэкэндом, и если ваш существующий бэкэнд не соответствует этому, вы можете в конечном итоге потратить много времени и усилий либо на переработку бэкэнда, либо на поиск / написание плагинов. поговорить с существующим.

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