您现在的位置是:亿华云 > 数据库
聊聊 VS Code 使用的代码编辑器
亿华云2025-10-09 06:58:05【数据库】4人已围观
简介前言有时候我们会有在需要在网页中写代码或者改代码配置的需求,这个时候就需要用到代码编辑器,常规的代码编辑器有 CodeMirror 和 Monaco Editor, CodeMi
前言
有时候我们会有在需要在网页中写代码或者改代码配置的聊聊需求,这个时候就需要用到代码编辑器,使用常规的码编代码编辑器有 CodeMirror 和 Monaco Editor, CodeMirror 使用的辑器人比较多,主要因为比较轻量,聊聊核心文件压缩后仅 70+ KB,使用根据所需要支持的码编语言按需打包,目前 CodeMirror 6 已经完全重构。辑器它支持触摸屏并且极大地提高了库的聊聊可访问性。
另一个优秀的使用库就是 Monaco Editor,它比较重量级,码编但功能却十分优秀,辑器本文主要介绍下 Monaco Editor 的聊聊用法。
Monaco Editor 介绍
Monaco Editor 是使用 VS code 使用的编辑器,支持丰富的码编代码格式,拥有良好的可扩展性,支持代码并排对比编辑器,并且友好的支持视觉障碍人士,拥有语音播报功能,但 Monaco Editor 在移动 web 中却不支持。
代码对比
功能
对以下语言支持代码感知和验证:
TypeScript, JavaScript, CSS, LESS, SCSS, JSON, HTML。服务器租用
对以下语法支持代码高亮:
XML, PHP, C#, C++, Razor, Markdown, Diff, Java, VB, CoffeeScript, Handlebars, Batch, Pug, F#, Lua, Powershell, Python, Ruby, SASS, R, Objective-C。
基本使用
1、 首先安装 monaco-editor:
npm install monaco-editor2、需要一个渲染编辑器的容器节点,我们设置是一个 id 为 container 的 div:
<div id="container" style="height: 100%"></div>3、 在 js 文件中引入 monaco editor, 并创建编辑器:
import * as monaco from monaco-editor/esm/vs/editor/editor.api.js
monaco.editor.create(document.getElementById(container), {
value: [function x() { , \tconsole.log("Hello world!");, }].join(\n),
})打开浏览器,我们可以看到编辑器已经成功展示出来:
效果
常规配置
我们可以在 create 的第二个参数传递一个 option 参数。
参数
说明
类型
默认值
可选值
value
编辑器的初始值
string
-
-
theme
编辑器的主题样式,除了提供的可选值外,也可以通过 monaco.editor.defineTheme 自定义主题
string
vs
vs,vs-dark,hc-blacklanguage
编辑器的初始语言,例如可以设置为 javascript, json 等
string
-
-
model
和编辑器关联的初始模型
ITextModel
-
-
lineNumbers
控制行数的渲染,如果是 function,那么会使用 return 的内容作为行数展示
string/Function
on
on,off,relative, interval, (lineNumber: number) => string
readOnly
控制编辑器是否只读
boolean
false-
autoClosingBrackets
自动闭合括号
string
languageDefined
always/languageDefined/beforeWhitespace/never
autoClosingOvertype
自动闭合括号或引号
string
-
always/auto/never
autoClosingQuotes
自动闭合引号
string
languageDefined
always/languageDefined/beforeWhitespace/never
autoIndent
自动缩进
string
advanced
none/keep/brackets/advanced/full
在 webpack 中使用
JS 代码:
import * as monaco from monaco-editor
self.MonacoEnvironment = {
getWorkerUrl: function (moduleId, label) {
if (label === json) {
return ./json.worker.bundle.js
}
if (label === css || label === scss || label === less) {
return ./css.worker.bundle.js
}
if (label === html || label === handlebars || label === razor) {
return ./html.worker.bundle.js
}
if (label === typescript || label === javascript) {
return ./ts.worker.bundle.js
}
return ./editor.worker.bundle.js
},
}
monaco.editor.create(document.getElementById(container), {
value: [function x() { , \tconsole.log("Hello world!");, }].join(\n),
language: javascript,
})然后需要在 webpack 入口添加配置:
module.exports = {
mode: development,
entry: {
app: ./index.js,
editor.worker: monaco-editor/esm/vs/editor/editor.worker.js,
json.worker: monaco-editor/esm/vs/language/json/json.worker,
css.worker: monaco-editor/esm/vs/language/css/css.worker,
html.worker: monaco-editor/esm/vs/language/html/html.worker,
ts.worker: monaco-editor/esm/vs/language/typescript/ts.worker,
},
output: {
globalObject: self,
filename: [name].bundle.js,
path: path.resolve(__dirname, dist),
},
module: {
rules: [
{
test: /\.css$/,
use: [style-loader, css-loader],
},
{
test: /\.ttf$/,
use: [file-loader],
},
],
},
}上述加载方式是 ESM 的加载方式,默认情况下,monaco editor 附带的所有语言都将包含在内,如果你觉得这样配置麻烦,可以使用 monaco-editor-webpack-plugin,通过只选择特定的语言或者只选择特定的b2b供应网编辑器特性,这样可以用来生成一个更小的编辑器包。
修改 webpack.config.js ,在 languages 填写只包含支持的语言子集。
const MonacoWebpackPlugin = require(monaco-editor-webpack-plugin)
const path = require(path)
module.exports = {
entry: ./index.js,
output: {
path: path.resolve(__dirname, dist),
filename: app.js,
},
module: {
rules: [
{
test: /\.css$/,
use: [style-loader, css-loader],
},
{
test: /\.ttf$/,
use: [file-loader],
},
],
},
plugins: [
new MonacoWebpackPlugin({
languages: [typescript, html, css],
}),
],
}值获取
editor.getValue()获取编辑器中的所有文本,并生成一个字符串返回,会保留所有信息(换行、缩进、注释等等)。
editor.getSelection()获取编辑器中被选中文案的 range ,返回一个对象,如下:
{
"startLineNumber": 0,
"startColumnNumber": 0,
"endLineNumber": 0,
"endColumnNumber": 0
}自定义语言
monaco editor 还可以支持自定义语言,下面代码演示一个日志的编辑器:
// 注册一个语言
monaco.languages.register({ id: mySpecialLanguage })
// 通过正则注册解析规则
monaco.languages.setMonarchTokensProvider(mySpecialLanguage, {
tokenizer: {
root: [
[/\[error.*/, custom-error],
[/\[notice.*/, custom-notice],
[/\[info.*/, custom-info],
[/\[[a-zA-Z 0-9:]+\]/, custom-date],
],
},
})
// 定义仅包含与此语言匹配的规则的新主题
monaco.editor.defineTheme(myCoolTheme, {
base: vs,
inherit: false,
rules: [
{ token: custom-info, foreground: 808080 },
{ token: custom-error, foreground: ff0000, fontStyle: bold },
{ token: custom-notice, foreground: FFA500 },
{ token: custom-date, foreground: 008800 },
],
colors: {
editor.foreground: #000000,
},
})
// 注册新语言的代码提示
monaco.languages.registerCompletionItemProvider(mySpecialLanguage, {
provideCompletionItems: () => {
var suggestions = [
{
label: simpleText,
kind: monaco.languages.CompletionItemKind.Text,
insertText: simpleText,
},
{
label: testing,
kind: monaco.languages.CompletionItemKind.Keyword,
insertText: testing(${ 1:condition}),
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
},
{
label: ifelse,
kind: monaco.languages.CompletionItemKind.Snippet,
insertText: [if (${ 1:condition}) { , \t$0, } else { , \t, }].join(\n),
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
documentation: If-Else Statement,
},
]
return { suggestions: suggestions }
},
})
monaco.editor.create(document.getElementById(container), {
theme: myCoolTheme,
value: getCode(),
language: mySpecialLanguage,
})效果:
通过这个例子,我们就可以在网页实现友好查看在线日志。
在 react 中使用
目前社区已经封装了 @monaco-editor/react, 而且不需要使用 webpack (或 rollup/parcel/etc)配置文件/插件。
import React from react
import Editor from @monaco-editor/react
function App() {
return
}
export default App详情请参考仓库 npm[1]。
应用
tailwindcss 的在线运行网站就 https://play.tailwindcss.com/ 就是使用了 monaco-editor 并且拥有智能的语法提示,代码是开源的。
小结
本文简单介绍了下 monaco-editor,企商汇当然还有很多高级功能等待着我们去探索和挖掘, 文中罗列并不全面,深入挖掘请大家参考官网[2]和Github[3] ,希望在未来的开发中能够快速上手类似的代码编辑器实现。
参考资料[1]npm: https://www.npmjs.com/package/@monaco-editor/react
[2]官网: https://microsoft.github.io/monaco-editor/
[3]Github: https://github.com/microsoft/monaco-editor
很赞哦!(8399)
上一篇: ④注册门槛低
下一篇: 域名和网址一样吗?域名和网址有什么区别?
相关文章
- 什么是im域名?新手需要了解im域名哪些?
- Try-Catch-Finally中的4个巨坑,老程序员也搞不定!
- 用Operators管理多集群Kubernetes
- 从浅入深讲解 Node 如何开发一个命令行工具
- 3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。
- 在Java的反射中,Class.forName和ClassLoader的区别
- 促进全球互通互联:WebRTC 成为 W3C 和 IETF 标准
- Consul实战:术语和命令解释
- 域后缀首选.com,.net,然后是.cn。后缀选择不当,导致流量损失。域名是企业与互联网网址之间的链接,关键是企业在网络上存在的标志。因此,选择好域名是开展网上工作的首要重要条件。
- ERP火了20年,“中台”仅用5年就消失了?
热门文章
站长推荐
2、根据用户基础选择访问提供程序。由于互联问题的存在,接入商的选择也非常重要,如果用户群主要在联通,尽量选择联通接入较好的接入商,如果用户群主要在电信,那么选择电信接入较好的接入商。如果用户组位于国家/地区,则选择更好的访问提供程序进行交互。
详解LongAdder实现原理
聊一聊函数之美
Python自动化读取邮件基础代码讲解
2、定期提交和投标域名注册。例如,益华网络点击“立即预订”后,平台会抢先为客户注册域名。当然,一个域名可能会被多个客户预订,所以出价最高的人中标。
新方法:有望开发出更加小巧轻便的新一代VR/AR产品
微服务,开源市场的下一个明星
面试不用慌!跟着老司机吃透Redo log 与 Binlog