Monaco Editor 是微软开源,运行在浏览器环境中

27 篇文章 0 订阅
25 篇文章 0 订阅
自己前期在使用这个插件的安转是默认(monaco-editor,monaco-editor-webpack-plugin),最高版本的 ,运行的时候就是报错,一直报错node_moudle里面解析错误,搞了半天不晓得什么原因,(网上很多文章也没说要注意版本对应,官方文档真的难的看) 最后发现是这两个最高版本对应问题 注意 使用这两个插件包一定注意版本对应  版本最好使用我下面给出,这个插件包还是开发版本
已经附上对应版本号 

1.我是在vue中项目使用的
首先安装 monaco-editor 插件包 这个就通过npm或者cnpm安装  npm install monaco-editor
 "monaco-editor": "^0.25.2",
 在vue项目使用这个monaco-editor还要安装一个 monaco-editor-webpack-plugin 可以自动帮你把语言注入进来  npm install monaco-editor-webpack-plugin -S  
    "monaco-editor-webpack-plugin": "^4.2.0",
<template>
<div :ref="container" class="monaco-editor" :style="`width:100%;height:calc(100% - 100px);`"></div>
</template>
    vue.config.js中 
    注入 const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin')
    module.exports = {
    // 部署应用时的基本URL
    publicPath: process.env.NODE_ENV === 'production' ? '/' : '/',
    outputDir: 'dist', // 打包位置
    assetsDir: 'assets', // 打包后静态资源位置
    productionSourceMap: false, // 生产环境是否生成 sourceMap 文件
    chainWebpack: config => {
        config.resolve.alias
            .set("@", resolve("src"))
            .set("@v", resolve("src/views"))
            .set("@c", resolve("src/components"))
            .set("@u", resolve("src/utils"))
            .set("@a", resolve("src/assets")); /* 别名配置 */
        config.optimization.runtimeChunk("single");
        //这个这个哈哈哈
        config.plugin('monaco-editor').use(MonacoWebpackPlugin, [
            {
              languages: ['json', 'javascript', 'html', 'xml']
            }
          ])
    },
};
// import * as monaco from 'monaco-editor' 这个导入浏览器控制台会有报错
// import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
// import '@/components/monaco-editor/basic-languages/javascript/javascript.js'
// import '@/components/monaco-editor/basic-languages/javascript'
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
import 'monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution' // 代码高亮
import 'monaco-editor/esm/vs/editor/contrib/find/findController.js' // 引入查找控件
export default {
  props: {
    opts: {
      type: Object,
      default: function () {
        return {
          fontSize: 18, //字体大小
          language: "javascript",
          theme: 'vs-dark', // vs, hc-black, or vs-dark
          readOnly: false, // 是否为只读模式
        };
      },
    },
    styleMonaco:{
      type:Object,
      default:{
        height:"800px",
        width:"800px"
      }
    },
  },
  data() {
    return {
      // 主要配置 这里的配置只是 默认基础配置 , 一般在父组件的 data 里配置就可以了  ,子组件这里不配置都可以
      defaultOpts: {
        folding: true, // 是否启用代码折叠
        links: true, // 是否点击链接
        overviewRulerBorder: false, // 是否应围绕概览标尺绘制边框
        renderLineHighlight: 'gutter', // 当前行突出显示方式
        roundedSelection: false, // 选区是否有圆角
        scrollBeyondLastLine: false, // 设置编辑器是否可以滚动到最后一行之后
        selectOnLineNumbers: true,
        cursorStyle: "line", //光标样式
        automaticLayout: false, //自动布局
        glyphMargin: true, //字形边缘
        useTabStops: false,
        autoIndent: true, //自动布局
        copyWithSyntaxHighlighting: true, // 是否应将语法突出显示复制到剪贴板中 即 当你复制到word中是否保持文字高亮颜色
        autoClosingBrackets: "always", // 是否自动添加结束括号(包括中括号) "always" | "languageDefined" | "beforeWhitespace" | "never"
        autoClosingDelete: "always", // 是否自动删除结束括号(包括中括号) "always" | "never" | "auto"
        autoClosingOvertype: "always", // 是否关闭改写 即使用insert模式时是覆盖后面的文字还是不覆盖后面的文字 "always" | "never" | "auto"
        autoClosingQuotes: "always", // 是否自动添加结束的单引号 双引号 "always" | "languageDefined" | "beforeWhitespace" | "never"
      },
      editorOptions:null,//和并固定参数和可选参数
      monacoEditor:null,//初始化实例
      container: 'container'
    }
  },
  //监听一些常用的属性值需要改变,需要重新初始化容器
  watch: {
    opts: {
      handler(n) {
        this.init()
      },
      deep: true
    }
  },
  mounted() {
    // this.init()
  },
  methods: {
    init() {
      console.log(this.$refs.container);
      // 初始化container的内容,销毁之前生成的编辑器
      this.$refs.container.innerHTML = ''
      this.editorOptions = Object.assign(this.defaultOpts, this.opts)
      this.monacoEditor = monaco.editor.create(this.$refs.container, this.editorOptions)
      // 编辑器内容发生改变时触发
      // this.monacoEditor.onDidChangeModelContent(() => {
      //   this.$emit('change', this.monacoEditor.getValue())
      // })
      // this.monacoEditor.onKeyDown((event) => { //禁止复制粘贴
      //   const {
      //     keyCode,
      //     ctrlKey,
      //     metaKey
      //   } = event;
      //   if ((keyCode === 33 || keyCode === 52) && (metaKey || ctrlKey)) {
      //     console.log(3333);
      //     event.preventDefault();
      //   }
      // });
    },
    // 供父组件调用手动获取值
    getVal() {
      return this.monacoEditor.getValue()
    },
  }
}
//父组件样式
 <div class="preCode">
        <div class="title">默认代码</div>
        <div class="formatSelect">
          <el-form :model="ruleForm1" ref="ruleForm" :inline="true" class="demo-ruleForm">
            <el-form-item label="Language" :label-width="formLabelWidth">
              <el-input v-model="ruleForm1.language" autocomplete="off" :disabled=true></el-input>
            </el-form-item>
            <el-form-item label="Theme" :label-width="formLabelWidth">
              <el-select v-model="ruleForm1.theme" placeholder="请选择主题" @change="themeChange">
                <el-option :label="item.label" v-for="item in themeOption " :key="item.value" :value="item.value"></el-option>
              </el-select>
            </el-form-item>
          </el-form>
        </div>
        <CodeEditor ref="asdasd" :opts="monacoData" key="index2"></CodeEditor>
      </div>
//父组件调用
import CodeEditor from "@/components/CodeEditor";
export default {
  data() {
    return {
      outLineContent: "",
      monacoData: {
        fontSize: 20, //字体大小
        language: "html",
        theme: "vs-dark", // vs, hc-black, or vs-dark
        readOnly: false, // 是否为只读模式
      },
      height: window.innerHeight  + 'px',
      formLabelWidth: "120px",
      ruleForm: {
        theme: "vs-dark",
        language: "javascript",
      },
      ruleForm1: {
        theme: "vs",
        language: "html",
      },
      themeOption: [{
          value: "vs",
          label: "浅色模式",
        },
        {
          value: "vs-dark",
          label: "深色模式",
        },
        {
          value: "hc-black",
          label: "高对比模式",
        },
      ],
    };
  },
  computed: {
    resizeHeight() {
      let style = {
        height: this.height
      }
      return style
    }
  },
  components: {
    CodeEditor,
    Editor,
  },
  mounted() {
    let _this = this
    window.addEventListener(
      'resize',
      () => {
        if (document.getElementById('javaModuleId')) {
          _this.height = window.innerHeight  + 'px'
        }
      },
      false
    )
    
    
  },
  methods: {
    themeChange(val) {
      this.monacoData.theme = val;
      // this.$refs.CodeEditorId.getMonaco.setTheme(val);
    },
  },
};
      .preCode {
        width: 100% ;
        height: 500px;

        .title {
          font-weight: bold;
          color: #333333;
          font-size: 15px;
          margin-right: 11px;
          margin: 20px 0;
        }

        // overflow-x: hidden;
        .formatSelect {
          /deep/.el-form {
            width: 100%;
          }
        }
      }

monaco editor 汉化 请参考 https://juejin.cn/post/6965675865673826335
Monaco Editor 使用指南 请参考 https://juejin.cn/post/6844904198836846599
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值