使用 Gatsby.js 搭建靜態博客 1 關鍵文件

原文地址:https://ssshooter.com/2018-12...

靜態博客之前也有搭建過,不過使用 Hexo 一鍵生成的,其實當時也有考慮過 Gatsby,不過這個框架搭建博客入門還是比較難的,前置知識點包括 react 和 graphQL。

這個系列的文章記錄的就是這個博客搭建中需要注意的點。

此博客使用 gatsby-starter-blog 作爲框架,後續自己添加功能。

在安裝 gatsby cli 後運行此指令即可以 gatsby-starter-blog 爲模板創建博客。

gatsby new gatsby-blog https://github.com/gatsbyjs/gatsby-starter-blog

項目創建後文件夾結構基本如下(有區別是因爲這是我搭建好的截圖,也有可能是 starter 的版本升級)

其中最爲重要的是 gatsby-node.js/src/templates/blog-post.js 以及 gatsby-config.js

gatsby-node.js

頁面創建邏輯大部分都在 gatsby-node.js,打開文件可以看到類似代碼:

// 頁面創建函數
exports.createPages = ({ graphql, actions }) => {
  const { createPage } = actions

  return new Promise((resolve, reject) => {
    const blogPostTemplate = path.resolve(`src/templates/blog-post.js`)
    // 查詢 md 文件構建頁面
    // 此處查詢使用的是 graphql,這也是 Gatsby 入門門檻較高的原因之一
    // 不過其實這是一個比 sql 更容易理解的查詢語言
    resolve(
      graphql(
        `
          {
            allMarkdownRemark(limit: 1000) {
              edges {
                node {
                  frontmatter {
                    path
                  }
                }
              }
            }
          }
        `
      ).then(result => {
        if (result.errors) {
          reject(result.errors)
        }

        // 遍歷查詢結果生成頁面
        result.data.allMarkdownRemark.edges.forEach(({ node }) => {
          const path = node.frontmatter.path
          // 生成單個頁面的函數
          createPage({
            path, // 頁面路徑
            component: blogPostTemplate, // 頁面使用的模板
            // 這是注入上下文變量,注入後可以在模板頁面中使用變量
            // 變量可以使用於 graphql 查詢和 jsx 編寫
            context: {
              path,
            },
          })
        })
      })
    )
  })
}

/src/templates/blog-post.js

此處只是一個舉例,其他模板文件和頁面文件的結構都類似,所以這裏使用 /src/templates/blog-post.js 說明文件結構。(另外放在 /src/pages/ 的 js 文件都是會轉換爲頁面的)

這類文件兩部分:

第一部分:export default BlogPostTemplate

這是頁面視圖的組件,跟普通 jsx 一樣,不過上面有說到:createPage 函數是可以注入參數到模板文件的。

而這些參數就在 this.props.pageContext 中。

另外,下面將會提到的頁面查詢函數所得的數據在 this.props.data

第二部分:export const pageQuery

// 注意其中 $slug,這也是被頁面創建函數注入的上下文變量,沒有前綴,直接使用即可
export const pageQuery = graphql` 
  query BlogPostBySlug($slug: String!) {
    site {
      siteMetadata {
        title
        author
      }
    }
    markdownRemark(fields: { slug: { eq: $slug } }) {
      id
      excerpt
      html
      frontmatter {
        title
        tags
        date(formatString: "MMMM DD, YYYY")
      }
    }
  }
`

查詢函數大概長這樣,簡單來說 graphql 就是把你需要的數據填入你的請求,然後返回給你,光說不易理解,自己玩一把就能立刻明白!

更方便的是,在項目開發環境運行後,還會自帶一個 graphql 查詢頁面:http://localhost:8000/___graphql

一定要注意右上角是自帶文檔的!遇到數據結構懵逼的時候,在文檔查一下就 ok 啦(你甚至可以 ctrl 點擊 query 中的字段名直接跳轉到對應文檔,實在方便得不能再方便了,好評!)

頁面中的查詢函數返回的結果會注入到 this.props.data,跟普通屬性一樣照常使用即可。

gatsby-config.js

gatsby-config.js 看名字就知道這是 Gatsby 的配置文件。使用 starter 建立項目已經自帶了不少插件,但在我的搭建過程中仍然有一些需要自己添加的。

這裏是 Gatsby 的插件庫,遇到什麼需求可以優先在此處搜索。

總結

結合這三個重要文件,便是 Gatsby 的應用結構:

讀取設置和插件 -> 調用創建頁面前查詢所需資源 -> 創建頁面,把查詢到的參數注入到模板 -> 進行模板本身的查詢 -> 填入數據 -> 成功生成一個頁面

整個流程大部分都是使用循環生成所有頁面。

此係列下一篇將會是分頁相關的詳細說明,這是我初始化之後第一個加上的功能(是的, starter 是不帶分頁的...)。

參考鏈接:
https://www.gatsbyjs.org/docs...
https://www.gatsbyjs.org/docs...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章