You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在@monaco-editor/react中配置Playwright代码补全与语法高亮

在React中使用@monaco-editor/react集成Playwright类型与补全的问题

我正尝试在React应用中用@monaco-editor/react搭建浏览器端IDE,希望用户能在编辑器里导入Playwright,并且Playwright的函数、类型能正常触发代码补全、语法高亮。但试了各种方法都没效果,连编辑器对Playwright导入语句的错误标记都消不掉。

下面是我的代码片段,其中codeTemplate是编辑器的占位代码,../../frameworkTypes/playwright.d.ts是安装playwright-core时生成的类型文件:

import Editor, { EditorProps } from "@monaco-editor/react";
import { Box } from "@mui/material";
import { useRef } from "react"
import { codeTemplate } from "../../constants/constants";

// eslint-disable-next-line import/no-webpack-loader-syntax
const playwrightTypings = require("!!raw-loader?esModule=false!../../frameworkTypes/playwright.d.ts");


export const CodeEditor = ({ ...props }: EditorProps) => {
    const monacoRef = useRef(null);

    const types = [
        { name: "playwright", types: playwrightTypings },
    ];

    const handleEditorWillMount = (monaco: any) => {
        types.forEach(module => {
            monaco.languages.typescript.javascriptDefaults.addExtraLib(
                `declare module "${module.name}" {
                    ${module.types}
                }`
            )
        });
    };

    const handleEditorDidMount = (editor: any, monaco: any) => {
        monacoRef.current = editor;
    };
    
    return (
        <Box display="flex">
            <Editor
                height="45vh"
                width="100%"
                language="typescript"
                theme="vs-dark"
                defaultValue={codeTemplate}
                beforeMount={handleEditorWillMount}
                onMount={handleEditorDidMount}
                {...props}
            />
        </Box>
    );
}

我已经卡了好几天,求任何可行的建议。之前参考过两个资源的方案,但都没起作用。


可行调整方案

1. 确认类型文件加载有效性

  • 在handleEditorWillMount里打印module.types,检查是否完整加载了playwright.d.ts的内容,排查是否存在路径错误或加载截断问题。
  • 若使用Webpack 5+,无需单独安装raw-loader,可改用内置语法:import playwrightTypings from "../../frameworkTypes/playwright.d.ts?raw";,同时在tsconfig.json中添加:
    "resolveJsonModule": true,
    "allowSyntheticDefaultImports": true
    
    避免类型导入报错。

2. 针对TypeScript配置补全

你当前仅给JavaScript默认配置添加了类型库,但编辑器使用的是TypeScript语言,需同步配置TypeScriptDefaults:

const handleEditorWillMount = (monaco: any) => {
    // 清空旧的额外库,避免冲突
    monaco.languages.typescript.typescriptDefaults.clearExtraLibs();
    monaco.languages.typescript.javascriptDefaults.clearExtraLibs();

    types.forEach(module => {
        // 同时给JS和TS配置添加类型库
        const moduleDeclaration = `declare module "${module.name}" {
            ${module.types}
        }`;
        // 给类型文件指定虚拟路径,帮助Monaco解析依赖
        const virtualPath = `file:///node_modules/@types/${module.name}/index.d.ts`;
        
        monaco.languages.typescript.javascriptDefaults.addExtraLib(moduleDeclaration, virtualPath);
        monaco.languages.typescript.typescriptDefaults.addExtraLib(moduleDeclaration, virtualPath);
    });

    // 配置TS编译器选项,适配Playwright模块解析
    monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
        module: monaco.languages.typescript.ModuleKind.ESNext,
        target: monaco.languages.typescript.ScriptTarget.ESNext,
        allowSyntheticDefaultImports: true,
        moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,
        typeRoots: ["node_modules/@types"],
        lib: ["ESNext", "DOM"]
    });
};

3. 匹配模块导入名

确保声明的模块名和用户实际导入的一致:如果用户代码是import { chromium } from "playwright-core",则模块名需改为"playwright-core",而非"playwright"。

4. 补充依赖类型

Playwright类型依赖Node.js内置类型,可将@types/node中的核心类型文件(如globals.d.ts)也加载为额外库,补充全局类型定义。


内容的提问来源于stack exchange,提问作者Lienid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:25:38