基於Gridsome建立一個基於Vue.JS和Markdown的部落格
本文介紹如何使用Gridsome的JAMstack生成靜態站點,在文章的最後,我們將使用Markdown構建一個部落格作為生成的內容,使用GraphQL來查詢將在頁面上顯示的帖子。
靜態站點生成器是Web開發的新混合方法的一部分,允許您在計算機上本地構建功能強大的網站,但是將站點預構建為靜態檔案以進行部署。JAMstack是一種構建網站和應用程式的新方法,可提供更好的效能,更高的安全性,更低的擴充套件成本和更好的開發人員體驗
介紹Gridsome
Gridsome是一個Vue.js驅動的靜態站點生成器,用於建立可在任何地方部署的快速安全的網站。它使開發人員可以輕鬆構建現代JAMstack網站。
Gridsome捆綁了一些難以錯過的功能,這使它成為最受歡迎的靜態站點生成器之一。其中一些功能包括:
- 使用熱重新載入進行本地開發 - 在開發過程中實時檢視更改。
- 編寫Vue.js程式碼 - 一個輕量級且易於使用的前端框架。
- GraphQL資料層 - 為您的所有資料集中管理資料。
- 自動頁面路由 - 使用檔案快速建立和管理頁面。
- 漸進式影象支援 - 自動調整大小,優化和延遲載入影象。
- 自動頁面預取 - 頁面在後臺載入以便快速瀏覽。
- 自動優化的程式碼 - 開箱即用的程式碼分割和資產優化。
- 快速靜態頁面生成 - 安全,快速地部署到任何靜態Web主機。
- 資料來源外掛 - 從流行的無頭CMS,API或Markdown檔案新增資料。
建立一個Gridsome專案
我們需要設定一個新的Gridsome專案,為此我們將需要執行以下命令。
第一步,使用npm或yarn在計算機上安裝Gridsome CLI。
$ npm install --global @gridsome/cli or $ yarn global add @gridsome/cli |
安裝CLI後的下一步是繼續建立一個名為的新專案Telerik-blog並執行該專案。
// create a new gridsome project $ gridsome create telerik-blog $ cd telerik-blog $ gridsome develop |
執行這些命令後,本地開發伺服器應該執行在http://localhost:8080,訪問可顯示的示例頁面。
如果我們嘗試更改此佈局頁面上的任何內容,那麼我們將看到它會自動更改螢幕上的內容。這是我們之前談到的Gridsome Hot Reloading功能的結果。
用Gridsome構建一個部落格
我們將開始描述我們試圖通過部落格實現的目標 - 我們將有一個包含帖子列表的單個頁面,並且每個帖子都包含Markdown中的內容。為了實現這一目標,我們需要安裝一個Gridsome外掛叫做gridsome/source-filesystem有助於轉換檔案轉換成可以與GraphQL在你的元件中獲取內容。繼續使用此命令安裝程式包:
yarn add @gridsome/source-filesystem or npm install @gridsom/source-filesystem |
並在gridsome.config.js檔案中配置它:
module.exports = { siteName: 'Gridsome Blog', siteDescription: 'A simple blog designed with Gridsome', plugins: [ { use: '@gridsome/source-filesystem', options: { path: 'content/posts/**/*.md', typeName: 'Post', route: '/blog/:slug' } } ] } |
上面的配置是我們設定source-filesystem外掛所需的。這裡設定的選項:
- path:我們將在帖子中消費的降價內容的位置。
- typeName:GraphQL型別和模板名稱。一個.vue檔案src/templates必須符合typeName有它的模板。
- route:這是每個帖子將遵循的路線,即 localhost:8080/blog/new-post
Gridsome使用Layouts作為頁面和模板的包裝器。佈局包含頁首,頁尾或側邊欄等slot元件以及插入來自頁面和模板的內容的元件。
<template> <div class="layout"> <slot/> <!-- Page/Template will be inserted here --> <div class="footer"> <p> Built with <a class="link" href="//gridsome.org">Gridsome</a> & Made with by <a class="link" href="//twitter.com/lauragift21">Gift Egwuenu</a> </p> </div> </div> </template> |
上面的程式碼塊是我們的Default.vue元件。我們可以繼續瀏覽GitHub Repo中使用的樣式。
建立頁面佈局
頁面佈局將列出所有部落格帖子,也將作為主頁。在Gridsome中,Pages用於普通頁面以及列表和分頁GraphQL集合。在這種情況下,我們的部落格文章是集合。
頁面URL是根據檔案的位置和名稱生成的。例如,如果我們在pages目錄中建立一個檔案並命名它Index.vue,它將被視為index.html主頁。如果我們建立一個檔案並呼叫它About.vue也同樣適用- 它將被視為about.html並將被連結為/about。
這就是路由在Pages中的工作方式。因為我們只想在一個頁面中顯示所有內容,所以我們可以繼續建立Index.vue 檔案,或者如果我們已經為我們生成了一個檔案,那麼我們可以使用它。
我們Index.vue應該看起來像這樣:
<template> <Layout> <header class="header"> <h1>Gridsome Blog</h1> <p>A simple blog designed with Gridsome</p> </header> </Layout> </template> |
現在我們有了主頁,我們可以繼續建立一個部落格帖子列表並在頁面上顯示。我們可以在元件目錄中建立一個PostList.vue檔案,我們將在其中建立用於顯示部落格帖子列表:
<template> <div class="post-list"> <hr class="line" /> <p class="date" v-html="post.date" /> <h1 class="title" v-html="post.title" /> <p class="description" v-html="post.description" /> <b> {{post.timeToRead}} min read </b>   <g-link :to="post.path" class="read">Read More...</g-link> </div> </template> <script> export default { props: ["post"], }; </script> |
在此檔案中,我們有用於顯示帖子列表的內容,我們還新增了一個post屬性,使我們能夠將資料從父元件傳遞到PostList子元件。
返回Index.vuePages目錄中,請記住我之前提到的Gridsome為您的所有資料提供了集中資料管理,在我們的例子中是指GraphQL。它使用<page-query>並將<static-query>資料提取到頁面,模板和元件中。在這裡,我們需要提取我們在Markdown中編寫的內容目錄中的所有帖子,並將它們顯示在我們的Vue元件中。
<page-query> query { allPost { totalCount edges { node { id title timeToRead description date (format: "D MMMM YYYY") path } } } } </page-query> |
現在,我們的Vue元件中有內容了,我們可以將它們傳遞給PostList.vue元件,如下所示:
<section class="posts"> <PostList v-for="edge in $page.allPost.edges" :key="edge.node.id" :post="edge.node" /> </section> |
顯示帖子佈局
現在我們有一個content顯示資料夾中的帖子列表。下一步是在單擊其中一個帖子時顯示單個帖子。我們將使用模板來處理這個問題。在Gridsome中,Template用於顯示GraphQL集合的單個帖子檢視。新增以下內容到templates目錄中Post.vue檔案。
<template> <Layout> <br> <g-link to="/" class="link"> ← Go Back</g-link> <div class="post-title"> <h1>{{$page.post.title}}</h1> <p class="post-date"> {{ $page.post.date}} | {{$page.post.timeToRead}} min read </p> </div> <div class="post-content"> <p v-html="$page.post.content" /> </div> </Layout> </template> |
要查詢單個帖子的內容,我們將使用page-query:
<page-query> query Post ($path: String!) { post: post (path: $path) { id title content date (format: "D MMMM YYYY") timeToRead } } </page-query> |
完成後,當您單擊read more主頁時,您應該看到我們在gridsome.config.js中配置的帶有帖子標題的單個帖子的內容
相關文章
- 一個基於 beego 的,有情懷的部落格Go
- 基於 GitBook 搭建個人部落格Git
- 一個基於vue2、koa2和mongodb的部落格VueMongoDB
- 基於.NetCore開發部落格專案 StarBlog - (4) markdown部落格批量匯入NetCore
- 基於 Laravel 9 和 Bulma 開發的個人部落格Laravel
- Hikari:一個基於php的靜態部落格系統PHP
- 分享一個新版部落格:基於 Laravel 5.5,React,AntdLaravelReact
- 基於Vue搭建自己的部落格Vue
- 基於express + vue 的部落格草稿ExpressVue
- 我的基於 JamStack 的新部落格
- Django搭建個人部落格:基於類的檢視Django
- 基於thinkphp3.2.3開發的個人部落格PHP
- 基於 Spring Boot 的個人部落格 FS-BlogSpring Boot
- 基於ThinkPHP5.0.3深藍個人部落格PHP
- 個人部落格Cblogcms-基於ThinkPHP開發GCPHP
- 基於TP3.1個人部落格系統
- 基於 Hexo + GitHub Pages 搭建個人部落格(三)HexoGithub
- 基於ECS搭建雲上部落格
- 基於Hexo搭建靜態部落格Hexo
- 從零搭建基於golang的個人部落格網站Golang網站
- 基於 SpringBoot+VUE 的開源 blog (個人部落格)Spring BootVue
- 基於ThinkPHP搭建的仿Wordpres個人部落格系統PHP
- 推薦一個基於Springboot+Vue的開源部落格系統Spring BootVue
- 發起一個開源專案:基於 .NET 的部落格引擎 fluss
- 基於 abp vNext 和 .NET Core 開發部落格專案 - 部落格介面實戰篇(一)
- 基於mkdocs-material搭建個人靜態部落格
- 基於“SMemory”的部落格園皮膚美化
- 基於 Laravel5.5 的簡單個人部落格系統Laravel
- 基於.NetCore開發部落格專案 StarBlog - (1) 為什麼需要自己寫一個部落格?NetCore
- 自動部署基於issues的靜態部落格
- 以後基於 Topass 的部落格加密方法通告加密
- 基於.NetCore開發部落格專案 StarBlog - (2) 環境準備和建立專案NetCore
- 基於Vue.js封裝一個簡單的select元件Vue.js封裝元件
- 一個基於Vue.js+Mongodb+Node.js的部落格內容管理系統Vue.jsMongoDBNode.js
- 基於Github Page 搭建部落格(hexo框架)GithubHexo框架
- 基於 Github Actions 自動部署 Hexo 部落格GithubHexo
- 基於 Vuepress 搭建個人部落格,文章詳細,助你快速上手Vue
- 開源一款基於 Typecho 開發的部落格主題