尝试设置 BlazorMonaco 编辑器时出现“ReferenceError:monaco 未定义”

问题描述 投票:0回答:1

我正在尝试设置 BlazorMonaco 编辑器,但我不断收到错误:

fail: Microsoft.AspNetCore.Components.Server.Circuits.CircuitHost[111]
      Unhandled exception in circuit 'u1AmXKcme53TZumhysV_MenrWwA9xjflVubUoLRRQzk'.
      Microsoft.JSInterop.JSException: monaco is not defined
ReferenceError: monaco is not defined

检查编译后的 JavaScript,问题似乎出在

_content/BlazorMonaco/lib/monaco-editor/min-maps/vs/out-editor/vs/loader.js
文件中。控制台中显示的错误是:

properties of undefined (reading 'define')
    at loader.js:1961:33
    at loader.js:1973:13

指向 loader.js 中的这一行:

if (typeof AMDLoader.global.define !== 'function' || !AMDLoader.global.define.amd) {

代码:

我按照 BlazorMonaco GitHub 存储库中说明的步骤进行操作。我实施的步骤摘要:

  1. 已将 NuGet 包安装到项目中。

  2. 在 HTML 中添加脚本标签

    <head>
    :

<script src="_content/BlazorMonaco/jsInterop.js"></script>
<script src="_content/BlazorMonaco/lib/monaco-editor/min/vs/loader.js"></script>
<script src="_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.js"></script>


  1. 创建以下
    .razor
    组件:
@using BlazorMonaco
@using BlazorMonaco.Editor

<h3>Code Editor</h3>

<StandaloneCodeEditor @ref="_editor" Id="sample-code-editor-123" ConstructionOptions="EditorConstructionOptions" />

@code {
    private StandaloneCodeEditor _editor = null!;
    private string _valueToSet = "";

    private StandaloneEditorConstructionOptions EditorConstructionOptions(StandaloneCodeEditor editor)
    {
        return new StandaloneEditorConstructionOptions
        {
            Language = "javascript",
            GlyphMargin = true,
            Value = "\"use strict\";\n" +
                    "function Person(age) {\n" +
                    "   if (age) {\n" +
                    "       this.age = age;\n" +
                    "   }\n" +
                    "}\n" +
                    "Person.prototype.getAge = function () {\n" +
                    "   return this.age;\n" +
                    "};\n"
        };
    }
}

我找不到任何有关发生此错误的原因的信息。看来我们需要某种

Monaco
包?

c# blazor monaco-editor referenceerror
1个回答
1
投票

我们成功解决了这个错误。步骤 2 中出现问题之一,更正的方法是将脚本标记(请参阅步骤 2)添加到 HTML

<body>
标记,而不是问题中提到的
<head>
标记。请注意,这些脚本标签必须放置在
blazor.webassembly.js
文件的脚本标签之后。

换句话说,您的

<body>
文件中的
wwwroot/index.html
标签应如下所示:

<body>
    <div id="app">
        <svg class="loading-progress">
            <circle r="40%" cx="50%" cy="50%" />
            <circle r="40%" cx="50%" cy="50%" />
        </svg>
        <div class="loading-progress-text"></div>
    </div>

    <div id="blazor-error-ui">
        An unhandled error has occurred.
        <a href="" class="reload">Reload</a>
        <a class="dismiss">🗙</a>
    </div>
    
    <script src="_framework/blazor.webassembly.js"></script>
    
    <!-- Loading modules for BLAZOR MONACO -->
    <script src="_content/BlazorMonaco/jsInterop.js"></script>
    <script src="_content/BlazorMonaco/lib/monaco-editor/min/vs/loader.js"></script>
    <script src="_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.js"></script>
    
</body>

正如 @ViRuSTriNiTy 提到的,该错误是由于在我们现有项目中实现 Monaco 编辑器时发生的副作用造成的。我们的项目中也有 ag-grid,最初使用 cdn 链接将 ag-grid 导入 JavaScript 文件。

import "https://cdn.jsdelivr.net/npm/ag-grid-community/dist/ag-grid-community.js";
import "https://cdn.jsdelivr.net/npm/ag-grid-enterprise/dist/ag-grid-enterprise.js";

将 ag-grid 和 BlazorMonaco 作为我们项目的一部分,出现错误:

Microsoft.JSInterop.JSException: Can only have one anonymous define call per script file

<script>
中 HTML
<head>
中的 cdn 链接替换为
wwwroot/index.html
标签,解决了此问题。

<!-- Loading modules for AG GRID  -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/ag-grid-enterprise.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ag-grid-community/styles/ag-grid.css"/>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ag-grid-community/styles/ag-theme-alpine.css"/>
© www.soinside.com 2019 - 2024. All rights reserved.