Я большой поклонник Parse , технологии, которая ускоряет разработку веб-приложений и мобильных приложений. Он позволяет хранить, синхронизировать и передавать данные в облаке без написания строки кода на стороне сервера. Читайте дальше, чтобы увидеть, как вы можете интегрировать Parse в ваш следующий проект.
Немного фона
Взаимодействие с базой данных чрезвычайно безболезненно!
Давайте сделаем шаг назад и оценим, где была веб-разработка пять лет назад. Мы использовали языки, такие как PHP / Ruby, на сервере, который взаимодействовал с реляционными базами данных (такими как MySQL), и наш интерфейс был завален различными файлами JavaScript. Я не знаю о вас, но большинство моих проектов были на каком-то сервере с небольшим объемом дискового пространства, оперативной памяти и пропускной способности.
Множество новых технологий используют облако, и разработчики нередко используют преимущества этих экономически эффективных услуг, таких как AWS, Amazon S3, Heroku и многие другие. Внедрение этих услуг существенно изменило ландшафт веб-разработки; больше того, что мы делаем, находится в облаке.
Сегодня мы рассмотрим Parse, стартап, предлагающий облачную систему управления данными. Используя их сервис, я смог быстро создавать новые мобильные и веб-приложения. Мы собираемся использовать Parse для создания обязательного веб-приложения To-do, и я надеюсь, что оно даст вам представление о том, что может предложить эта служба.

Что такое парс?
Проще говоря, Parse — это облачная система управления данными, которая позволяет быстро разрабатывать веб-приложения и мобильные приложения.
Это делает разработку приложений действительно легкой, вынимая бэкэнд из ваших рук.
Итак, как это работает? Хорошо, давайте предположим, что вы веб-разработчик. Вы можете добавить файл Parse JavaScript на свою страницу, получить ключ API и начать сохранять «объекты» в облаке с помощью всего лишь нескольких строк кода. Parse освобождает вас от настройки стека на стороне сервера.
Подумай об этом на минуту. Традиционно вы устанавливаете стек на стороне сервера (LAMP или RoR, ASP.NET или что-то еще), настраиваете базу данных и затем взаимодействуете с ней через Ajax на клиенте. Parse просто уменьшил всю эту работу до нескольких строк кода.
В этом уроке мы будем использовать JavaScript SDK Parse. Однако вы не ограничены использованием только JavaScript; есть библиотеки Parse на многих языках, включая PHP, NodeJS, Java, C # и другие. Вы можете найти все доступные библиотеки здесь .
Использование Parse для ваших веб-проектов
Прежде чем мы начнем, давайте подумаем, как можно создать традиционное приложение со списком дел с использованием стека LAMP.
- Вы бы создали базу данных MySQL.
 - У вас может быть класс PHP, который отвечает за выполнение операций CRUD. При желании вы можете просто иметь несколько функций PHP.
 - Вы можете использовать JavaScript и Ajax на стороне клиента для вызова соответствующих сценариев PHP и передачи строк запроса.
 - Вам потребуется санировать входные данные для защиты от XSS-атак, а также беспокоиться о безопасности базы данных в целом.
 - Если вы используете приложение для совместной работы, вам необходимо отслеживать разных пользователей и управлять их списками. Больше кода, больше таблиц и больше схем.
 - Вы должны убедиться, что ваша база данных остается работоспособной.
 
Вы поняли идею. Нам есть над чем подумать, и есть много областей, где можно ошибаться. Parse решает эти проблемы для нас.
Создать Parse Account
Прежде чем что-то делать, создайте бесплатный аккаунт Parse . Затем создайте новое приложение под названием EnvatoTodo.

Скачать пустой проект
 Parse предоставляет отличное руководство QuickStart, которое поможет вам начать работу.  Выберите JavaScript и выберите EnvatoTodo из выпадающего меню в шаге 2 (показано на рисунке ниже).  Parse создаст zip-файл, содержащий Parse SDK и index.html . 

Клиентская сторона
  Прежде чем мы начнем взаимодействовать с Parse, давайте настроим базовую структуру на стороне клиента для нашего приложения.  Поскольку пользовательский интерфейс не является целью этого приложения, я просто покажу вам код, который я использовал.  Ничего особенного, но я использую YUI3.  При желании вы можете использовать jQuery.  Все есть в index.html . 
| 
 001 
002 
003 
004 
005 
006 
007 
008 
009 
010 
011 
012 
013 
014 
015 
016 
017 
018 
019 
020 
021 
022 
023 
024 
025 
026 
027 
028 
029 
030 
031 
032 
033 
034 
035 
036 
037 
038 
039 
040 
041 
042 
043 
044 
045 
046 
047 
048 
049 
050 
051 
052 
053 
054 
055 
056 
057 
058 
059 
060 
061 
062 
063 
064 
065 
066 
067 
068 
069 
070 
071 
072 
073 
074 
075 
076 
077 
078 
079 
080 
081 
082 
083 
084 
085 
086 
087 
088 
089 
090 
091 
092 
093 
094 
095 
096 
097 
098 
099 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
 | 
 <!DOCTYPE html> 
<head> 
  <meta charset=»utf-8″> 
  <title>Todo App Built on Parse</title> 
  <meta name=»description» content=»My Parse App»> 
  <meta name=»viewport» content=»width=device-width»> 
  <link rel=»stylesheet» href=»css/reset.css»> 
  <link rel=»stylesheet» href=»css/styles.css»> 
  <script src=»http://yui.yahooapis.com/3.6.0/build/yui/yui-min.js»></script> 
  <script type=»text/javascript» src=»http://www.parsecdn.com/js/parse-1.0.19.min.js»></script> 
    <style> 
        body { 
            font-family: «HelveticaNeue-Light», sans-serif; 
            font-weight:300; 
        } 
        h2 { 
            font-size:16px; 
            text-transform:uppercase; 
        } 
        a { 
            text-decoration:none; 
        } 
        .hidden { 
            display:none; 
        } 
        #main { 
            text-align:center; 
        } 
        input { 
            padding: 10px; 
            border-radius: 3px; 
            border:1px solid #ccc; 
            box-shadow: inset 0 0 10px #eee; 
            font-size:24px; 
        } 
        #input-wrapper { 
            padding-bottom:15px; 
        } 
        #list-item-submit { 
            background: #73D175; 
            color: white; 
            box-shadow:none; 
            border-color: #599E5A; 
        } 
        li { 
            text-align:left; 
            font-family:sans-serif; 
            list-style: none; 
            padding: 10px 0; 
            border-bottom:1px solid #ccc; 
            margin-left:-10px; 
        } 
        li input { 
            margin-right:15px; 
        } 
    </style> 
</head> 
<body> 
  <h1>Todo List built on <a href=»http://www.parse.com» alt=»Parse»>Parse</a></h1> 
  <div id=»main»> 
        <div id=»input-wrapper»> 
            <input type=»text» id=»list-input» placeholder=»Enter a todo here…»> 
            <input type=»button» id=»list-item-submit» value=»Add»> 
        </div> 
        <div> 
            <h2>Incomplete Tasks</h2> 
            <ul id=»incomplete-items»> 
                <li id=»no-incomplete-message»>There are no incomplete tasks! 
            </ul> 
        </div> 
  </div> 
    <!— This is a template that we’ll be using to populate our list items —> 
    <script id=»todo-items-template» type=»x/handlebars»> 
        <li class=»list-item»><input type=»checkbox» id=»{id}»>{content}</li> 
    </script> 
    <script> 
        //Use the YUI ‘node’ module. 
        YUI().use(‘node’, function(Y) { 
            //Lets declare some variables that we’ll be using. 
            var ListItem, 
            query, 
            noTasksMessage = Y.one(‘#no-incomplete-message’), 
            submitBtn = Y.one(«#list-item-submit»), 
            incompleteItemList = Y.one(‘#incomplete-items’), 
            completeItemList = Y.one(‘#complete-items’), 
            input = Y.one(«#list-input»); 
            //The rest of our application code will go below. 
            submitBtn.on(‘click’, function(e) { 
                /* 
                When the submit button is clicked, we want to get the contents of the input and save a new todo list item. 
                */ 
            }); 
            /* 
            When a <li> is clicked, we want to save that item as being complete. 
            */ 
            incompleteItemList.delegate(‘click’, function(e) { 
            }, ‘li’); 
            /* We also want to get the 10 most recent incomplete tasks and add them to <div id=»incomplete-items»></div> */ 
        }); 
    </script> 
</body> 
</html> 
 | 
  Важно отметить в приведенном выше коде включение файла Parse JavaScript, <script src="http://www.parsecdn.com/js/parse-1.0.19.min.js"></script> ,  Этот файл содержит объект Parse, с которым мы будем взаимодействовать. 
Добавить классы в браузере данных
Parse освобождает вас от настройки стека на стороне сервера.
Давайте вернемся к Parse. Просмотр браузера данных для EnvatoTodo (в настоящее время он пуст). Браузер данных похож на сервер баз данных MySQL, но Parse DB не содержит схем. Хотя вы можете указать столбцы в Браузере данных, вы можете сохранить любой объект с помощью простого JSON (в отличие от многих баз данных NoSQL / Document). Это чрезвычайно важная и полезная функция Parse.
Мы собираемся пойти дальше и добавить «класс» в базу данных. Думайте о классе как о столе. Причина, по которой он называется классом, заключается в том, что вы обычно создаете объекты из определенного класса, а затем сохраняете этот объект в базе данных.
Отказ от ответственности: JavaScript официально не имеет классов (пока), но у него есть логический эквивалент. Для простоты я буду использовать терминологию «класс» в этом уроке.
У Parse есть пять типов классов.
-   Пользовательские классы хранят специфичную для пользователя информацию, а Parse предоставляет сахарные методы, такие как 
signUp(),login()и другие, чтобы помочь в администрировании пользователей. - Классы установки обычно используются для отправки push-уведомлений для мобильных приложений. Да, Parse поддерживает push-уведомления для всех клиентов.
 - Ролевые классы помогают разделить пользователей на конкретные роли, контролируя доступ для чтения / записи к другим классам. Это называется ACL (список контроля доступа) в Parse.
 - Классы продукта хранят данные продукта в приложении.
 - Пользовательские классы предназначены для всего остального.
 
  Давайте создадим собственный класс с именем ListItem .  Как только он будет создан, вы заметите, что у него уже есть четыре свойства.  Parse автоматически обновляет свойства каждого создаваемого вами класса.  Некоторые классы, такие как пользовательские классы, могут иметь свои специфические свойства. 
  Наши объекты ListItem будут содержать свойство content чтобы показать, что содержит Todo, и свойство isComplete чтобы указать, было ли завершено Todo.  Мы могли бы добавить столбцы для этих свойств, но Parse выяснит это из нашего JSON. 
Инициализация Parse
  Давайте вернемся к index.html чтобы добавить код.  Первое, что мы хотим сделать, это инициализировать Parse с помощью нашего идентификатора приложения и ключа JavaScript.  Их можно найти на вкладке «Обзор» вашего приложения в браузере данных.  Добавьте следующую строку в ваш JavaScript, заменив APP_ID и JS_KEY соответствующими значениями: 
  Parse.initialize (APP_ID, JS_KEY); 
Спасение Тодоса
Давайте начнем добавлять функциональность в наше приложение. Сначала мы сохраним элемент списка дел, когда пользователь нажмет кнопку «Добавить». Следующий код — все, что нам нужно для этой функциональности:
submitBtn.on ('click', function (e) { // Расширяем собственный класс Parse.Object. var ListItem = Parse.Object.extend ("ListItem"); // Создание объекта класса ListItem var listItem = new ListItem (); // listItem теперь является объектом, который мы хотим сохранить, поэтому мы присваиваем ему нужные свойства. listItem.set ("content", text); listItem.set ("isComplete", false); // Мы вызываем метод save и передаем функции обратного вызова в случае успеха и неудачи. listItem.save (null, { success: function (item) { // Успешный обратный вызов }, error: function (gameScore, error) { // Сбой обратного вызова } }); });
  Взаимодействие с базой данных чрезвычайно безболезненно!  Каждый пользовательский класс в Parse наследуется от Parse.Object ;  следовательно, ListItem является подклассом.  Строковый аргумент "ListItem" сообщает Parse, что этот класс соответствует созданной нами таблице ListItem.  Затем мы создаем новый объект ListItem , устанавливаем его свойства и вызываем save() . 
Показ предметов
Чтобы отобразить список элементов списка дел, мы будем использовать API Parse JavaScript для запроса десяти последних сохраненных элементов и перечисления их под приложением. Это даст вам представление о том, как запросы работают в Parse.
// Еще раз расширяем класс Parse.Object, чтобы сделать класс ListItem ListItem = Parse.Object.extend ("ListItem"); // На этот раз мы используем Parse.Query для генерации нового запроса, а именно запроса таблицы ListItem. query = new Parse.Query (ListItem); // Мы устанавливаем ограничения на запрос. query.equalTo ('isComplete', false) query.limit = 10; query.descending ( 'createdAt'); // Мы отправляем запрос и передаем функции обратного вызова. query.find ({ success: function (results) { // Успешный обратный вызов }, ошибка: функция (ошибка) { // Ошибка обратного вызова } });
  Еще раз, это довольно просто и легко читается.  Метод Parse.Query() довольно мощный.  Здесь мы выполняем довольно простой запрос, но запросы Parse также могут быть сложными.  Вы можете запрашивать определенные регулярные выражения, выполнять реляционные запросы и многое другое.  Обязательно посетите документацию по запросу для получения дополнительных примеров и фрагментов кода. 
Собираем все вместе
  Следующее, что нам нужно добавить, это возможность пометить элемент списка дел как завершенный при установке флажка элемента.  Каждый флажок имеет уникальный id связанный с объектом Parse, который он представляет.  Поэтому, когда флажок установлен, нам нужно: 
- Получить идентификатор.
 - Запросите объект Parse с этим идентификатором.
 -   Получите возвращенный объект Parse и обновите его свойство 
isCompleteкакtrue. - Сохраните обновленный объект.
 - Удалить его из отображаемого списка.
 
Вот как выглядит этот код:
incompleteItemList.delegate ('click', function (e) { // сохраняем ссылку на это var self = this; // создаем объект запроса Parse var query = new Parse.Query (ListItem); // Метод query.get () требует в качестве первого аргумента objectId. Возвращает объект с этим идентификатором. query.get (self.one ('input'). get ('id'), { success: function (item) { // Как только объект возвращается, мы обновляем его свойство и сохраняем его. item.set ('isComplete', true); item.save (); // Поскольку элемент больше не является неполным, мы удаляем его из списка. self.remove (); // Если в списке ничего нет, показать сообщение о том, что список пуст. if (incompleteItemList.all ('li'). size ()> = 1) { noTasksMessage.removeClass ( 'скрытый'); } }, ошибка: функция (объект, ошибка) { alert («Ошибка при обновлении элемента todo:« + error.code + »« + error.message); } }); }, 'li');
  В этом фрагменте мы запрашиваем отдельный элемент с определенным id , обновляем его и сохраняем.  Затем мы удаляем его из списка с помощью self.remove() . 
  В Parse обновление объектов очень похоже на сохранение объектов — мы вызываем save() в обоих случаях.  Parse выясняет, является ли это существующим (грязным) объектом или совершенно новым объектом, и выполняет соответствующее действие. 
Полный исходный код
  С этим мы готовы!  Довольно легко, а?  Загрузите вложенный ZIP-файл и откройте index.html чтобы просмотреть весь исходный код. 
Другие преимущества
В этом уроке мы прежде всего рассматривали Parse с точки зрения веб-разработки. Тем не менее, сервис изначально был запущен для мобильных разработчиков. Parse имеет очень полный SDK для Android и iOS и поддерживает такие функции, как push-уведомления для всех пользователей вашего мобильного приложения.
Некоторые другие важные функции, которые мы не рассмотрели в этом руководстве, включают пользователей, роли и хранение реляционной информации.
Parse позволяет создавать пользователей и назначать им разные роли. Например, в системе управления обучением у вас могут быть «Учителя», «Студенты» и «Администраторы». Назначая роли, вы можете указать, какой тип пользователя имеет доступ к определенным объектам Parse.
А как насчет безопасности?
Множество новых технологий используют облако …
Как разработчик, мне нравится, что Parse заботится о многих проблемах безопасности, которые у меня есть. Как говорится на веб-сайте, Parse SDK разработаны так, что «вам не нужно беспокоиться о сохранении данных». По-прежнему существует проблема с доступом пользователей к информации, которой они не должны иметь. Чтобы решить эту проблему, Parse предлагает разрешения уровня объекта и класса.
Разрешения на уровне объекта позволяют разработчику определять массив идентификаторов объектов, которые имеют доступ для чтения и / или записи объекта. Разрешения на уровне класса позволяют разработчику определять, какими аспектами класса Parse можно манипулировать из API. Следующие операции могут быть разрешены или запрещены для каждого класса: Получить, Найти, Обновить, Создать, Удалить и Добавить поля.
Плюсы и минусы
Хочу подчеркнуть, что Parse подходит не для всех типов проектов. Хотя бесплатный план очень щедрый, Parse — платная услуга. Это может дорого обойтись, если вы превысите определенные пределы. К счастью, модель ценообразования очень прозрачна, и вы сможете определить, сколько может стоить ваше приложение. Вообще говоря, я использую его для небольших проектов, где я могу ожидать определенного ограничения, когда дело доходит до количества запросов API, которые я делаю. Я еще не попробовал Parse для большого проекта.
Одной из распространенных проблем с такими службами, как Parse, является эффект блокировки.
Если вы используете Parse для небольшого проекта, который внезапно начинает развиваться, может быть трудно перейти на другой сервис или платформу. Как вы можете себе представить, замена Parse вашим собственным бэкэндом повлечет за собой значительное количество рефакторинга. Это не значит, что вы не должны использовать Parse, но об этом следует помнить.
Заключительные замечания
В этом уроке мы рассмотрели, как мы можем использовать Parse для создания относительно простого веб-приложения. Я использовал этот сервис для ряда проектов для различных клиентов, и я считаю, что команда Parse очень помогает при возникновении проблем. Я призываю вас попробовать услугу и принять собственное решение!
Раскрытие информации: я не имею отношения к Parse или любому из его сотрудников. Я просто разработчик, который использует их сервис, и я считаю, что это полезное дополнение к моему рабочему процессу разработки.