{"id":304299,"date":"2020-05-26T21:00:39","date_gmt":"2020-05-26T21:00:39","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=304299"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=304299","title":{"rendered":"DataStore \u2014 CRUD (Create Read Update Delete)"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/503964\/\">\n<h2 id=\"proschay-redux-mobx-apollo-gran-mezhdu-bekendom-i-frontendom-slomana-innovacionyy-shag-evolyucii-steyt-menedzherov\">\u041f\u0440\u043e\u0449\u0430\u0439 Redux, MobX, Apollo! \u0413\u0440\u0430\u043d\u044c \u043c\u0435\u0436\u0434\u0443 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u0441\u043b\u043e\u043c\u0430\u043d\u0430! \u0418\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u044b\u0439 \u0448\u0430\u0433 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0441\u0442\u0435\u0439\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432.<\/h2>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b80\/124\/44a\/b8012444aaccda69a59a7c1b037c3dac.png\" alt=\"DataStore\"><\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u0431 \u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u2014 \u044d\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435, \u043a\u043e\u0433\u0434\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0432\u0430\u0448\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041a\u043e\u0433\u0434\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0431\u044d\u043a\u044d\u043d\u0434\u0443, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u044b\u0435 \u0438\u043c\u0435\u044e\u0442\u0441\u044f. \u0414\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0441\u0435\u0445 \u043a\u0440\u0430\u0439\u043d\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u044d\u0448\u0430 AWS AppSync SDK \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u043c\u0438 \u043c\u0443\u0442\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u0434\u0435\u043b\u044c\u0442\u0430-\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>Amplify DataStore \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443 \u0438\u043b\u0438 \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c \u0438 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>Amplify DataStore \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0431\u0435\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Amplify DataStore \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u00ab\u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439\u00bb \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 AWS \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0431\u044d\u043a\u044d\u043d\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e AWS AppSync \u0438 Amazon DynamoDB.<\/p>\n<p>  <\/p>\n<p>DataStore \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f Delta Sync \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0430\u0448\u0435\u0433\u043e \u0431\u044d\u043a\u0435\u043d\u0434\u0430 GraphQL \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"preimuschestva-datastore-ot-aws-amplify-nad-redux-mobx-apollo-relay-selektrorami-deselektorami-i-prochimi-flaksami\">\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 DataStore \u043e\u0442 AWS Amplify \u043d\u0430\u0434 Redux, MobX, Apollo, Relay, \u0441\u0435\u043b\u0435\u043a\u0442\u0440\u043e\u0440\u0430\u043c\u0438, \u0434\u0435\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u0444\u043b\u0430\u043a\u0441\u0430\u043c\u0438:<\/h2>\n<p>  <\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c AWS Amplify \u0441 Redux, MobX \u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a AWS Amplify \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0435\u0439\u0442-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u043d\u043e \u0438 \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 Apollo \u0438 Relay.<\/p>\n<p>  <\/p>\n<h2 id=\"1-real-time-iz-korobki\">1. Real time \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438<\/h2>\n<p>  <\/p>\n<p>\u041d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u0443 \u0435\u0433\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0441\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b\u0445 \u043d\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 web sockets.<\/p>\n<p>  <\/p>\n<p>\u0410 \u043c\u043d\u043e\u0433\u0438\u0435 \u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 web sockets?<\/p>\n<p>  <\/p>\n<p>\u0414\u0443\u043c\u0430\u044e \u043d\u0435\u0442, \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e real time \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0430 \u0431\u044d\u043a\u0435 \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0435.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0441 \u0436\u0435, <a href=\"https:\/\/react-native-village.github.io\/docs\/amplify-01\" rel=\"nofollow\">fullStack serverless<\/a> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0430 AWS Amplify, real time \u0438\u0434\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438, \u043a\u0430\u043a \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435 \u0442\u0430\u043a \u0438 \u043d\u0430 \u0431\u044d\u043a\u0435 \u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0432\u044d\u0431\u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e\u0433\u043e \u0432 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043e\u0430\u043d\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 GraphQL \u0441\u0445\u0435\u043c\u044b. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0443\u0433\u0430\u0442\u044c \u0433\u0440\u043e\u043c\u043a\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 <a href=\"https:\/\/react-native-village.github.io\/docs\/amplify-03\" rel=\"nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0443\u0440\u043e\u043a\u0430<\/a>, \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0432 AWS Amplify \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f Store:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">type Job   @model   @auth(     rules: [       {allow: owner, ownerField: &quot;owner&quot;, operations: [create, update, delete]},     ]) {   id: ID!   position: String!   rate: String!   description: String!   owner: String }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u0441\u0442\u043e\u0440\u0435, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430, \u043d\u043e \u0438 \u0434\u043b\u044f \u0431\u044d\u043a\u0435\u043d\u0434\u0430. \u041e\u0434\u0438\u043d \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u0430\u0432\u0434\u044b \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 \u0438 \u0434\u043b\u044f \u0431\u044d\u043a\u0435\u043d\u0434\u0430. \u0414\u0430 \u0434\u0430, \u0432\u0438\u0436\u0443 \u044f, \u0447\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437 \u043f\u043e\u0432\u0442\u043e\u044e \u044d\u0442\u043e \u0432 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043a\u0438\u043b\u043b\u0435\u0440 \u0444\u0438\u0447\u0430 \u0438 \u043f\u0430\u043d\u0447 \u043b\u0430\u0439\u043d vs Redux, MobX, Apollo, Relay. <\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u043e\u0442 Redux, MobX, Apollo \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u0441\u0442\u0435\u0440\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u044c \u043c\u0435\u0436\u0434\u0443 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c. \u0418 \u0441\u0442\u0430\u0432\u0438\u0442 AWS Amplify DataStore \u043d\u0430\u0434 \u0432\u0441\u0435\u043c\u0438<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0435!!!<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u0431\u044d\u043a\u0435\u043d\u0434\u0430, \u0442\u043e \u0432\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u044b \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0430\u0449\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>Serverless \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043f\u0440\u0438\u0448\u043b\u0430 \u043f\u043e\u0440\u0430 \u0443\u0447\u0438\u0442\u044c \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0445 \u0443\u0441\u043b\u0443\u0433\u0438 \u043d\u0443\u0436\u043d\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u0430\u0441\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c, \u043d\u0435 \u0448\u0430\u0433\u0430\u044e\u0449\u0438\u043c \u0432 \u043d\u043e\u0433\u0443 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u043e\u0442 \u0447\u0435\u0433\u043e \u0438 \u043d\u0435 \u0436\u0438\u0432\u0443\u0449\u0438\u043c\u0438 real time.<\/p>\n<p>  <\/p>\n<h2 id=\"2-generaciya-koda\">2. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430<\/h2>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u043c\u0435\u043d\u044f \u0432 \u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u0432 \u044d\u0442\u043e\u043c \u043f\u0430\u043d\u0447\u0435 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043d\u0430\u043c \u043e \u0441\u0435\u0431\u0435.<\/p>\n<p>  <\/p>\n<p>Old school\u0449\u0438\u043a?<\/p>\n<p>  <\/p>\n<p>\u042e\u0437\u0430\u0435\u043c fetch \u0438\u043b\u0438 axios?<\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0434\u0440\u0435\u043c\u0443\u0447\u0438\u0439 \u043b\u0435\u0441 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0435 \u0438 \u0441\u0430\u043c\u0438 \u043f\u0438\u0448\u0438\u043c \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 Redux, MobX, Apollo, Relay.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442 \u0432\u0430\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u0434\u043d\u044f!<\/p>\n<p>  <\/p>\n<p>\u0412\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a API, \u0432\u0430\u043c \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043d\u0435\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u043f\u0430\u043f\u043e\u0447\u043a\u0443 \u0441 \u043a\u043e\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 AWS Amplify DataStore \u043e\u043d\u0438 \u0442\u0430\u043a\u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0441\u0442\u043e\u0440\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0441\u0435 \u0442\u043e\u0439 \u0436\u0435 GraphQL \u0441\u0445\u0435\u043c\u044b \u0438\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430. \u0418 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">npm run amplify-modelgen<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 models \u0441 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>\u0418 \u043f\u0430\u043f\u043a\u0430 graphql \u043f\u043e\u0441\u043b\u0435 \u043f\u0443\u0448\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0441\u043e \u0432\u0441\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0432\u043e Flow, TS \u0438\u043b\u0438 \u0432\u0430\u043d\u0438\u043b\u0435 JavaScript.<\/p>\n<h2 id=\"3-offline-data--cloud-sync\">3. Offline data &amp; cloud sync<\/h2>\n<p>  <\/p>\n<p>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u043d\u043b\u0430\u0439\u043d.<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442\u0435 \u0432 \u043d\u0435\u043d\u0430\u0434\u0435\u0436\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043d\u043e \u0432\u0430\u043c \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u044f\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>  <\/p>\n<p>\u0423 Apollo \u0435\u0441\u0442\u044c apollo-link-retry \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u043a\u0430\u0442 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041f\u0440\u0430\u0432\u0434\u0430 \u043e\u043d (\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f) \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a GraphQL \u0432 \u043e\u0442\u0432\u0435\u0442\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>  <\/p>\n<p>\u0423 Redux, MobX \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u0442 \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043c\u0438\u0434\u043b\u0432\u0430\u0440\u0438, \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e REST \u043a\u0430\u043a \u0434\u0435\u0434\u0443\u0448\u043a\u0430 \u043d\u0430 \u043f\u0435\u043d\u0441\u0438\u0438 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u0432\u043d\u0443\u043a\u043e\u0432. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 <a href=\"https:\/\/react-native-village.github.io\/docs\/amplify-02\" rel=\"nofollow\">GraphQL vs REST<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0423 AWS Amplify DataStore \u0435\u0441\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043d\u0430\u043b\u043e\u0433 apollo-link-retry, \u043d\u043e \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0432 \u043d\u0435\u0433\u043e \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0443\u044e \u0437\u043d\u0430\u043a\u043e\u043c\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u0439, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0432 \u043e\u0431\u043b\u0430\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0418\u0437 \u043c\u0438\u043d\u0443\u0441\u043e\u0432 AWS Amplify \u0445\u043e\u0447\u0443 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0445\u0443\u043a\u0438 Apollo c \u0435\u0433\u043e loading \u0438 error \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u044e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043b open source <a href=\"https:\/\/github.com\/react-native-village\/aws-amplify-react-hooks\" rel=\"nofollow\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u0440\u0430\u0437\u0443\u043c\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/aws-amplify.github.io\/docs\/js\/datastore\" rel=\"nofollow\">\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0440\u043e\u043a\u0430 \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u0441 \u0432\u0430\u043c\u0438 \u044d\u0442\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Amplify DataStore:<\/p>\n<p>\u041f\u043e\u0435\u0445\u0430\u043b\u0438!<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0443\u0440\u043e\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0443\u0440\u043e\u043a\u0430 \u043f\u043e <a href=\"https:\/\/react-native-village.github.io\/docs\/auth1-00\" rel=\"nofollow\">\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0446\u0438\u0438<\/a>, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 DataStore \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0438, \u0442\u043e \u0432\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u043d\u0430 \u0448\u0430\u0433 \u043d\u0430\u0437\u0430\u0434.<\/p>\n<p>  <\/p>\n<p>\u0427\u0430\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 AWS Amplify: <a href=\"https:\/\/teleg.run\/awsamplify\" rel=\"nofollow\">Telegram<\/a><\/p>\n<p>  <\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/fullstackserverless\/startup\/tree\/datastore\" rel=\"nofollow\">Github<\/a>.<\/p>\n<h2 id=\"kloniruem-repozitoriy\">\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/h2>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0443\u0440\u043e\u043a, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0448\u0430\u0433\u0443 5<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">git clone https:\/\/github.com\/fullstackserverless\/startup.git<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">cd startup<\/code><\/pre>\n<p>  <\/p>\n<p>Install dependencies<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">yarn<\/code><\/pre>\n<p>  <\/p>\n<p>\u0438\u043b\u0438<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">npm install<\/code><\/pre>\n<h2 id=\"registriruem-svoy-aws-account\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0432\u043e\u0439 AWS account<\/h2>\n<p>  <\/p>\n<p>\u0428\u0430\u0433 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 AWS<br \/>  \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/aws-amplify.github.io\/docs\/\" rel=\"nofollow\">\u044d\u0442\u043e\u0439<\/a> \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u043f\u043e \u0432\u0438\u0434\u0435\u043e \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0443 \u0447\u0435\u043a\u0430\u0435\u043c \u0432\u0441\u0435 5 \u0448\u0430\u0433\u043e\u0432.<\/p>\n<p>  <\/p>\n<h4 id=\"vnimanie\">\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!!!<\/h4>\n<p>  <\/p>\n<p>\u041f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0430, \u0433\u0434\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 1$ <\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043c \u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438 \u0441\u0442\u0430\u0432\u0438\u043c Amplify Command Line Interface (CLI)<\/p>\n<h2 id=\"inicializaciya-aws-amplify-v-proekt-react-native\">\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f AWS Amplify \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 React Native<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 React Native \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 AWS Amplify \u043f\u0440\u043e\u0435\u043a\u0442<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">amplify init<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u043c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f <\/p>\n<h2 id=\"podklyuchaem-plagin-autentifikacii\">\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/h2>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438 \u0432\u043e\u0439\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u043e\u0439<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">amplify add auth<\/code><\/pre>\n<p>  <\/p>\n<p>\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u042d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 auth \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432 \u0432\u0430\u0448 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 ampify\/backend\/auth<\/p>\n<p>  <\/p>\n<h4 id=\"vybiraem-profil-kotoryy-my-hotim-ispolzovat-default-enter-i-kak-polzovateli-budut-vhodit-v-sistemu-emailza-sms-spisyvayut-dengi\">\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. default. Enter \u0438 \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. Email(\u0417\u0430 SMS \u0441\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0434\u0435\u043d\u044c\u0433\u0438).<\/h4>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u043e <\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">amplify push<\/code><\/pre>\n<p>  <\/p>\n<p>All resources are updated in the cloud<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"ampify-app\">ampify-app<\/h2>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 c DataStore \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c npx-\u0441\u043a\u0440\u0438\u043f\u0442 ampify-app.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">npx amplify-app@latest<\/code><\/pre>\n<h2 id=\"ustanovka-zavisimostey\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 <a href=\"https:\/\/aws-amplify.github.io\/docs\/js\/datastore#setup\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 React Native Cli, \u0442\u043e<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">yarn add @aws-amplify\/datastore @react-native-community\/netinfo @react-native-community\/async-storage<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 React Native&gt; 0.60, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0434\u043b\u044f iOS:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">cd ios &amp;&amp; pod install &amp;&amp; cd ..<\/code><\/pre>\n<h2 id=\"podklyuchaem-plagin-apiapp-sync\">\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d API(App Sync)<\/h2>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438 \u0435\u0433\u043e \u0432 <a href=\"https:\/\/react-native-village.github.io\/docs\/amplify-03\" rel=\"nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0443\u0440\u043e\u043a\u0435<\/a>, \u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u0448\u0430\u0433.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0442\u043e, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d API<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">amplify add api<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 GraphQL \u0432 <code>amplify\/backend\/api\/&lt;datasourcename&gt;\/schema.graphql<\/code> \u043a\u0443\u0434\u0430 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">type Job   @model   @auth(     rules: [       {allow: owner, ownerField: &quot;owner&quot;, operations: [create, update, delete]},     ]) {   id: ID!   position: String!   rate: String!   description: String!   owner: String }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439 \u043e \u043d\u0435\u0439 <a href=\"https:\/\/react-native-village.github.io\/docs\/amplify-03#schemagraphql\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a><\/p>\n<h2 id=\"generaciya-modeley\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439<\/h2>\n<p>  <\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 DataStore, \u2014 \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u0440\u0430\u0431\u043e\u0442\u044b. GraphQL \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0434\u043b\u044f JavaScript, iOS \u0438 Android \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043f\u0440\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c. GraphQL \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a Automerge \u0432 AppSync. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f NPX \u0438\u043b\u0438 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Amplify CLI.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0412\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0443\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c AWS \u0434\u043b\u044f \u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f DataStore, \u043e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Amplify CLI \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0443\u0440\u043e\u043a\u0435.<\/p><\/blockquote>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0445\u0435\u043c\u0443 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0443\u0440\u043e\u043a\u0435, \u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">npm run amplify-modelgen<\/code><\/pre>\n<p>  <\/p>\n<p>\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043f\u0430\u043f\u043a\u0435 src\/models<\/p>\n<h2 id=\"obnovlyaem-api\">\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c API<\/h2>\n<p>  <\/p>\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c DataStore \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e API<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">amplify update api<\/code><\/pre>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u043b\u0430\u043a\u043e <\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">amplify push<\/code><\/pre>\n<p>  <\/p>\n<p>All resources are updated in the cloud<\/p>\n<h2 id=\"read\">READ<\/h2>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0440\u0430\u043d JobsMain src\/screens\/Jobs\/JobsMain.js<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 Query, \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438, \u0433\u0434\u0435 \u0447\u0438\u0441\u043b\u043e \u0447\u0435\u0440\u0435\u0437 \u0445\u0443\u043a useQuery \u0438 \u043e\u043d \u043d\u0430\u043c \u0432\u0435\u0440\u043d\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u0432 Flatlist.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">import React, { useEffect, useState } from 'react' import { FlatList } from 'react-native' import { Auth } from 'aws-amplify' import { AppContainer, CardVacancies, Space, Header } from 'react-native-unicorn-uikit' import { DataStore } from '@aws-amplify\/datastore' import { Job } from '..\/..\/models' import { goBack, onScreen } from '..\/..\/constants'  const JobsMain = ({ navigation }) =&gt; {   const [data, updateJobs] = useState([])    const fetchJobs = async () =&gt; {     const mess = await DataStore.query(Job)     updateJobs(mess)   }    useEffect(() =&gt; {     fetchJobs()     const subscription = DataStore.observe(Job).subscribe(() =&gt; fetchJobs())     return () =&gt; {       subscription.unsubscribe()     }   }, [data])    const _renderItem = ({ item }) =&gt; {     const owner = Auth.user.attributes.sub     const check = owner === item.owner     return (       &lt;&gt;         &lt;CardVacancies obj={item} onPress={onScreen(check ? 'JOB_ADD' : 'JOB_DETAIL', navigation, item)} \/&gt;         &lt;Space height={20} \/&gt;       &lt;\/&gt;     )   }    const _keyExtractor = (obj) =&gt; obj.id.toString()    return (     &lt;AppContainer onPress={goBack(navigation)} flatlist&gt;       &lt;FlatList         scrollEventThrottle={16}         data={data}         renderItem={_renderItem}         keyExtractor={_keyExtractor}         onEndReachedThreshold={0.5}         ListHeaderComponent={           &lt;Header             onPress={goBack(navigation)}             onPressRight={onScreen('JOB_ADD', navigation)}             iconLeft=&quot;angle-dobule-left&quot;             iconRight=&quot;plus-a&quot;           \/&gt;         }         stickyHeaderIndices={[0]}       \/&gt;     &lt;\/AppContainer&gt;   ) }  export { JobsMain }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0440\u0430\u043d JobDetail src\/screens\/Jobs\/JobDetail.js<\/p>\n<pre><code class=\"plaintext\">import React from 'react' import { Platform } from 'react-native' import { AppContainer, CardVacancies, Space, Header } from 'react-native-unicorn-uikit' import { goBack } from '..\/..\/constants'  const JobDetail = ({ route, navigation }) =&gt; {   return (     &lt;AppContainer&gt;       &lt;Header onPress={goBack(navigation)} iconLeft=&quot;angle-dobule-left&quot; \/&gt;       &lt;CardVacancies obj={route.params} detail \/&gt;       &lt;Space height={Platform.OS === 'ios' ? 100 : 30} \/&gt;     &lt;\/AppContainer&gt;   ) }  export { JobDetail }<\/code><\/pre>\n<h2 id=\"create-update-delete\">CREATE UPDATE DELETE<\/h2>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0440\u0430\u043d JobAdd src\/screens\/Jobs\/JobAdd.js, \u0433\u0434\u0435 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 CREATE UPDATE DELETE<\/p>\n<pre><code class=\"plaintext\">import React, { useState, useEffect, useRef } from 'react' import { AppContainer, Input, Space, Button, Header, ButtonLink } from 'react-native-unicorn-uikit' import { DataStore } from '@aws-amplify\/datastore' import { Formik } from 'formik' import * as Yup from 'yup' import { Job } from '..\/..\/models' import { goBack } from '..\/..\/constants'  const JobAdd = ({ route, navigation }) =&gt; {   const [loading, setLoading] = useState(false)   const [check, setOwner] = useState(false)   const [error, setError] = useState('')    const [input, setJob] = useState({     id: '',     position: '',     rate: '',     description: ''   })    const formikRef = useRef()    useEffect(() =&gt; {     const obj = route.params     if (typeof obj !== 'undefined') {       setOwner(true)       setJob(obj)       const { setFieldValue } = formikRef.current       const { position, rate, description } = obj       setFieldValue('position', position)       setFieldValue('rate', rate)       setFieldValue('description', description)     }   }, [route.params])    const createJob = async (values) =&gt; (await DataStore.save(new Job({ ...values }))) &amp;&amp; goBack(navigation)()    const updateJob = async ({ position, rate, description }) =&gt; {     try {       setLoading(true)       const original = await DataStore.query(Job, input.id)       const update = await DataStore.save(         Job.copyOf(original, (updated) =&gt; {           updated.position = position           updated.rate = rate           updated.description = description         })       )       update &amp;&amp; goBack(navigation)()       setLoading(false)     } catch (err) {       setError(err)     }   }    const deleteJob = async () =&gt; {     try {       setLoading(true)       const job = await DataStore.query(Job, input.id)       const del = await DataStore.delete(job)       del &amp;&amp; goBack(navigation)()       setLoading(false)     } catch (err) {       setError(err)     }   }    return (     &lt;AppContainer onPress={goBack(navigation)} loading={loading} error={error}&gt;       &lt;Header onPress={goBack(navigation)} iconLeft=&quot;angle-dobule-left&quot; \/&gt;       &lt;Space height={20} \/&gt;       &lt;Formik         innerRef={formikRef}         initialValues={input}         onSubmit={(values) =&gt; (check ? updateJob(values) : createJob(values))}         validationSchema={Yup.object().shape({           position: Yup.string().min(3).required(),           rate: Yup.string().min(3).required(),           description: Yup.string().min(3).required()         })}       &gt;         {({ values, handleChange, errors, setFieldTouched, touched, isValid, handleSubmit }) =&gt; (           &lt;&gt;             &lt;Input               name=&quot;position&quot;               value={values.position}               onChangeText={handleChange('position')}               onBlur={() =&gt; setFieldTouched('position')}               placeholder=&quot;Position&quot;               touched={touched}               errors={errors}             \/&gt;             &lt;Input               name=&quot;rate&quot;               keyboardType=&quot;numeric&quot;               value={`${values.rate}`}               onChangeText={handleChange('rate')}               onBlur={() =&gt; setFieldTouched('rate')}               placeholder=&quot;Rate&quot;               touched={touched}               errors={errors}             \/&gt;             &lt;Input               name=&quot;description&quot;               value={values.description}               onChangeText={handleChange('description')}               onBlur={() =&gt; setFieldTouched('description')}               placeholder=&quot;Description&quot;               touched={touched}               errors={errors}               multiline               numberOfLines={5}             \/&gt;             &lt;Space height={40} \/&gt;             &lt;Button title={check ? 'Update' : 'Create'} disabled={!isValid} onPress={handleSubmit} formik \/&gt;             {check &amp;&amp; (               &lt;&gt;                 &lt;Space height={10} \/&gt;                 &lt;ButtonLink title=&quot;or&quot; textStyle={{ alignSelf: 'center' }} \/&gt;                 &lt;Space height={15} \/&gt;                 &lt;Button title=&quot;DELETE&quot; onPress={deleteJob} cancel \/&gt;               &lt;\/&gt;             )}           &lt;\/&gt;         )}       &lt;\/Formik&gt;       &lt;Space height={100} \/&gt;     &lt;\/AppContainer&gt;   ) }  export { JobAdd }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0438 \u0432 screens\/Jobs\/index.js \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u044d\u043a\u0440\u0430\u043d\u044b<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">export * from '.\/JobsMain' export * from '.\/JobDetail' export * from '.\/JobAdd'<\/code><\/pre>\n<h2 id=\"navigaciya\">\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043c\u043f\u043e\u0440\u0442 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 Jobs \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u0445 \u0432 StackNavigator<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">import * as React from 'react' import { createStackNavigator } from '@react-navigation\/stack' import { enableScreens } from 'react-native-screens' \/\/ eslint-disable-line import { Hello, SignUp, SignIn, ConfirmSignUp, User, Forgot, ForgotPassSubmit } from '.\/screens\/Authenticator' import { JobsMain, JobDetail, JobAdd } from '.\/screens\/Jobs'  enableScreens()  const Stack = createStackNavigator()  const AppNavigator = () =&gt; {   return (     &lt;Stack.Navigator       screenOptions={{         headerShown: false       }}       initialRouteName=&quot;HELLO&quot;     &gt;       &lt;Stack.Screen name=&quot;HELLO&quot; component={Hello} \/&gt;       &lt;Stack.Screen name=&quot;SIGN_UP&quot; component={SignUp} \/&gt;       &lt;Stack.Screen name=&quot;SIGN_IN&quot; component={SignIn} \/&gt;       &lt;Stack.Screen name=&quot;FORGOT&quot; component={Forgot} \/&gt;       &lt;Stack.Screen name=&quot;FORGOT_PASSWORD_SUBMIT&quot; component={ForgotPassSubmit} \/&gt;       &lt;Stack.Screen name=&quot;CONFIRM_SIGN_UP&quot; component={ConfirmSignUp} \/&gt;       &lt;Stack.Screen name=&quot;USER&quot; component={User} \/&gt;       &lt;Stack.Screen name=&quot;JOBS_MAIN&quot; component={JobsMain} \/&gt;       &lt;Stack.Screen name=&quot;JOB_DETAIL&quot; component={JobDetail} \/&gt;       &lt;Stack.Screen name=&quot;JOB_ADD&quot; component={JobAdd} \/&gt;     &lt;\/Stack.Navigator&gt;   ) }  export default AppNavigator<\/code><\/pre>\n<h2 id=\"knopka-jobs\">\u041a\u043d\u043e\u043f\u043a\u0430 Jobs<\/h2>\n<p>  <\/p>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u044d\u043a\u0440\u0430\u043d User \u0432 screens\/Authenticator\/User\/index.js<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">import React, { useState, useEffect } from 'react' import { Auth } from 'aws-amplify' import * as Keychain from 'react-native-keychain' import { AppContainer, Button } from 'react-native-unicorn-uikit' import { goHome, onScreen } from '..\/..\/..\/constants'  const User = ({ navigation }) =&gt; {   const [loading, setLoading] = useState(false)   const [error, setError] = useState('')    useEffect(() =&gt; {     const checkUser = async () =&gt; {       await Auth.currentAuthenticatedUser()     }     checkUser()   })    const _onPress = async () =&gt; {     setLoading(true)     try {       await Auth.signOut()       await Keychain.resetInternetCredentials('auth')       goHome(navigation)()     } catch (err) {       setError(err.message)     }   }    const _onPressJob = () =&gt; onScreen('JOBS_MAIN', navigation)() \/\/ \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d JOBS_MAIN    return (     &lt;AppContainer message={error} loading={loading}&gt;       &lt;Button title=&quot;Sign Out&quot; onPress={_onPress} \/&gt;       &lt;Button title=&quot;Jobs&quot; onPress={_onPressJob} \/&gt;     &lt;\/AppContainer&gt;   ) }  export { User }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c<\/p>\n<p>  <\/p>\n<h2 id=\"done\">Done<\/h2>\n<p>  <\/p>\n<h2 id=\"references\">References<\/h2>\n<p>  <\/p>\n<p><a href=\"https:\/\/aws-amplify.github.io\" rel=\"nofollow\">https:\/\/aws-amplify.github.io<\/a><\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/learning.oreilly.com\/library\/view\/full-stack-serverless\/9781492059882\/\" rel=\"nofollow\">https:\/\/learning.oreilly.com\/library\/view\/full-stack-serverless\/9781492059882\/<\/a><\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/www.altexsoft.com\/blog\/engineering\/graphql-core-features-architecture-pros-and-cons\/\" rel=\"nofollow\">https:\/\/www.altexsoft.com\/blog\/engineering\/graphql-core-features-architecture-pros-and-cons\/<\/a><\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/engineering.fb.com\/core-data\/graphql-a-data-query-language\/\" rel=\"nofollow\">https:\/\/engineering.fb.com\/core-data\/graphql-a-data-query-language\/<\/a><\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/graphql.org\/learn\" rel=\"nofollow\">https:\/\/graphql.org\/learn<\/a><\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/503964\/\"> https:\/\/habr.com\/ru\/post\/503964\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/503964\/\">\n<h2 id=\"proschay-redux-mobx-apollo-gran-mezhdu-bekendom-i-frontendom-slomana-innovacionyy-shag-evolyucii-steyt-menedzherov\">\u041f\u0440\u043e\u0449\u0430\u0439 Redux, MobX, Apollo! \u0413\u0440\u0430\u043d\u044c \u043c\u0435\u0436\u0434\u0443 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c \u0441\u043b\u043e\u043c\u0430\u043d\u0430! \u0418\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u044b\u0439 \u0448\u0430\u0433 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0441\u0442\u0435\u0439\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432.<\/h2>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b80\/124\/44a\/b8012444aaccda69a59a7c1b037c3dac.png\" alt=\"DataStore\"><\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u0431 \u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u2014 \u044d\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435, \u043a\u043e\u0433\u0434\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0432\u0430\u0448\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041a\u043e\u0433\u0434\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0431\u044d\u043a\u044d\u043d\u0434\u0443, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u044b\u0435 \u0438\u043c\u0435\u044e\u0442\u0441\u044f. \u0414\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0441\u0435\u0445 \u043a\u0440\u0430\u0439\u043d\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u044d\u0448\u0430 AWS AppSync SDK \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u043c\u0438 \u043c\u0443\u0442\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u0434\u0435\u043b\u044c\u0442\u0430-\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>Amplify DataStore \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443 \u0438\u043b\u0438 \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043e\u0431\u043b\u0430\u043a\u043e\u043c \u0438 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>Amplify DataStore \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0431\u0435\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Amplify DataStore \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u00ab\u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439\u00bb \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 AWS \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0431\u044d\u043a\u044d\u043d\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e AWS AppSync \u0438 Amazon DynamoDB.<\/p>\n<p>  <\/p>\n<p>DataStore \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f Delta Sync \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0430\u0448\u0435\u0433\u043e \u0431\u044d\u043a\u0435\u043d\u0434\u0430 GraphQL \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-304299","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=304299"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304299\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=304299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=304299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=304299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}