Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Weird warning #227

Open
beamcode opened this issue Jun 26, 2024 · 5 comments
Open

Weird warning #227

beamcode opened this issue Jun 26, 2024 · 5 comments

Comments

@beamcode
Copy link
Contributor

[Shiki] 10 instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call highlighter.dispose() to release unused instances.

Not sure if this is me or Rpc

@o-az
Copy link
Member

o-az commented Jun 28, 2024

@beamcode could you please please share a repro?
either link to code or https://stackblitz.com/

@beamcode
Copy link
Contributor Author

Yeah happens on my simple personal website https://github.com/beamcode/beamcode.dev/

@b3nk3
Copy link

b3nk3 commented Sep 24, 2024

I think it's a react thing...

a simple refactoring sorted it for me:

let highlighterInstance: any = null;

export async function Code({ code }: { code: string }) {
  const highlightedCode = await highlightCode(code);
  return (
    <section
      dangerouslySetInnerHTML={{
        __html: highlightedCode,
      }}
    />
  );
}

async function getHighlighter() {
  if (!highlighterInstance) {
    highlighterInstance = await unified()
      .use(remarkParse)
      .use(remarkRehype)
      .use(rehypePrettyCode, {
        theme: JSON.parse(JSON.stringify(hotlineVice)),
      })
      .use(rehypeStringify);
  }
  return highlighterInstance;
}

async function highlightCode(code: string) {
  const highlighter = await getHighlighter();
  const file = await highlighter.process(code);
  return String(file);
}

@o-az
Copy link
Member

o-az commented Oct 2, 2024

I think it's a react thing...

a simple refactoring sorted it for me:


let highlighterInstance: any = null;



export async function Code({ code }: { code: string }) {

  const highlightedCode = await highlightCode(code);

  return (

    <section

      dangerouslySetInnerHTML={{

        __html: highlightedCode,

      }}

    />

  );

}



async function getHighlighter() {

  if (!highlighterInstance) {

    highlighterInstance = await unified()

      .use(remarkParse)

      .use(remarkRehype)

      .use(rehypePrettyCode, {

        theme: JSON.parse(JSON.stringify(hotlineVice)),

      })

      .use(rehypeStringify);

  }

  return highlighterInstance;

}



async function highlightCode(code: string) {

  const highlighter = await getHighlighter();

  const file = await highlighter.process(code);

  return String(file);

}

thanks! PR for this would be appreciated.

@Ianmello10
Copy link

Ianmello10 commented Nov 25, 2024

I have the same issue with next-mdx-remote :

[Shiki] 160 instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call `highlighter.dispose()` to release unused instances.
	const { frontmatter, content } = await compileMDX<PostMetadata>({
		source: contentFilePath,
		options: {
			mdxOptions: {
				remarkPlugins: [],
				rehypePlugins: [
					[
						rehypePrettyCode,
						{
							theme: "vitesse-dark",
						},
					],
					[rehypeSlug],
				],
			},

			parseFrontmatter: true,
		},
	});

i made this change in a clone of rehype-pretty-code, installed it in a next js project and the singleton warning disappeared.

import {
  type Highlighter,
  type CodeToHastOptions,
  getSingletonHighlighter as defaultGetHighlighter,
} from 'shiki'; 

getHighlighter is deprecated

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants