使用Strve.js来搭建一款 Markdown 编辑器

今天,我们来使用Strve.js来搭建一款 Markdown 编辑器,没错!你没听错。我们需要创建了一个实时 Markdown 编辑器,用户可以在 textarea 中输入 Markdown 文本,然后实时显示转换后的 HTML。你可能会说使用 Strve.js 开发会不会写的特别复杂难懂啊,还不如用 Vue.js 呢!

好,满足你的好奇心。首先,我们不搞那些工程化的东西,我们就是新建一个 html 文件。

就像这样。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Markdown Editor</title></head><body></body>
</html>

好,我们到此就开发完成了~ 谢谢阅读~

……

开玩笑的!我们这么严谨的开发人员怎么会这么敷衍。

我们说使用Strve.js开发应用,那么我们就先引入Strve.js。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Markdown Editor</title></head><body><script src="https://unpkg.com/strve-js@5.1.1/dist/strve.full.js"></script></body>
</html>

哇塞!引入就这么简单?是的,就这么简单的。另外,我们引入的版本是UMD,UMD 叫做通用模块定义规范(Universal Module Definition)。也是随着大前端的趋势所诞生,它可以通过运行时或者编译时让同一个代码模块在使用 CommonJs、CMD 甚至是 AMD 的项目中运行。简单来说,就像我们之前使用 Jquery 那样,引入直接使用,然后直接打开html文件看效果,不需要自己搭建本地文件服务器啥的。省心省力!!

好家伙,下一步我们就开始写静态页面了啊!不要忘记自己是一个切图仔。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Markdown Editor</title></head><body><script src="https://unpkg.com/strve-js@5.1.1/dist/strve.full.js"></script><script>const { h, createApp } = Strve;function App() {return h/*html*/`<textarea class="input" placeholder="input..." @input="${update}"></textarea><div class="output" $key="output"></div>`;}createApp(App).mount("#app");</script></body>
</html>

这就写完了?怎么没有在 body 标签内写 html 标签啊,我只看到了模版字符串中写的,这是什么操作?JSX?别急啊,这是Strve.js最大特性呀!可以将模版字符串转化成我们看到的 html 视图。你可能又会说这不跟 JSX 思想差不多呢!是的,我开发这个框架的动机就是受 JSX 语法的影响。

到这里,我们只是写了页面但是没有写样式。那么,下面我们就开整样式。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Markdown Editor</title><style>html,body,#app {margin: 0;height: 100%;font-family: "Helvetica Neue", Arial, sans-serif;color: #333;}#app {display: flex;}.input,.output {width: 50%;box-sizing: border-box;}.input {border: none;border-right: 1px solid #ccc;resize: none;outline: none;background-color: #f6f6f6;font-size: 14px;font-family: "Monaco", courier, monospace;padding: 20px;}.output {padding: 0 20px;}
</style></head><body><script src="https://unpkg.com/strve-js@5.1.1/dist/strve.full.js"></script><script>const { h, createApp } = Strve;function App() {return h/*html*/`<textarea class="input" placeholder="input..." @input="${update}"></textarea><div class="output" $key="output"></div>`;}createApp(App).mount("#app");</script></body>
</html>

你可能会说,样式有了,页面结构也有了,我想看看效果。先忍住!我们得先赋予他灵魂,好事不怕晚。

下面,我们就开始写业务逻辑了。我们要实现的效果就是用户可以在 textarea 中输入 Markdown 文本,然后实时显示转换后的 HTML。你可能会说,啥意思?就是左侧我们写Markdown 文本,然后右侧就是显示 Markdown 转换后的文本了。

好了,废话不多说了!(还算有点自知之明)

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Markdown Editor</title><linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/dark.min.css"/><style>html,body,#app {margin: 0;height: 100%;font-family: "Helvetica Neue", Arial, sans-serif;color: #333;}#app {display: flex;}.input,.output {width: 50%;box-sizing: border-box;}.input {border: none;border-right: 1px solid #ccc;resize: none;outline: none;background-color: #f6f6f6;font-size: 14px;font-family: "Monaco", courier, monospace;padding: 20px;}.output {padding: 0 20px;}
</style></head><body><script src="https://unpkg.com/strve-js@5.1.1/dist/strve.full.js"></script><script src="https://unpkg.com/marked@2.1.3/lib/marked.js"></script><script src="https://unpkg.com/marked-highlight@2.0.1/lib/index.umd.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script><script src="https://unpkg.com/lodash@4.17.21/lodash.min.js"></script><script>const { h, setData, createApp, domInfo, nextTick } = Strve;// Highlight code blocksmarked.use(markedHighlight.markedHighlight({langPrefix: "hljs language-",highlight(code, lang) {const language = hljs.getLanguage(lang) ? lang : "plaintext";return hljs.highlight(code, { language }).value;},}));let input = "";function compiledMarkdown() {return marked(input);}const debouncedUpdate = _.debounce(function (e) {setData(() => {input = e.target.value;});nextTick(() => {domInfo.output.innerHTML = compiledMarkdown();});}, 100);function update(e) {debouncedUpdate(e);}function App() {return h/*html*/ `<textarea class="input" placeholder="input..." @input="${update}"></textarea><div class="output" $key="output"></div>`;}createApp(App).mount("#app");</script></body>
</html>

我去!咋一下子多出了这么多代码!你这是逗我吗?

别着急嘛!我会对你负责的,我既然一下子写了这么多代码,肯定会解释清楚的。

下面,我们要正经起来了!我们既然需要开发一款 Markdown 编辑器,我们需要的依赖库有下面几种:

  • Strve-js: 一个轻量级的 JavaScript 框架,用于构建用户界面;

  • Marked: 一个将 Markdown 转换为 HTML的库;

  • Highlight: 让网页上的代码高亮美化的免费开源工具库;

  • Lodash: 一个实用的 JavaScript 工具库;

那么你就会看我们引入了这些库。

<script src="https://unpkg.com/strve-js@5.1.1/dist/strve.full.js"></script>
<script src="https://unpkg.com/marked@2.1.3/lib/marked.js"></script>
<script src="https://unpkg.com/marked-highlight@2.0.1/lib/index.umd.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script>
<script src="https://unpkg.com/lodash@4.17.21/lodash.min.js"></script>

另外,需要再引入一个css文件,用于 Markdown 中代码高亮的样式。

<linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/dark.min.css"
/>

外部引入的文件,我们已经介绍完了,那么我们再集中讲解下核心业务逻辑代码。

定义一个名为 input 的变量用于存储用户输入的 Markdown 文本。然后定义一个名为 compiledMarkdown 的函数,该函数使用 Marked 库将 input 变量中的 Markdown 文本转换为 HTML。然后再定义一个名为 update 的函数,该函数在用户输入时调用。它使用 Lodash 的 debounce 函数来防止频繁触发,提高性能。当用户输入时,它会更新 input 变量并将转换后的 HTML 插入到输出 <div> 中。定义一个名为 App 的组件,该组件包含一个 textarea 用于输入 Markdown 文本,以及一个 <div> 用于显示转换后的HTML。<textarea> 上有一个input 事件监听器,当用户输入时调用 update 函数。输出 <div> 使用 $key 属性设置 Strve 的引用名称为"output"。使用 Strve 的 createApp 函数创建一个 App 实例并挂载到 id 为app的元素上。

核心逻辑讲完了,那么我们欣赏下这款 Markdown 编辑器完整代码吧!

额~ 真简约啊!你可能会问能不能这样,能不能那样啊!都不行,真垃圾呀!

哈哈哈……

目录

让您失望了!



扯了这么多!你的动机到底是啥?

当然是为了分享这个简约实用的项目啊!

另外,也是为了推广我的框架:Strve.js,值得高兴的一件事,ChatGPT 居然给我这个框架定义为一个轻量级的 JavaScript 框架,用于构建用户界面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/5906.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java——《面试题——maven篇》

全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——…

活动打卡报名小程序开源版开发

活动打卡报名小程序开源版开发 活动打卡报名小程序开源版的功能可以包括以下几个方面&#xff1a; 活动列表展示&#xff1a;展示所有的活动信息&#xff0c;包括活动名称、时间、地点、报名人数等。活动详情展示&#xff1a;点击活动列表中的某个活动&#xff0c;可以查看该…

jenkins共享库配置及设计

jenkins共享库做模块封装时遇到的问题总结&#xff1a; 背景描述:使用jenkins共享库对SCM subversion操作进行封装时&#xff0c;使用了Checkout插件&#xff0c;生成的检出脚本代码为 checkout([$class: SubversionSCM, additionalCredentials: [], excludedCommitMessages: …

【C#】并行编程实战:实现数据并行(2)

本章继续学习实现数据并行&#xff0c;本文主要介绍任务并行度和自定义分区策略相关内容。 本教程对应学习工程&#xff1a;魔术师Dix / HandsOnParallelProgramming GitCode 2、任务并行度 数据并行设计在系统的多个内核上以并行方式运行循环所带来的的优势&#xff…

mac苹果电脑,怎么批量修改文件名称

mac苹果电脑&#xff0c;如何批量修改文件名称&#xff1f;在苹果电脑上对文件名称进行修改是一件非常简单的操作&#xff0c;相信任何mac电脑用户都知道怎么操作&#xff0c;只需要选中要修改名称的文件&#xff0c;然后点击鼠标右键&#xff0c;然后会弹出一个菜单&#xff0…

基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;一&#xff09;&#xff1a;FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;二&#xff09;&#xff1a;基础知识和解封装&#xff08;demux&#xff09;基于 FFmpeg 的跨平台视频…

(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

系列文章目录 通过Qt实现手势识别控制软件操作相关系列技术方案 &#xff08;一&#xff09;Qt 将某控件、图案绘制在最前面的方法&#xff0c;通过QGraphicsScene模块实现 &#xff08;二&#xff09;Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方&#xff0c;实现圆…

Git快速入门

Git 1、Git概述Git简介Git下载与安装 2、Git代码托管服务常用的Git代码托管服务使用码云托管服务 3、Git常用命令Git全局设置获取Git仓库工作区、暂存区、版本库概念本地仓库常用命令远程仓库操作命令分支操作标签操作 4、在IDEA中使用Git在IDEA中配置Git获取Git仓库本地仓库操…

【ISO26262】汽车功能安全:以汽车安全完整性等级为导向和以安全为导向的分析

关于 ASIL剪裁的要求分解 表 A.1 以汽车安全完整性等级为导向和以安全为导向的分析的概览

Vue常见面试题整理

一、对于MVVM的理解&#xff1f; MVVM是Model-View-ViewModel的缩写。 Model&#xff1a;代表数据模型&#xff0c;也可以在Model中定义数据修改和操作的业务逻辑。View&#xff1a;代表UI组件&#xff0c;它负责将数据模型转化成UI展现出来。ViewModel&#xff1a;监听模型数…

vue点击盒子一步一步滚动

vue点击盒子一步一步滚动 HTML <div class"course_detail"><div class"arrow" v-if"index 0" click"step"></div><div class"lightArrow" v-else click"step"></div><div clas…

打造专属个人模型-私有独立离线模型部署-阿里云GPU服务器配置

阿里云有免费的机器学习 GPU 服务器&#xff0c;免费试用活动页https://free.aliyun.com只要没有申请过 PAI-DSW 资源的新老用户皆可申请 5000CU 的免费额度&#xff0c;3个月内使用。 选择第一个进行立即试用 可以看到试用的界面 如果遇到下面的错误&#xff0c;当前账号没有权…