将 CodeMirror 与 Vuejs/Nuxtjs 一起使用会导致服务器重新加载时出现错误 'CodeMirror' is not defined

Using CodeMirror with Vuejs/Nuxtjs results in error 'CodeMirror' is not defined when I the server reloads

我正在 Nuxtjs/Vuejs 应用程序中的一个文本区域中实现 CodeMirror。我想根据 XML.

美化 textarea

有时 CodeMirror 工作正常,但有时当我重新加载页面时出现错误:

Test.vue
33:18  error  'CodeMirror' is not defined  no-under

所以最初它工作得很好但是当我尝试对项目中的任何文件进行一些更改并且当 Nuxtjs/Vuejs 服务器再次重新加载以合并新更改时我得到错误 error 'CodeMirror' is not defined

我不明白为什么我有时会收到错误消息,而其他时候却不会。因为我已经添加了所需的 CDN 并完成了各种答案和文章中提到的步骤,所以我希望它根本不会抛出错误。有人可以帮我解决这个问题吗?

遵循的步骤:

  1. 已将 CDN 添加到我的 nuxt-config.jsScripts:
    script: [
      {
        src:"text/javascript",
        src:"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/codemirror.min.js"
      },
      {
        src:"text/javascript",
        src:"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/mode/xml/xml.min.js"
      }
    ],

CSS:

{
 rel: "stylesheet",
 href:"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.63.1/codemirror.min.css"
}

以下是我的Test.vue

<template>
  <div>
    <div class="row">
      <div class="col-md-5">
        <div class="row">
          <div class="col-md-12">
            <textarea
              id="test"
              v-model="xmlInput"
              class="form-control"
              placeholder="XML Document"
              spellcheck="false"
              data-gramm="false"
              @input="convertToJSON()"
            />
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      xmlInput: ''
    }
  },
  methods: {
    convertToJSON () {
      console.log('ONE')
      const cm = CodeMirror.fromTextArea(document.getElementById('test'), {
        mode: 'application/xml',
        lineNumbers: true,
        matchBrackets: true,
        styleActiveLine: true,
        lineWrapping: true,
        tabSize: 2,
        value: 'console.log("Hello, World");'
      })
      cm.setSize(500, 500)
    }
  }
}
</script>

<style scoped>
textarea {
  height: 78vh;
  white-space: nowrap;
  resize: both;
}

::-webkit-input-placeholder {
  color: #f1948a;
  text-align: center;
}
</style>

有人可以帮我解决这个问题吗?我在这里做错了什么?任何建议将不胜感激。提前致谢。

重新创建问题的沙盒: https://codesandbox.io/s/boring-water-g14zd?file=/pages/index.vue

沙盒中的错误:

您可以执行以下操作使其正常工作。

  • 首先,您不必在每次输入更改时都重新初始化 codemirror 编辑器 @input="convertToJSON()"
  • 您可以在组件挂载时初始化编辑器。

代码

<template>
  <div>
    <div class="row">
      XML Dat
      <div class="col-md-5">
        <div class="row">
          <div class="col-md-12">
            <textarea
              id="test"
              v-model="xmlInput"
              class="form-control"
              placeholder="XML Document"
              spellcheck="false"
              data-gramm="false"
            />
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
export default {
  data() {
    return {
      xmlInput: "",
    };
  },
  mounted() {
    // 
    const editor = document.getElementById("test");
    editor.value = "";
    /** eslint-next-line */
    const cm = CodeMirror.fromTextArea(editor, {
      mode: "application/xml",
      lineNumbers: true,
      matchBrackets: true,
      styleActiveLine: true,
      lineWrapping: true,
      tabSize: 2,
      value: 'console.log("Hello, World");',
    });

    cm.setSize(500, 500);
  },
};

这是工作代码和框 link - https://codesandbox.io/s/falling-cdn-5o0t6?file=/pages/index.vue

如果您想使用 codemirror npm 模块,这里是 link 的工作代码和框 - https://codesandbox.io/s/boring-water-g14zd?file=/pages/index.vue