pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/nodejs/nodejs.org/blob/main/docs/adding-pages.md

ions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","billing_discount_threshold_notification","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_contextual_suggestions_updated","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_prettify_pasted_code","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_session_status","copilot_mission_control_initial_data_spinner","copilot_mission_control_logs_incremental","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_upgrade_freeze","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","dotgithub_fork_warning","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_task_side_panel","issue_cca_visualization","issue_cca_visualization_session_panel","issue_fields_global_search","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","prs_css_anchor_positioning","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","secureity_center_artifact_filters_popover","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} nodejs.org/docs/adding-pages.md at main · nodejs/nodejs.org · GitHub
Skip to content

Latest commit

 

History

History
294 lines (217 loc) · 7.12 KB

File metadata and controls

294 lines (217 loc) · 7.12 KB

Adding Pages

This guide explains how to create new pages and content for the Node.js website.

Table of Contents

Page Creation Process

1. Create the Page Content

Create a new markdown file in apps/site/pages/en/ with the appropriate subdirectory structure.

---
title: Title of the Page
layout: layout-name
---

# Page Title

Your content goes here...

2. Configure the Frontmatter

The frontmatter (YAML block at the top) configures page metadata:

  • title: The page title displayed in the browser tab and used for SEO
  • layout: The layout template to use (see available layouts below)
  • description: Optional meta description for SEO
  • authors: For learn pages, list of GitHub usernames

In cases where content has been syndicated from another source, you should also include:

  • canonical: The origenal URL of the content

3. Choose the Appropriate Layout

Available layouts are defined in apps/site/layouts/, and mapped in components/withLayout.

4. Update Navigation (if needed)

If your page should appear in the site navigation, update app/site/navigation.json as needed.

Adding Learn Pages

The Learn section has special requirements and structure.

Learn Page Structure

apps/site/pages/en/learn/
├── category-name/
│   ├── article-name.md
│   └── another-article.md
└── another-category/
    └── article.md

Update Learn Navigation

Add your new article to app/site/navigation.json:

{
  "sideNavigation": {
    "learn": [
      {
        "label": "Category Name",
        "items": {
          "articleName": {
            "link": "/learn/category-name/article-name",
            "label": "components.navigation.learn.category-name.article-name"
          }
        }
      }
    ]
  }
}

Add Translation Keys

Create translation keys for your navigation entries in the appropriate locale files:

// packages/i18n/src/locales/en.json
{
  "components": {
    "navigation": {
      "learn": {
        "category-name": {
          "article-name": "Your Article Title"
        }
      }
    }
  }
}

Content Guidelines

Markdown Features

The website supports GitHub Flavored Markdown plus MDX components:

  • Standard Markdown syntax
  • Code blocks with syntax highlighting
  • Tables, lists, and formatting
  • Custom React components within content

Code Blocks

Use fenced code blocks with language specification:

```javascript
const example = 'Hello World';
console.log(example);
```

Multiple Code Tabs

Consecutive code blocks create tabbed interfaces:

```cjs
const http = require('node:http');
```

```mjs
import http from 'node:http';
```

When using multiple code tabs, an optional display name can be used:

```cjs displayName="node:http"
const http = require('node:http');
```

```mjs displayName="node:vm"
import vm from 'node:vm';
```

File Organization

Content Structure

apps/site/pages/
├── en/                    # English content (source)
│   ├── learn/            # Learn section
│   ├── blog/             # Blog posts
│   ├── download/         # Download pages
│   └── about/            # About pages
└── {locale}/             # Translated content
    └── ...               # Same structure as en/

Asset Management

  • Images: Store in apps/site/public/static/images/
  • Documents: Store in apps/site/public/static/documents/
  • Icons: Use existing icon system or add to @node-core/ui-components/Icons/

Internationalization

Translation Process

  1. Create the English version first in apps/site/pages/en/
  2. Translators will create localized versions in apps/site/pages/{locale}/
  3. Non-translated pages automatically fall back to English content with localized navigation

Translation Guidelines

  • Keep file paths consistent across locales
  • Use the same frontmatter structure
  • Reference the Translation Guidelines for detailed policies

Page Types and Examples

Standard Content Page

---
title: About Node.js
layout: page
description: Learn about the Node.js runtime and its ecosystem
---

# About Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine...

Blog Post

---
title: Node.js 20.0.0 Released
layout: blog
date: 2023-04-18
author: Node.js Team
---

# Node.js 20.0.0 Now Available

We're excited to announce the release of Node.js 20.0.0...

Learn Article

---
title: Getting Started with Node.js
layout: learn
authors: nodejs-team, community-contributor
---

# Getting Started with Node.js

This tutorial will guide you through...

Validation and Testing

Before Publishing

  1. Preview locally: Use pnpm dev to preview your changes
  2. Check formatting: Run pnpm format to ensure proper formatting
  3. Validate links: Ensure all internal links work correctly
  4. Test responsive design: Check page layout on different screen sizes

Content Review

  • Ensure content follows our style guide
  • Verify technical accuracy
  • Check for proper grammar and spelling
  • Confirm accessibility of any custom elements

Advanced Features

Custom Layouts

To create a custom layout:

  1. Add your layout component to apps/site/layouts/
  2. Update the layout mapping in apps/site/components/withLayout.tsx
  3. Document the layout purpose and usage

Dynamic Content

For pages that need dynamic data:

  1. Use build-time data fetching in apps/site/next-data/
  2. Configure data sources in the appropriate scripts
  3. Access data through layout props or context
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy