_layout.tsx
The content starting from this chapter is for users who need deep customization. If you simply use Pagic, you can skip directly to the Blog chapter.
_layout.tsx is one of Pagic's core concepts.
What is _layout.tsx§
_layout.tsx can be understood as Pagic's template file when rendering the page. All page files (md/tsx) will use _layout.tsx as the template when rendering.
We might as well create a _layout.tsx in the previous site project:
site/
├── _layout.tsx├── pagic.config.ts
└── README.md
The content of _layout.tsx is as follows:
import { React, PagicLayout } from 'https://deno.land/x/pagic@v1.6.3/mod.ts';
const Layout: PagicLayout = ({ title, content }) => (
<html>
<head>
<title>{title}</title>
<meta charSet="utf-8" />
</head>
<body>
{content}
<p>Custom _layout.tsx</p>
</body>
</html>
);
export default Layout;
Next we run:
pagic build --serve
Then open http://127.0.0.1:8000/, you can see that in addition to the title Hello world, there is also a paragraph Custom _layout.tsx, which shows that this page uses _layout.tsx rendered as a template.
Why can we build a page without _layout.tsx in the previous chapter?
That's because Pagic will use the _layout.tsx file in the default theme as a template by default. When we create our own _layout.tsx, it will overwrite the _layout.tsx in the theme.
Sub-pages and sub-templates§
The design of _layout.tsx is intuitive. When we create a subdirectory, the pages in it will give priority to the use of _layout.tsx in that directory. Only when there is no _layout.tsx in the subdirectory, will the page look in the upper-level directory until you find _layout.tsx:
site/
|── dist # Output directory
| |── index.html
| └── foo
| ├── index.html
| └── bar
| └── index.html
├── _layout.tsx├── pagic.config.ts
|── README.md
└── foo
├── README.md
└── bar
├── _layout.tsx └── README.md
In the above example, site/foo/bar/README.md will use site/foo/bar/_layout.tsx in the same directory as the template, and site/foo/README.md will Use site/_layout.tsx as a template.
By configuring the frontMatter of page, you can skip this rule and force a template to be specified.
Componentization§
Componentization is one of the important features of React. We can reuse code by splitting _layout.tsx into sub-components. However, in Pagic, due to the need to support rendering of tsx files as pages, we need to make a convention for sub-components, that is, starting with _ are sub-components:
site/
|── dist # Output directory
| └── hello.html
├── _layout.tsx
├── _sidebar.tsx├── hello.tsx
└── pagic.config.ts
In the above example, hello.tsx will be constructed as dist/hello.html, and _sidebar.tsx will not be constructed as a page because it starts with _. In this way, you can split the Sidebar component into the _sidebar.tsx file, and then import it in _layout.tsx:
import { React, PagicLayout } from 'https://deno.land/x/pagic@v1.6.3/mod.ts';
import Sidebar from './_sidebar.tsx';
const Layout: PagicLayout = ({ title, content }) => (
<html>
<head>
<title>{title}</title>
<meta charSet="utf-8" />
</head>
<body>
<Sidebar /> {content}
</body>
</html>
);
export default Layout;
props§
Note that in the above example, we used the title and content in props, so besides these two, what other props can be used?
Please refer to the following table:
| Properties | Type | Description |
|---|---|---|
title |
string |
The title of the page, usually put in <head><title> |
content |
string |
The content of the page, usually put in <body> |
contentTitle |
ReactElement |
The title of content, can be used with contentBody to insert content between title and body |
contentBody |
ReactElement |
The body of content, can be used with contentTitle to insert content between title and body |
toc |
ReactElement |
Table of content |
author |
string |
The first committer of the file |
contributors |
string[] |
All submitters of the file (including the first submitter), sorted by the time of the first submission (first submitted first) |
date |
Date |
The date when the file was first submitted |
updated |
Date |
The date when the file was last submitted |
excerpt |
string |
The excerpt of article, default to the first 210 characters of the content |
cover |
string |
The cover of article (first image of content) |
tags |
string[] |
The tags of the article |
categories |
string[] |
The categories of the article |
config |
PagicConfig |
Pagic runtime[1] configuration |
pagePath |
string |
Page path, such as docs/README.md |
layoutPath |
string |
The template path of the page, such as docs/_layout.tsx |
outputPath |
string |
The output path of the page, such as docs/index.html |
head |
ReactElement |
The content that needs to be inserted into <head> |
script |
ReactElement |
ReactElement generated by the script plugin |
loading |
boolean |
Whether the page loading |
sidebar |
PagePropsSidebar |
An object generated by the sidebar plugin |
prev |
PagePropsSidebar[0] |
Details of the previous page |
next |
PagePropsSidebar[0] |
Details of the next page |
gitalk |
ReactElement |
ReactElement generated by the gitalk plugin |
blog |
Checkout Blog | Blog information of the current page |
language |
Checkout Internationalization | Language of the current page |
| Others | any |
Third-party plugins may also expand props |
Static resources§
Except for the special files mentioned above, other files will be regarded as static resources and copied directly to the dist directory.
All file name conventions are summarized as follows:
| File name | Description |
|---|---|
Start with . |
Hidden files, will be ignored |
pagic.config.ts or pagic.config.tsx |
Config file |
_layout.tsx |
Template file |
tsx file starting with _ |
Subcomponent |
file ends with md or tsx |
Page file |
| Other files | Static resources will be copied directly to the dist directory |
Annotations§
- The runtime configuration of Pagic is slightly different from the configuration in
pagic.config.ts