npm 包 @monastic.panic/relay-compiler 使用教程

阅读时长 11 分钟读完

在前端开发中,GraphQL 是一种流行的查询语言和服务端框架,但是在客户端要如何使用这种查询语言和处理数据呢?这就需要使用 Relay,它是一个基于 React 的查询和数据管理库,可以方便地进行网络请求,处理和管理数据。在这个过程中,@monastic.panic/relay-compiler 是一个必须的 npm 包,用于将 GraphQL 查询编译成可执行的 JavaScript 代码,并将它们与 Relay 一起使用。在本篇文章中,我们将介绍如何使用 @monastic.panic/relay-compiler,以及它的使用技巧和注意事项。

安装

要使用 @monastic.panic/relay-compiler,首先需要安装 node.js 和 npm。然后通过以下命令进行安装:

该命令将 @monastic.panic/relay-compiler 安装为项目的一个 devDependencies。接下来,我们需要配置我们的项目以使得机器可以找到该命令。可以在 package.json 中加入以下内容:

最后,你需要提供配置文件(relay.config.js):

其中,src 指定 Relay 查询的源代码目录,schema 指定 GraphQL schema 的路径,language 指定使用 TypeScript 或 JavaScript。

现在你就可以在项目根目录下使用以下命令:

这个命令将对你的 Relay 查询文本进行编译。

使用

使用 @monastic.panic/relay-compiler 的关键是为项目中的各个 GraphQL 查询文件生成相应的模块。使用 GraphQL 查询语言时,@monastic.panic/relay-compiler 会将其编译成可执行的 JavaScript 代码。

例如,我们有一个叫做 query.graphql 的文件,其中包含以下查询:

@monastic.panic/relay-compiler 将其编译成以下形式:

-- -------------------- ---- -------
---
 - -----
 - ---------- --------------------------------
 --

-- -------------- --
---- --------

----
------ ---- - -------------- - ---- ----------------
------ ---- - ----------------- - ---- ----------------
------- ------ ------ ---- --------------- ------------------
------ ---- ---------- - --
  ------ ---
    ------- --------
    ------ --------
  ---
  ---------- ---------------
---
------ ---- --------------- - -----------
------ ---- -------------- - -
  -------- ----------------
  --------------- ---------------
 -
-

我们来逐一分解其中的内容。

顶部指示器

顶部指示器包含了这个查询语句的类型信息,例如它所从属于的类型,以及查询哈希值。这是相当重要的,因为它允许 Relay 根据 @monastic.panic/relay-compiler 所生成的模块自动跟踪查询文本的变化。这样,当查询文本变化时,Relay 会自动重新生成查询模板。

导入语句

这里导入了用于客户端的 runtime 函数,以及 fragment 的类型和参考。如果您使用 TypeScript,那么还会带有一些辅助的类型导入。

Queries

编译后的查询语句被包装在一个可以被传递到查询的函数中的代码块中。这个函数是使用 index.js 文件中的 createQueryBuilder 函数生成的。

参考的扩展类型

最后,我们对这个查询进行了一些更进一步的封装。在这里,我们使用 opaque types 保证这个查询的类型安全性,并公开了一些类型来增强我们 GraphQL 查询的可读性。

示例代码

在这里,我们创建了一个包含查询列表的可重用组件:

-- -------------------- ---- -------
------ - -- ----- ---- --------
------ ------- ---- ---------------------------
------ - ----------- - ---- --------------------
------ ---- - ---------------------------- - ---- ---------------------------------------------------

---- ----- - -
  ------ -----------------------------
--

------ ------- -------- ------------------------- ------ -
  ----- ---- - ------------
    --------
      -------- ------------------------ -- ----- -
        -------- -
          ----- -
            ---- -
              --
              -----
              ----
            -
          -
        -
      -
    --
    -----------
  --

  -- ----------------------------- -
    ------ ----- ----- -----------
  -

  ------ -
    ----
      ----------------------------- -- -
        --- -------------------
          --------------------------
          ---------------------------
        -----
      ---
    -----
  --
-

使用:

-- -------------------- ---- -------
------ ----- ---- --------
------ ------------
------ - -------- - ---- --------
------ - ------------------------ - ---- --------------------
------ ---------------- ---- ---------------------
------ ------------------ ---- -----------------------
------ ------- ---- ---------------------------

-------- ----- -
  ----- ----- - --------
    ----- -------- -
      ---------------------------
    -
  --

  ------ -
    ------------------------- -------------------------------
      ---- ----------------
        ------- -----------------------
          --------- ------------------------
            ------------------- ------------- --
          -----------
        ---------
      ------
    ---------------------------
  --
-

------ ------- ----

这里有一个完整的查询示例。在 Client 模块中,通过 Eko 消息服务器获取消息:

-- -------------------- ---- -------
------ - ------------ - ---- -------------
------ - ----------------------- - ---- -------------
------ - ------------ - ---- -----------------------
------ - ------------------ ---------------------- ----- - ---- ----------
------ - --------------------- - ---- ----------------------------------------------------------- -- ----

------ - ------------ -- --------------- - ---- -----------------------------
------ - --------------------- - ---- ------------------------------------
------ - -------------------------- - ---- ---------------------------------------------
------ - ----------------- - ---- ----------------

---- -------------- - ----------------------- - -
  -------- ------ ------
  ---- -------
--

------ ----- ------- - ----- --------- --------------- -- -
  ----- ------ - ----------------------
  ----- ------ - -----------------------------------

  ----- ----- - -
    --------- -------------------------------
  --
  ----- ------ - ----- ----------------------
  ----- ------------------- - ------------
  --------------- - -----------------------------
  ----- ------ - ----------------------------- -----------------------

  ----- -------------------- ------------ - -
    ------ --------------------
    ---------- - --- --------------------------------------------- --
    -------------- ----------
--

  ------------------------------------------------------------------ -
    ----- ---- -- -
      ------------------------------- ------- -- -
        ----- ------------ - ----------------------------------------------------- -- --------- --
        ------------------------------------------- ---------- -------------- -- -------
      ---

      ------------------
    --
    --------- -- -- -
      --------------------
    --
    ------ ----- -- -
      -------------------
    --
  ---
--

这里有两个重要的部分。generateQueryDocument 从 Eko client schema 中提取出 createMessageFragment 映射,并根据其构建 GraphQL 查询的 JavaScript 模块。messageQueryRequest 消息查询包含了一个名为 messageDetailsFragment 的 Fragment 在其查询中。在 subscribe 方法中看到的是该请求的返回,在返回中,我们将得到一个行级别的更新任务,称为“payload”。

总结

在本文中,我们介绍了如何使用 @monastic.panic/relay-compiler,以及它的使用技巧和注意事项。我们展示了在 React 应用程序中使用这个 npm 包的完整示例。此外,我们还展示了一个从 Eko 消息服务器获取消息的完整示例和分析。在建立起贯通前后端对话的同时,提高 React/Relay 跨平台编程能力的方法以及利用 TypeScript 构建 GraphQL 类型安全的关键技术。希望这篇文章对于你的前端开发工作有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066bcc967216659e2447fe

纠错
反馈