语法荧光笔无法使用带 Next.js 的 codemirror 2

Syntax highlighter not working using codemirror 2 with Next.js

我看到很多例子,它对所有人都很好,但我不知道为什么它不突出我的代码。 我尝试了很多解决方案 none,其中对我有用。

此外,我需要在其中注入我自己的自定义 HTML 文件,当用户单击代码演示时,用户还可以更改文件和 运行 自己的自定义代码那个用户想要。

这是输出的屏幕截图:

我用于编辑器的代码

import React from 'react';
import {Controlled as ControlledEditor} from 'react-codemirror2';
import {language} from "@hapi/accept";
import {codecs} from "next/dist/next-server/server/lib/squoosh/codecs";

if (typeof navigator !== 'undefined') {
    require('codemirror/mode/xml/xml');
    require('codemirror/mode/css/css');
    require('codemirror/mode/javascript/javascript');
    require('codemirror/mode/markdown/markdown');
}
    
const Editor = (props) => {
    const {
        displayName,
        value,
        onChange
    } = props
    
    const handleChange = (editor,date,value) => {
        onChange(value);
    }
    
    return (
        <div className="editor-container">
            <div className="editor_title">
                {displayName}
                <button>O/C</button>
            </div>
            <ControlledEditor
                onBeforeChange={handleChange}
                value={value}
                className={'code-mirror-wrapper'}
                options={{
                    lineWrapping:true,
                    lint:true,
                    mode:language,
                    theme:'dracula',
                    lineNumbers:true
                }}
            />
        </div>
    )
}
    
export  default  Editor;

这是我调用我的编辑器的新文件:

import React,{useState,useEffect} from 'react';
import Editor from '../../component/Editor/editor';
    
const RunCode = () => {
    const [html,setHtml] = useState();
    const [css,setCss] = useState();
    const [JS,setJS] = useState();
    const [scrDoc,setSrcDoc] = useState('');
    
    useEffect(()=>{
        const timeout = setTimeout(()=>{
            setSrcDoc(
                `<html>
                   <body>${html}</body>
                   <style>${css}</style>
                   <script>${JS}</script>
                </html>`
            )
        },250)
    
        return () => clearTimeout(timeout)
    },[html,JS,css]);
    
    return(
        <>
             <div className={'pane top-pane'}>
                 <Editor
                     language={'xml'}
                     displayName={'HTML'}
                     value={html}
                     onChange={setHtml}
                 />
                 <Editor
                     language={'CSS'}
                     displayName={'CSS'}
                     value={css}
                     onChange={setCss}
                 />
                 <Editor
                     language={'JS'}
                     displayName={'JS'}
                     value={JS}
                     onChange={setJS}
                 />
             </div>
             <div className="output">
                  <iframe
                      srcDoc={scrDoc}
                      title={'Output'}
                      sandbox={'allow-scripts'}
                      height={'100%'}
                      width={'100%'}
                  >
                  </iframe>
             </div>
         </>
    )
}
    
export  default  RunCode;

简短的回答是:您可能不会导入 .css 文件来使用“Dracula”主题。 确保从使用 ControlledEditor 的组件中的 node_modules 导入这两个文件,以便为您的编辑器提供主题。

  • 导入“codemirror/lib/codemirror.css”;
  • 导入“codemirror/theme/dracula.css”;

PS:我个人最喜欢的主题是:ayu-dark ;)

我也做过类似的东西。这里有一个Github Repo供大家参考。 :)

趣闻:@juliomalves 帮助我在 vercel 上部署了这个项目。