Create a markdown post entry under posts folder (posts/my-first-post.md)
---
title: First Post
category: post
---
This is the first paragraph and it will be used as an excerpt when loaded in a `<Content excerpt />` tag.
This paragraph should *not* appear in that list.
Add npm scripts to run dev mode to your package.json
Use fetcher to retrieve the posts and data from your markdown files.
The getPostsFilterBy and getDataFilterBy methods in fetcher allows to pass filter functions. For instance, we can use inCategory filter to retrieve posts in a given category:
You can use Dynamic Routes and static generator functions (getStaticProps and getStaticPaths) with fetcher methods.
Example for a [name].js dynamic route
importfetcherfrom'nextein/fetcher'const{ getData, getPost }=fetcher(/* filter */)exportasyncfunctiongetStaticPaths(){constdata=awaitgetData()return{paths: data.map(({ name })=>({params: { name }})),fallback: false}}exportasyncfunctiongetStaticProps({ params }){constpost=awaitgetPost(params)return{props: { post }}}exportdefaultfunctionPost({ post }){//...}
Example for a [[...name]].js dynamic route:
importfetcherfrom'nextein/fetcher'import{inCategory}from'nextein/filters'const{ getData, getPosts, getPost }=fetcher(inCategory('guides'))exportasyncfunctiongetStaticPaths(){constdata=awaitgetData()return{paths: [{params: {name: []}},
...data.map(({ name })=>({params: {name: [name]}}))],fallback: false}}exportasyncfunctiongetStaticProps({ params }){constposts=awaitgetPosts()constpost=awaitgetPost(params)// This can be null if not matching `...name`return{props: { posts, post }}}exportdefaultfunctionGuides({ posts, post }){//...}
inCategory(category, options)
Filter function to be applied to posts to retrieve posts in a given category.
category: {String} The category to filter results.
options : {Object} Optional
includeSubCategories:Boolean true to include posts in sub categories. Default: false
Categories are resolved by the folder structure by default. This means that a post located at posts/categoryA/subOne will have a category categoryA/subOne unless you specify the category name in frontmatter.
If you want to retrieve all posts under a certain category, let's say categoryA which will include all those under subOne, use the options includeSubCategories: true.
Component to render a post object. This component receives the content from the post as a property.
Use the excerpt property to only render the first paragraph (this is useful when rendering a list of posts).
content: {Object} Markdown content in HAST format to be render. This is provided by post.content
excerpt: {Boolean} true to only render the first paragraph. Optional. Default: false
renderers: {Object} A set of custom renderers for Markdown elements with the form of [tagName]: renderer.
component: {String|React.Component} The component used for the root node.
importContentfrom'nextein/content'//...exportdefaultfunctionPostPage({ post }){return<Content{...post}/>}
Using renderers to change/style the <p> tag
constParagraph=({ children })=>(<pstyle={{padding:10,background: 'silver'}}>{children}</p>)// Then in your render method ...<Content{...post}renderers={{p: Paragraph}}/>
post
__id is the unique identifier generated by nextein.
data is the frontmatter object containig the post meta information (title, page, category, etc)
data.category is the post's category. When not specified, if the post is inside a folder, the directory structure under posts will be used.
data.date: JSON date from frontmatter's date or date in file name or file creation date
content is representation of post content (generally in HAST format) created by the build plugin for a given mimeType.
{data,content}=post
frontmatter
There are only a few defined properties in the frontmatter metadata that is used by nextein
---
category: categoryOne
date: 2017-06-23
---
Post Content...
category: the category name (optional)
date: date string in YYYY-MM-DD format. Used to sort posts list. (optional)
published: Set to false to remove this post from entries.
name: Read Only The post file name. Date is removed from name if present.
withNextein
A wrapper configuration function to be applied into the next.config.js. It provides a way to add your own next.js config along with nextein internal next.js config.
next.config.js
const{ withNextein }=require('nextein/config')module.exports=withNextein({// Your own next.js config here})
Plugins
You can also define nextein plugins using the withNextein configuration:
const{ withNextein }=require('nextein/config')module.exports=withNextein({nextein: {plugins: [//your nextein plugins here]}// Your own next.js config here})
The nextein.plugins configuration accepts an array of plugins with the following formats:
[name]: Just a string to define the plugin.
[name, options]: A string to define the plugin and a plugins options object.
{ name, id, options }: A plugin object. The name field is required. All previous definitoins are transformed into this format. The id is optional, when provided allows multiple instances of the same plugin.
The plugin name should be a pre-installed plugin (nextein-plugin-markdown) , or a local file (./myplugins/my-awesome-plugin)
raw: Default to true. Make this false to not add the raw content in the post object.
position: Default to false. Make this true to add the position info to post content HAST.
rehype: Default to []. Add a set of plugins for rehype
remark: Default to []. Add a set of plugins for remark
nextein-plugin-filter-unpublished
Filter posts by using a property to prevent draft / unpublished entries to be displayed.
Options:
field: Default to'published'. Will check if a field is present in post data and filter if set to false.
Writing Plugins
You can write your own plugins. There are basically 2 different types (source and transforms). Source plugins will be called to generate the posts entries and then the transform plugins will receive those entries and can modify, filter, append, or transform in anyway the posts list.
请发表评论