Gridsome -- 基本使用
拉勾教育WEB前端高薪訓練營
是什麼
- GitHub 主目錄:https://github.com/gridsome/gridsome
- 官網:https://gridsome.org/
- Gridsome 是由Vue.js驅動的Jamstack框架,用於構建預設情況下快速生成的靜態生成的網站和應用。
- Gridsome是Vue提供支援的靜態網站生成器,用於為任何無頭CMS,本地檔或API構建可用於CDN的網站
- 使用Vue.js,webpack和Node.js等現代工具構建網站。 通過npm進行熱重載並訪問任何軟體包,並使用自動首碼在您喜歡的預處理器(如Sass或Less)中編寫CSS。
- 基於 Vue.js 的 Jamstack 框架
- Gridsome 使開發人員可以輕鬆構建預設情況下快速生成的靜態生成的網站和應用程式
- Gridsome允許在內容裡面引用任何CMS或數據源。
從WordPress,Contentful或任何其他無頭CMS或API中提取資料,並在元件和頁面中使用GraphQL訪問它。
什麼是 Jamstack
Gridsome是一個Jamstack框架。 Jamstack使您可以通過預渲染檔並直接從CDN直接提供檔案來構建快速安全的網站和應用程式,而無需管理或運行Web伺服器。
Learn more about the Jamstack.
它是如何工作的
Gridsome生成靜態HTML,一旦載入到瀏覽器中,該HTML就會滲入Vue SPA。 這意味著您可以使用Gridsome構建靜態網站和動態應用程式。
Gridsome為每個頁面構建一個.html檔和一個.json檔。 載入第一頁後,它僅使用.json檔來預取和載入下一頁的數據。 它還為需要它的每個頁面構建一個.js包(代碼拆分)。
它使用vue-router進行SPA路由,並使用vue-meta來管理。
Gridsome預設添加最小57kB的gzip JS捆綁包大小(vue.js,vue-router,vue-meta和一些用於圖像延遲載入的檔)。
備選方案
使用場景
- 不適合管理系統
- 簡單頁面展示
- 想要有更好的 SEO
- 想要有更好的渲染性能
起步
1、安裝 Gridsome CLI
# 使用 yarn
yarn global add @gridsome/cli
# 使用 npm
npm install --global @gridsome/cli
# 查看是否安装成功
gridsome --version
2、創建 Gridsome 專案
# 创建项目
gridsome create my-gridsome-site
# 进入项目中
cd my-gridsome-site
# 启动开发模式,或 npm run develop
gridsome develop
gridsome 專案安裝相依注意事項:
- 配置 node-gyp 編譯環境
- 配置環境變數:
npm_config_sharp_libvips_binary_host
為https://npm.taobao.org/mirrors/sharp-libvips/
- https://github.com/lovell/sharp-libvips
- https://developer.aliyun.com/mirror/NPM
- https://npm.taobao.org/mirrors
- https://sharp.pixelplumbing.com/install
npm config set sharp_binary_host "https://npm.taobao.org/mirrors/sharp"
npm config set sharp_libvips_binary_host "https://npm.taobao.org/mirrors/sharp-libvips"
- 設定 hosts:
199.232.68.133 raw.githubusercontent.com
3、目錄結構
.
├── src
│ ├── components # 公共组件
│ ├── layouts # 布局组件
│ ├── pages # 页面路由组件
│ ├── templates # 模板文件
│ ├── favicon.png # 网站图标
│ └── main.js # 应用入口
├── static # 静态资源存储目录,该目录中的资源不做构建处理
├── README.md
├── gridsome.config.js # 应用配置文件
├── gridsome.server.js # 针对服务端的配置文件
├── package-lock.json
└── package.json
4、部署
可以把建譯結果 dist
放到任何 Web 伺服器中進行部署。
例如我們這裡使用 Node.js 命令列工具 serve 來測試建譯結果。
npm install -g serve
serve dist
或者可以部署到其它第三方託管平臺:https://gridsome.org/docs/deployment/。
或是自己的伺服器,都可以!
核心概念
目標:學習 Gridsome 的核心概念
Pages
通過在 src/pages 資料夾中添加 Vue 元件來創建頁面。 他們使用基於檔的路由系統。 例如,src / pages / About.vue將是 http://mywebsite.com/about/。 頁面用於簡單頁面和列出集合的頁面(例如/ blog /)。
瞭解此頁面的更多訊息:https://gridsome.org/docs/pages/。
Collections
如果您要在網站上放置部落格文章,標籤,產品等,則收藏很有用。 可以使用 Source 外掛程式或 Data Store API 從任何 Headless CMS,內容 API 或 Markdown 檔中獲取集合。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tnW8P6Kw-1609808495553)(./assets/node-pages.0eae6d2.8581c59dbb258143a7ffcebb617ec5dc.png)]
集合存儲在臨時的本地GraphQL資料層中,可以在任何地方查詢,過濾,分頁或有關係。
Templates
範本負責顯示集合的節點(單個頁面)。 樣本通常位於src / templates中。 如果未在範本配置中指定元件,則Gridsome嘗試查找與集合名稱相同的檔。
這是一個例子:
<!-- src/templates/Post.vue -->
<template>
<Layout>
<h1 v-html="$page.post.title" />
</Layout>
</template>
<page-query>
query ($id: ID!) {
post(id: $id) {
title
}
}
</page-query>
更多關於 Templates 的內容:https://gridsome.org/docs/templates/。
Layouts
佈局是在頁面和範本內部用於包裝內容的Vue元件。 佈局通常包含頁眉和頁腳。
頁面中通常按以下方式使用佈局:
<template>
<Layout>
<h1>About us</h1>
</Layout>
</template>
<script>
import Layout from '~/layouts/Default.vue'
export default {
components: {
Layout
}
}
</script>
也可以在全球範圍內使用佈局,因此您無需每頁導入它們。
請注意,Gridsome CLI創建的預設範本將使用全域佈局元件。
更多關於 Layouts 的內容:https://gridsome.org/docs/layouts/。
Images
Gridsome具有內置的 <g-image>
元件,可輸出優化的逐行圖像。 如果更改寬度和高度,則在開發時還可以即時調整大小和裁剪。 <g-images>
創建一個超小型模糊的嵌入式base64影像,然後在檢視中使用IntersectionObserver延遲載入影像。
更多關於 Images 的內容:https://gridsome.org/docs/images/。
Linking
Gridsome具有內置的 <g-link>
元件,該元件在查看連結時使用 IntersectionObserver 來預取連結的頁面。 這使得在 Gridsome 網站中流覽非常快,因為單擊的頁面已經下載。
更多關於 <g-link>
的內容:https://gridsome.org/docs/linking/。
部署
Gridsome 基礎
目錄結構
.
├── package.json # 包说明文件
├── gridsome.config.js # Gridsome 配置文件
├── gridsome.server.js # 自定义 Gridsome 编译
├── static/ # 静态资源存储目录,该目录中的资源不做构建处理
└── src/
├── main.js # 应用入口
├── index.html # 公共页面
├── App.vue # 根组件
├── layouts/ # 布局组件
│ └── Default.vue
├── pages/ # 路由页面
│ ├── Index.vue
│ └── Blog.vue
└── templates/ # 模板
└── BlogPost.vue
專案配置
Gridsome需要 gridsome.config.js 才能工作。 外掛程式和項目設置位於此處。 基本設定檔如下所示:
module.exports = {
siteName: 'Gridsome',
siteUrl: 'https://www.gridsome.org',
plugins: []
}
屬性 | 型態 | 的預設值 |
---|
外掛程式範例:
module.exports = {
plugins: [
{
use: '@gridsome/source-filesystem',
options: {
path: 'blog/**/*.md',
route: '/blog/:year/:month/:day/:slug',
typeName: 'Post'
}
}
]
}
注意事項:
- 開發過程中修改配置需要重啟服務
Pages 頁面
頁面負責在URL上顯示您的數據。 每個頁面將靜態生成,並具有自己的帶有標記的index.html檔。
在 Gridsome 中建立頁面有兩種選擇:
- 單檔元件
- 使用 Pages API 以程式設計方式創建頁面
pages 中的單檔元件
src/pages
目錄中的單檔元件將自動具有其自己的 URL。 檔案路徑用於產生網址,以下是一些基本範例:
src/pages/Index.vue
becomes/
(The frontpage)src/pages/AboutUs.vue
becomes/about-us/
src/pages/about/Vision.vue
becomes/about/vision/
src/pages/blog/Index.vue
becomes/blog/
大小自動轉小寫,駝峰命名會自動使用短橫杠分割
src/pages 中的頁面通常用於諸如 /about/ 之類的固定 URL,或用於在 /blog/ 等處列出部落格文章。
使用 Pages API 建立頁面
可以使用 gridsome.server.js
中的 createPages
鉤子以程式設計方式創建頁面。 如果您要從外部 API 手動創建頁面而不使用 GraphQL 資料層,則此功能很有用。
module.exports = function (api) {
api.createPages(({ createPage }) => {
createPage({
path: '/my-page',
component: './src/templates/MyPage.vue'
})
})
}
動態路由
動態路由對於僅需要用戶端路由的頁面很有用。 例如,根據URL中的細分從生產環境中的外部API獲取訊息的頁面。
通過文件創建動態路由
動態頁面用於用戶端路由。 可以通過將名稱包裝在方括弧中來將路由參數放置在檔和目錄名稱中。 例如:
src/pages/user/[id].vue
becomes/user/:id
.src/pages/user/[id]/settings.vue
becomes/user/:id/settings
.
注意事項:
- 在編譯時,這將生成
user/_id.html
和user/_id/settings.html
,並且您必須具有重寫規則以使其正常執行。 - 具有動態路由的頁面的優先順序低於固定路由。 例如,如果您有一個
/user/create
路由和/user/:id
路由,則/user/create
路由將具有優先順序。
這是一個基本的頁面元件,它使用路由中的id參數來獲取客戶端的使用者訊息:
<template>
<div v-if="user">
<h1>{{ user.name }}</h1>
</div>
</template>
<script>
export default {
data() {
return {
user: null
}
},
async mounted() {
const { id } = this.$route.params
const response = await fetch(https://api.example.com/user/${id}
)
this.user = await response.json()
}
}
</script>
始終使用 mounted
來獲取客戶端數據。 由於在生成靜態HTML時執行數據,因此在 created
中獲取數據會引起問題。
通過程式設計方式創建動態路由
以程式設計方式創建帶有動態路由的頁面,以獲取更高級的路徑。 動態參數使用 :
來指定。
每個參數都可以具有一個自定義的正則運算式,以僅匹配數位或某些值。
module.exports = function (api) {
api.createPages(({ createPage }) => {
createPage({
path: '/user/:id(d+)',
component: './src/templates/User.vue'
})
})
}
生成重寫規則
Gridsome無法為動態路由的每種可能的變體生成HTML檔,這意味著直接訪問URL時最有可能顯示404頁。 而是,Gridsome生成一個HTML檔,該檔可用於重寫規則。 例如,類似/ user /:id的路由將生成位於/user/_id.html 的HTML檔。 您可以具有重寫規則,以將所有與/ user /:id匹配的路徑映射到該檔。
由於每種伺服器類型都有自己的語法,因此必須手動生成重寫規則。 afterBuild 掛鉤中的 redirects 數組包含應生成的所有必要的重寫規則。
const fs = require('fs')
module.exports = {
afterBuild ({ redirects }) {
for (const rule of redirects) {
// rule.from - The dynamic path
// rule.to - The HTML file path
// rule.status - 200 if rewrite rule
}
}
}
頁面 meta 訊息
Gridsome 使用 vue-meta 處理有關頁面的元訊息。
<template>
<div>
<h1>Hello, world!</h1>
</div>
</template>
<script>
export default {
metaInfo: {
title: 'Hello, world!',
meta: [
{ name: 'author', content: 'John Doe' }
]
}
}
</script>
自定義 404 頁面
建立一個 src/pages/404.vue
元件以具有一個自定義 404 頁面。
Collections 集合
集合是一組節點,每個節點都包含帶有自定義數據的欄位。 如果您要在網站上放置部落格文章,標籤,產品等,則集合很有用。
添加集合
集合可以通過 source plugins 添加,也可以使用 Data Store API 自己添加。
在開發和構建期間,這些集合存儲在本地記憶體數據存儲中。 節點可以來自本地檔(Markdown,JSON,YAML等)或任何外部API。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uEefslBk-1609808703279)(assets/node-pages.0eae6d2.8581c59dbb258143a7ffcebb617ec5dc-7030007.png)]
使用 source plugins 添加集合
將集合添加到 Gridsome 的最簡單方法是使用源外掛程式。 本範例從 WordPress 網站創建集合。 來源外掛程式的 typeName 選項通常用於為外掛程式加入的集合名稱新增首碼。
// gridsome.config.js
module.exports = {
plugins: [
{
use: '@gridsome/source-wordpress',
options: {
baseUrl: 'YOUR_WEBSITE_URL',
typeName: 'WordPress',
}
}
]
}
你可以在這裏流覽外掛程式清單。
使用Data Store API添加集合
您可以從任何外部 API 手動添加集合。
本範例創建一個名為 Post 的集合,該集合從 API 獲取內容並將結果作為節點添加到該集合中。
// gridsome.server.js
const axios = require('axios')
module.exports = function (api) {
api.loadSource(async actions => {
const collection = actions.addCollection('Post')
const { data } = await axios.get('https://api.example.com/posts')
for (const item of data) {
collection.addNode({
id: item.id,
title: item.title,
content: item.content
})
}
})
}
瞭解有關 Data Store API 的更多訊息。
GraphQL 中的集合
每個集合將向 GraphQL schema 添加兩個根欄位,這些根欄位用於檢索頁面中的節點。
欄位名稱是根據集合名稱自動生成的。 如果您將集合命名為 Post,那麼在架構中將具有以下可用欄位:
post
通過ID獲取單個節點。allPost
獲取節點清單(可以排序和過濾等)。
探索可用的類型和欄位
您可以透過在 GraphQL 資源管理員開啟架構選項卡來瀏覽可用欄位。
閱讀有關如何在 GraphQL 中查詢節點的更多訊息:https://gridsome.org/docs/querying-data/。
集合範本
範本用於為集合中的節點創建單個頁面。 節點需要相應的頁面才能顯示在其自己的URL上。
Templates
範本用於為集合中的節點創建單個頁面。 節點需要相應的頁面才能顯示在其自己的URL上。
可用屬性
Property | Description | Link |
---|
總結:
- 使用第三方外掛程式時需要在 main.js 中引入
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import Vuex from 'vuex'
import mavonEditor from 'mavon-editor'
import store from './store'
import util from './utils/util'
import DefaultLayout from '~/layouts/Default.vue'
export default function (Vue, { appOptions, router, head, isClient }) {
// Set default layout as a global component
Vue.use(ElementUI)
Vue.use(Vuex)
appOptions.store = new Vuex.Store(store)
Vue.use(mavonEditor)
Vue.prototype.$markdown = function (value) {
return mavonEditor.markdownIt.render(value)
}
Vue.prototype.$util = util
Vue.component('Layout', DefaultLayout)
- 靜態化時不可以直接調用請求返回數據,需要 gridsome.server.js 中添加
Learn more:https://gridsome.org/docs/server-api/
const axios = require('axios')
module.exports = function (api) {
api.loadSource(async ({ addCollection }) => {
const posts = addCollection('Post')
const tags = addCollection('Tag')
posts.addReference('tags', 'Tag')
// Use the Data Store API here: https://gridsome.org/docs/data-store-api/
// const collection = addCollection('Post')
const { data } = await axios.get('https://jsonplaceholder.typicode.com/posts')
for (const item of data) {
posts.addNode({
id: item.id,
title: item.title,
content: item.body
})
}
})
}
- 創建自訂路由 – gridsome.server.js
Use the Pages API here: https://gridsome.org/docs/pages-api/
module.exports = function (api) {
api.loadSource(async ({ addCollection }) => {
api.createPages(({ createPage }) => {
createPage({
path: '/my-page',
component: './src/templates/MyPage.vue'
})
})
}
- 基本配置 – gridsome.config.js 外掛程式和專案設置位於此處
Learn more: https://gridsome.org/docs/config