Templates are used to create single pages for nodes in a collection. Nodes need a corresponding page in order to be presented on its own URL.
The example below shows you how to setup route and template for a collection named Post. A component located at src/templates/{Collection}.vue will be used as template if no component is specified.
// gridsome.config.js
module.exports = {
  templates: {
    Post: '/blog/:year/:month/:title',
  }
}Specify a custom component path:
// gridsome.config.js
module.exports = {
  templates: {
    Post: [
      {
        path: '/blog/:year/:month/:title',
        component: './src/other/location/Post.vue'
      }
    ]
  }
}Setup multiple templates for a collection:
// gridsome.config.js
module.exports = {
  templates: {
    Product: [
      {
        path: '/product/:slug',
        component: './src/templates/Product.vue'
      },
      {
        name: 'reviews',
        path: '/product/:slug/reviews',
        component: './src/templates/ProductReviews.vue'
      }
    ]
  }
}Template paths are available in the GraphQL schema with a path field. Use a to argument for getting paths to additional templates for a collection.
query ($id: ID!) {
  product(id: $id) {
    path               # path to the default template
    path(to:"reviews") # path to the reviews template
  }
}Available template options are:
Path parameters are slugified by default, but the original value can be used by adding a _raw suffix, eg. :title_raw. Access values in deep objects or arrays by separating properties or indexes with double underscores (__). The date field has a set of shorthand helpers; :year, :month and :day.
:id resolves to node.id:value resolves to node.value(slugified value):value_raw resolves to node.value(original value):object__value resolves to node.object.value:array__3__id resolves to node.array[3].idThe path option can be a function, which receives the node as the first argument and returns a path.
// gridsome.config.js
module.exports = {
  templates: {
    Post: [
      {
        path: (node) => {
          return `/product/${node.slug}/reviews`
        }
      }
    ]
  }
}Each node will get a path field in the GraphQL schema which contains the generated URL.
Pages generated from the templates configuration will have the node id available as a query variable in the page-query block. Use the $id variable to get the node for the current 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>Other node fields are also available as query variables. Access values in deep objects or arrays by separating properties or indexes with double underscores (__).
$id resolves to node.id$value resolves to node.value$object__value resolves to node.object.value$array__3__id resolves to node.array[3].idThe metaInfo option must be a function in order to access the query results:
<script>
export default {
  metaInfo() {
    return {
      title: this.$page.post.title
    }
  }
}
</script>