Учебное пособие по Meteor: создание веб-приложений реального времени с помощью Meteor

Опубликовано: 2022-03-11

Meteor — это полнофункциональный JavaScript-фреймворк для веб-приложений и мобильных приложений. Он существует с 2011 года и завоевал прочную репутацию среди разработчиков Meteor как идеальное и простое в использовании решение для быстрого прототипирования. Однако в последнее время разработчики поняли, что Meteor больше не предназначен только для создания прототипов: он готов к использованию в коммерческой разработке. С арсеналом пакетов, которые он предоставляет, надежной основой mongoDB/node.js, на которую он опирается, и гибкостью кода, которую он предлагает; Meteor позволяет легко создавать надежные и безопасные веб-приложения в реальном времени, обрабатывая все, от приложения браузера до сервера или базы данных.

учебник по метеору

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

Зачем использовать Метеор? Короткий ответ: «Потому что Meteor — это весело». Это упрощает разработку веб-приложений. Его легко освоить, и он позволяет больше сосредоточиться на функциональности вашего приложения, чем на основах синхронизации данных и обслуживания страниц.

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

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

Установка метеора и строительные леса

Установка Meteor в системах *nix выполняется в одну строку:

 curl https://install.meteor.com/ | sh

Хотя официальной поддержки до сих пор нет, их предварительная версия для Windows идет хорошо. Ходят слухи, что поддержка Windows будет поставляться с версией 1.1, которая должна выйти в апреле или мае 2015 года. Как и следовало ожидать от такой умной среды, как Meteor, для начальной загрузки приложения требуется вызвать одну строку команды:

 meteor create book-list

Это создаст каталог с именем «book-list» и заполнит его шаблонным и зависимым кодом. Чтобы запустить приложение, войдите во вновь созданный каталог и выполните:

 meteor

Откройте http://localhost:3000 в веб-браузере, и вы увидите следующее:

добро пожаловать на метеор

Вы также можете проверить «версию 0» нашего приложения на MeteorPad, сайте, похожем на JSFiddle для Meteor: список книг: приложение по умолчанию.

Meteor хранит свои представления в файлах HTML. Если мы откроем «book-list.html», то увидим:

 <head> <title>book-list</title> </head> <body> <h1>Welcome to Meteor!</h1> {{> hello}} </body> <template name="hello"> <button>Click Me</button> <p>You've pressed the button {{counter}} times.</p> </template>

Meteor использует «Blaze», механизм шаблонов, для рендеринга ответов из этих HTML-файлов. Двойные скобки должны быть знакомы всем, кто использовал Handlebars.js (или другие подобные механизмы шаблонов), и здесь они выполняют аналогичную функцию. Blaze проверяет выражения внутри каждой пары двойных фигурных скобок и заменяет каждое из них значением, полученным из этих выражений.

В этом простом примере программы всего два выражения с двойными фигурными скобками:

  • Первый, «{{> hello}}», указывает Blaze включить шаблон с именем «hello». Этот шаблон определяется в нижней части файла, в разделе <template name="hello">.

  • Второй, «{{counter}}», немного сложнее. Чтобы увидеть, откуда берется это значение «счетчика», нам нужно открыть «book-list.js»:

 if (Meteor.isClient) { // counter starts at 0 Session.setDefault('counter', 0); Template.hello.helpers({ counter: function () { return Session.get('counter'); } }); Template.hello.events({ 'click button': function () { // increment the counter when button is clicked Session.set('counter', Session.get('counter') + 1); } }); } if (Meteor.isServer) { Meteor.startup(function () { // code to run on server at startup }); }

Некоторые вещи здесь требуют пояснений. Во-первых, разделение на «если (Meteor.isClient)» и «если (Meteor.isServer)». Напомним, что метеор — это фреймворк с полным стеком, поэтому код, который вы пишете, выполняется как на сервере, так и на клиенте. Эти условия позволяют нам ограничить это: первый блок работает только на клиенте, а второй — только на сервере.

Во-вторых, есть вызов «Session.setDefault» — он инициализирует в браузере переменную сеанса, называемую «счетчик». Переменные сеанса немного похожи на глобальные в Meteor (хорошо и плохо). Однако эта переменная сеанса не отображается непосредственно в «{{counter}}». Вместо этого это «встречное» выражение является «помощником», определенным в разделе «Template.hello.helpers». Этот помощник просто получает значение переменной сеанса и возвращает его.

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

Клиентский код также отслеживает события через «Template.hello.events». Мы идентифицируем событие по типу события и селектору (в данном случае «нажмите кнопку»), а затем сообщаем Meteor, что должно делать это событие. В этом случае увеличивается переменная сеанса, которая повторно запускает вспомогательную функцию и, в свою очередь, повторно отображает содержимое.

Отображение статических данных

Все это хорошо, но это не то приложение Meteor, которое нам нужно для этого урока.

Давайте начнем настраивать это приложение — мы будем отображать статический, жестко закодированный список книг. Сейчас мы будем хранить список книг в переменной сеанса. В коде «isClient» мы будем использовать «Template.hello.rendered», чтобы установить переменную сеанса, как только отобразится шаблон bookList:

 Template.hello.rendered = function() { Session.setDefault('books', [ {title: "To Kill a Mockingbird", author: "Harper Lee"}, {title: "1984", author: "George Orwell"}, {title: "The Lord of the Rings", author: "JRR Tolkien"}, {title: "The Catcher in the Rye", author: "JD Salinger"}, {title: "The Great Gatsby", author: "F. Scott Fitzgerald"} ]); };

Затем мы возвращаем эту переменную сеанса с новым помощником в шаблоне «hello»:

 Template.hello.helpers({ books: function () { return Session.get('books'); } });

И вывести его на экран с помощью интерполяции переменных в шаблоне «hello»:

 <template name="hello"> <h3>Here are your books:</h3> {{ books }} </template>

Вы можете проверить этот код в действии на Meteorpad: Book-List: Show Session Variable

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

развертывать изменения автоматически

Пока вот что получаем:

некорректное отображение данных

К сожалению, мы неправильно отображаем данные. Blaze получает баллы за точность здесь (да, это массив объектов), но нам придется быть немного умнее, если мы хотим отобразить наш список книг удобным способом. К счастью, Blaze позволяет очень легко работать с массивами данных с помощью директивы #each:

 <h3>Here are your books:</h3> <UL> {{#each books}} <LI><i>{{title}}</i> by {{author}}</LI> {{/each}} </UL>

В Blaze «#each» работает примерно так же, как директива «ng-repeat» в Angular — она перебирает структуру массива, устанавливая текущий контекст для текущего объекта в массиве и повторно отображая HTML внутри «{{#each …}}”. Вот как сейчас выглядит наш список книг:

правильное отображение данных

На MeteorPad: правильное отображение переменной сеанса

Немного очистки

Прежде чем идти дальше, давайте немного очистим наш код.

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

Во-первых, давайте переименуем этот шаблон «hello» во что-нибудь осмысленное, например «bookList», и заменим стандартный HTML-код следующим:

 <head> <title>book-list</title> </head> <body> {{> bookList}} </body> <template name="bookList"> <h3>Here are some books:</h3> <UL> {{#each books}} <LI><i>{{title}}</i> by {{author}}</LI> {{/each}} </UL> </template>

Во-вторых, разделим «клиентскую» и «серверную» части на отдельные файлы. В каталоге нашего приложения мы создадим подкаталог «клиент» и подкаталог «сервер» — Meteor автоматически будет знать, что нужно запускать файлы «/client/» на клиенте и запускать файлы «/server/» на сервер. Хорошим соглашением является размещение кода шаблона в файле JavaScript с именем шаблона, поэтому давайте поместим наш клиентский код в «client/bookList.js». Мы можем поместить наш в настоящее время пустой код запуска сервера в «server/startup.js». Наконец, давайте выдвинем «

Обратите внимание, что даже после всех этих переключений Meteor по-прежнему автоматически находит все наши файлы HTML и JavaScript. Пока файл находится где- то в «/client/», Meteor будет знать, что его нужно запустить на клиенте. Пока файл находится где- то в «/server/», метеор будет знать, что нужно запустить его на сервере. Опять же, разработчик должен поддерживать порядок.

Итак, теперь наш код должен выглядеть так:

список-книг.html:

 <head> <title>book-list</title> </head> <body> {{> bookList}} </body>

клиент/bookList.html:

 <template name="bookList"> <h3>Here are some books:</h3> <UL> {{#each books}} <LI><i>{{title}}</i> by {{author}}</LI> {{/each}} </UL> </template>

клиент/bookList.js:

 Template.bookList.rendered = function() { Session.setDefault('books', [ {title: "To Kill a Mockingbird", author: "Harper Lee"}, {title: "1984", author: "George Orwell"}, {title: "The Lord of the Rings", author: "JRR Tolkien"}, {title: "The Catcher in the Rye", author: "JD Salinger"}, {title: "The Great Gatsby", author: "F. Scott Fitzgerald"} ]); }; Template.bookList.helpers({ books: function () { return Session.get('books'); } });

сервер/startup.js:

 Meteor.startup(function () { // code to run on server at startup }); ~~~ Check it out on MeteorPad: [Initial Code Cleanup](http://meteorpad.com/pad/MwvMcsBAzfbWwEXp3/Book-List:%20Initial%20Code%20Cleanup) Verify that everything's running correctly by checking the browser window and then we're good to move on to the next step. ## Using the Database in Meteor The Meteor server runs on top of a MongoDB database. In this section of our tutorial, we will move the static list of books out of the session variable and into that database. First, delete the Template.bookList.rendered code, so that we're no longer putting stuff into that session variable. Next, we should add that list of books to the database as fixture data when the server initializes. As you'd expect for MongoDB, Meteor stores data in "collections". So, we'll create a new collection for our books. To keep things simple we will name it "books". It turns out that both the client and the server will want to know about this collection, so we'll put this code in a new subfolder: "/lib/". Meteor knows automatically that files in "/lib/" run on the client and the server. We'll create a file called "lib/collections/books.js", and give it just one line of code: ~~~ js Books = new Meteor.Collection("books");

В окне браузера, указанном по адресу http://localhost:3000, перейдите в консоль разработчика и проверьте значение «Книги». Теперь это должна быть коллекция Mongo! Попробуйте запустить «Books.find().fetch()», и вы получите пустой массив, что имеет смысл, так как мы еще не добавили в него ни одной книги. Мы можем попробовать добавить в него элементы в консоли:

 Books.insert({title: "To Kill a Mockingbird", author: "Harper Lee"})

Добавлять вещи в консоли довольно утомительно. Вместо этого мы настроим все так, чтобы при запуске сервера мы автоматически вставляли данные приборов в базу данных. Итак, вернемся к «server/startup.js» и добавим это:

 Meteor.startup(function () { if (!Books.findOne()) { Books.insert({title: "To Kill a Mockingbird", author: "Harper Lee"}); Books.insert({title: "1984", author: "George Orwell"}); Books.insert({title: "The Lord of the Rings", author: "JRR Tolkien"}); Books.insert({title: "The Catcher in the Rye", author: "JD Salinger"}); Books.insert({title: "The Great Gatsby", author: "F. Scott Fitzgerald"}); } });

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

 meteor reset

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

Теперь снова запустим сервер:

 meteor

При запуске Meteor запустит процедуру запуска, увидит, что база данных пуста, и добавит данные прибора. На этом этапе, если мы перейдем к консоли и наберем «Books.find().fetch()», мы получим пять книг, которые у нас были раньше.

Все, что осталось для этого шага, — отобразить книги на экране. К счастью, это так же просто, как заменить «return Session.get('books');» со следующим помощником «books»:

 return Books.find();

И мы снова в деле! Приложение теперь отображает данные из курсора базы данных, а не из переменной сеанса.

Проверьте это на MeteorPad: переход к базе данных

Вопросы безопасности

Я предварю это, сказав: «не делайте этого».

Как вы думаете, что произойдет, если кто-то запустит это приложение в своем браузере, перейдет к консоли и наберет «Books.remove({})»?

Ответ таков: они уничтожат коллекцию.

Итак, это довольно большая проблема с безопасностью — у наших пользователей слишком много доступа к нашей базе данных. Любой клиент может получить доступ ко всей базе данных. Мало того, любой клиент может внести любые изменения во всю базу данных, включая удаление данных «.remove({})».

Это нехорошо, так что давайте это исправим.

Meteor использует так называемые «пакеты» для добавления функциональности. Что модули для Node.js, а гемы для Ruby, пакеты — это набор функциональных возможностей для Meteor. Есть пакеты на все случаи жизни. Чтобы ознакомиться с тем, что доступно, зайдите на сайт атмосфера.js.

Приложение метеора по умолчанию, которое мы создали с помощью «meteor create», включает в себя два пакета, называемые «автопубликация» и «небезопасный». Первый пакет обеспечивает автоматический доступ клиентов ко всей базе данных, а второй позволяет пользователям выполнять любые действия с этой базой данных.

Удалим тех. Мы можем сделать это, запустив из каталога приложения следующее:

 meteor remove autopublish insecure

Когда это будет сделано, вы увидите, что данные списка книг исчезают с экрана (поскольку у вас больше нет к ним доступа), и если вы попытаетесь вызвать «Books.insert», вы получите сообщение об ошибке: «insert failed : Доступ запрещен". На MeteorPad: Излишняя безопасность

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

Так почему же Meteor автоматически включает эти пакеты, если они представляют такую ​​угрозу безопасности? Причина в том, что, особенно для новичков, эти два пакета облегчают начало работы — вы можете легко отлаживать и настраивать базу данных из консоли браузера. Но рекомендуется как можно скорее отказаться от автопубликации и небезопасности.

Опубликовать и подписаться

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

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

Во-первых, давайте создадим «/server/publications.js»:

 Meteor.publish('books', function() { return Books.find({}); });

И мы создадим «/client/subscriptions.js»:

 Meteor.subscribe('books');

Проверьте это на MeteorPad: опубликуйте и подпишитесь

Сервер «публикует» курсор, который имеет доступ ко всем данным, а клиент «подписывается» на него на другом конце. Клиент использует эту подписку для заполнения зеркальной копии базы данных всеми данными курсора. Когда мы обращаемся к «Books.find().fetch()», мы видим все пять объектов и видим их на экране, как и раньше.

Разница сейчас в том, что очень легко ограничить доступ клиентов. Попробуйте переключить публикацию «find()» на подмножество данных:

 Meteor.publish('books', function() { return Books.find({}, {limit:3}); });

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

Добавление новых книг

Мы увидели, как предоставить клиентам доступ для чтения к базе данных ограниченным и безопасным способом. Теперь давайте рассмотрим вторую проблему: как мы позволяем пользователям изменять базу данных, не позволяя им делать все, что они хотят? Избавление от небезопасного пакета привело к тому, что клиенты вообще не имели доступа — давайте попробуем снова разрешить добавление книг. В метеоре мы делаем это, добавляя «метод» на сервер. Давайте добавим метод, добавляющий новую книгу, в «/lib/collections/books.js»:

 Meteor.methods({ addBook: function(bookData) { var bookID = Books.insert(bookData); return bookID; } });

Как видите, он берет «bookData» — в данном случае это объект с полями «название» и «автор» — и добавляет его в базу данных. Как только ваш клиент перезагрузится, мы можем вызвать этот метод из клиента. Вы можете зайти в консоль и ввести что-то вроде этого:

 Meteor.call('addBook', {title: "A Tale of Two Cities", author: "Charles Dickens"})

И вуаля! Вы получаете еще одну книгу в списке книг. Использование консоли невыносимо неуклюже, поэтому давайте добавим в конец шаблона «bookList» простую форму, которая позволит нам добавлять новые книги:

 <form class="add-book"> Title:<br> <input type="text" name="title"> <br> Author:<br> <input type="text" name="author"> <input type="submit" value="Add Book"> </form>

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

 Template.bookList.events({ "submit .add-book": function(event) { event.preventDefault(); // this prevents built-in form submission Meteor.call('addBook', {title: event.target.title.value, author: event.target.author.value}) } });

Вы можете увидеть это в действии на MeteorPad: Methods

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

На заметку: вы также можете решить проблемы безопасности в Meteor, используя «правила разрешения и запрета». Вы можете узнать больше об этом и о некоторых причинах, по которым я предпочитаю описанный выше подход, на сайте discoverymeteor.com.

Аутентификация пользователя

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

Перейдите в каталог приложения и установите два пакета:

 meteor add accounts-ui accounts-password

Там. Вы только что добавили систему входа в приложение. Теперь нам просто нужно добавить пользовательский интерфейс входа в book-list.html. Поместите эту единственную строку в верхней части тела:

 {{> loginButtons}}

Вы должны увидеть приглашение для входа в верхнюю часть экрана:

приглашение для входа

Обратите внимание, что если вы нажмете на ссылку для входа, она запросит адрес электронной почты и пароль. Мы можем переключить это на простую систему входа в систему с помощью имени пользователя и пароля, создав «/client/config.js» со следующим:

 Accounts.ui.config({ passwordSignupFields: "USERNAME_ONLY" });

На этом этапе вы можете ввести «Meteor.userId()» в консоли, и он вернет «null». Вы можете попробовать нажать на ссылку, чтобы создать учетную запись. Вызов «Meteor.userId()» теперь должен возвращать строку идентификатора. Сервер имеет доступ к той же части информации (как «this.userId»), поэтому тривиально заставить метод «добавить книги» заставить пользователя войти в систему и включить поле userID:

 Meteor.methods({ addBook: function(bookData) { if (this.userId) { bookData.userID = this.userId; var bookID = Books.insert(bookData); return bookID; } } });

Остается только ограничить клиент, показывая только те книги, которые добавил этот пользователь. Мы используем возможность публикации, чтобы сузить круг того, к чему имеет доступ клиент:

 Meteor.publish('books', function() { return Books.find({userID: this.userId}); });

Теперь публикация находит книги только этого конкретного пользователя. Мы даже можем получить доступ к userId из выражений Blaze как «{{currentUser}}»; и мы можем использовать это с директивой «{{#if}}» (которая делает именно то, что вы думаете), чтобы показывать данные только тогда, когда пользователь вошел в систему:

 <template name="bookList"> {{#if currentUser}} <h3>Here are your books:</h3> <UL> {{#each books}} <LI><i>{{title}}</i> by {{author}}</LI> {{/each}} </UL> <form class="add-book"> Title:<br> <input type="text" name="title"> <br> Author:<br> <input type="text" name="author"> <input type="submit" value="Add Book"> </form> {{else}} <h3>Please log in to see your books</h3> {{/if}} </template>

Проверьте окончательный результат на MeteorPad: Пользователи

Развертывание

Теперь мы можем развернуть это приложение Meteor в Интернете. Мы делаем это, переходя в каталог приложения на терминале и выполняя:

 meteor deploy <your app's name>.meteor.com

Убедитесь, что вы заменили «<имя вашего приложения>» фактическим коротким именем экземпляра приложения. Выполнение этой команды предложит вам настроить учетную запись в Meteor, а затем она разместит ваше новое приложение на тестовых серверах Meteor, чтобы вы могли опробовать его в Интернете.

Для быстрой демонстрации все, что вам нужно, — это решение от metetor.com. Команда Meteor не объявила о каких-либо явных ограничениях на объем хранилища или пропускную способность на своих серверах. Единственное заметное ограничение заключается в том, что если ваше приложение не используется в течение длительного времени, сайту требуется несколько секунд, чтобы раскрутиться для следующего пользователя.

Тем не менее, meteo.com не предназначен для коммерческого использования. Но когда вы переходите к производству, есть компании, предлагающие платформу как услугу, такие как Modulus и Digital Ocean, которые упрощают развертывание приложений Meteor. Если вы хотите развернуть приложение метеора на своем собственном сервере, «метеор вверх» также упрощает этот процесс.

Следующие шаги

Поздравляем! В своем стремлении изучить Meteor вы создали и развернули очень простое веб-приложение Meteor, работающее в реальном времени. Очевидно, что это всего лишь крошечный первый шаг в целую вселенную функций и возможностей. Если вам нравится то, что вы видели до сих пор, я настоятельно рекомендую книгу Дэвида Тернбулла «Ваше первое метеорное приложение», в которой читатели знакомятся с созданием более сложного приложения, попутно предоставляя дополнительную информацию о функциях метеоров. Он доступен в виде книги для Kindle по небольшой цене и в виде бесплатного PDF-файла на веб-сайте Тернбулла.

Вы также захотите изучить пакеты, доступные для Meteor. В девяти случаях из десяти ответ на вопрос «как сделать <x> в Meteor?» "есть пакет для этого". «Как мне добавить маршрутизацию в свое приложение?» Вы используете железный маршрутизатор. «Как предоставить RESTful API?» Вы используете RESTivus. «Как включить модульное тестирование?» Вы используете скорость. «Как мне добавить проверки схемы?» Вы используете Collection2. Вы можете легко заблудиться на Atmosphere.js, просматривая все доступные пакеты.

Почему бы не использовать метеор?

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

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

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

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