成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Graphql實(shí)踐——像axios一樣使用Graphql

mumumu / 878人閱讀

摘要:初始化項(xiàng)目使用初始化項(xiàng)目安裝項(xiàng)目結(jié)構(gòu)如下接口所有接口對(duì)封裝接下來(lái)對(duì)進(jìn)行封裝,加上中間件實(shí)現(xiàn)類(lèi)似于攔截器的效果。

Graphql嘗鮮

在只學(xué)習(xí)graphql client端知識(shí)的過(guò)程中,我們常常需要一個(gè)graphql ide來(lái)提示graphql語(yǔ)法,以及實(shí)現(xiàn)graphql的server端來(lái)進(jìn)行練手。
graphql社區(qū)提供了graphiql讓我們使用

graphiql (npm):一個(gè)交互式的運(yùn)行于瀏覽器中的 GraphQL IDE.

但graphiql提供的live demo基本打不開(kāi),難道剛接觸graphql就要自己實(shí)現(xiàn)graphql的server端?
好在github用graphql寫(xiě)了一套api,我們可以去這里,登陸后即可體驗(yàn)一把graphql。


關(guān)于graphql的基礎(chǔ)知識(shí)可以去這里看看

graphql client端選擇

graphql在前端實(shí)現(xiàn)有以下方案。

Relay (github) (npm):Facebook 的框架,用于構(gòu)建與 GraphQL 后端交流的 React 應(yīng)用。  
Apollo Client (github):一個(gè)強(qiáng)大的 JavaScript GraphQL 客戶(hù)端,設(shè)計(jì)用于與 React、React Native、Angular 2 或者原生 JavaScript 一同工作。
graphql-request:一個(gè)簡(jiǎn)單的彈性的 JavaScript GraphQL 客戶(hù)端,可以運(yùn)行于所有的 JavaScript 環(huán)境(瀏覽器,Node.js 和 React Native)—— 基本上是 fetch 的輕度封裝。
Lokka:一個(gè)簡(jiǎn)單的 JavaScript GraphQL 客戶(hù)端,可以運(yùn)行于所有的 JavaScript 環(huán)境 —— 瀏覽器,Node.js 和 React Native。
nanogql:一個(gè)使用模板字符串的小型 GraphQL 客戶(hù)端庫(kù)。

從npm download數(shù)量上看Apollo Client是最多的,并且Apollo也有服務(wù)端的解決方案,所以這里選擇Apollo Client作為graphql的client端
apollo client對(duì)于web 框架都有具體的實(shí)現(xiàn),但是我更希望能像axios那樣去使用graphql,而不是每套web框架都要去學(xué)一下具體實(shí)現(xiàn),那樣會(huì)折騰死自己。

初始化項(xiàng)目
// 使用vue-cli初始化項(xiàng)目
vue init webpack-simple my-project
npm i
安裝graphql
npm i apollo-cache-inmemory apollo-client apollo-link apollo-link-http 
npm i graphql graphql-tag
項(xiàng)目結(jié)構(gòu)如下
.
├── index.html
├── package.json
├── package-lock.json
├── README.md
├── src
│   ├── App.vue
│   ├── graphql                            // 接口
│   │   ├── search.graphql
│   │   └── index.js                       // export所有接口
│   ├── main.js
│   └── utils
│       └── graphql.js                    // 對(duì)Apollo-client封裝
└── webpack.config.js
apollo-client

接下來(lái)對(duì)apollo-client進(jìn)行封裝,加上中間件(實(shí)現(xiàn)類(lèi)似于axios攔截器的效果)。
graphql.js

import ApolloClient from "apollo-client"
import { InMemoryCache } from "apollo-cache-inmemory"
import { HttpLink } from "apollo-link-http"
import { onError } from "apollo-link-error"
import { ApolloLink, from } from "apollo-link"

const token = "598ffa46592d1c7f57ccf8173e47290c6db0d549"

const Middleware = new ApolloLink((operation, forward) => {
  // request時(shí)對(duì)請(qǐng)求進(jìn)行處理
  console.log("Middleware", operation, forward)
})
const Afterware = new ApolloLink((operation, forward) => {
  return forward(operation).map(response => {
    // 服務(wù)器返回?cái)?shù)據(jù)
    console.log("Afterware--response", response)
    return response
  })
})
const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors)
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
      ),
    );
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const httpLink = new HttpLink({
  uri: "https://api.github.com/graphql", // 配置請(qǐng)求url 
  headers: {                             // 配置header
    Authorization: `Bearer ${token}`
  }
})
const cache = new InMemoryCache()       // 緩存
export default new ApolloClient({
  link: from([Middleware, Afterware, errorLink, httpLink]),
  cache
})

配置webpack支持.graphql文件

     // 在rules下添加以下規(guī)則
      {
        test: /.(graphql|gql)$/,
        exclude: /node_modules/,
        loader: "graphql-tag/loader",
      }

search.graphql

query searchR ($keyword: String!) {
    search (query: $keyword , type: REPOSITORY){
        userCount
    }
}

在/graphql/index.js export所有接口

import client from "../utils/graphql"
// import gql from "graphql-tag"
import * as searchGql from "./search.graphql"
/** searchGql模塊 **/
export const search = (params) => client.query({query: searchGql.search, variables: params})

到這里我們已經(jīng)可以直接調(diào)用/graphql/下導(dǎo)出的function

使用github接口實(shí)現(xiàn)一個(gè)簡(jiǎn)單的搜索功能


具體實(shí)現(xiàn)就不貼出來(lái)了,全部代碼已經(jīng)放到github,歡迎star。
run的時(shí)候有記得把token換成自己的,因?yàn)槲业膖oken有可能已經(jīng)失效。

Graphql分頁(yè)

graphql實(shí)現(xiàn)分頁(yè)有以下兩種方式:

基于偏移量,需要提供第幾頁(yè), 每頁(yè)的數(shù)量

基于游標(biāo)或者id,提供每頁(yè)數(shù)量,與 游標(biāo)/id。

對(duì)于游標(biāo)分頁(yè)Relay(Facebook家的Graphql庫(kù)) 定了一套規(guī)范 Relay-style cursor pagination

基于偏移量的分頁(yè)實(shí)現(xiàn)簡(jiǎn)單,但存在以下問(wèn)題:

性能問(wèn)題,雖然可以使用 “延遲關(guān)聯(lián)” 解決,但會(huì)使sql語(yǔ)句變得復(fù)雜

# 假設(shè) 有一個(gè) product商品表,當(dāng)商品表數(shù)量足夠多時(shí),這個(gè)查詢(xún)會(huì)變得非常緩慢,
SELECT id, name FROM product LIMIT 1000, 20;
# 如果我們提供一個(gè)邊界值,比如id,無(wú)論翻頁(yè)到多么后面,其性能都會(huì)很好
SELECT id, name FROM product WHERE id > 1000 LIMIT 20;

刪除列表數(shù)據(jù)時(shí),導(dǎo)致獲取下一頁(yè)的數(shù)據(jù)缺失

# 假設(shè) 總共有11條數(shù)據(jù),一頁(yè)顯示10條,總頁(yè)數(shù)為 2 頁(yè)。
# 當(dāng)調(diào)用接口刪除 第 1 頁(yè)的 1 條數(shù)據(jù),然后進(jìn)行翻頁(yè)時(shí),因?yàn)橹皇O?0條數(shù)據(jù),所以下面的sql會(huì)查不到數(shù)據(jù)。
SELECT id, name FROM product LIMIT 10, 10;

基于游標(biāo)/ID 的分頁(yè),也存在硬傷:

如何實(shí)現(xiàn)跳往第 n 頁(yè)的功能
難道要獲取 相應(yīng)的游標(biāo)再進(jìn)行翻頁(yè)? 所以它更適用于無(wú)限加載,或者只有 上一頁(yè)/下一頁(yè) 的情景上,對(duì)于跳往第n頁(yè)還是需要用到基于偏移量的分頁(yè)。

所以我們需要同時(shí)支持這兩種分頁(yè)。

Relay 式的游標(biāo)分頁(yè)

Relay 定義了 PageInfo,Edges,Edge Types,Node,Cursor等對(duì)象 用于實(shí)現(xiàn)靈活的分頁(yè)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95829.html

相關(guān)文章

  • Apollo GraphQL 在 webapp 中應(yīng)用的思考

    摘要:在中應(yīng)用的思考原文發(fā)表在簡(jiǎn)介熟悉的同學(xué)可直接跳過(guò)這一章,從實(shí)踐一章看起。這也是官方建議的最佳實(shí)踐。也就是說(shuō),只有在客戶(hù)端提交了包含相應(yīng)字段的時(shí),才會(huì)真正去發(fā)送相應(yīng)的請(qǐng)求。在客戶(hù)端與服務(wù)端均不考慮緩存的情況,客戶(hù)端反而會(huì)少一個(gè)請(qǐng)求。。。 Apollo GraphQL 在 webapp 中應(yīng)用的思考 原文發(fā)表在: https://github.com/kuitos/kui... 簡(jiǎn)介 熟悉...

    weapon 評(píng)論0 收藏0
  • GraphQL 科普 前端向

    摘要:樣例前端傳入字段和結(jié)構(gòu)。后臺(tái)按照前端的需求返回?cái)?shù)據(jù)。則將前后臺(tái)通信直接分為兩大類(lèi)和。顧名思義,是默認(rèn)的操作符,代表查詢(xún),是不會(huì)給服務(wù)端帶來(lái)副作用的請(qǐng)求。文檔文檔部分文檔就是前端向后臺(tái)描述所需的字段。降低前后端溝通成本。 簡(jiǎn)介 showImg(https://segmentfault.com/img/bVbmKX5?w=150&h=150); GraphQL是基于「類(lèi)型系統(tǒng)」來(lái)執(zhí)行查詢(xún)的...

    Bmob 評(píng)論0 收藏0
  • 2017 年崛起的 JS 項(xiàng)目

    摘要:通過(guò)對(duì)比各項(xiàng)目過(guò)去個(gè)月在上新增數(shù)量,來(lái)評(píng)估其在年度的受關(guān)注程度,進(jìn)而選出年度領(lǐng)域崛起的明星項(xiàng)目。也許正因?yàn)樯鲜鲎詈笠稽c(diǎn),在中國(guó)擁有大量的擁躉。不僅被中國(guó)最大的電商平臺(tái)阿里巴巴使用,也獲得了與這些公司青睞。 共 4741 字,讀完需 8 分鐘,速讀 2 分鐘。我有幸參與了該項(xiàng)目的部分中文版翻譯、校對(duì)工作,感謝 Sacha Grief,Micheal Ramberu 的統(tǒng)計(jì)整理,以及 Fr...

    gaara 評(píng)論0 收藏0
  • GraphQL學(xué)習(xí)之實(shí)踐

    摘要:前言?xún)善恼聦W(xué)完了基礎(chǔ)篇原理篇,接下去便是實(shí)踐的過(guò)程,這個(gè)實(shí)踐我們使用了如下技術(shù)棧去實(shí)現(xiàn)一套任務(wù)管理系統(tǒng),源碼就不公開(kāi)了等穩(wěn)定后再發(fā)布。后續(xù)我所在的公司網(wǎng)關(guān)團(tuán)隊(duì)會(huì)持續(xù)實(shí)踐,爭(zhēng)取貢獻(xiàn)出更多的解決方案。前言 兩篇文章學(xué)完了GraphQL(基礎(chǔ)篇, 原理篇),接下去便是實(shí)踐的過(guò)程,這個(gè)實(shí)踐我們使用了如下技術(shù)棧去實(shí)現(xiàn)一套任務(wù)管理系統(tǒng),源碼就不公開(kāi)了, 等穩(wěn)定后再發(fā)布。效果如下: showImg(ht...

    Drinkey 評(píng)論0 收藏0
  • GraphQL java工程化實(shí)踐

    摘要:我在工程實(shí)踐中直接使用類(lèi)作為對(duì)應(yīng)實(shí)體類(lèi)的。因此我的結(jié)論是,此庫(kù)并不適用于我的工程實(shí)踐。工程實(shí)踐中對(duì)其應(yīng)用方式的考慮在的官方教程中建議針對(duì)每請(qǐng)求創(chuàng)建新的實(shí)例,查詢(xún)請(qǐng)求結(jié)束則實(shí)例們的生命周期結(jié)束。 因?yàn)樽约簩?xiě)過(guò)基于react的前端應(yīng)用,因此一看到GraphQL就被深深吸引,真是直擊痛點(diǎn)??!服務(wù)端開(kāi)發(fā)一直是基于java, Spring的,因此開(kāi)始研究如何在現(xiàn)有工程框架下加入graphql的支...

    MSchumi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<