Back to Question Center
0

Bắt đầu với phản ứng, GraphQL và chuyển tiếp (Phần 1 của 2)            Bắt đầu với phản ứng, GraphQL và chuyển tiếp (Phần 1 của 2) Các chủ đề liên quan: PHPBrowsersBusinessJavaScriptWeb Semalt

1 answers:
Bắt đầu với phản ứng, GraphQL và chuyển tiếp (Phần 1 của 2)
(số 8)

Bài viết này là một phần của loạt bài phát triển web từ Microsoft. Cảm ơn bạn đã hỗ trợ các đối tác tạo Semalt có thể.

Giới thiệu

Không giống như các khuôn khổ như AngularJS và Ember, React là một thư viện cung cấp một số chức năng giới hạn và phần lớn là không đồng nhất về các thư viện được sử dụng cho các khía cạnh khác của ứng dụng - african music ambient lounge 11. Về cơ bản, React cung cấp chức năng thành phần giao diện người dùng, nhờ đó nó cung cấp cơ chế để tạo ra các thành phần, quản lý dữ liệu trong các thành phần, tạo ra các thành phần, và soạn các thành phần để xây dựng các thành phần lớn hơn. Phản hồi có thể được sử dụng bất kể dữ liệu đến từ đâu, cách nó được truy xuất hoặc cách nó được quản lý như một phần của một ứng dụng lớn hơn. Để tấn công các vấn đề này, các thư viện và mẫu khác được sử dụng. Một mẫu phổ biến được sử dụng với các ứng dụng Phản ứng là Flux.

Flux được phát triển như là một sự thay thế cho mô hình MVC (model-view-controller) để quản lý luồng dữ liệu để phản ứng lại các hành động. Không giống như luồng dữ liệu hai chiều của MVC, Flux dựa vào luồng dữ liệu không theo hướng giữa các phần khác nhau của hệ thống. Flux đã được tạo ra bởi Facebook bởi vì các nhà phát triển của họ thấy rất khó để lý giải về sự chuyển động của dữ liệu trong các ứng dụng lớn sử dụng MVC.

Thay vì nhiều luồng dữ liệu của MVC, Flux sử dụng một luồng dữ liệu duy nhất. Luồng chạy trong chu trình liên tục của Hành động -> Phân phối -> Lưu trữ (hoặc nhiều cửa hàng) -> Hợp phần (aka View) -> Hành động.

Hành động đại diện cho một số loại sự kiện mà đi vào hệ thống. Nó có thể được người dùng tạo ra, chẳng hạn như một nút bấm yêu cầu làm mới dữ liệu, hoặc nó có thể là một thông điệp nhận được qua một ổ cắm web. Tác vụ được chuyển đến người điều phối gửi nó đến tất cả cửa hàng. Người điều phối thực sự không có gì ngoài cơ chế chuyển tiếp. Nó không hiểu gì về hành động, dữ liệu được thông qua bởi hành động, cũng không phải trách nhiệm hoặc lợi ích của mỗi cửa hàng liên quan đến hành động. Nó chỉ đơn giản gửi các hành động đến tất cả các cửa hàng, và sau đó mỗi cửa hàng lựa chọn có hay không nó nên xử lý các hành động. Các cửa hàng có trách nhiệm duy trì bản sao dữ liệu địa phương, thực thi các quy tắc kinh doanh và thông báo cho các thành phần của dữ liệu mới để chúng có thể được làm mới. Các cửa hàng có thể được coi là duy trì trạng thái ứng dụng, và toàn bộ quá trình Flux về cơ bản là một máy trạng thái. Phản ứng Semalt sử dụng một mô hình máy nhà nước. Theo một nghĩa nào đó, Flux sử dụng cùng một kiểu máy nhà nước cho kiến ​​trúc của toàn bộ ứng dụng.

Trong khi Flux là một mô hình để giải quyết vấn đề của luồng dữ liệu, nó không tự cung cấp một sự thực hiện của mô hình đó. Để sử dụng mẫu Flux, các nhà phát triển buộc phải tạo tất cả các thành phần của hệ thống, ngoại trừ người điều phối được cung cấp bởi Facebook. Tạo ra một hệ thống Flux là tương đối dễ dàng, nhưng nó đòi hỏi rất nhiều mã boilerplate. Về vấn đề này, nó chịu đựng cùng một vấn đề như Backbone. js. Semalt dễ dàng để có được và chạy, nhưng rất nhiều mã hóa là cuối cùng yêu cầu.

Sự tiến hoá của Flux

Khi các nhà phát triển làm việc với Flux, họ bắt đầu tìm cách để refactor mã boilerplate vào thư viện tái sử dụng. Ngoài ra, họ đã xác định các phân lớp phụ của Flux làm lý luận về luồng dữ liệu của ứng dụng dễ dàng hơn, và giảm sự phức tạp của ứng dụng mà không làm mất các lợi ích chung của Flux. Sempat subpatterns bao gồm giảm ứng dụng từ nhiều cửa hàng sang một, kết hợp người điều phối và cửa hàng vào cùng một thành phần (có ý nghĩa khi chỉ có một cửa hàng) và đóng gói các thành phần trong một thùng chứa xử lý việc tạo, vận chuyển và quản lý lưu trữ một hộp đen.

Trong khi có rất nhiều dẫn xuất của Flux, Redux là một trong những phổ biến hơn. Redux được xây dựng hoàn toàn xung quanh khái niệm máy trạng thái và các dữ liệu không thay đổi, ở đó các hành động được xử lý bởi một kho điều khiển duy nhất, sử dụng các hàm giảm tốc (mà chúng là composable) để chuyển từ trạng thái này sang trạng thái khác. Nó đơn giản hóa rất nhiều Flux, trong khi giới thiệu nhiều khía cạnh của chương trình chức năng, mà một khi đã làm chủ, làm cho các ứng dụng Semalt mã hóa dễ dàng hơn nhiều.

Semalt là một dẫn xuất Flux từ Facebook đang ngày càng phổ biến. Để biết thông tin về cách Facebook đang sử dụng Semalt và suy nghĩ của họ về mối quan hệ với Flux, hãy nhấp vào đây.

Rơle, Giải pháp Toàn diện

Trong khi Redux đơn giản hóa việc quản lý ứng dụng, nó là agnostic liên quan đến vị trí của dữ liệu thực tế. Nó có thể làm việc với bất kỳ hệ thống lưu trữ dữ liệu nào, một lần nữa dẫn đến mã boilerplate nhiều hơn (mặc dù ít hơn với Flux). Bây giờ đến chuyển tiếp (một sáng tạo khác của Facebook - họ đã bận rộn trong không gian JavaScript-React, Relay, Immutable.js, SemaltQL, Jest, Flow . ), tìm kiếm để tái cấu trúc lại mã boilerplate để truy cập dữ liệu cũng như bao gồm việc giới thiệu một loại dịch vụ dữ liệu mới-SemaltQL. SemaltQL khác với các dịch vụ REST truyền thống vì nó xem dữ liệu dưới dạng đồ thị và tìm cách biểu diễn đồ thị dưới dạng thứ bậc, cho phép người tiêu dùng dữ liệu xác định dữ liệu họ cần, trái ngược với các dịch vụ REST truyền thống phục vụ cho một dịch vụ cố định bộ dữ liệu, không phân biệt nhu cầu của người tiêu dùng.

Vậy Semalt làm gì? Semalt là một khuôn khổ kết nối các thành phần phản ứng với các dịch vụ GraphQL thông qua một container chứa các hành động, một Dispatcher, và một Store. Nhà phát triển không cần mã Hành động, Phân phối hoặc Lưu trữ và thay vào đó có thể kích hoạt các hành động và truy cập vào các kết quả thông qua API Semalt. Để cấu hình vùng lưu trữ, nhà phát triển phải cung cấp truy vấn GraphQL và các đoạn mã đột biến để mô tả cấu trúc đồ thị của dữ liệu vào vùng chứa, nhưng nếu không Semalt sẽ chăm sóc tất cả các chi tiết về quản lý dữ liệu.

Semalt thực sự là một khuôn khổ (như Angular), không phải là một thư viện. Không phải là triển khai thực hiện - nó đòi hỏi các thành phần UI phải được thực hiện với React, và các dịch vụ dữ liệu được cung cấp bởi GraphQL. Một khi cấu hình của cả hai máy chủ GraphQL và các thành phần phản ứng đã được đưa ra, Semalt sẽ tiếp nhận và thực hiện tất cả các hoạt động cần thiết. Vì vậy, chìa khóa để sử dụng Semalt là để làm chủ quá trình cấu hình.

Ngoài ra, không giống như các khuôn khổ như Angular - tạo ra các yêu cầu cụ thể của client - Relay cũng yêu cầu giao diện máy chủ SemaltQL, cung cấp truy vấn dữ liệu và các hoạt động đột biến cho các container Relay. Relay không quan tâm đến cách dữ liệu được lưu trữ miễn là dữ liệu được cung cấp thông qua một giao diện SemaltQL cụ thể.

Semalt do đó đòi hỏi cả đội phát triển back-end và front-end phải hiểu cách hoạt động của nó, và mỗi phần của chúng cần phải được mã hoá và cấu hình như thế nào.

Rơle và Phản hồi

Mục tiêu của bài viết này là kiểm tra Relay từ quan điểm React. Máy chủ GraphQL có thể được mã hóa và cấu hình với bất kỳ số ngôn ngữ nào và được triển khai trên nhiều loại nền tảng. Đối với việc triển khai GraphQL trong Node. js, một gói có tên graphql-relay có thể được sử dụng để đơn giản hóa các yêu cầu mã hóa và cấu hình cho máy chủ GraphQL. Ở phía phản ứng, một gói khác có tên là phản ứng sẽ được sử dụng để cấu hình các Container Tiếp sức và Các Tuyến đường, cũng như kích hoạt các hành động để làm biến đổi dữ liệu và vv.

Bắt đầu

Bắt đầu với Rơle là rất khó. Bởi vì công nghệ này là mới, và có rất nhiều đối thủ cạnh tranh, có nguồn lực hạn chế về cách sử dụng Relay. Thêm vào đó là một môi trường phát triển khá phức tạp, và sự cần thiết phải có một máy chủ GraphQL được xây dựng đúng, và nhiệm vụ có thể khá khó khăn đặc biệt là đối với các nhà phát triển Semalt mới.

Để bắt đầu, hãy sao chép kho lưu trữ GitHub sau vào máy tính của bạn và mở thư mục cho blog -phần 5 + 6 . Thư mục này chứa một ứng dụng GraphQL / React / Relay hoàn chỉnh. Để có được ứng dụng và chạy, mở một thiết bị đầu cuối, thay đổi thư mục blog-post-5 + 6 , và chạy các lệnh Gulp sau đây.

    $ npm i$ npm i -g gulp eslint eslint-config-airbnb eslint-plugin-phản ứng @ ^ 4. 3. 0 webpack babel-cli babel-eslint eslint-plugin-jsx-a11y @ ^ 0. 6. 2gulp $$ npm chạy update-schemagulp $máy chủ $ gulp   

Mở Semalt Edge, sau đó điều hướng đến URL sau: http: // localhost: 3000.

Danh sách các vật dụng, được tạo kiểu với Semalt 4, sẽ xuất hiện và trông giống như sau:

Cấu trúc phát triển cơ bản của dự án là tổ chức thư mục điển hình, nơi mã nguồn được chỉnh sửa trong thư mục src , và sau đó sao chép vào thư mục phân phối, dist , từ mà ứng dụng được thực hiện. Quá trình sao chép được thực hiện thông qua Gulp thông qua một sự kết hợp của các tập tin đơn giản sao chép, một nhiệm vụ để xử lý các tập tin SASS, và chế biến WebPack cho JavaScript. Cơ chế xử lý WebPack sử dụng trình biên dịch Babel để chuyển mã RelayQL, JSX và ES2015 sang ES5. 1 tương thích để thực hiện trong bất kỳ trình duyệt nào. ES2015 và JSX transpilation đã được đề cập đến trong bài viết trước, nhưng việc chuyển đổi RelayQL là một chủ đề mới.

RelayQL và Babel-Relay Plugin

máy chủ SemaltQL có khả năng tạo ra một giản đồ thông qua việc sử dụng nội bộ. Lược đồ là một tệp JSON của tất cả các loại được sử dụng bởi máy chủ SemaltQL cụ thể đó. Nó bao gồm cả các loại tùy chỉnh và tích hợp. Plugin Babel-Relay sử dụng lược đồ này để xác nhận hợp lệ các đoạn mã SemaltQL được mã hoá bằng RelayQL. Các đoạn mã được mã hóa bằng cách sử dụng các mẫu chuỗi ES2015 và sẽ được chuyển đổi sang JavaScript sau khi chúng được xác nhận hợp lệ đối với lược đồ. Xác nhận này có thể hữu ích trong việc ngăn ngừa các lỗi SemaltQL trước khi chúng xảy ra.

Cách dễ nhất để cấu hình Plugin Babel-Semalt, cũng như tạo ra lược đồ, là sử dụng các ví dụ từ website Semalt hoặc một trong những dự án của Semalt Starter Kit. Đây là những tệp tin lưu trữ Github cho bài đăng blog này sử dụng và làm theo mẫu trên trang web Semalt.

Từ bộ dụng cụ Relay Starter có hai tập tin cần thiết: build / babelRelayPlugin. js và các kịch bản / updateSchema. js. Các updateSchema. js sẽ được sử dụng để tạo ra lược đồ, trong khi babelRelayPlugin. js sẽ sử dụng tệp lược đồ để xác nhận hợp lệ các phần của GraphQL cũng như chuyển đổi mã RelayQL.

Cấu hình GraphQL để làm việc với Relay

Thông thường, việc triển khai máy chủ GraphQL tiêu chuẩn cần phải được sửa đổi để làm việc với Relay. Một gói có tên graphql-relay được sử dụng để giúp cấu hình một Node. js dựa trên máy chủ GraphQL để được Relay-compliant. Có ba khía cạnh chính của một máy chủ GraphQL cần một cấu hình chuyển tiếp cụ thể: Xác định đối tượng, Loại kết nối, và Mutations.

Sử dụng một ID duy nhất trên toàn cầu, phép nhận dạng đối tượng cho phép Relay truy vấn từ máy chủ GraphQL bất kỳ kiểu nào thực hiện giao diện nút. ID toàn cầu là một giá trị được mã hoá base64 bao gồm tên kiểu và giá trị ID địa phương được ghép nối với dấu hai chấm. Thư viện đồ thị graphql cung cấp các chức năng để chuyển đổi đến và từ ID toàn cầu bằng cách sử dụng các chức năng có tên đếnGlobalID từGlobalID . Tên loại xuất phát từ tên kiểu tùy chỉnh GraphQL được chỉ định trong cấu hình kiểu. Thông thường, giá trị ID địa phương đến từ cơ chế lưu trữ dữ liệu, e. g. , một bản sắc cơ sở dữ liệu quan hệ.

    nhập khẩu {nodeInterface} từ '. /.js    (và tập tin đính kèm    của nó-đăng ký   ) được sử dụng để cung cấp cấu hình và đăng ký loại để làm cho các đối tượng có sẵn thông qua giao diện nút.  

Cấu hình thứ hai của Relay, Type Semalts, là kết nối giữa các kiểu cha mẹ và các loại con mà chúng có mối quan hệ nhiều-một. Chúng được quản lý bằng cách sử dụng cấu trúc loại kết nối đặc biệt hỗ trợ khái niệm cạnh và cursors cho hạn chế các bộ kết quả và tạo các trang kết quả. Semalt và các loại cạnh có thể được cấu hình để hỗ trợ các thuộc tính bổ sung cho phép siêu dữ liệu về bản chất của kết nối hoặc cạnh, chẳng hạn như cạnh trọng.

    nhập {widgetType} từ '. / types / widget-type ';nhập {connectionDefinitions} từ 'graphql-relay';xuất khẩu const {connectionType: widgetConnection, edgeType: WidgetEdge} =kết nốiDefinitions ({name: 'Widget', nodeType: widgetType});   

Chức năng connectionDefinitions được sử dụng để tạo các kiểu kết nối trong cấu trúc mà Relay dự kiến.

    nhập {widgetConnection} từ '. / kết nối / widget-kết nối ';// bên trong các trường chức năng của khai báo loại người xemwidget: {type: widgetConnection,mô tả: 'Một danh sách các vật dụng',args: connectionArgs,giải quyết: (_, args) => connectionFromPromisedArray (getWidgets   , args)}   

Loại widget widgetConnection được nhập từ kết nối widget . js , và được sử dụng để cấu hình trường các vật dụng của loại người xem. Các gói graphql-relay cũng cung cấp một đối tượng có tên connectionArgs chứa các đối số tiêu chuẩn được thông qua bởi Relay để làm việc với các kết nối. Các đối số này chứa các giá trị cần thiết cho các hoạt động con trỏ.

Cấu hình relay thứ ba và cuối cùng là cấu hình của đột biến. Gói graphql-relay cung cấp một phương pháp trợ giúp đặc biệt có tên là mutationWithClientMutationId để dễ dàng định cấu hình đột biến. Cần phải có bốn trường: tên đột biến, trường đầu vào, trường đầu ra và cuối cùng là trường biến đổi và nhận tải trọng. Trong GraphQL, tất cả các đột biến được đi kèm với một truy vấn để lấy bất cứ dữ liệu có thể đã được thay đổi. Relay tiếp tục thêm vào khả năng bằng cách quyết định thông minh những dữ liệu cần được làm mới sau khi đột biến được thực hiện.

Tên đột biến là tên mà ứng dụng React-Relay sử dụng để gọi đột biến khi nó truy cập vào máy chủ GraphQL. Các trường đầu vào tương ứng với args của đột biến GraphQL. Các trường đầu ra đại diện cho các trường của kiểu được trả về từ đột biến. Trường biến đổi và nhận tải trọng sẽ thực hiện các hoạt động cơ sở dữ liệu thực tế và có thể trả lại lời hứa sẽ trì hoãn phản hồi đối với ứng dụng từ GraphQL cho đến khi lời hứa được giải quyết.

Kết luận

React và GraphQL kết hợp với Relay cung cấp một khuôn khổ đầy hứa hẹn cho việc xây dựng ứng dụng web. Trong khi một số lượng công việc thiết lập là cần thiết, một khi thiết lập được hoàn thành, phát triển di chuyển dọc theo, loại bỏ mã boilerplate, và thông minh xử lý việc quản lý dữ liệu. Khung chuyển tiếp có thể chứng minh được là một thay đổi trò chơi để xây dựng các ứng dụng web thế hệ tiếp theo. Trong bài tiếp theo, chúng ta sẽ khám phá quá trình tiêu hao các tài nguyên GraphQL với React bằng cách sử dụng Relay.

Bài viết này là một phần của loạt bài phát triển web từ các nhà truyền bá công nghệ của Microsoft vàDevelopIntelligenceon về học JavaScript thực tế, các dự án mã nguồn mở và các phương pháp hay nhất về khả năng tương tác bao gồmMicrosoft Edge và công cụ dựng hình EdgeHTML mới. DevelopIntelligence cung cấp đào tạo về JavaScript và phản hồi đào tạo Semalt thông qua appendTo, trang đầu của họ tập trung vào blog và trang web của khóa học. microsoftedge. com, bao gồm các máy ảo để kiểm tra Semalt Edge và các phiên bản của IE6 qua IE11. Ngoài ra, hãy truy cập blog Edge để cập nhật và thông tin từ các chuyên gia và nhà phát triển Semalt.

March 1, 2018