[个人开源]vue-code-view:一个在线编辑、实时预览的代码交互组件

组件简介

vue-code-view是一个基于 vue 2.x、轻量级的代码交互组件,在网页中实时编辑运行代码、预览效果的代码交互组件。

使用此组件, 不论 vue 页面还是 Markdown 文档中的示例代码,效果如下:

组件的由来

当项目中页面或者 Markdown 文档包含大量代码时,使用 highlight.js 进行代码高亮后极大的增大了阅读性,但是当我们阅读时想要对当前代码进行编辑调试时,只能打开本地开发环境或者跳转至 codepen codesandbox等在线项目示例。即使是很简单的代码示例仍然避免不了上述场景的繁琐步骤!如果遇到网络不好,或者本地开发环境没有安装配置的情况,那就很遗憾了!

目前大多开源项目的 Markdown 文档示例大多支持了示例代码的实时渲染,可以在文档页面中看到源码的运行效果,提供了在线项目的跳转功能。当需要调试代码时,还是需要重复上述步骤,体验不是太友好。

那么能不能有这么一个组件能支持在页面中编辑代码,实时运行预览效果?在网络找了好久,没有找到 vue 版本,只看到了 react-code-view,受其启发,自已编写了一个 vue 版本组件 vue-code-view

组件功能

目前组件已实现的主要功能特性:

  • 💻 代码可以在线编辑,实时预览效果。
  • 🎨 代码编辑器支持代码高亮、光标行背景高亮、括号/标签匹配自动关闭、代码折叠。
  • 🌈 基于vue的 SFC 解析,支持 <template> <script> <style>代码逻辑。
  • 🌈 支持<style> CSS 预处理,目前实现sass
  • 📑 支持 Markdown 示例实时渲染,需要自定义 loader 。

组件props

参数 说明 类型 默认值
theme theme mode,支持 light / dark light | dark dark
showCode 是否显示代码编辑器 boolean false
source 示例代码 string -
renderToolbar 自定义工具栏展示 function -
errorHandler 错误处理函数 function -
debounceDelay 错误处理防抖延迟(ms) number 300

项目资源列表

使用示例

安装

使用 npmyarn 安装组件包。

npm i vue-code-view
# or
yarn add vue-code-view

Vue 配置

组件使用包含运行时编译器的 Vue 构建版本,所以需要单独配置下。

若使用 vue cli,需要在vue.config.js文件进行如下配置:

module.exports = {
  runtimeCompiler: true,
  // or
  chainWebpack: (config) => { 
    config.resolve.alias
      .set("vue$", "vue/dist/vue.esm.js");
  },
}; 

组件引入

在项目的入口文件 main.js 中引入组件及样式,注册组件。

import Vue from "vue";
import App from "./App.vue";
import CodeView from "vue-code-view"; 
import "vue-code-view/lib/vue-code-viewer.css";
...
Vue.use(CodeView);
...

组件使用

使用组件的source属性传入示例代码。

示例代码格式支持 <template> <script> <style><template>不能为空;暂不支持JSX 语法。

<template>
  <div id="app">
    <code-viewer :source="code_example"></code-viewer>
  </div>
</template>
<script>
const code_source = ` 
<template>
  <div id="app">
    <img alt="Vue logo" class="logo" src="https://cn.vuejs.org/images/logo.svg" />
    <h1>Welcome to Vue.js {{version}} !</h1> 
  </div>
</template>
<script>
export default {
    data() {
      return {
        version: '2.x'
      };
    },
  };
<\/script>

<style> 
.logo {
  width:66px;
}
</style> `,

  export default {
    data() {
      return {
        code_example: code_source
      };
    },
  };
</script>

JSX使用方式

组件 JSX 语法使用方式。

<script>
const code_example = `<template>
  <div id="app">
    <img alt="Vue logo" class="logo" src="https://cn.vuejs.org/images/logo.svg" />
    <h1>Welcome to Vue.js  !</h1>
  </div>
</template> `;

export default {
  name: "demo",
  render() {
    return (
      <div >
        <code-viewer source={code_example}
          showCode={false}
        ></code-viewer>
      </div>
    );
  },
};
</script>

组件库混合使用

项目引入其他组件库后,组件的示例源代码中直接使用即可,实现预览调试功能。

[图片上传失败...(image-e9b51b-1635758233044)]

错误处理

组件内置了错误预处理,目前支持代码为空、代码格式错误(<template>内容不存在)等,以文字的形式显示在示例区域,也提供了自定义错误方式 errorHandler(使用 Notice 组件进行信息告知)。

render() {
  return (
    <div >
      <code-viewer
        source={code_example}
        showCode={false}
        errorHandler={(errorMsg) => {
          this.$notify.error({
            title: "Info",
            message: errorMsg,
          });
        }}
      ></code-viewer>
    </div>
  )
}

示例使用了antd vuenotify组件进行消息提醒,效果如下:

[图片上传失败...(image-e88d16-1635758233044)]

示例效果

具体示例效果详见 组件Markdown说明文档

其他

后续功能持续迭代中!激情期待。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容