Meteor вместо Next.js: создаем NFT-маркетплейс
Наконец это стало реальностью: NFT-маркетплейс, созданный с помощью Meteor. Это приложение предназначено сугубо для демонстрационных целей и основано на этом туториале. Идея заключалась в том, чтобы реплицировать окончательную версию приложения, используя Meteor вместо Next.js в качестве фреймворка и добавив при этом новые функциональные возможности. Мы добавили страницу с детализированной информацией о каждом товаре и опцией сортировки/фильтрации для списка товаров. Мы хотели разработать то, что поможет современным разработчикам изучить Meteor в увлекательной форме и попутно создавать новые продукты.
Обзор
Маркетплейс позволяет продавать, покупать и перепродавать NFT. В этом помогает Polygon, который создан на базе Ethereum. Благодаря ему, пользователи могут быстрее и дешевле взаимодействовать с платформой, а разработчики — создавать более простые приложения по сравнению с теми, что построены непосредственно на Ethereum.
Вот что использовалось для создания приложения.
- Фреймворк для веб-приложений — Meteor.
- Среда разработки Solidity — Hardhat.
- Файловое хранилище — IPFS.
- Библиотека веб-клиента Ethereum — Ethers.js.
Что можно найти в приложении
Чтобы протестировать приложение в режиме реального времени, установите браузерное расширение Metamask и создайте в нем учетную запись. Затем переходите на сайт и экспериментируйте с ним. Чтобы увидеть его в действии на локальном уровне, клонируйте проект по этой ссылке. Для обоих вариантов есть инструкции в файле README.md в корневой папке приложения.
На первой странице, которая открывается при входе в приложение, находится список всех NFT, выставленных на продажу. Здесь можно, к примеру, отсортировать товары по цене и дате добавления.
Подключение к приложению осуществляется с помощью Metamask при переходе на страницу “Подключиться” (Connect).
Теперь можно создать товар для продажи. На странице “Создать” (Create) добавьте изображение, цену и прочую информацию. Для загрузки и сохранения изображений используется IPFS.
В приложении также есть страница “Детали” (Details), где можно посмотреть всю информацию о выбранном товаре. Для этого была добавлена функция под названием fetchMarketItem , которой не было в оригинальном контракте Marketplace.
У пользователя есть собственная страница. Она позволяет отфильтровать товары, которыми он владеет или продает, а также дает доступ к опции сортировки, как и главная страница. Для этой страницы также были внесены небольшие изменения в оригинальный контракт, а именно создана функция для получения всех товаров от пользователя.
Оригинальный туториал можно найти по этой ссылке.
- Феномен NFT и причины его популярности
- 10 инструментов, которые упростят жизнь веб-разработчика
- Найти и обезвредить: утечки памяти в Node.js
Читайте нас в Telegram, VK и Дзен
Веб фреймворк Meteor и Electron — в чём разница между ними?
Meteor.js и Electron – кроссплатформенные фреймворки для разработки приложений на JavaScript, Node, HTML и CSS. Я попытался выяснить, какой из этих веб-фреймворков лучший для написания десктопных приложений.
Веб-фреймворк Meteor

Meteor — веб фреймворк, который предназначен для создания Javascript-приложений . Для этого фреймворк нужно установить на компьютер и работать с проектами через команды. Он включает в себя API , инструменты разработки, пакеты из Node.js , а также базовую поддержку Javascript-сообщества .
Чтобы начать работать с Meteor , перейдите на официальный сайт фреймворка и установить его на ПК ( есть версии для Windows , Mac или Linux ). Затем нужно создать приложение при помощи команды meteor create myapp и запустить meteor. После чего будет запущен локальный сервер для разработки. Если вам нужно больше подробностей, ознакомьтесь с руководством Meteor.
В состав Meteor входит библиотека пакетов Atmosphere , в которой есть всё необходимое для работы с фреймворком. Meteor также позволяет использовать npm . Есть вероятность, что уже в скором будущем пакеты будут переведены на npm . Готовые Meteor-приложения также можно перевести в библиотеки, чтобы использовать их внутри других проектов.
Так как Meteor создает приложения на базе Node , вам потребуется хостинг Node . Лучший хостинг для Meteor js — Galaxy , основанный на Amazon Web Services ( AWS ). Использование этого хостинга упрощает процесс запуска.
Galaxy позволяет вести логи, собирать аналитику, мониторить, обновлять и постоянно интегрировать что-то новое, переносить проекты, а также пользоваться специальными инструментами.
Создаваемое вами приложение также может быть адаптировано под Android или iOS . Для этого понадобятся дополнительные настройки и инструменты. Но добавить их достаточно просто, а для тестирования можно использовать эмуляторы. Meteor для Windows не поддерживает мобильные сборки ( билды ). Эта способность есть у Cordova, который является фреймворком, преобразующим веб-языки в мобильные приложения.
На сайте Meteor js Windows сказано, что он позволяет разрабатывать десктопные приложения. Но в действительности это не так.
Meteor подходит для создания того, что запускается на сервере, и работает в браузере или на iOS/Android . Он представляет собой фреймворк, оборудованный модулями и интерфейсами.
Другие фреймворки ( например, Ember ), предназначены только для front-end разработки. Meteor поддерживает интеграцию и применение большинства популярных Javascript-библиотек и фреймворков ( Angular и React ).
Meteor js изначально подготовлен к интеграции с MongoDB на серверной стороне и MiniMongo на стороне клиента. Здесь довольно просто создать набор данных и начать использовать их в базе.
Electron

Electron предназначен для создания кроссплатформенных приложений, работающих как десктопные. Здесь разработка также происходит на JavaScript , HTML , CSS и с использованием различных Node-библиотек . Но создаваемое приложение компилируется в нативные программы для Windows , Linux и Mac . Как раз этой функции не хватает в Meteor .
Electron был разработан командой Github специально для редактора Atom , и с того времени используется для системы лайков в Microsoft и Facebook .
Интерфейс контейнера управляется с помощью Chromium и использует сервер Node.JS для вывода приложения внутри контейнера. Это автономный веб-сервер, работающий во фрейме, который не сильно отличается от вкладки в браузере Chrome .
Данный фреймворк позволяет использовать React , Angular или библиотеки Node . Но здесь не придётся запускать PHP , Ruby или Java .
За счёт Chromium создаваемые приложения осуществляют доступ к определенным функциям операционной системой, будь то диалоговые окна, меню или оповещения. Приложения для Windows можно упаковать и выполнять при помощи установщика. У вас будет доступ к файловой системе и возможность хранить данные различными способами.
Если хотите увидеть Electron в действии, то вы уже делаете это. Многие приложения основываются на этом фреймворке: Slack , Visual Studio Code , Nylas N1 , Brave Browser и редактор Atom .

Что касается приложений под Mac , то вам понадобится версия операционной системы не ниже 10.9 , 64bit . В случае с Windows потребуется Windows 7 или выше, 32bit или 64bit ( но не версии ARM ). Ситуация с Linux зависит от библиотек, но с точностью можно сказать, что приложения будут работать на Ubuntu 12.04 ( и выше ), Fedora 21 и Debian 8 .
Для хранения данных предусмотрено множество вариантов. Самый простой – LocalStorage . Но его может оказаться недостаточно, так как объём исчисляется в мегабайтах. Следующим по счёту JSON-хранилищем , которое удобно использовать для настроек и состояний называется electron-json-storage. Ещё можно использовать Pouchdb, но доводилось слышать много жалоб на производительность этой СУБД, если код насчитывает свыше 50 тысяч строк.
Идеальным вариантом будет IndexedDB . Для работы с ней есть различные инструменты и API , вроде Dexie.js . Здесь даже есть локальные хранилища для БД, вроде NeDB.
Electron компилирует десктопные приложения под Windows , Linux и Mac . Meteor js обучение показало, что он создает веб-приложения с возможностью адаптации под iOS и Android с помощью Cordova .
Возникает очевидный вопрос: могу ли я создать Meteor-приложение , но запустить его как контейнер Electron ? Ответ – да!
Загвоздка в том, что вряд ли для этого существует удобный способ. Есть много разных методов. Лучше начать изучать этот вопрос с форумов Meteor . Также можно обратиться к Electrometeor – проекту для запуска Meteor в Electron . Но учтите, что этой утилите уже несколько лет. Я не знаю, работает ли она с последними версиями Meteor .
Я бы и сам хотел попробовать скомбинировать два этих фреймворка. Результатом такого слияния должно стать приложение, которое будет работать в веб, компилироваться под iOS и Android , а также работать на всех десктопных операционных системах. При этом все варианты реализации будут основываться на одной и той же базе исходного кода.
Конкурентов Electron не так и много. Среди них можно выделить NW.js ( прежнее название «node-webkit» ). Оба фреймворка построены на движке V8 Chromium JS , но Electron лучше с точки зрения функционала.
Есть и другие способы скомпилировать создаваемые приложения под несколько платформ, но Electron лучше всего подходит для работы с HTML , JS , CSS и Node . Xamarin, к примеру, делает всё то же самое, но на C# .
Сильнейшим конкурентом Meteor js Windows считается Express – фреймворк также основанный на Node.js . В дополнение к Express можно использовать Feathers , который добавляет новые модули и функции для разработки приложений в режиме реального времени.
Meteor – фреймворк для разработки, тестирования, профилирования, запуска, обновления и мониторинга полноценных веб-приложений. С помощью Cordova можно адаптировать любой проект под iOS или Android . После этого можно превратить приложение в полноценную десктопную программу, работающую в Windows , Mac и Linux .
Учтите, что Meteor подходит только для работы с маленькими приложениями.
Electron можно использовать, если необходимо разрабатывать кроссплатформенные десктопные приложения, работающие как офлайн, так и онлайн. При этом желательно чтобы разработка велась на JavaScript , HTML , CSS , Node с использованием библиотек npm . Electron является простым Node-сервером , работающим в контейнере Chromium на движке J avaScript V8 . Теоретически, в нём можно запускать любые старые Node-приложения , независимо от того, разработано оно на Meteor js или нет.
Если вы разработали приложение при помощи Electron , а затем хотите запустить его в веб, то придётся разобрать его до базового Node-проекта без использования API Electron . Проще будет сначала создать веб-приложение, а затем думать о том, как скомпилировать его для работы на настольных ПК.
Надеюсь, сегодняшняя статья поможет вам определиться, какой фреймворк использовать в следующем проекте – Electron или Meteor js . Я рекомендую познакомиться с обоими фреймворками.
Вадим Дворников автор-переводчик статьи « What’s the Difference between Meteor and Electron? »
Разбираемся с Meteor.js
Как я стал разработчиком веб приложений — в стиле Meteor
Что должен знать веб-разработчик, собирающийся создавать приложения на Meteor? Ниже приведен список языков, фреймворков, библиотек, пакетов и многое другое 😉
Списки в статье специально даны в определённом порядке, если не указано иное. Эта статья не объясняет, почему вы должны изучать ту или иную технологию (вы сами должны в этом разобраться). Её цель — дать быстрый обзор технологий, с которыми ежедневно имеет дело Meteor-разработчик.
Чтобы не блуждать в море новой информации, хорошо бы иметь под рукой карту, на которую можно взглянуть, чтобы узнать в какой точке пути вы находитесь.
Языки, библиотеки и фреймворки, трындец!
В конечном итоге вам нужно уметь понимать Meteor API. Изучение технологий, приведенных ниже, даст вам всё необходимое. Нет нужды становиться экспертом в каждой области, но нужно понимать структуру и терминологию каждой из них.
Обязательно
- Javascript — вначале JS?! Да, солдат, не задавай мне снова вопросов, а то я подыму тебя с вертухи!
- Shell (Terminal)
- HTML & CSS
- JSON
- MongoDB
- Handlebars
- Git и GitHub
- jQuery
- LESS и/или SASS
- Underscore и/или Lo-Dash
- Bootstrap
Опционально (изучайте при необходимости)
MeteorJS
Теперь, когда изучены все перечисленные технологии, вы достойны познать силу и великолепие Meteor!
Почему вам нужно изучить ВСЁ это перед тем, как прикасаться к Meteor? Потому что Meteor — это full-Stack платформа. Через Meteor вы управляете фронт-эндом, бек-эндом и всеми остальными эндами.
… Ладно, больше никаких вопросов, давайте узнаем ещё БОЛЬШЕ!
Пришло время становиться Meteor-задротом, читайте доки:
- Основная документация по API
- Подпроекты
Если подпроекты выглядят пугающе, не волнуйтесь. Ниже приведен необходимый минимум, который вам нужно знать:
Хорошие уроки и курсы по Meteor
Упорядочены по сложности и глубине. Уроки, курсы, книги и видео проведут вас по различным проектам Meteor. Это будет кульминацией всей статьи:
- Meteor’s official tutorial (бесплатно)
- Your First Meteor Application от David Turnbull (бесплатно)
- Meteor Walkthrough Videos от George McKnight (бесплатно)
- Meteor Cookbook от Abigail Watson
- Discover Meteor от Sacha Greif & Tom Coleman (от $ до $$) (прим. переводчика: есть бесплатная версия на русском языке)
- Meteor in Action от Manuel Schoebel & Stephan Hochhaus ($)
- 8 Days of Meteor от Josh Owens ($)
- Meteor Testing от Sam Hatoum ($)
- Meteor Club Master Bootcamp от Josh Owens ($$$)
- Meteor Club Testing Bootcamp от Josh Owens & Sam Hatoum ($$$)
- Bulletproof Meteor от Arunoda Susiripala (бесплатно или $$)
- Продвинутые курсы Evented Mind от Chris Mather ($$)
Пакеты Meteor (в произвольном порядке)
Да, для изучения осталось ещё много всего. У Метеора есть менеджер пакетов, который называется Atmosphere. Он позволяет сообществу создавать пакеты, которые глубоко интегрированы в платформу Meteor, они расширяют API, доступные для вас как для разработчика. Ниже приведен список из стандартных пакетов, которые вы найдёте почти в каждом серьёзном Meteor-приложении, поэтому их нужно знать:
| Название пакета | GitHub | Atmosphere | Сайт |
|---|---|---|---|
| accounts-password | github | atmosphere | сайт |
| useraccounts:core | github | atmosphere | сайт |
| reactive-var | atmosphere | сайт | |
| reactive-dict | atmosphere | ||
| iron:router | github | atmosphere | руководство сайт |
| zimme:iron-router-active | github | atmosphere | |
| zimme:iron-router-auth | github | atmosphere | |
| manuelschoebel:ms-seo | github | atmosphere | статья |
| dburles:collection-helpers | github | atmosphere | |
| matb33:collection-hooks | github | atmosphere | |
| reywood:publish-composite | github | atmosphere | сайт |
| ongoworks:security | github | atmosphere | |
| alanning:roles | github | atmosphere | сайт |
| aldeed:autoform | github | atmosphere | |
| aldeed:collection2 | github | atmosphere | |
| aldeed:simple-schema | github | atmosphere | |
| momentjs:moment | github | atmosphere | сайт |
| matteodem:easy-search | github | atmosphere | сайт |
| matteodem:server-session | github | atmosphere | |
| meteorhacks:kadira | github | atmosphere | сайт |
| meteorhacks:aggregate | github | atmosphere | |
| meteorhacks:fast-render | github | atmosphere | сайт |
| meteorhacks:subs-manager | github | atmosphere | |
| meteorhacks:unblock | github | atmosphere | |
| raix:handlebar-helpers | github | atmosphere | |
| yogiben:helpers | github | atmosphere | |
| zimme:collection-softremovable | github | atmosphere | |
| zimme:collection-timestampable | github | atmosphere | |
| u2622:persistent-session | github | atmosphere | |
| tmeasday:publish-counts | github | atmosphere | |
| percolatestudio:synced-cron | github | atmosphere | |
| dburles:factory | github | atmosphere | |
| anti:fake | github | atmosphere |
##Кроличья нора становится всё глубже…
Ух ты, вы должно быть упорные, раз дошли до этого места. Ладно, хотите взглянуть на мои суперсекретные списки?
Сервис-провайдеры
Когда вам нужно разместить ваше приложение онлайн, есть огромное количество сервис-провайдеров, доступных для разработчика. Ниже несколько из них, которые служат целям Meteor-сообщества (и делают отличную работу), поэтому я решил озвучить их названия:
- Kadira — отслеживание производительности
- Modulus — хостинг (используйте промо-код «Metpodcast», чтобы получить кредит в $25)
- Compose — хостинг MongoDB с Oplog
Блоги, видео, новости и всё остальное (в произвольном порядке)
Пойдём выпьем со мной чего-нибудь, что остудит нас после Meteor… Увидишь, мы будем не одни:
- Crater.io — агрегатор новостей
- Meteor Weekly — агрегатор новостей
- Meteor’s Official Blog — блог
- Josh Owens — блог
- Discover Meteor — блог
- The Meteor Chef — блог
- Differential — блог
- Gentlenode — блог
- MeteorHacks — блог
- Meteor Tips — блог
- PEM — блог
- Manuel Schoebel — блог
- Practical Meteor — блог
- Lukasz Kups — блог
- David Burles — блог
- The Meteor Podcast — подкаст
- Meteor Devshops — YouTube
- Josh Owens — YouTube
- George McKnight — YouTube
- Arunoda Susiripala — YouTube
- David Turnball — YouTube
- Sasi Kanth — YouTube
- Vianney Lecroart — Medium
- Space Camp — Medium
- Dominus — Medium
- Arunoda Susiripala — Medium
- Sacha Greif — Medium
- Paul van Zyl — Medium
Если я кого-то забыл, дайте мне знать на (@_benstr) или @joshowens.
Другие статьи вроде этой
- Best Learning Resources for Meteor.js от Cтефан Хочхаус (Stephan Hochhaus)
- Learn Meteor.js Properly, которую написал Ричард (Richard)
Разработка с Meteor.js и реактивное программирование
Я начал работать с Meteor.js примерно полтора года назад, когда он был еще совсем сырым и нестабильным. Я сделал пару маленьких проектов, которые живы до сих пор, написал статью на Хабру и даже получил дикие проблемы в продакшене с забиванием CPU на 100% при том, что сервер почти ничего не делал. Но прошло время, и я решил поставить еще один эксперимент и разработать с использованием этого фреймворка проект средней сложности. Разработка затянулась, и в процессе я сформулировал свои правила того, как структурировать приложение, как решать проблемы с безопасностью, как деплоить и какие инструменты использовать на серверах. Об этом и расскажу.
Внимательный читатель уже заметил, что я ничего не сказал про автоматизированное тестирование. Да, я не писал тесты, и это плохо. Как говорят в таких случаях: было мало времени. Если хотите почитать про тестирование Meteor.js приложение, то есть статья здесь.
Реактивность
Если следите за трендами в мире программирования, вы точно много раз слышали этот термин. Скорее всего, вы слышали его настолько часто, что он встал в один ряд с «big data». Как и в случае с «big data», термин «реактивность» употребляют теперь по поводу и без. Если вы не уверены, что знаете точно, что же такое «reactive programming», советую почитать небольшую статью The Reactive Manifesto, а тем, кто окончательно угорел по реактивному программированию и хочет еще, — пройдите курс c Мартином Одерски.
Meteor.js изначально позиционировался как фрэймворк, основанный на парадигме реактивного программирования, поэтому, если вы не прочитали ссылку выше, просто запомните 4 понятия: масштабируемость (scalability), событийно-ориентированное программирование (event-driven programming), отзывчивость (responsivness) и устойчивость (resilience). Они понадобятся нам позже.
С чего начать
Начните с чтения документации.Затем узнайте про meteorite и atmoshpere. В блоге приложения Kadira можно найти много интересных статей про Meteor.js. Само приложение посвящено мониторингу Meteor приложений (типа newrelic). Посмотрите скринкасты от разработчиков Meteor.js
Здесь я привел несколько ресурсов, где вы можете найти много про то, как работает фрэймворк, из чего он состоит и как с его помощью разрабатывать приложения. Далее я продолжу, предполагая, что вы знакомы с азами и можете написать простой чат на Meteor.js.
Структура приложения
Я много размышлял над тем, как лучше организовать приложение, в итоге пришел к следующему:
- client/helpers
- client/vendor
- client/views
- controllers
- methods
- models
- repositories
- server
- services
- templates
Общая структура такая: для каждой страницы (роута) создается controller. У каждого controller есть один или несколько template. У каждого template есть один view.
Теперь подробно рассмотрим каждую директорию и то, что там должно быть.
Controllers
В этой папке лежат контроллеры. Я предлагаю использовать IronRouter. Он сделан специально для Meteor, поддерживает определение роутов на клиенте и сервере, создание контроллеров и layout’ов. Он достаточно популярен, и к нему есть приличное количество плагинов (например, iron-router-progress).
Models
Здесь лежат модели: коллекции и любые другие классы, ответственные за моделирование приложения.
Repositories
Так как данные будут передаваться с сервера на клиент через подписки, вам придется писать аналогичные запросы как на клиенте, так и на сервере. Repository — хорошая абстракция, чтобы инкапсулировать все запросы к коллекциям. Тем более что встроенные в meteor методы для работы с коллекциями идентичны для сервера и клиента.
Server
Здесь хранятся все файлы, которые должны исполняться только на сервере.
Services
Как и в обычных приложениях, здесь лежат классы, которые содержат себе бизнес-логику.
Templates
Здесь лежат html-файлы.
Client
Все файлы, которые здесь лежат, будут загружены только на клиенте.
Views
Здесь лежат файлы, в которых содержаться обработчики событий и Spacebars хелперы. Таким образом мы получаем что-то вроде ViewModel без лишнего кода. Пример:
Template.dbase.events =
‘click .js-more’: ->
@questionPagination.loadNextPage()
Helpers
Клиентский код, который используется в нескольких разных view.
Vendor
Клиентский библиотеки, которые вы подключаете для проекта.
Methods
И наконец, тут лежат определения Meteor-методов
Ограничение доступа к базе
С самого начала прямой доступ к базе с клиента был одной из главных фич Meteor. Именно на нее опирался весь механизм реактивности, именно благодаря этому стал возможен механизм latency compensation и именно за нее больше всего фрэймворк критиковали. Однако в версии 0.6 появился механизм ограничения манипуляций с данными. С базовыми принципами можно ознакомиться здесь.Тем не менее, остается вопрос. Как организовать код, который будет определять: разрешить или нет запрошенную операцию. Для примитивных случаев можно просто описать все в callback при вызове .allow или .deny, но для более сложного поведения это не подходит. Нам нужна какая-то форма, которая бы позволяла композицию, переиспользование и понятную организацию кода. Говоря о безопасности, принято считать, что лучше организовывать защиту как набор независимых слоев. Исходя из всего вышеперечисленного, я решил выбрать структуру аналогично потокам из node.js:
class @Guard
@create: -> new @
constructor: -> @_heads = []
pipe: (head) ->
@_heads.push head
@
guard: ->
self = @
->
args = arguments
ctx = @
_.all(self._heads, (head) -> head.apply(ctx, args))
Answer.allow
insert: Guard.create()
.pipe(RegisteredHead)
.pipe(GameNotEndedHead)
.guard()
Таким образом, мы просто определяем набор последовательно исполняемых фильтров. Если один из них возвращает false, операция прерывается. Здесь каждый фильтр это отдельный, изолированный от других слой защиты. Как оказалось, в таких терминах довольно легко думать, когда речь идет о том, что вы хотите и что не хотите разрешать делать пользователю.
Развертка и поддержка приложения
Предположим, что ваше приложение готово и настало время его задеплоить. Но для начала вам нужно настроить сервера и выбрать web-сервер, если вы не хотите, чтобы node.js раздавал статику (вы точно не хотите). Самый простой вариант — nginx. Вам не составит никакого труда настроить nginx раздавать статику и апстримить запросы вашему приложению. Но в этой ситуации вам придется думать о супервизоре, о том, как организовать кластеризацию (распараллеливании node.js приложения). Лично я вам советую использовать Phusion Passenger. Уже примерно полгода он умеет работать как с node.js, так и конкретно с Meteor приложениями. Самым оптимальным будет установить его как плагин для nginx, а также у них есть целая статья про то, как настроить passenger работать в связке с Meteor. Также Meteor умеет читать Mongo Oplog для того, чтобы отслеживать изменения в базе. Это довольно сильно уменьшает нагрузку на CPU, но, чтобы это заработало, нужно настроить инстанс Mongo как Replica Set. Из коробки Meteor поддерживает команду meteor deploy. Эта команда отправит ваш код на хостинг, который разрабатывают создатели Meteor специально для хостинга приложений этого фреймворка. Это очень удобно для того, чтобы просто потестировать приложение или организовать staging environment, но для production логичнее иметь свои собственные сервера. Способов организовать деплой на свои собственные сервера много, но мне больше всего нравится node-модуль flightplan, поэтому для него у меня уже написан специальный рецепт, который заточен под интеграцию с Phusion Passenger и умеет делать zero-downtime deployment (более или менее).
Полезные smart packages
Здесь я просто перечислю список полезных smart packages, которые помогли мне при разработке. Все их можно найти на Atmosphere.
- accounts-vkontakte — добавляет авторизацию для VK в стандартный модуль авторизации Meteor
- iron-router — лучший router для Meteor приложений
- user-status — сообщает о том, находится ли сейчас конкретный пользователь на online.
- define — если у вас много файлов, то вам необходима система модулей. Эта очень простая, но есть все, что нужно
- houston — хорошая админка
- cron-tick — мини-cron внутри Meteor приложения
- kadira — модуль мониторинга приложения для сервиса Kadira
Реактивность
Теперь поговорим про то, насколько Meteor удовлетворяет свойствам реактивного приложения.
Event-driven development
Тут обсуждать нечего: конечно, удовлетворяет, правда, в немного извращенном варианте. Вместо подхода, который предлагает, например, Rx или Observables в Scala, где мы оперируем потоками событий, здесь вся событийность от нас спрятана. Мы работаем с простым синхронным js-кодом. Это, с одной стороны, проще, с другой — сильно усложняет понимание того, как все работает внутри.
Scalability
Так как Meteor — обычное node приложение, то и вопрос scalability решается для него точно так же. То есть сравнительно неплохо. Если вы используете Phusion Passenger, то он позаботиться о том, чтобы держать нужное количество инстансов приложения. Можно долго спорить о быстродействии MongoDB, но она довольно легко масштабируется, так что выбор именно этой БД добавляет приличное количество очков к параметру масштабируемости Meteor приложений.Если вы хотите знать больше о том, как себе все это представляют создатели Meteor, посмотрите это видео.
Resilience
Ну тут все опять же упирается в архитектуру node.js. А мы знаем, что node.js работает в одном треде и, несмотря на высокую пропускную способность, в определенный момент начинает захлебываться. За что его многократно пинали ногами любители Erlang в многочисленных бенчмарк-тестах. Также, если node.js приложение падает, то падает дружно всем процессом, и ничего кроме перезапуска тут не поможет. Так что я бы не назвал Meteor приложением устойчивыми.
Responsive
Это главная фишка Meteor. Бесплатный real-time из коробки.
Итог
В общем и целом, Meteor приложения можно назвать реактивными с некоторыми оговорками. Основные ограничения тут, скорее, не у Meteor, а у node.js. Но, так или иначе, Meteor точно может претендовать на реактивность.
Преимущества
Помимо реактивности, что уже само по себе является огромным преимуществом, я хотел отметить еще несколько моментов.
Скорость разработки
Разрабатывать под Meteor действительно приятно. Livereload из коробки, встроенная система билдинга статики. Удобство добавления препроцессоров. Подключение новых файлов на лету. Деплой встроенной командой на сервера *.meteor.com для тестирования. Здесь все сделано, чтобы вы тратили меньше времени на разработку.
Spacebars
Spacebars — переписанный handlebars. Чем-то напоминает Reac.js и htmlbars, но (по ощущениям) работает медленнее, а также обладает магической способностью не менять html, который вы поменяли с помощью jquery (например), меняя все вокруг него. При этом не надо оборачивать в шаблоне этот кусок кода ни в какие хелперы. В общем, если вы хотите изменить часть страницы так, чтобы state приложения не менялся, spacebars это может.
Гомогенность
Один из первых фреймворков, который пытается использовать тот факт, что и на сервере, и на клиенте используется один и тот же язык, на полную катушку. По умолчанию, весь ваш код исполняется и там, и там, а это значит, что вам не нужно дублировать код, если одинаковая логика встречается на сервере и клиенте.
Проблемы
Несмотря на все преимущества, есть и недостатки.
Нестабильность
Что ни говори, а текущая версия Meteor — 0.8. Когда будет 1.0 непонятно, а значит будут изменения API, баги и регрессии. Но в принципе, с этим можно жить. Также я несколько раз сталкивался с багом, когда Meteor просто съедал 100% CPU без видимых на то причин, но в последних версиях этого, вроде бы, уже нет.
Отладка
Когда я говорил, что отзывчивость (responsiveness) реализована немного извращенно, я не шутил. Часть логики обновления страницы при появлении новых данных реализуется с помощью исключений (exceptions), и это влечет неприятные последствия: иногда вы просто не видите ошибку, потому что она была поймана каким-то внутренним обработчиком Meteor, и тут приходится заниматься отладкой вслепую, это действительно бесит.
Также иногда выдается неполный stacktrace ошибки из-за наличия асинхронных операций, но эту проблему можно решить с помощью zones.js.
Неопределенность
Вы постоянно находитесь в состоянии незнания того, какие данные у вас сейчас есть, а какие еще не пришли. Поэтому придется ставить кучу if. Чтобы этого избежать, старайтесь не делать очень сложных моделей документов: 1–2 уровня вложенности. Ну и конечно, придется обрабатывать все случаи отсутствия данных: ставить спиннеры и так далее, но это скорее хорошо.
Заключение
Создатели Meteor называют своей главной целью максимально упростить разработку web-приложений. Сделать процесс создания прототипа максимально быстрым и удобным. И мне кажется, что Meteor действительно сильно упрощает и ускоряет разработку. В нем довольно много новых и интересных идей и это, пожалуй, первый проект, который использует преимущества разработки frontend и backend на одном языке.Если вы думаете, стоит ли использовать Meteor в своем следующем проекте, то задайте себе три вопроса:
- Нужен ли вам real-time?
- Подходит ли вам MongoDB?
- Любите ли вы bleeding edge технологии?
Если хотя бы на два вопроса вы ответили «да», то советую дать Meteor шанс.
Собственно сам проект, который я реализовал, можно посмотреть здесь: ilito.paperpaper.ru. Мне понравилось, и я непременно буду использовать Meteor в дальнейшем.
Если у вас есть какие-то вопросы, пишите в комментариях или мне в твиттер @thought_sync.