• Stars
    star
    501
  • Rank 88,002 (Top 2 %)
  • Language
    JavaScript
  • Created over 3 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

一个代码在线编辑预览工具,类似codepen、jsbin、jsfiddle等。

code-run

一个代码在线编辑预览工具,类似codepen

在线示例:https://wanglin2.github.io/code-run-online/

相关文章

使用Skypack在浏览器上直接导入ES模块

快速搭建一个代码在线编辑预览工具

如何手动解析vue单文件并预览?

手把手教你实现在Monaco Editor中使用VSCode主题

特性

  • 支持多种预处理语言

  • 支持多种布局随意切换

  • 支持添加额外的cssjs资源

  • 内置多种常用模板

  • 支持导出zip

  • 支持代码格式化

  • 美观强大的控制台

  • 支持vue单文件(2.x、3.x)

  • 支持直接移植VSCode主题,并且已经内置了大量优质主题

  • 内置支持保存到github gist【gist API】,想要保存到自己的存储体系修改也十分简单

  • 内置支持在未配置github gist的情况下将变动保存到url中,可方便的将url分享给他人查看

  • 内置支持生成和carbon一样漂亮美观的代码图片

  • 内置使用unpkgimportmap支持在浏览器上使用ES模块语法

  • 支持嵌入模式,方便在文档网站中使用,让文档示例更轻松

本地构建

git clone https://github.com/wanglin2/code-run.git

cd code-run

npm i

npm run serve

打包

修改应用基路径

请先确认打包后应用的基路径,项目默认的基路径为/code-run/,如果你想换一个,可以按如下步骤修改:

1.修改vue.config.js文件里的publicPath字段。

2.修改src/config/index.js文件的base字段。

修改路由模式

默认的路由模式为hash模式,如果需要使用history模式请修改src/config/index.js文件的routerMode字段。

另外history模式下如果存在多级路径,可能需要修改以下文件:

1.修改/public/index.html文件的prettier相关js资源的路径;

打包命令

npm run build

项目主要技术

脚手架: Vue CLI

框架:Vue 3.X全家桶,通过script setup使用组合式API

UI库:element-plus

代码编辑器:Monaco Editor

界面截图

界面截图1

界面截图2

界面截图3

关于使用ESM

目前在JavaScriptTypeScriptCoffeeScriptVue3Vue2等模式下支持使用ESM,默认情况下,如果你直接按下列方式导入模块的话:

import moment from 'moment'

最后会转换成:

import moment from 'https://unpkg.com/moment?module'

也就是使用unpkg,但是有些模块unpkg获取不到ESM版本,或者直接这样获取到的版本不是我们所期望的,比如导入vue时,我们需要的是https://unpkg.com/[email protected]/dist/vue.esm-browser.js,但是https://unpkg.com/vue?module默认返回的是https://unpkg.com/[email protected]/dist/vue.runtime.esm-bundler.js?module,这个版本无法运行在浏览器上,所以这时候就可以通过手动添加importmap来设置导入模块的来源。

主题新增教程

本教程针对迁移VSCode主题。

1.确定要新增的主题,先在本地VSCode上安装并切换到该主题,然后按F1Command/Control + Shift + P或鼠标右键点击Command Palette/命令面板,接着找到并点击Developer:Generate Color Theme From Current Setting/开发人员:使用当前设置生成颜色主题,然后VSCode就会生成一份json数据,保存到项目的/scripts/vscodeThemes/目录下。

2.然后命令行执行命令npm run convertTheme,转换后的主题会被输出到项目的/public/themes目录下,接下来再执行命令npm run createThemeList即可生成主题配置,接下来即可在设置->主题设置里看到所有主题,并可以切换使用

相关命令介绍

  • npm run buildConsole:编译项目的/public/console/index.js文件为ES5语法,输出到同目录下的compile.js,该文件会在页面预览的iframe里进行加载,请勿直接修改compile.js文件。

  • npm run buildMonacoWorker:打包Monaco Editor编辑器的worker文件,如果使用的Monaco Editor编辑器版本变化了需要重新打包。

  • npm run convertTheme:将VSCode主题文件转换成Monaco Editor主题文件。

  • npm run createThemeList:根据主题文件列表自动生成配置文件。

  • npm run buildVueSFCCompiler:打包@vue/compiler-sfc文件,针对Vue3

编译器更新指南

因为本项目是纯前端项目,所以在使用lesssasstypescript等预处理语言或扩展语言时需要在线进行编译,这个工作是由各个语言的编译器处理的,这些编译器你可以在/public/parses/目录下找到,随着时间的推移,肯定会落后于它们的新版本,所以你需要定期更新它们,获取它们的浏览器使用版本并不是一件易事,所以在这里将有些仅有的经验分享给大家。

  • less

首先npm i less,然后在node_modules找到less/dist/目录,该目录下的两个文件都是umd格式的,可以直接使用。

  • sass

sass目前使用的是这个项目sass.js,但是这个项目已经三年没有更新了。

  • babel

babel提供了浏览器使用版本,具体可以参考官方文档@babel/standalone

  • typescript

typescript直接npm i typescript,然后找到node_modules/typescript/lib/typescript.js文件,它也是支持直接在浏览器上使用的。

  • coffeescript

coffeescript也是直接npm i coffeescript,然后找到node_modules/coffeescript/coffeescript-browser-compiler-legacy/coffeescript.js文件,支持直接在浏览器上使用。

  • livescript

livescript的浏览器使用版本可以直接去其官方仓库下载browser,不过也两年没有更新了。

  • postcss

可以使用Browserifywebpack把它打包到一个文件中。

  • 其他

stylus暂时没有找到浏览器使用版本或编译成功,知道的朋友欢迎提个issue

新增代码模板

项目内置了几个常用的代码模板,可以根据需要进行增减,模板配置文件在src/config/templates.js

新增页面布局模板

教程

项目内置了几个常用的页面布局模板,如果不满足你的需求也可以新增布局,一个布局就是一个vue单文件,可以在src/pages/edit/layouts/目录下找到所有布局,每个布局其实就是确定如何显示编辑器控制台预览三部分,编辑器包含jscsshtmlvue四个编辑器,可配置显示哪几个、顺序、是否允许拖动等,需要新增的布局也需要放到该目录下。

接下来以新增一个vue单文件的布局为例来看,首先确定布局细节,我们想左侧显示一个vue编辑器,右侧显示预览控制台预览模块默认展开,控制台默认最小化:

1.首先我们在layouts目录下创建一个VueSFC.vue

2.修改src/config/constants.js文件,引入该组件,并在layoutListlayoutMap两个配置上新增该布局:

import VueSFC from '../pages/edit/layouts/VueSFC.vue'

export const layoutList = [
	// ...
	{
		name: 'Vue单文件',
		value: 'vue',
	}
]

export const layoutMap = {
	// ...
	vue: VueSFC
}

可以添加一张该布局的预览图片,放置到src/assets/layoutImgs/目录下,然后在constants.js文件里引入,最后在previewImgMap配置上添加即可。

这样修改完后即可在页面的设置功能里的布局设置的下拉列表里看到新增的Vue单文件选项。接下来完善VueSFC.vue的内容。

3.可参考其他布局结构的内容,复制过来修改,最终的内容应该是这样的:

<template>
  <!-- 该容器的直接DragItem直接数量为2,方向水平排列,第一个DragItem直接允许缩小到0,第二个DragItem组件最小允许缩小到20px -->
  <Drag :number="2" dir="h" :config="[{ min: 0 }, { min: 20 }]">
    <!-- 编辑器块,索引为0,禁止缩放该块,隐藏拖动条 -->
    <DragItem :index="0" :disabled="true" :showTouchBar="false">
      <!-- 编辑器增加,内部编辑器排列方向为垂直,配置了要显示的编辑器 -->
      <Editor dir="v" :showList="showList"></Editor>
    </DragItem>
    <!-- 预览&控制台,索引为1,允许拖动进行缩放 -->
    <DragItem :index="1" :disabled="false">
      <!-- DragItem又嵌套了一个容器组件,该容器的直接DragItem直接数量为2,方向垂直排列,第一个DragItem直接允许缩小到0,第二个DragItem组件默认显示的高度为48px,且最小允许缩小到48px -->
      <Drag :number="2" dir="v" :config="[{ min: 0 }, { min: 48, default: 48 }]">
        <DragItem
          :index="0"
          :disabled="true"
          :showTouchBar="false"
          title="预览"
        >
          <Preview></Preview>
        </DragItem>
        <DragItem :index="1" :disabled="false" title="控制台">
          <Console></Console>
        </DragItem>
      </Drag>
    </DragItem>
  </Drag>
</template>

<script setup>
import Editor from '@/components/Editor.vue'
import Preview from '@/components/Preview.vue'
import Console from '@/components/Console.vue'
import Drag from '@/components/Drag.vue'
import DragItem from '@/components/DragItem.vue'
import { reactive } from 'vue'

// 配置只显示vue编辑器
const showList = reactive([
    {
        title: 'VUE',// 编辑器名称
        disableDrag: true,// 禁止拖动进行缩放
        showTouchBar: false// 隐藏推动条
    }
])
</script>

注释已经解释的很详细,详情可参考接下来的组件文档。

布局相关组件文档

Drag组件

该组件相当于是一个容器,每个容器会实例化一个Resize尺寸拖动调整类,内部需要放置DragItem组件。

组件props

名称 介绍 类型 默认值
dir 容器内部的DragItem组件排列方式,可选项:h(水平排列)、v(垂直排列) String h
number 内部的DragItem组件数量 Number 0
config 配置内部的DragItem组件的信息,数组类型,每一项都是一个对象,具体的属性请看表1 Array []

表1

config数组每一项的对象的属性:

名称 介绍 类型 默认值
default 对应索引的DragItem组件默认显示的尺寸,dirh时指宽度,为v时指高度 Number 默认容器内的所有DragItem组件平分空间
min 对应索引的DragItem组件允许显示的最小尺寸,当发生拖动时,如果该组件空间被挤压,默认允许被压缩到0,即完全不显示,如果配置了该属性,则缩小到配置的大小后不再变化 Number 0
max 对应索引的DragItem组件允许显示的最大尺寸,当发生拖动时,如果该组件空间被增加,默认会增加到允许的最大尺寸,如果配置了该属性,则增加到配置的大小后不再变化 Number 0

DragItem组件

该组件代表一个可拖动的块,需要放置在Drag组件下,通过slot来传入需要实际显示的内容。DragItem组件内可再嵌套Drag容器。

组件props

名称 介绍 类型 默认值
disabled 是否禁止拖动 Boolean false
touchBarSize 拖动条的尺寸,dirh时指宽度,为v时指高度 Number 20
index 该组件在容器内的同级DragItem组件列表中的索引,从0开始 Number 0
showTouchBar 是否显示拖动条 Boolean true
title 标题 String
hide 是否隐藏该组件 Boolean false

Editor组件

该组件目前包含jscsshtmlvue四个编辑器,可以控制具体显示哪几个,以及它们的排列方式。

组件props

名称 介绍 类型 默认值
hide 是否隐藏编辑器 Boolean false
dir 排布方向,v(垂直)、h(水平) String h
showList 要显示的编辑器列表,数组类型,每一项可以是数字也可以是一个对象,见表2 Array ['HTML', 'CSS', 'JS']

表2

showList数组的每一项可以是一个字符串,可选值为:HTMLCSSJSVUE,代表四种编辑器,配置了哪几个就显示哪几个。

如果需要再配置一些属性,比如是否允许该编辑器拖动等等,可配置的属性如下:

名称 介绍 类型 默认值
title 编辑器名称,可选项:HTMLCSSJSVUE String
disableDrag 是否禁止拖动缩放该编辑器 Boolean
showTouchBar 是否显示该编辑器的推动条 Boolean

暂未解决的问题

1.生成代码图片功能偶尔生成的图片高度超出了代码实际的高度,目前暂未找到原因及根本解决方法。可选方法之一为生成图片后再提供一个图片裁剪的功能。

2.极少数情况下会出现主题不生效的问题。

致谢

本项目中预处理/扩展语言的编译部分、其他一些细节有参考了项目codepan的实现。

License

MIT

More Repositories

1

mind-map

一个还算强大的Web思维导图。A relatively powerful web mind map.
JavaScript
5,290
star
2

tiny_whiteboard

一个在线小白板,类似excalidraw。
JavaScript
251
star
3

douban_api

豆瓣API服务
JavaScript
143
star
4

VideoTimeLine

一个简单的Vue2视频时间轴组件
Vue
97
star
5

markjs

一个插件化的多边形标注库
JavaScript
89
star
6

snow

看,下雪了~
JavaScript
83
star
7

web_map_demo

Web地图demo,一个简单的2D地图加载器,支持拖动、缩放、显示叠加物、搜索。
Vue
83
star
8

lx-doc

理想文档。定位于个人和小团队的在线云文档。支持思维导图、白板、流程图、PPT、电子表格等
JavaScript
67
star
9

canvas-editor-demo

一个基于canvas实现的富文本编辑器demo,仅仅是demo。
JavaScript
62
star
10

simple-flow-chart

一个简单的流程图设计器,基于Vue2。
Vue
48
star
11

markdown_editor_sync_scroll_demo

Markdown编辑器精确同步滚动demo
HTML
21
star
12

tree_layout

绘制一棵漂亮的树,可用于绘制思维导图。
JavaScript
18
star
13

front-article

小前端【街角小林】所有的前端原创文章。
15
star
14

simple-novice-guide

一个简单的新手引导库
TypeScript
14
star
15

AssociationLineDemo

图形之间的关联线连接demo。
HTML
13
star
16

json-tree-view

一个简洁的json格式化插件。
JavaScript
12
star
17

VNode_visualization

虚拟DOM的diff算法动画演示
JavaScript
11
star
18

visual-drag-platform-fit-demo

可视化拖拽平台的页面屏幕适应方案
Vue
10
star
19

web_articles

前端优质文章集锦
8
star
20

simple-word-cloud

一个简单的词云库
JavaScript
8
star
21

wanglin2

7
star
22

PolygonEditDemo

一个简单的多边形编辑器demo
Vue
6
star
23

handPaintedStyle

手绘风格图形的简单实现
Vue
5
star
24

download-image-demo

前端下载图片的N种方法
Vue
5
star
25

VNode-Demo

虚拟dom的diff demo
JavaScript
4
star
26

vite-demo

JavaScript
4
star
27

ES_Modules_CDN

支持ES模块的cdn服务demo。
JavaScript
3
star
28

simple-canvas-editor

一个使用canvas实现的简单富文本编辑器。
HTML
3
star
29

pieChart

一个简单的饼图
Vue
3
star
30

ComponentLibraryImport

组件库实现按需引入的几种方式
Vue
3
star
31

literature-articles

个人原创的文学文章。
CSS
3
star
32

vue_v0.11_analysis

vue0.11版本源码阅读系列文章
JavaScript
2
star
33

simulateCSSBackgroundInCanvas

在canvas中模拟css的background相关样式
JavaScript
2
star
34

nice-doc

个人文档平台
2
star
35

learn_vue_2.6.0

Vue2.6.1源码阅读系列
JavaScript
2
star
36

textUnderline

文本划线的极简实现
Vue
2
star
37

canvas-in-action

Canvas实战系列文章。
CSS
2
star
38

mind-map-themes

提供更多的mind-map主题。
1
star
39

es5-es5-inherit-example

ES6和ES5继承的示例
JavaScript
1
star
40

collect

个人收藏夹
1
star
41

vue_dynamic_import_component

vue动态引入组件demo
JavaScript
1
star
42

playground

Vue3代码在线运行工具
JavaScript
1
star
43

esm_cjs

JavaScript
1
star
44

hannuota

汉诺塔小游戏
Vue
1
star
45

tiny_whiteboard_demo

tiny_whiteboard在线demo,非可读仓库,请勿关注。
JavaScript
1
star
46

text_diff_demo

文本diff demo
JavaScript
1
star
47

code-run-online

CodeRun在线示例
JavaScript
1
star
48

vue_components

一个monorepo类型的组件库
JavaScript
1
star
49

lx-doc-site

JavaScript
1
star
50

canvas-demos

Vue
1
star
51

whbm-nav

新开源系列:五花八门导航。
Vue
1
star
52

mind_map_test

无意义仓库,仅用于测试。
HTML
1
star