创建一个展示你的 Instagram 帖子的 Gatsby 作品集
我创建了我的第一个Gatsby Portfolio Starter。它通过 Instagram API 显示任何用户的最新 Instagram 帖子,并实现了Uber 构建的设计系统Base Web 。
在这篇文章中,我将向你展示如何快速制作并构建这个 Starter 的原型。我会提供一些技巧和窍门,以及需要注意的事项(及其解决方法),以及如何开始使用你的 Starter(看看我做了什么?👀)
单击下面即可查看存储库。
timrodz / gatsby-starter-instagram-baseweb
🎢 轻量级、简约的 Gatsby 入门工具,用于创建基于 Instagram 的作品集。
❓ 什么是 Gatsby?
Gatsby是一个基于 React 的免费开源框架,可帮助开发者构建速度超快的网站和应用。它提供大量插件和启动器,就像主题一样,你可以在其上进行构建和开发。而且它的社区也非常棒——太棒了!
我已经玩 Gatsby 一个多月了。我用它重新设计并搭建了我的作品集,同时还在为一位自由摄影师朋友搭建作品集。这真是一个深入 Gatsby 的绝佳机会!
🤔 它是如何工作的?
创建这个 Starter 的过程毫不意外地简单——这得益于 Gatsby 的本质以及它提供的学习曲线。具体来说,我是一名 Web 技术初学者。
找到合适的模板
我选择使用Gatsby 默认启动器。它已准备好投入生产,被认为是 Gatsby 的原生启动器。非常适合学习和构建!
连接到 Instagram
这个网站的主要功能是可以抓取并显示 Instagram 帖子。幸运的是,Gatsby 有一个Instagram 启动器!它的设置非常简单,并且提供了两种入门方法。
公共抓取
Instagram API 提供了一个选项,可以从任何公开个人资料中抓取最多 12 条帖子。我们将使用这个选项。
{
allInstaNode(sort: { fields: timestamp, order: DESC }, limit: 12) {
edges {
node {
id
caption
localFile {
childImageSharp {
fluid {
...GatsbyImageSharpFluid
}
}
}
}
}
}
}
使用 API 令牌进行抓取
如果您想抓取超过 12 条的历史帖子,则需要提供凭证进行身份验证。点击此处开始。
此查询将显示我们的 Instagram 帐户的最新 12 条帖子,以及id
(将用于重定向到原始帖子)caption
和localFile
,其中包含显示我们的图像所需的数据。
选择设计系统
之后,我开始研究设计系统,因为我想用最少的设置来创建和迭代原型。就在那时,我发现了Base Web,一个由 Uber 创建的设计系统。它轻量级、极简主义的设计方法非常适合这个例子。
特征:
- 开箱即用的强大组件。从日期选择器到简单的块。
- Styletron用于样式设置。它使用 CSS-in-JS 方法。
- 通过Overrides API和可配置主题实现扩展。
- 内置辅助功能。
- 得益于 Styletron 引擎,性能非常出色。
使用 BaseWeb 制作响应式元素非常简单。以下是创建包含并显示图像的灵活网格的方法:
const Gallery = () => (
<FlexGrid flexGridColumnCount={[1, 2, 3]}>{renderImages()}</FlexGrid>
);
您将看到flexGridColumnCount
被一个数组包围:[1, 2, 3]
。这会自动处理断点:
- 小屏幕尺寸:
flexGridColumnCount = 1
- 中等屏幕尺寸:
flexGridColumnCount = 2
- 大屏幕尺寸:
flexGridColumnCount = 3
开始之前
需要注意的是:Gatsby 使用hydration,这意味着它使用 React 运行时将静态内容进行服务器端渲染 (SSR)。如果您使用的代码或插件访问了window
或 之类的变量document
,则在构建应用时会遇到一些麻烦。
想象一下这是我们应用程序的入口点:
import { Client as Styletron } from 'styletron-engine-atomic';
import { Provider as StyletronProvider } from 'styletron-react';
import { LightTheme, BaseProvider, styled } from 'baseui';
import * as React from 'react';
const engine = new Styletron();
export default function EntryPoint() {
return (
<StyletronProvider value={engine}>
<BaseProvider theme={LightTheme}>
<h1>Hello!</h1>
</BaseProvider>
</StyletronProvider>
);
}
看起来很简单,对吧?它甚至可以通过 运行gatsby develop
。问题在于通过 构建应用程序时gatsby build
,它会抛出一个document is undefined
指向styletron-engine-atomic
包的错误。真是糟糕!或者,真的糟糕吗?
如果你指向出错的代码,你确实会看到它styletron-engine-atomic
正在访问document
元素,这是理解 Gatsby 生态系统的重要部分。这些元素仅存在于浏览器内部。
为了解决这个问题,我们可以等到进入浏览器后再加载。借助React hooksstyletron-engine-atomic
的魔力(和),我们可以在组件挂载后(也就是在浏览器中)将应用通知给库。useEffect
useState
import
import { Provider as StyletronProvider } from 'styletron-react';
import { LightTheme, BaseProvider, styled } from 'baseui';
import * as React from 'react';
export default function EntryPoint() {
const [engine, setEngine] = React.useState(null);
React.useEffect(() => {
// Once the `styletron-engine-atomic` library imports
// We will grab its content and create a new client through it
import('styletron-engine-atomic').then((styletron) => {
const clientEngine = new styletron.Client();
setEngine(clientEngine);
});
}, []);
if (!engine) return null;
return (
<StyletronProvider value={engine}>
<BaseProvider theme={LightTheme}>
<h1>Hello!</h1>
</BaseProvider>
</StyletronProvider>
);
}
考虑到这些变化,这个 Web 应用程序已准备好构建。
🏋️ 让 Gatsby 承担重任
大多数 Gatsby 应用的入口点都是该gatsby-config.js
文件。你可以指定站点元数据并设置插件。在本例中,除了默认插件外,我只加载了一些额外的插件:
- gatsby-source-instagram:需要通过 Instagram API 获取和显示数据。
- gatsby-plugin-styletron:Base Web 引擎与 Styletron 和 Gatsby 协同工作所必需的插件。了解更多。
- gatsby-plugin-alias-imports:可选但方便的工具,用于创建导入的快捷方式,即:
// -- gatsby-config.js
{
resolve: `gatsby-plugin-alias-imports`,
options: {
alias: {
components: `${__dirname}/src/components`,
data: `${__dirname}/data/`
}
}
}
// -- script.js
// Before
import { title } from '../../data/config';
import { Component } from '../components/Component';
// After
import { title } from 'data/config';
import { Component } from 'components';
将应用程序转换为 PWA(渐进式 Web 应用程序)
将你的应用转换为 PWA 是当下的热门,而且理由充分。谷歌对PWA 的总结非常到位。
借助 Gatsby,将此应用转换为 PWA非常简单:
- 在里面启用插件gatsby-plugin-offline
gatsby-config.js
。 - 创建一个
gatsby-browser.js
文件。我们需要在onServiceWorkerUpdateReady函数中添加一个回调,该回调将通知应用程序window
重新加载。
export const onServiceWorkerUpdateReady = () => {
window.location.reload(true);
};
轰隆隆——一旦您的网站搭建完成,您就掌握了 PWA 的基础知识,可以开始使用了!以下是 Google Lighthouse 的审核分数。
处理数据
为了简化操作并将最重要的变量集中到一起,我创建了一个data/config.js
文件。我们可以添加网站标题、描述、作者、社交链接和其他元数据。这些变量也会为SEO组件提供支持!
搜索引擎优化
我从Smakosh 那里得到了使用schema.org组织的想法。
import Thumbnail from 'static/images/thumbnail.png';
import {
address,
contact,
foundingDate,
legalName,
logo,
socialLinks,
url
} from 'data/config';
const structuredDataOrganization = `{
"@context": "http://schema.org",
"@type": "Organization",
"legalName": "${legalName}",
"url": "${url}",
"logo": "${logo}",
"foundingDate": "${foundingDate}",
"founders": [{
"@type": "Person",
"name": "${legalName}"
}],
"contactPoint": [{
"@type": "ContactPoint",
"email": "${contact.email}",
"contactType": "customer service"
}],
"address": {
"@type": "PostalAddress",
"addressLocality": "${address.city}",
"addressCountry": "${address.country}"
},
"sameAs": [
"${socialLinks.instagram}",
"${socialLinks.twitter}",
]
}`;
为了注入它,Gatsby 为我们提供了一个可编辑的React Helmet。我们必须以脚本的形式传递数据application/ld+json
。
const SEO = ({ description, lang, meta, title }) => {
const { site } = useStaticQuery(graphql`
{
site {
siteMetadata {
title
description
author
}
}
}
`);
const metaDescription = description || site.siteMetadata.description;
return (
<Helmet>
<script type='application/ld+json'>
{structuredDataOrganization}
</script>
</Helmet>
);
};
更改媒体查询断点
使用 Base Web 覆盖主题非常简单。他们的自定义断点示例正是我所需要的。
import { LightTheme } from 'baseui';
// Specify your custom breakpoint sizes here
const breakpoints = Object.freeze({
small: 769,
medium: 1024,
large: 1216
});
const ResponsiveTheme = Object.keys(breakpoints).reduce(
(acc, key) => {
acc.mediaQuery[
key
] = `@media screen and (min-width: ${breakpoints[key]}px)`;
return acc;
},
{
breakpoints,
mediaQuery: {}
}
);
export default { ...LightTheme, ...ResponsiveTheme };
🌯 结束了!
创建这个项目是学习 Gatsby 及其底层工作原理的绝佳方式。它是一个快速上手的框架,让您可以专注于创建 Web 应用。它通过在您需要时提供所需的工具来实现这一点,并且附带了可用于生产的出色内置配置。
就 Base Web 而言,它是一个构建应用和原型的优秀设计系统,并且可以轻松覆盖。我尤其喜欢它没有太多通常会让 Web 应用臃肿的组件——它包含了你(和我)可能需要的组件。
分享您的想法!
你使用 Gatsby 的体验如何?告诉我吧——我很想知道你有什么好分享的!
照片由Soragrit Wongsa在Unsplash上拍摄。
文章来源:https://dev.to/timrodz/creating-a-gatsby-portfolio-that-shows-your-instagram-posts-4m24