With Tina, your content is stored in Git along with your codebase. Tina provides an API to query your content through GraphQL, based on your defined content models.
Here's an example of how the data-fetching for a basic "post" ties together with the content modelling (defined in schema.ts).
Note that getPostDocument is not built-in to Tina's API. This is an example of a query based on YOUR defined schema, (where you have a "post" collection defined).
For more information on writing queries for your specific schema, check out our "Using the GraphQL API" docs.
With Tina, your content is all stored in filesystem, within your site's repo. Using file-based content in a site can be limited, so Tina provides a CLI tool that gets run locally next to your site, which allows all of your content to make available through an expressive GraphQL API.
We'll go over those details of running this CLI script later, but if you want to skip it, you can read about it here.
In NextJS, content is typically queried statically at build-time, or with SSR.
Tina provides a staticRequest helper function, which makes a request to your locally-running GraphQL server at build-time.
// pages/home.js
import { staticRequest } from 'tinacms'
const getStaticProps = async () => {
const query = `
query GetPostDocument($relativePath: String!) {
getPostDocument(relativePath: $relativePath) {
data {
title
}
}
}
`
const variables = {
relativePath: 'hello-world.md',
}
let data = {}
try {
data = await staticRequest({
query,
variables,
})
} catch {
// swallow errors related to document creation
}
return {
props: {
query,
variables,
data,
//myOtherProp: 'some-other-data',
},
}
}You'll likely want to query the Tina data layer for dynamic routes.
export const getStaticPaths = async () => {
const postsListData = await staticRequest({
query: gql`
query GetPostList {
getPostList {
edges {
node {
sys {
filename
}
}
}
}
}
`,
})
return {
paths: postsListData.getPostList.edges.map(post => ({
params: { filename: post.node.sys.filename },
})),
}
}Note: for now, TinaCMS only supports static data fetching, so you must use
getStaticProps(andgetStaticPathsfor dynamic pages). We'll be opening up more capabilities (like SSR, and client-side data-fetching) in the near future!
staticRequest?Absolutely not. This is a helper function which emphasizes that static requests should only be made against your local server. The staticRequest helper function makes the request against http://localhost:4001, which is where @tinacms/cli runs its GraphQL server. Feel free to use any HTTP client you'd like.
staticRequest helper function is provided to simplify making requests to the local GraphQL server.