使用 Vue 和 Gridsome 构建静态站点

简介: 使用 Vue 和 Gridsome 构建静态站点

静态站点介绍


静态网站生成器所做的事情也就是传统开发中所谓的「静态化渲染」,经常出现在一些 CMS 系统中。

它是预渲染的,但是和服务端渲染有所不同。具体差异可以看这篇文章,静态化与服务端渲染

静态网站不需要服务端支持,只需要将静态生成的文件放到任意的文件托管服务器或者 CND 上即可。比如GitHub Pages 和阿里云 OSS 等。

静态网站的优点总结为:省钱、快速、安全

省钱是值不需要完整的服务器,只需要文件托管服务求或者 CND,这类云服务的价格通常来说很便宜。

快速是指不需要调用后端 API 接口,也不需要服务端渲染时的数据填充和类似 MVVM 的客户端渲染,浏览器拿到的就是可以直接使用的 HTML、CSS 和 JavaScript。

安全是指没有后端服务的支持,理论上也就没有任何漏洞,网站上的任何链接都是静态内容。

常见的静态网站生成器有很多,比如 Ruby 的 Jekyll、Node 的 Hexo、Golang 的 Hugo、React 的 Gatsby、Vue 的 Gridsome 等等。

静态网站还有一个别名,叫做 JAMStack。JAM分别是 JavaScript、Api、Markup 的首字母组合。

静态化本质上是一种胖前端。它也是前后端的模式,只不过在生成静态网站后,前后端就不再有联系了。

在静态网站生成时,提供数据的后端可以来自多个服务,比如 RESTFul API、GraphQL、JSON 文件、无头 CMS 等等。

在静态网站运行时,静态网站需要的一些功能比如登陆、阅读量、收藏、点赞、评论等等可以来自不同的服务厂商,而不需要自己开发。除了使用专业服务外,另一种比较流行的方案是使用 serverless 自行开发,以此实现更高的客制化功能,比如腾讯云的云函数和阿里云的函数计算。

静态化的适用场景通常是纯内容、弱交互的网站。如果网站有大量动态内容,就不适合使用静态化渲染了。它在本质解决的问题就是提供极致的阅读体验


静态站点框架 Gridsome 基础教程


Gridsome 是一个免费开源,基于 Vue.js 技术栈的静态网站生成器。使用 Gridsome 需要有一定的 Vue 基础和 GraphQL 基础。


安装、创建、启动 gridsome 项目


首先全局安装 gridsome 的命令行工具。


npm install --global @gridsome/cli

然后使用 gridsome create <application-name> 命令创建项目。


gridsome create my-gridsome-site

最后进入项目目录下,使用 npm run developgridsome develop 启动开发服务器。


cd my-gridsome-site && gridsome develop

gridsome 启动成功后会提示 3 个地址。


Site running at:
- Local:                 http://localhost:8080/
- Network:               http://192.168.1.131:8080/
Explore GraphQL data at: http://localhost:8080/___explore

第一个是本地地址。

第二个是公网IP地址。

第三个是管理 GraphQL 数据的控制台地址。


预渲染


路由规则


打开项目,可以在 src/pages 目录下看到 Index.vue 和 About.vue 文件,这两个文件对应的就是页面中的 Home 页面和 About 页面。

在 girdsome 中,pages 目录下的每个 vue 文件都对应一个路由。

现在来添加第一个页面。


// src/pages FirstPage.vue
<template>
  <div>hello,my first page</div>
</template>
<script>
export default {
  name: "first-page",
};
</script>

然后访问 http://localhost:8080/first-page,就可以看到对应的内容了。


编译项目


接下来我们将项目编译为静态内容。执行下面的命令。


gridsome build

gridsome 会在项目中创建 dist 目录,其中保存了所有的网页。每一个 vue 文件都会被渲染为纯 HTML 文件。这些文件都不会进行客户端渲染,而是由浏览器直接呈现。也不会有 vue 运行时等 JavaScript 资源。所以可以做到极致的访问速度。


部署项目


现在将 dist 目录部署到任意服务器中即可。

下面使用 npm 的 serve 模块启动项目。

全局安装 serve。


npm i serve -g

启动项目。


serve dist


目录结构


src


layouts 目录中存放了全局的布局组件,在 main.js 中注册了 Layout 组件。用于设置页面的通用样式布局。

像一些全局的样式文件或者全局组件,都可以在 main.js 中引入。

pages 目录存放了与路由相对应的 vue 文件。

components 目录存放公共组件。

templates 目录中存放了 GraphQL Collection 的模板。

.temp 目录是 gridsome 在运行中生成的临时文件。


.cache


存放了缓存文件。


static


存放静态文件,一些不需要编译的文件,比如图片、字体等资源。


girdsome.config.js 和 gridsome.server.js


分别是客户端和服务端的配置文件,用于配置插件、设置站点全局信息、或者注入数据等等。

配置文件修改后需要重启开发服务器才可以生效。


Pages 页面


gridsome 支持两种创建页面的方式。一种是基于文件的方式,一种是编程的方式。


基于文件的方式


按照规则直接在 pages 目录下创建 vue 文件就可以生成页面。它有一些默认规则。

  1. Index.vue 表示跟路径 /
  2. 驼峰命名法会转换为中横线命名法。比如 AboutUs.vue 生成 about-us
  3. 嵌套文件生成嵌套路由。比如 /about/vision 生成 about/vision
  4. 默认寻找 Index.vue。比如 src/pages/blog/Index.vue 生成 /blog/


编程的方式


在 girdsome.server.js 文件中默认导出方法中进行配置。


module.exports = function (api) {
  api.createPage(({ createPage}) => {
    createPage({
      path: "/my-page",
      component: "./src/templates/MyPage.vue"
    })
  })
}


动态路由


gridsome 支持动态路由,使用中括号包裹路由参数。

src/pages/user/[id].vue 生成 user/:id。

src/pages/user/[id]/settings.vue 生成 user/:id/settings。

无论是基于文件还是编程的方式,都支持动态路由。


页面 Meta 信息


gridsome 支持给每个页面设置不同的 meta 信息。在默认导出的对象中添加 metaInfo 属性,就可以生成 meta 信息。


export default {
  name: "first-page",
  metaInfo: {
    title: "Hello,World!",
    meta: [{ name: "authro", content: "John Doe" }],
  },
};


自定义 404 页面


gridsome 提供了一个默认的 404 页面。

如果需要自定义 404 页面,可以创建 src/pages/404.vue 文件。这个文件可以取代默认的 404 页面。


Collections 集合


一个页面可以通过调用接口来获取数据动态填充页面。调用接口获取数据填充页面这个步骤可以放到客户端也可以放到服务端。

如果放到服务端,需要使用 gridsome 的 collections。

在 gridsome 的动态数据生成动态页面的设计中,有 Data Sources、Collections 和 Nodes 三个概念。

Data Sources 是指数据源,可以来自任意形式的 API 接口,比如 WordPress、JSON 或者 Markdown 等等。

Collections 是 girdsome 将数据源转换后的结果。

Nodes 是 collections 对应的节点,每一个 node 都会生成一个页面。


添加 Collections


创建 collections 有两种方式,第一种是使用插件的形式(source plugins),在 gridsome.config.js 中进行配置。第二种是使用代码调用接口的方式(Data Store API),在 gridsome.server.js 进行调用。

有一个开源的项目 jsonplaceholder。它是基于 JSON Server 和 LowDB 创建的,可以为我们提供免费的 Mock RESTful API 服务用于测试。

安装用于请求的 axios 模块。


npm i axios

修改 gridsome.server.js 中的 loadSource 方法,去调用 jsonplaceholder 的 posts 加载数据。posts 接口提供了一百条 post 数据。


// gridsome.server.js
// ...
api.loadSource(async ({ addCollection }) => {
  const collection = addCollection('Post')
  const { data } = await axios.get('https://jsonplaceholder.typicode.com/posts')
  for (const item of data) {
    collection.addNode({
      id: item.id,
      title: item.title,
      content: item.content
    })
  }
})


查询 Collections


修改全局的配置需要重新启动服务,重新启动后可以进入 http://localhost:8080/___explore,这是 GraphQL 的控制台。

在控制台右侧有 DECS,其中包含了刚刚添加的 psot 和 allPost。

image.png

在左侧编辑 GraphQL 查询语句,点击运行,就可以从右侧的数据预览栏中看到查询结果。

比如查询 id 为 10 的文章数据。


query {
  post(id: 10) {
    id
    title
    content
  }
}

使用分页查询前 10 条数据以及总条数。


query {
  allPost(skip: 0, limit: 10, order: ASC) {
    totalCount
    edges {
      node {
        id
        title
        content
      }
    }
  }
}

在页面和模板中获取 GraphQL 数据

使用 page-query 标签。page-query 和 template 标签是平级的。page-query 中直接编写 GraphQL 查询语句,可以设置变量。查询结果默认存入 $page 变量中。


<template>
  <div>
    <h1 v-html="$page.post.title" />
    <div v-html="$page.post.content" />
  </div>
</template>
<page-query>
query ($id: ID!) {
  post(id: $id) {
    title
    content
  }
}
</page-query>


在组件中获取 GraphQL 数据


使用 static-query 标签,用法与 page-query 类似。查询结果放入 $static 中。


<template>
  <div v-html="$static.post.content" />
</template>
<static-query>
query {
  post (id: "1") {
    content
  }
}
</static-query>


Templates 模板


模板专门用于渲染 nodes。创建 template 需要两步。

首先在 src/templates 中创建模板组件。


<template>
  <div>
    <h1 v-html="$page.post.title" />
    <div v-html="$page.post.content" />
  </div>
</template>
<page-query>
query ($id: ID!) {
  post(id: $id) {
    title
    content
  }
}
</page-query>
之后在 gridsome.config.js 中配置路由和模板组件。
javascript
复制代码
module.exports = {
  templates: {
    Post: [
      {
        path: '/post/:id',
        component: './src/templates/Post.vue'
      }
    ]
  }
}

如果想在 metaInfo 中获取 GraphQL 中的数据,可以将 mateInfo 设置为函数。


metaInfo() {
  return {
    title: this.$page.post.title,
  };
}

以上就是 Gridsome 基础教程的全部内容。



相关文章
|
3月前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
168 1
|
7天前
|
JavaScript 前端开发 算法
vue渲染页面的原理
vue渲染页面的原理
|
1月前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
1月前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
95 12
|
1月前
|
JavaScript 前端开发 开发者
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。
|
1月前
|
JavaScript 前端开发 数据安全/隐私保护
Vue Router 简介
Vue Router 是 Vue.js 官方的路由管理库,用于构建单页面应用(SPA)。它将不同页面映射到对应组件,支持嵌套路由、路由参数和导航守卫等功能,简化复杂前端应用的开发。主要特性包括路由映射、嵌套路由、路由参数、导航守卫和路由懒加载,提升性能和开发效率。安装命令:`npm install vue-router`。
|
2月前
|
JavaScript 安全 API
iframe嵌入页面实现免登录思路(以vue为例)
通过上述步骤,可以在Vue.js项目中通过 `iframe`实现不同应用间的免登录功能。利用Token传递和消息传递机制,可以确保安全、高效地在主应用和子应用间共享登录状态。这种方法在实际项目中具有广泛的应用前景,能够显著提升用户体验。
193 8
|
2月前
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
93 1
|
3月前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1086 0

热门文章

最新文章