Use when working with docusaurus.config.js/ts files — validate the config structure, set required fields (title/url/baseUrl), fix URL and baseUrl formats, add presets and plugins, configure navbar/footer/theme settings, and move unknown keys into customFields. Triggers on tasks involving docusaurus.config.js, docusaurus.config.ts, site configuration, URL formats, presets, or theme config.
77
97%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
Docusaurus configuration can be in multiple formats:
import {Config} from '@docusaurus/types';
import {themes as prismThemes} from 'prism-react-renderer';
const config: Config = {
// Configuration here
};
export default config;export default {
// Configuration here
};module.exports = {
// Configuration here
};export default async function createConfig(): Promise<Config> {
// Import ESM-only packages
const mdxMermaid = await import('mdx-mermaid');
return {
// Configuration here
};
}stringstring'https://example.com'string/'/' or '/docs/'tagline: Short description of your sitefavicon: Path to favicon (relative to static folder)organizationName: GitHub org/user name (for deployment)projectName: GitHub repo name (for deployment)deploymentBranch: Branch for deployment (default: 'gh-pages')trailingSlash: Boolean or undefined for trailing slash handlingi18n: {
defaultLocale: 'en',
locales: ['en', 'fr', 'es'],
}presets: [
[
'@docusaurus/preset-classic',
{
docs: {
sidebarPath: './sidebars.ts',
editUrl: 'https://github.com/user/repo/tree/main/',
},
blog: {
showReadingTime: true,
},
theme: {
customCss: './src/css/custom.css',
},
},
],
],themes: ['@docusaurus/theme-classic'],
themeConfig: {
navbar: {
title: 'My Site',
logo: {
alt: 'My Site Logo',
src: 'img/logo.svg',
},
items: [
{to: '/docs/intro', label: 'Docs', position: 'left'},
],
},
footer: {
style: 'dark',
links: [],
copyright: `Copyright © ${new Date().getFullYear()}`,
},
},String format (no options):
plugins: ['@docusaurus/plugin-debug'],Array format (with options):
plugins: [
[
'@docusaurus/plugin-content-docs',
{
id: 'community',
path: 'community',
routeBasePath: 'community',
},
],
],Official Docusaurus packages can use shorthand:
'classic' → '@docusaurus/preset-classic''plugin-debug' → '@docusaurus/plugin-debug'Unknown fields cause validation errors. Use customFields for custom data:
customFields: {
apiKey: process.env.API_KEY,
customValue: 'my-value',
complexData: {
nested: true,
},
}Access in components:
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
function MyComponent() {
const {siteConfig} = useDocusaurusContext();
const apiKey = siteConfig.customFields.apiKey;
return <div>{apiKey}</div>;
}When modifying config, verify:
Required fields present:
title existsurl exists and has no trailing slashbaseUrl exists and starts/ends with /Plugins and themes:
Custom data:
customFields objectFile format:
Testing:
npm run buildplugins: [
[
'@docusaurus/plugin-content-docs',
{
id: 'product',
path: 'product',
routeBasePath: 'product',
},
],
[
'@docusaurus/plugin-content-docs',
{
id: 'community',
path: 'community',
routeBasePath: 'community',
},
],
],const config: Config = {
url: process.env.SITE_URL || 'https://localhost:3000',
customFields: {
apiEndpoint: process.env.API_ENDPOINT,
},
};Create babel.config.js:
module.exports = {
presets: [require.resolve('@docusaurus/babel/preset')],
plugins: [
// Your custom Babel plugins
],
};"url must not have a trailing slash"
url: 'https://example.com/' to url: 'https://example.com'"baseUrl must start and end with /"
baseUrl: 'docs' to baseUrl: '/docs/'"Unknown field 'myField'"
customFields: { myField: 'value' }"Cannot find module '@docusaurus/types'"
npm install --save-dev @docusaurus/types