返回目录
开源项目其他开源工具类新手

GitHub - wanglin2/code-run: 一个代码在线编辑预览工具,类似codepen、jsbin、jsfiddle等。

code-run 一个代码在线编辑预览工具,类似 codepen 。 在线示例: https://wanglin2.github.io/code-run-online/ 。 相关文章 使用Skypack在浏览器上直接导入ES模块 快速搭建一个代码在线编辑预览工具 如何手动解析vue单文件并预览? 手把手教你实现在Monaco Editor中使用VSCode主题 特性 - 支持多种预处理语言 - 支持多种布局随意切换 - 支持添加额外的 css 、 js 资源 - 内置多种常用模板 - 支持导出 zip -

0 次阅读2026/09/16 发布
GitHub - wanglin2/code-run: 一个代码在线编辑预览工具,类似codepen、jsbin、jsfiddle等。 来源图片

社区作者 · zZz

它解决什么问题

code-run

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

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

相关文章

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

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

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

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

特性

- 支持多种预处理语言

- 支持多种布局随意切换

- 支持添加额外的 css 、 js 资源

- 内置多种常用模板

- 支持导出 zip

- 支持代码格式化

- 美观强大的控制台

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

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

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

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

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

- 内置使用 unpkg 及 importmap 支持在浏览器上使用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

界面截图

关于使用ESM

目前在 JavaScript 、 TypeScript 、 CoffeeScript 、 Vue3 、 Vue2 等模式下支持使用 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 上安装并切换到该主题,然后按 F1 或 Command/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 。

编译器更新指南

因为本项目是纯前端项目,所以在使用 less 、 sass 、 typescript 等预处理语言或扩展语言时需要在线进行编译,这个工作是由各个语言的编译器处理的,这些编译器你可以在 /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

可以使用 Browserify 或 webpack 把它打包到一个文件中。

  • 其他

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

新增代码模板

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

新增页面布局模板

教程

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

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

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

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

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 组件默认显示的尺寸, dir 为 h 时指宽度,为 v 时指高度 Number 默认容器内的所有 DragItem 组件平分空间

min 对应索引的 DragItem 组件允许显示的最小尺寸,当发生拖动时,如果该组件空间被挤压,默认允许被压缩到0,即完全不显示,如果配置了该属性,则缩小到配置的大小后不再变化 Number 0

max 对应索引的 DragItem 组件允许显示的最大尺寸,当发生拖动时,如果该组件空间被增加,默认会增加到允许的最大尺寸,如果配置了该属性,则增加到配置的大小后不再变化 Number 0

DragItem组件

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

组件 props :

名称 介绍 类型 默认值

disabled 是否禁止拖动 Boolean false

touchBarSize 拖动条的尺寸, dir 为 h 时指宽度,为 v 时指高度 Number 20

index 该组件在容器内的同级 DragItem 组件列表中的索引,从0开始 Number 0

showTouchBar 是否显示拖动条 Boolean true

title 标题 String

hide 是否隐藏该组件 Boolean false

Editor组件

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

组件 props :

名称 介绍 类型 默认值

hide 是否隐藏编辑器 Boolean false

dir 排布方向,v(垂直)、h(水平) String h

showList 要显示的编辑器列表,数组类型,每一项可以是数字也可以是一个对象,见表2 Array ['HTML', 'CSS', 'JS']

表2

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

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

名称 介绍 类型 默认值

title 编辑器名称,可选项: HTML 、 CSS 、 JS 、 VUE String

disableDrag 是否禁止拖动缩放该编辑器 Boolean

showTouchBar 是否显示该编辑器的推动条 Boolean

暂未解决的问题

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

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

致谢

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

License

MIT

— 本文由 AI 根据公开来源辅助整理,命令、版本与许可证请在使用前到原始页面复核。

安装 / 开始使用

1.确定要新增的主题,先在本地 VSCode 上安装并切换到该主题,然后按 F1 或 Command/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 。

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

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

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

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

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

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

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

可以使用 Browserify 或 webpack 把它打包到一个文件中。

stylus 暂时没有找到浏览器使用版本或编译成功,知道的朋友欢迎提个 issue 。 新增代码模板 项目内置了几个常用的代码模板,可以根据需要进行增减,模板配置文件在 src/config/templates.js 。

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

接下来以新增一个 vue单文件的布局 为例来看,首先确定布局细节,我们想左侧显示一个 vue 编辑器,右侧显示 预览 和 控制台 , 预览 模块默认展开, 控制台 默认最小化: 1.首先我们在 layouts 目录下创建一个 VueSFC.vue 。 2.修改 src/config/constants.js 文件,引入该组件,并在 layoutList 和 layoutMap 两个配置上新增该布局: import VueSFC from './pages/edit/layouts/VueSFC.vue'

  • less
  • sass
  • babel
  • typescript
  • coffeescript
  • livescript
  • postcss
  • 其他
命令
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 ([

来源教程配图

界面截图1
配图 1 · 界面截图1查看原图
界面截图2
配图 2 · 界面截图2查看原图
界面截图3
配图 3 · 界面截图3查看原图

适用场景

学习研究
开源项目实践