CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-react-syntax-highlighter

React component library for syntax highlighting with highlight.js and Prism.js support.

Pending
Overview
Eval results
Files

light-builds.mddocs/

Light Build Variants

Lightweight syntax highlighter builds that require manual language registration for optimal bundle sizes. These builds include only the core highlighting engine without pre-bundled languages.

Capabilities

Light (Highlight.js Core)

Light build using highlight.js core requiring manual language registration.

/**
 * Light syntax highlighter component using highlight.js core
 */
const Light: SyntaxHighlighterComponent & {
  /** Register a language definition for highlighting */
  registerLanguage: (name: string, language: any) => void;
};

type SyntaxHighlighterComponent = React.ComponentType<SyntaxHighlighterProps>;

Usage Examples:

import { Light as SyntaxHighlighter } from 'react-syntax-highlighter';
import js from 'react-syntax-highlighter/dist/esm/languages/hljs/javascript';
import python from 'react-syntax-highlighter/dist/esm/languages/hljs/python';
import docco from 'react-syntax-highlighter/dist/esm/styles/hljs/docco';

// Register languages before use
SyntaxHighlighter.registerLanguage('javascript', js);
SyntaxHighlighter.registerLanguage('python', python);

const LightExample = () => {
  const code = `function calculateSum(a, b) {
  return a + b;
}

console.log(calculateSum(5, 3));`;

  return (
    <SyntaxHighlighter language="javascript" style={docco}>
      {code}
    </SyntaxHighlighter>
  );
};

PrismLight (Prism.js Core)

Light build using Prism.js core requiring manual language registration.

/**
 * Light syntax highlighter component using Prism.js core
 */
const PrismLight: SyntaxHighlighterComponent & {
  /** Register a language definition for highlighting */
  registerLanguage: (name: string, language: any) => void;
  /** Create language aliases for existing registered languages */
  alias: (name: string, aliases: string | string[]) => void;
};

Usage Examples:

import { PrismLight as SyntaxHighlighter } from 'react-syntax-highlighter';
import jsx from 'react-syntax-highlighter/dist/esm/languages/prism/jsx';
import typescript from 'react-syntax-highlighter/dist/esm/languages/prism/typescript';
import prism from 'react-syntax-highlighter/dist/esm/styles/prism/prism';

// Register languages
SyntaxHighlighter.registerLanguage('jsx', jsx);
SyntaxHighlighter.registerLanguage('typescript', typescript);

const PrismLightExample = () => {
  const code = `interface User {
  name: string;
  age: number;
}

const user: User = {
  name: "Alice",
  age: 30
};`;

  return (
    <SyntaxHighlighter language="typescript" style={prism}>
      {code}
    </SyntaxHighlighter>
  );
};

Language Registration

Manual language registration for light builds.

/**
 * Register a language definition for syntax highlighting
 * @param name - Language identifier (e.g., 'javascript', 'python')
 * @param language - Language definition module
 */
registerLanguage(name: string, language: any): void;

Usage Examples:

// Single language registration
import { Light as SyntaxHighlighter } from 'react-syntax-highlighter';
import javascript from 'react-syntax-highlighter/dist/esm/languages/hljs/javascript';

SyntaxHighlighter.registerLanguage('javascript', javascript);

// Multiple language registration
import cpp from 'react-syntax-highlighter/dist/esm/languages/hljs/cpp';
import java from 'react-syntax-highlighter/dist/esm/languages/hljs/java';
import rust from 'react-syntax-highlighter/dist/esm/languages/hljs/rust';

const languages = [
  ['cpp', cpp],
  ['java', java], 
  ['rust', rust]
];

languages.forEach(([name, lang]) => {
  SyntaxHighlighter.registerLanguage(name, lang);
});

// Dynamic registration
const registerLanguageIfNeeded = async (languageName) => {
  try {
    const language = await import(`react-syntax-highlighter/dist/esm/languages/hljs/${languageName}`);
    SyntaxHighlighter.registerLanguage(languageName, language.default);
  } catch (error) {
    console.warn(`Language ${languageName} not found`);
  }
};

Bundle Size Optimization

Light builds significantly reduce bundle size by including only required languages.

// Compare bundle sizes:
// Full build: ~500KB (all languages included)
// Light build: ~50KB (core only, languages added as needed)

// Optimal pattern for known languages
import { Light as SyntaxHighlighter } from 'react-syntax-highlighter';
import javascript from 'react-syntax-highlighter/dist/esm/languages/hljs/javascript';
import css from 'react-syntax-highlighter/dist/esm/languages/hljs/css';
import html from 'react-syntax-highlighter/dist/esm/languages/hljs/xml'; // xml is used for HTML

// Register only the languages you need
const SUPPORTED_LANGUAGES = {
  javascript,
  css,
  html
};

Object.entries(SUPPORTED_LANGUAGES).forEach(([name, lang]) => {
  SyntaxHighlighter.registerLanguage(name, lang);
});

// Usage remains the same
<SyntaxHighlighter language="javascript" style={docco}>
  {code}
</SyntaxHighlighter>

Custom Language Support

Adding support for languages not included in the standard distribution.

// Example: Adding cURL support with highlight.js plugin
import { Light as SyntaxHighlighter } from 'react-syntax-highlighter';
import curl from 'highlightjs-curl'; // External plugin

SyntaxHighlighter.registerLanguage('curl', curl);

const CurlExample = () => {
  const curlCode = `curl -X POST https://api.example.com/users \\
  -H "Content-Type: application/json" \\
  -d '{"name": "John", "email": "john@example.com"}'`;

  return (
    <SyntaxHighlighter language="curl" style={docco}>
      {curlCode}
    </SyntaxHighlighter>
  );
};

Migration from Full Builds

Converting from full builds to light builds for better performance.

// Before (Full build - larger bundle)
import SyntaxHighlighter from 'react-syntax-highlighter';
import { docco } from 'react-syntax-highlighter/dist/esm/styles/hljs';

// After (Light build - smaller bundle)
import { Light as SyntaxHighlighter } from 'react-syntax-highlighter';
import javascript from 'react-syntax-highlighter/dist/esm/languages/hljs/javascript';
import docco from 'react-syntax-highlighter/dist/esm/styles/hljs/docco';

// Register required languages
SyntaxHighlighter.registerLanguage('javascript', javascript);

// Component usage remains identical
const CodeBlock = ({ code, language }) => (
  <SyntaxHighlighter language={language} style={docco}>
    {code}
  </SyntaxHighlighter>
);

Best Practices

Language Management

// Create a centralized language registry
const LanguageRegistry = {
  registered: new Set(),
  
  async register(languageName) {
    if (this.registered.has(languageName)) return;
    
    try {
      const language = await import(
        `react-syntax-highlighter/dist/esm/languages/hljs/${languageName}`
      );
      SyntaxHighlighter.registerLanguage(languageName, language.default);
      this.registered.add(languageName);
    } catch (error) {
      console.warn(`Failed to load language: ${languageName}`);
    }
  },
  
  isRegistered(languageName) {
    return this.registered.has(languageName);
  }
};

// Usage in components
const CodeBlock = async ({ language, children }) => {
  await LanguageRegistry.register(language);
  
  return (
    <SyntaxHighlighter language={language} style={docco}>
      {children}
    </SyntaxHighlighter>
  );
};

Performance Optimization

// Preload common languages at app startup
const COMMON_LANGUAGES = ['javascript', 'typescript', 'python', 'json'];

const preloadLanguages = async () => {
  const imports = COMMON_LANGUAGES.map(async (lang) => {
    const module = await import(`react-syntax-highlighter/dist/esm/languages/hljs/${lang}`);
    return [lang, module.default];
  });
  
  const languages = await Promise.all(imports);
  languages.forEach(([name, lang]) => {
    SyntaxHighlighter.registerLanguage(name, lang);
  });
};

// Call during app initialization
preloadLanguages();

Install with Tessl CLI

npx tessl i tessl/npm-react-syntax-highlighter

docs

async-builds.md

index.md

language-support.md

light-builds.md

prism-integration.md

standard-highlighter.md

styling-themes.md

tile.json