使用 Monaco 编辑器突出显示 JSON 属性中的 JavaScript
这 摩纳哥编辑 是一款功能强大的代码编辑器,因其作为 Visual Studio Code 背后的核心而广为人知。它提供广泛的定制,包括语法突出显示、标记化以及在文件中嵌入不同语言。然而,在某些情况下,开发人员需要高级设置,例如在其中嵌入 JavaScript JSON 属性。
当尝试将驻留在 JSON 属性中的 JavaScript 代码显示为独立的代码时,会出现一个常见的挑战 JavaScript 块。这对于 JSON 不仅充当数据存储而且还携带可执行代码片段(例如那些在 “评估” 财产。
在本文中,我将演示配置 Monaco 编辑器以识别并正确显示嵌入在 JSON 字段中的 JavaScript 所需的步骤。尽管有现有的教程和建议,但实现所需的语法突出显示需要更量身定制的方法,我将在这里进行探讨。
使用正确的 标记化模式 和配置将确保 Monaco 编辑器按预期运行。提供的示例代码包含一个 JSON 结构,其中包含一个保存 JavaScript 代码的“eval”字段。我将指导您完成解决方案,并重点介绍我在尝试使用 Copilot 的建议实现此功能时遇到的一些陷阱。
命令 | 使用示例 |
---|---|
monaco.languages.register() | 这会向 Monaco Editor 注册一种新的自定义语言,允许您扩展或修改默认行为。将 JavaScript 嵌入到 JSON 属性中时这一点至关重要。 |
monaco.languages.setMonarchTokensProvider() | 定义语言的自定义语法突出显示规则。这用于指定编辑器应如何标记 JSON 和嵌入的 JavaScript 字段。 |
nextEmbedded | 特定的 Monarch 标记化属性,告诉 Monaco 在当前语言中嵌入另一种语言。它用于处理 JSON 中的 JavaScript。 |
monaco.editor.create() | 在指定的 DOM 元素中创建一个新的 Monaco Editor 实例。它使用所需的语言配置和代码内容初始化编辑器。 |
require(['vs/editor/editor.main']) | 异步加载主 Monaco 编辑器模块,确保所有编辑器功能在使用前正确初始化。 |
getModel().getValue() | 检索摩纳哥编辑器的当前内容。在单元测试中,这用于验证“eval”字段是否包含预期的 JavaScript 代码。 |
token: 'source.js' | 这指定了嵌入式 JavaScript 代码的标记类型,确保代码在 JSON 结构内接收 JavaScript 语法突出显示。 |
test() | 用于定义单元测试的 Jest 测试函数。在这种情况下,它确保编辑器正确识别并突出显示 JSON 属性中嵌入的 JavaScript 代码。 |
console.error() | 如果 Monaco 初始化失败,此命令会将错误记录到控制台,从而允许开发人员在安装过程中调试问题。 |
如何使用 Monaco 编辑器在 JSON 中嵌入 JavaScript
前面提供的脚本演示了如何配置 摩纳哥编辑 识别并正确显示嵌入在 JSON 属性中的 JavaScript,特别是在“eval”字段下。此设置确保编辑器可以解析嵌入的 JavaScript,就像它是独立 JavaScript 文件的一部分一样。实现这一目标的关键在于使用定义自定义分词器 君主 语法,它允许编辑器识别 JavaScript 部分并在 JSON 结构中应用正确的语法突出显示。
该示例中最重要的命令之一是 摩纳哥语言注册中心。该命令注册新的语言配置,有效扩展 Monaco 的默认行为。通过使用它,我们引入了一种名为“jsonWithJS”的自定义语言,以将我们的增强型 JSON 设置与标准设置区分开来。我们还雇用 setMonarchTokensProvider,它允许我们为新注册的语言声明标记化规则。这对于告诉编辑器如何处理“eval”属性中嵌入的 JavaScript 至关重要。
这 下一个嵌入式 属性在单个令牌内实现从 JSON 到 JavaScript 的转换中发挥着关键作用。它确保“eval”字段内的内容被视为 JavaScript,即使它驻留在 JSON 文件中。这种无缝转换使“eval”字段内的代码显示为 JavaScript,并有利于依赖 Monaco 语法突出显示功能以获得更好可读性的开发人员。此外, 摩纳哥.editor.create 方法用于初始化 Monaco 编辑器并在指定的 HTML 容器中呈现编辑器实例。
使用 Jest 的单元测试验证 JSON 属性内的 JavaScript 是否被正确识别并突出显示。这确保了我们的解决方案可靠并且可以在不同的环境中工作。我们还实现了错误处理 控制台错误 记录编辑器初始化期间的任何问题。这种模块化设计使开发人员可以轻松地重用代码,并将其扩展到其他需要语言嵌入的场景。通过这些配置,开发人员现在可以在使用包含可执行 JavaScript 代码的 JSON 文件时受益于更加动态和可读的体验。
使用 Monaco Editor 将 JavaScript 嵌入到 JSON 属性中
在 Monaco 编辑器中使用嵌入到 JSON 属性中的 JavaScript,专注于语法突出显示的标记器自定义
// Frontend Script: Monaco Editor configuration to embed JavaScript within JSON
// This solution initializes Monaco with a custom language definition.
require(['vs/editor/editor.main'], function () {
monaco.languages.register({ id: 'jsonWithJS' });
monaco.languages.setMonarchTokensProvider('jsonWithJS', {
tokenizer: {
root: [
[/"eval"\s*:\s*"(.*)"/, { token: 'source.js', nextEmbedded: 'javascript' }],
[/[{}[\],]/, 'delimiter'],
[/\b\d+\b/, 'number'],
[/"/, { token: 'string', bracket: '@open', next: '@string' }],
],
}
});
monaco.editor.create(document.getElementById('container'), {
value: '{"eval":"Item.val = Attr.val"}',
language: 'jsonWithJS'
});
});
使用带有 JSON 和 JavaScript 嵌入的 Monaco 编辑器的替代方法
使用标记化并改进错误处理和模块化设置的解决方案
// Frontend: Modular Monaco configuration with error handling
function setupMonacoEditor() {
require(['vs/editor/editor.main'], function () {
try {
monaco.languages.register({ id: 'jsonWithEmbeddedJS' });
monaco.languages.setMonarchTokensProvider('jsonWithEmbeddedJS', {
tokenizer: {
root: [[/"eval"\s*:\s*"(.*?)"/, { token: 'source.js', nextEmbedded: 'javascript' }]]
}
});
const editor = monaco.editor.create(document.getElementById('editor'), {
value: '{"eval":"console.log(Attr.val);"}',
language: 'jsonWithEmbeddedJS'
});
} catch (error) {
console.error('Failed to initialize Monaco:', error);
}
});
}
setupMonacoEditor();
Monaco 编辑器配置的单元测试
基于 Jest 的单元测试,用于验证 JSON 属性中嵌入的 JavaScript 标记化
// Unit Test: Jest test for Monaco Editor's JSON with embedded JavaScript
test('Monaco Editor recognizes JavaScript in eval property', () => {
const mockEditor = {
getModel: () => ({ getValue: () => '{"eval":"console.log(Item.val);"}' })
};
const value = mockEditor.getModel().getValue();
expect(value).toContain('console.log(Item.val);');
expect(value).toMatch(/"eval":\s*".*?"/);
});
使用嵌入式 JavaScript 增强 JSON 中的语法突出显示
前面未讨论的一方面是在处理包含嵌入式 JavaScript 的大型 JSON 文件时优化编辑器性能的重要性。 Monaco 编辑器可以处理多种语言,但相互嵌入语言会增加复杂性。如果不仔细配置,性能可能会下降,特别是如果 代币化 过程变得低效。为了避免这种情况,开发人员应该确保他们的 Monarch 分词器 定义明确并使用优化的正则表达式来最大限度地减少处理时间。
另一个关键的考虑因素是编辑器自动完成功能的灵活性。开发人员可能希望通过启用 JSON 键和 JavaScript 代码的自动完成功能来增强其 JSON-with-JavaScript 编辑器。为此, 完成项提供者 摩纳哥的 API 可用于根据用户输入动态提供建议。在处理包含评估代码块的复杂 JSON 结构时,此功能可以显着提高工作效率。
安全是另一个重要方面。在 JSON 中嵌入 JavaScript 可能会引发以下问题 代码注入 风险,特别是在允许用户生成内容的环境中。建议在编辑器中渲染 JSON 内容之前对其进行验证和清理。此外,开发人员应考虑沙箱或限制嵌入式 JavaScript 的执行,以避免潜在的安全漏洞。结合这些实践可确保 JavaScript 与 JSON 的集成既顺利又安全,满足开发和安全标准。
有关使用 Monaco Editor 在 JSON 中嵌入 JavaScript 的常见问题
- 使用 Monaco Editor 将 JavaScript 嵌入 JSON 时的主要挑战是什么?
- 主要挑战是配置标记器以使用以下命令正确识别和突出显示嵌入的 JavaScript nextEmbedded。
- 如何在同一个 Monaco 编辑器中启用 JSON 和 JavaScript 的自动完成功能?
- 您可以使用 monaco.languages.registerCompletionItemProvider 动态提供 JSON 键和 JavaScript 语法的建议。
- 使用大型 JSON 文件时如何防止出现性能问题?
- 优化正则表达式 setMonarchTokensProvider 有助于减少大文件的处理开销。
- 有没有办法处理编辑器初始化期间的错误?
- 是的,将初始化代码包装在 try...catch 块允许您记录错误 console.error 如果设置失败。
- 我可以出于安全目的限制嵌入式 JavaScript 的执行吗?
- 是的,您可以清理输入并应用沙箱技术来防止在 JSON 文件中执行恶意代码。
关于将 Monaco 用于 JSON 和嵌入式 JavaScript 的最终想法
Monaco 编辑器通过嵌入 JavaScript 代码和应用适当的语法突出显示提供了一种增强 JSON 文件的强大方法。尽管配置标记化可能很棘手,但使用 君主 标记化使开发人员能够无缝处理此问题并确保混合语言文件中的代码可读。
虽然此设置可以提高工作效率,但仔细处理性能和安全注意事项也至关重要。优化标记器并清理用户生成的内容将有助于保持稳定性并防止恶意代码注入。通过正确的设置,Monaco 可以提供灵活且安全的环境来处理复杂的 JSON 结构。
使用嵌入式 JavaScript 实现 Monaco 的来源和参考
- 详细介绍了如何使用 Monaco Editor 来支持多语言。查看官方文档: 摩纳哥编辑器文档 。
- 有关在摩纳哥配置 Monarch 标记化以实现高级语法突出显示的参考材料。详情请参阅 Monarch 语法文档 。
- 解释如何在摩纳哥实现自定义语言定义和嵌入。了解更多信息,请访问 VS Code 语言扩展指南 。
- 用于验证嵌入式代码执行的 Jest 测试指南。访问 玩笑官方文档 了解更多信息。