Рубрики
Без рубрики

Гэтсби внутренние органы для разработчиков

Исследуя мощные функции GATSBY с небольшой документацией в Интернете.

Автор оригинала: Tushar Sharma.

GATSBY это отличный инструмент. К сожалению, хотя трудно найти хорошую документацию Некоторые из очень полезных API, которые мы можем использовать при построении приложения GATSBY. Не тратя впустую время, давайте погрузимся прямо в некоторые из прохладных выводов моего разведки GATSBY.

Как это работает ⚙️? Обзор 🔭.

В GATSBY вы пишете шаблоны страницы в Jsx И необязательно вы также предоставляете способ получить динамический контент для страницы. Вообще через Graphql Запрос.

Поэтому, если вы хотите иметь страницу на вашем сайте в Your-website.com/about.html Вы создадите Актуальный компонент в SRC/страницы/about.js

import React from 'react'

export default function About() {
  return (
    
About Me
) }

Прямо сейчас это просто статический контент здесь, который является строкой Обо мне Отказ Если я хочу сделать эту строку динамикой, я могу использовать запрос GraphQL для этого.

import React from 'react'
import { graphql } from 'gatsby'

export default function About({data}) {
  return (
    
{data.dynamicString}
) } export const query = graphql` query aboutMeDynamicContent { # Your GraphQL Query here } `

Теперь возможно, что каждый раз, когда каждый раз, когда этот компонент загружает его первым извлекать данные, а затем оказывает его. Что действительно происходит GATSBY не загружает никакого динамического содержимого во время выполнения или когда ваш сайт будет жить. Это делает это однажды только во время Построить время Отказ

Итак, все запросы или API вызывают, которые вы определяете, называются в то время, когда ваш сайт является Быть построенным GATSBY, где он проходит через все ваши определенные компоненты и генерируют Статический HTML из этих компонентов. Если компилятор также находит запрос GraphQL, он вызывает эти запросы и сохраняет все данные из тех Запросы и используйте эти данные для генерации Статический HTML из этой страницы компонента. После процесса строительства ваше приложение должно стать полностью статичным, то есть все Данные, которые им нужны, поэтому он не должен запросить любой динамический контент во время выполнения.

GATSBY использует рендеринг на стороне сервера для генерации прирешенного спа, который регидрат в полностью функциональном приложении React.

GATSBY хранит все данные в большом файле JSON.

Теперь я не хочу проходить детали того, как это работает. Там столько великих статей, которые делает удивительную работу, описывающую то же самое. Давайте перейдем к некоторым из более крутых вещей.

Как это работает ⚙️? Внутренний внешний вид 🔬

А Узел является основой всех моделей данных, используемых в GATSBY.

type Node = {
  id: String, // a unique id of each node
  children: Array[String], // an array of node ids
  parent: String, // parent node id, undefined if no parent
  fields: Object, // this is for us to add any custom property to this node
  internal: {
    type: String, // A globally unique name chosen by the plugin who created this node.
    ...
  },
  ...other fields specific to this type of node
}

Запросы GraphQL, которые мы введены, целью этих узлов для данных.

Чтобы получить лучшее понимание процесса создания и манипуляций узла, давайте напишем несколько бруснульных плагинов для создания постов в блоге от файлов Markdown.

Я буду писать псевдо-код для какой-то части, чтобы избежать сложности.

Также я буду писать много комментариев для описания различных частей кода. Убедитесь, что вы прочитали их.

Наша структура каталогов выглядит что-то вроде этого

content/
  my-journey-to-neverland.md
  my-new-blog.md
src/
  components/
    post.js
  pages/
    index.js  
gatsby-node.js
package.json

Шаг 1 – Прочитайте файлы Markdown 🥔

Мы создадим плагин для этого. Давайте назовем наш плагин My-File-Reader

Реализация будет выглядеть что-то вроде этого в файле с именем gatsby-node.js Отказ

// helper function to read a file : PSEUDO
function readFile(path){
  ... read file at path `path`
  return {
    name,
    content,
    path,
    fileType,
    modifiedAt,
    createdAt
  };
}

// this function is called by gatsby to check if we've defined
// any nodes. You will use this if you want to register/create nodes. We are using it
// because we want to read files and create/register them as nodes in gatsby
exports.sourceNodes = (
  { actions, getNode, createNodeId },
  pluginOptions ) => {
  
  const { createNode } = actions; // helper function to register a node with gatsby
  const fileDirectory = pluginOptions.path; // path defined in plugin options to read files from 

  // iterating over the directory content
  fileDirectory.forEach((filePath) => {
  // reading file at given path
  const file = readFile(filePath);
    // registering our node
    createNode({
      id: createNodeId(), // assigning a unique id through helper function
      children: [], // no children at this point
      parent: undefined, // no parent
      internal: {
        type: 'MySourceFileNode', // A globally unique name for this node type
      },
      // custom properties of our file node
      name: file.name,
      content: file.content,
      path: file.path,
      fileType: file.fileType,
      modifiedAt: file.modifiedAt,
      createdAt: file.createdAt
    });
  });
}

На данный момент мы прочитали наши .md Файлы и проинформированные GATSBY о наших пользовательских узлах файлов. Теперь они будут доступны для наших запросов GraphQL. GATSBY автоматически создает Схема Graphql для нас. Мы можем запросить имя файла, типа файла и всех других свойств с использованием GraphQL.

Хорошая новость заключается в том, что вам не нужно писать плагин для прочтения обычных файлов RAW. Там это Официальный плагин Для этого 🤝.

Шаг 2 – Создать HTML от Markdown 🍟

Теперь, когда у нас есть сырые .md Файлы в нашей системе представлены как узлы. Мы создадим Новый тип узла, который будет содержать наш HTML (после составления нашей Roar Markdown до HTML).

Мы создадим другой плагин для этого. Давайте назовем наш плагин My-Md-Transformer

Реализация будет выглядеть что-то вроде этого в файле с именем gatsby-node.js Отказ

const mdToHtml = require('magic-md-to-html-transformer'); // pretty sure this doen't exist

// helper function to create our new node
function createMDNode({id, node, content}) {

  const { html } = mdToHtml(content);
  // creating data structure for our new node
  const mdNode = {
    id,
    children: [],
    // the parent our new node will be the file node
    // because we've derived the new node from the file node
    parent: node.id,
    internal: {
      content: content,
      // setting a unique name for our new node
      type: "Md"
    }
  };

  mdNode.html = html;
  return mdNode;
}

// gatsby calls this fuction for each node that it has created
// this is also a good place to modify/add a node
// it will be called for each of our `MySourceFileNode`
exports.onCreateNode = async (
  {
    node, // the node itself
    loadNodeContent,
    actions,
    createNodeId, //helper function to create a unique node id
    getNode, // helper function to get any node by passing the id
  },
  pluginOptions
) => {
    
  const { createNode, createParentChildLink, createNodeField } = actions;

   // we only want to transform nodes of type `MySourceFileNode`
   // rest we don't care 
  if (node.internal.type !== "MySourceFileNode") {
    return;
  }

  // helper function to read node's content
  // in our case the content would be the content of our raw md files
  const content = await loadNodeContent(node);

  // here we are creating a new node type
  // this new node type will contain our html transformed from md
  // we are passing in the raw content of our md files to our helper function
  const mdNode = createMDNode({
    id: createNodeId(),
    node,
    content
  });

  // registering our new node with getsby
  // after this it will be available in our GraphQL API
  createNode(mdNode);

  // this is a helper functin to inform the parent node that it has a new child 👼🏻
  // remember the `children` property, yes i think it updates that property of the parent to include this new child
  createParentChildLink({ parent: node, child: mdNode });

  // creating a custom field named slug on our new node
  // remember we have a fields property on each node
  // the field we create here gets added to that property
  createNodeField({
    name: 'slug', // field name
    mdNode, // the node on which we want to add a custom field
    value: kebabCase(node.fileName) // field value
  });
}

На данный момент у нас готова наша HTML-разметка, сохраненная в наших недавно созданных узлах в качестве свойства. Следующим шагом является регистрация URL-адресов с GATSBY, чтобы служить этой разметке.

Магазин узла, используемый внутри GATSBY, будет иметь что-то подобное

[
  {
    id: '123456',
    children: ['abc'],
    parent: ,
    internal: {
      type: 'MySourceFileNode',
    },
    name: 'my-new-blog',
    content: '↵# My New Blog↵↵Hello World!',
  },
  {
    id: '7891011',
    children: ['ghi'],
    parent: ,
    internal: {
      type: 'MySourceFileNode',
    },
    name: 'my-journey-to-neverland',
    content: '↵# Journey to neverland↵↵Hello World!',  
  },
  {
    id: 'abc',
    children: [],
    parent: '123456',
    internal: {
      type: 'Md',
    },
    field: {
      slug: 'my-new-blog',
    },
    html: '

My New Blog

Hello World!

', }, { id: 'ghi', children: [], parent: '7891011', internal: { type: 'Md', }, field: { slug: 'my-journey-to-neverland', }, html: '

Journey to neverland

Hello World!

', } ]

Шаг 3 – Служить HTML-страницы 🍽

Теперь мы хотим сказать GATSBY оказать наши блоги на URL-адресах, указанных нами. GATSBY также предоставляет API для этой цели.

// gatsby calls this fuction to give us an oppurtunity
// to register new pages with gatsby.
// We are using it to create a page for each of our blog
exports.createPages = ({ graphql, actions }) => {

  const { createPage } = actions; // helper function to register a page

  // we must return a promise
  // here we are querying our graphql api to get
  // all the `Md` nodes that we created
  // note that gatsby automatically creates GraphQL schema
  // for such queries like `allMd` and `allMySourceFileNode`
  // using the nodes that we've defined earlier
  return new Promise((resolve, reject) => {
    resolve(
      graphql(
        `
          {
            allMd {
              #edges is like results
              edges {
                node {
                  id
                  fields {
                    slug
                  }
                }
              }
            }
          }
        `
      ).then(result => {
        // this is some boilerlate to handle errors
        if (result.errors) {
          console.error(result.errors);
          reject(result.errors);
        }

        // storing our blogs in a variable
        const posts = result.data.allMd.edges;

        // iterating over all of our blogs
        posts.forEach(({ node }, index) => {
          // using the helper function
          // we create and register our page with gatsby
          createPage({
            path: node.fields.slug, // '/my-new-blog`
            // path of the react component which should render this html
            component: path.resolve(__dirname, `src/components/post.js`),
            // any data you want to pass to the react component that will render this
            context: { 
              id: node.id,
            }
          });
        });
      })
    );
  });
};

Вот и все, наши блоги Markdown теперь готовы быть поданы в качестве HTML-страниц. Этот пример был основан на блогах, присутствующих в нашей файловой системе, но мы можем использовать что-либо в качестве поставщика контента (API, CMS, удаленной файловой системы) и создавать контент/страницы для нашего веб-сайта. Это сила GATSBY.

Мне понравилось исследовать GATSBY, и это единственная причина, по которой я сделал переписать на мой сайт. Если у вас есть какие-либо вопросы относительно этого блога, добраться до меня на TS17995@gmail.com Отказ Я буду рад ответить.

Спасибо ✌🏻.