@fengkx/react-syntax-highlighter

中文文档
15.6.1发布于 2023/05/31MITESM + CJS近 30 天下载 1.3万

syntax highlighting component for react with prismjs or highlightjs ast using inline styles

原始使用文档
文档目录10 节
  1. React Syntax Highlighter
  2. Install
  3. Why This One?
  4. Javascript Styles!
  5. Use
  6. Prism
  7. Light Build
  8. Async Build
  9. Built with React Syntax Highlighter
  10. License

React Syntax Highlighter

Fork of the original repo to upgrade refractor to v4

Actions Status npm

Syntax highlighting component for React using the seriously super amazing lowlight and refractor by wooorm

Check out a small demo here and see the component in action highlighting the generated test code here.

For React Native you can use react-native-syntax-highlighter

Install

npm install react-syntax-highlighter --save

Why This One?

There are other syntax highlighters for React out there so why use this one? The biggest reason is that all the others rely on triggering calls in componentDidMount and componentDidUpdate to highlight the code block and then insert it in the render function using dangerouslySetInnerHTML or just manually altering the DOM with native javascript. This utilizes a syntax tree to dynamically build the virtual dom which allows for updating only the changing DOM instead of completely overwriting it on any change, and because of this it is also using more idiomatic React and allows the use of pure function components brought into React as of 0.14.

Javascript Styles!

One of the biggest pain points for me trying to find a syntax highlighter for my own projects was the need to put a stylesheet tag on my page. I wanted to provide out of the box code styling with my modules without requiring awkward inclusion of another libs stylesheets. The styles in this module are all javascript based, and all styles supported by highlight.js have been ported!

I do realize that javascript styles are not for everyone, so you can optionally choose to use css based styles with classNames added to elements by setting the prop useInlineStyles to false (it defaults to true).

Use

props

  • language - the language to highlight code in. Available options here for hljs and here for prism. (pass text to just render plain monospaced text)
  • style - style object required from styles/hljs or styles/prism directory depending on whether or not you are importing from react-syntax-highlighter or react-syntax-highlighter/prism directory here for hljs. and here for prism. import { style } from 'react-syntax-highlighter/dist/esm/styles/{hljs|prism}' . Will use default if style is not included.
  • children - the code to highlight.
  • customStyle - prop that will be combined with the top level style on the pre tag, styles here will overwrite earlier styles.
  • codeTagProps - props that will be spread into the <code> tag that is the direct parent of the highlighted code elements. Useful for styling/assigning classNames.
  • useInlineStyles - if this prop is passed in as false, react syntax highlighter will not add style objects to elements, and will instead append classNames. You can then style the code block by using one of the CSS files provided by highlight.js.
  • showLineNumbers - if this is enabled line numbers will be shown next to the code block.
  • showInlineLineNumbers - if this is enabled in conjunction with showLineNumbers, line numbers will be rendered into each line, which allows line numbers to display properly when using renderers such as react-syntax-highlighter-virtualized-renderer. (This prop will have no effect if showLineNumbers is false.)
  • startingLineNumber - if showLineNumbers is enabled the line numbering will start from here.
  • lineNumberContainerStyle - the line numbers container default to appearing to the left with 10px of right padding. You can use this to override those styles.
  • lineNumberStyle - inline style to be passed to the span wrapping each number. Can be either an object or a function that receives current line number as argument and returns style object.
  • wrapLines - a boolean value that determines whether or not each line of code should be wrapped in a parent element. defaults to false, when false one can not take action on an element on the line level. You can see an example of what this enables here
  • wrapLongLines - boolean to specify whether to style the <code> block with white-space: pre-wrap or white-space: pre. Demo
  • lineProps - props to be passed to the span wrapping each line if wrapLines is true. Can be either an object or a function that receives current line number as argument and returns props object.
  • renderer - an optional custom renderer for rendering lines of code. See here for an example.
  • PreTag - the element or custom react component to use in place of the default pre tag, the outermost tag of the component (useful for custom renderer not targeting DOM).
  • CodeTag - the element or custom react component to use in place of the default code tag, the second tag of the component tree (useful for custom renderer not targeting DOM).
  • spread props pass arbitrary props to pre tag wrapping code.
import SyntaxHighlighter from 'react-syntax-highlighter';
import { docco } from 'react-syntax-highlighter/dist/esm/styles/hljs';
const Component = () => {
  const codeString = '(num) => num + 1';
  return (
    <SyntaxHighlighter language="javascript" style={docco}>
      {codeString}
    </SyntaxHighlighter>
  );
};

Prism

Using refractor we can use an ast built on languages from Prism.js instead of highlight.js. This is beneficial especially when highlighting jsx, a problem long unsolved by this module. The semantics of use are basically the same although a light mode is not yet supported (though is coming in the future). You can see a demo(with jsx) using Prism(refractor) here.

import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
import { dark } from 'react-syntax-highlighter/dist/esm/styles/prism';
const Component = () => {
  const codeString = '(num) => num + 1';
  return (
    <SyntaxHighlighter language="javascript" style={dark}>
      {codeString}
    </SyntaxHighlighter>
  );
};

Light Build

React Syntax Highlighter used in the way described above can have a fairly large footprint. For those that desire more control over what exactly they need, there is an option to import a light build. If you choose to use this you will need to specifically import desired languages and register them using the registerLanguage export from the light build. There is also no default style provided.

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

SyntaxHighlighter.registerLanguage('javascript', js);

You can require PrismLight from react-syntax-highlighter to use the prism light build instead of the standard light build.

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

SyntaxHighlighter.registerLanguage('jsx', jsx);

Async Build

For optimal bundle size for rendering ASAP, there's a async version of prism light & light. This versions requires you to use a bundler that supports the dynamic import syntax, like webpack. This will defer loading of refractor (17kb gzipped) & the languages, while code splits are loaded the code will show with line numbers but without highlighting.

Prism version:

import { PrismAsyncLight as SyntaxHighlighter } from 'react-syntax-highlighter';

Highlight version

import { LightAsync as SyntaxHighlighter } from 'react-syntax-highlighter';

Supported languages

Access via the supportedLanguages static field.

SyntaxHighlighter.supportedLanguages;

Built with React Syntax Highlighter

  • mdx-deck - MDX-based presentation decks
  • codecrumbs - Learn, design or document codebase by putting breadcrumbs in source code. Live updates, multi-language support, and easy sharing.
  • Spectacle Editor - An Electron based app for creating, editing, saving, and publishing Spectacle presentations. With integrated Plotly support.
  • Superset - Superset is a data exploration platform designed to be visual, intuitive, and interactive.
  • Daydream - A chrome extension to record your actions into a nightmare script
  • CodeDoc - Electron based application build with React for creating project documentations
  • React Component Demo - A React Component To make live editable demos of other React Components.
  • Redux Test Recorder - a redux middleware to automatically generate tests for reducers through ui interaction. Syntax highlighter used by react plugin.
  • GitPoint - GitHub for iOS. Built with React Native. (built using react-native-syntax-highlighter)
  • Yoga Layout Playground - generate code for yoga layout in multiple languages
  • Kibana - browser-based analytics and search dashboard for Elasticsearch.
  • Golangci Web
  • Storybook Official Addons
  • Microsoft Fast DNA
  • Alibaba Ice
  • Uber BaseUI Docs
  • React Select Docs
  • Auto-layout - use flex layout
  • npmview - A web application to view npm package files
  • Static Forms - Free HTML forms for your static websites.
  • React DemoTab - A React component to easily create demos of other components
  • codeprinter - Print out code easily
  • Neumorphism - CSS code generator for Soft UI/Neumorphism shadows
  • grape-ui - Component library using styled-system and other open source components.
  • ✅ Good Arduino Code - A curated library of Arduino Coding examples
  • marmota.app - A desktop app to create simple markdown presentations

If your project uses react-syntax-highlighter please send a pr to add!

License

MIT

版本与发布记录

@fengkx/react-syntax-highlighter 共发布 2 个版本,首次发布于 2023/05/31;过去 12 个月发布了 0 个版本。

版本发布日期距今
15.6.1latest2023/05/313 年前
15.6.02023/05/313 年前

关于 @fengkx/react-syntax-highlighter 的常见问题

@fengkx/react-syntax-highlighter 是什么?

syntax highlighting component for react with prismjs or highlightjs ast using inline styles

如何安装 @fengkx/react-syntax-highlighter?

在项目目录运行 npm install @fengkx/react-syntax-highlighter,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(>= 0.14.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@fengkx/react-syntax-highlighter 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/fengkx__react-syntax-highlighter 是否存在。

@fengkx/react-syntax-highlighter 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@fengkx/react-syntax-highlighter 可以商用吗?

@fengkx/react-syntax-highlighter 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@fengkx/react-syntax-highlighter 的下载量有多少?

根据 npm 官方下载统计,@fengkx/react-syntax-highlighter 在 2026/10/15 – 2026/11/13 这 30 天内被下载 12,733 次,日均约 424 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@fengkx/react-syntax-highlighter 还在维护吗?

最新版本 15.6.1 发布于 2023/05/31(3 年前);至今共发布 2 个版本,其中过去 12 个月发布了 0 个;首次发布于 2023/05/31。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。