html中使用vue3+elementplus

包括 图标、国际化

html 复制代码
<!doctype html>
<html class="dark">
  <head>
    <meta charset="utf-8" />
    <title>Monaco Editor</title>
    <!-- 导入样式 -->
    <link rel="stylesheet" href="/element-plus/dist/index.css" />
    <link rel="stylesheet" href="/element-plus/theme-chalk/dark/css-vars.css" />
    <!-- 导入 Vue 3 -->
    <script src="/vue@3.5.26/dist/vue.global.js"></script>
    <!-- 导入组件库 ElementPlus-->
    <script src="/element-plus/dist/index.full.js"></script>
    <!-- 国际化 -->
    <script src="/element-plus/dist/locale/zh-cn.js"></script>
    <!-- 导入组件库 ElementPlusIconsVue -->
    <script src="/element-plus/icons-vue/dist/index.iife.min.js"></script>


    <!-- 引入Monaco Editor样式 -->
    <link rel="stylesheet" data-name="vs/editor/editor.main" href="/monaco-editor/min/vs/editor/editor.main.min.css" />
    <!-- 导入 define, require -->
    <script src="/monaco-editor/min/vs/loader.js"></script>
    <!-- 支持中文,先加载生效 -->
    <script src="/monaco-editor/min/vs/nls.messages.zh-cn.js.js"></script>

    <style>
      body,
      html {
        margin: 0;
        padding: 0;
        height: 100%;
      }
      #app {
        width: 100%;
        height: 100vh;
        display: flex;
        /* flex-direction: column; */
      }
      #editor-container {
        width: 100%;
        height: inherit;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <div>
        <el-menu default-active="2" class="el-menu-vertical-demo" :collapse="isCollapse" @open="handleOpen" @close="handleClose">
          <el-sub-menu index="1">
            <template #title>
              <el-icon><location /></el-icon>
              <span>分组的</span>
            </template>
            <el-menu-item-group>
              <template #title><span>组1</span></template>
              <el-menu-item index="1-1">项目一</el-menu-item>
              <el-menu-item index="1-2">项目二</el-menu-item>
            </el-menu-item-group>
            <el-menu-item-group title="组二">
              <el-menu-item index="1-3">项目三</el-menu-item>
            </el-menu-item-group>
            <el-sub-menu index="1-4">
              <template #title><span>项目四</span></template>
              <el-menu-item index="1-4-1">项目四-1</el-menu-item>
            </el-sub-menu>
          </el-sub-menu>
          <el-menu-item index="2">
            <el-icon><icon-menu /></el-icon>
            <!-- <el-icon><menu></menu></el-icon> -->
            <template #title>导航二</template>
          </el-menu-item>
          <el-menu-item index="3" disabled>
            <el-icon><document /></el-icon>
            <template #title>导航三</template>
          </el-menu-item>
          <el-menu-item index="4">
            <el-icon><setting /></el-icon>
            <template #title>导航四</template>
          </el-menu-item>
        </el-menu>
      </div>
      <!-- Monaco Editor容器 -->
      <div id="editor-container"></div>
    </div>

    <!-- Monaco Editor Loader -->
    <script>
      // AMD加载器配置
      const requireConfig = {
        paths: {
          vs: '/monaco-editor/min/vs'
        }
      }

      // 配置RequireJS
      globalThis.require = window.require || window.parent.require
      if (require) {
        require.config(requireConfig)
        initializeEditor()
      } else {
        debugger
        // 动态创建RequireJS
        const loaderScript = document.createElement('script')
        loaderScript.src = 'https://cdn.jsdelivr.net/npm/requirejs@2.3.6/require.min.js'
        loaderScript.onload = function () {
          require.config(requireConfig)
          initializeEditor()
        }
        document.head.appendChild(loaderScript)
      }

      function initializeEditor() {
        require(['vs/editor/editor.main'], function () {
          const container = document.getElementById('editor-container')
          const editor = monaco.editor.create(container, {
            value: `// Welcome to Monaco Editor
function hello() {
  console.log('Hello, world!')
}`,
            language: 'javascript',
            theme: 'vs-dark',
            //   automaticLayout: true,

            showFoldingControls: 'always',
            lineNumbers: 'on', // 行号显示
            minimap: { enabled: true }, //右侧小地图(可选)
            lineNumbersMinChars: 3, // 确保行号栏宽度足够显示折叠图标

            theme: 'vs-dark',
            automaticLayout: true, // ✅ 启用自动布局
            scrollBeyondLastLine: false,
            folding: true,
            showFoldingControls: 'always',
            lineNumbers: 'on',
            lineNumbersMinChars: 3,
            wordWrap: 'off',
            renderLineHighlight: 'all',
            scrollbar: {
              vertical: 'visible',
              horizontal: 'visible',
              useShadows: false
            }
          })
          // 暴露给父窗口
          window.editor = editor

          // 手动触发一次布局
          setTimeout(() => {
            editor.layout()
          }, 100)

          // 使用ResizeObserver监听容器尺寸变化(更可靠)
          if (typeof ResizeObserver !== 'undefined') {
            resizeObserver = new ResizeObserver(() => {
              console.log('容器尺寸变化')
              if (editor) {
                editor.layout()
              }
            })
            resizeObserver.observe(container)
          }

          // // 监听窗口大小变化
          // window.addEventListener('resize', () => {debugger;
          //     console.log("窗口大小变化");
          //   if (editor) {
          //     editor.layout();
          //   }
          // });
        })
      }

      // 监听父窗口消息
      window.addEventListener('message', function (event) {
        if (event.data.type === 'SET_VALUE') {
          editor.setValue(event.data.value)
        }
        if (event.data.type === 'SET_LANGUAGE') {
          monaco.editor.setModelLanguage(editor.getModel(), event.data.language)
        }
        if (event.data.type === 'LAYOUT') {
          editor.layout()
        }
      })
    </script>
    <script>
      const { createApp, ref } = Vue

      const app = createApp({
        setup() {
          const isCollapse = ref(true)
          const handleOpen = (key, keyPath) => {
            console.log(key, keyPath)
          }
          const handleClose = (key, keyPath) => {
            console.log(key, keyPath)
          }
          const message = ref('Hello vue!')
          return {
            message,
            isCollapse,
            handleOpen,
            handleClose,
          }
        }
      })
      app.use(ElementPlus)
      //   注册所有图标
      for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
        console.log(key)
        if(key === "Menu"){
            app.component('icon-' + component.__name, component)
            continue;
        }
        app.component(key, component)
      }
      app.mount('#app')
    </script>
  </body>
</html>
相关推荐
bjzhang752 小时前
使用 HTML + JavaScript 实现滑动验证码
前端·javascript·html
不老刘2 小时前
前端面试八股文:JavaScript 原型链
javascript·原型链
行走的陀螺仪2 小时前
使用uniapp,实现根据时间倒计时执行进度条变化
前端·javascript·uni-app·vue2·h5
科技D人生2 小时前
Vue.js 学习总结(19)—— Vue3 按钮防重复点击三种方案总结
前端·vue.js·uniapp·vue3 防重复提交·uniapp 防重复提交·前端防抖
麦麦大数据3 小时前
F064 vue+flask知识图谱在线学习系统
vue.js·flask·知识图谱·在线学习·学习系统·ai学伴·ai助学
John_ToDebug3 小时前
Chromium WebUI 定制实践:从 C++ 注入到 JS 安全展示全链路解析
javascript·c++·chrome
拼命_小李3 小时前
使用intro.js实现简单下一步引导demo
javascript
长不大的蜡笔小新3 小时前
私人健身房管理系统
java·javascript·spring boot
程序员修心3 小时前
CSS浮动与表格布局全解析
前端·html