@nx-lang/monaco

中文文档
0.10.0发布于 2026/11/02MITTypeScriptES Module构建来源已验证

针对NX的一个Monaco集成:通过Shiki突出显示已发布的语法,在NxLanguageService上悬停和补全,以及从诊断到标记的映射。

中文使用文档
文档目录5 节
  1. 同行依赖性
  2. registerNxLanguage(monaco, options?)
  3. 与 @monaco-editor/react
  4. 标记
  5. 出口

@nx-lang /摩纳哥

一个摩纳哥集成的NX,由每个NX网络编辑共享: nx 语言及其影响因素 配置从 @nx-lang/language,突出显示 志贵 与 包的TextMate语法,悬停和完成 NxLanguageService的映射 协议诊断到编辑器标记。无框架-主机与之组合 monaco.editor.create 或者 @monaco-editor/react 随它的便。

import * as monaco from "monaco-editor";
import { registerNxLanguage } from "@nx-lang/monaco";
import { createHttpLanguageService } from "@nx-lang/language-client";

const registration = registerNxLanguage(monaco, {
  service: createHttpLanguageService({ baseUrl: "/api/language" }),
});

const editor = monaco.editor.create(container, {
  value: source,
  language: "nx",
  theme: "github-dark",
});

同行依赖性

主机安装 monaco-editor, shiki, @shikijs/monaco, @nx-lang/language,所以有 一个摩纳哥在页面上,主机控制版本。支持Monaco 0.52.0及更高版本:every 包调用的API存在于那里,并且包是根据0.52的声明编译的。直到 @nx-lang/language 在注册表上,使用此存储库的主机通过路径链接它,对吗 这个存储库的工作空间("@nx-lang/language": "file:../../src/vscode")。

包永远不会导入 monaco-editor 本身;它只使用交给它的名称空间。那 namespace可以是一个ES模块导入,什么 @monaco-editor/react 传递给 beforeMount,或 monaco 全球一个amd装载摩纳哥离开 window - BlazorMonaco是这样加载的-所以 拥有自己的摩纳哥的主机永远不会在页面上留下第二份副本。

// An AMD-loaded Monaco: the global is the namespace.
registerNxLanguage(window.monaco, { service });

registerNxLanguage(monaco, options?)

用给定的Monaco名称空间注册NX,并返回一个句柄 dispose() 和一个 ready 保证在高亮笔加载后解析。

选项默认的意义
service无一个 NxLanguageService。其中一个是注册悬停和完成提供程序;没有,只有高亮显示和语言配置。
workspace模型本身(model) => LanguageDocument[]:对文档设置查询 model 被要求反对。
themes["github-light", "github-dark"]通过绑定的名称或主题对象在Monaco中加载和定义Shiki主题。选一个有编辑签名的 theme 选择或 monaco.editor.setTheme;如果没有选择,一旦荧光笔加载,第一个就会激活。
onError无当服务调用被拒绝或高亮显示加载失败时调用。没有东西被扔进摩纳哥。

医生的评论。 每个加载的主题都有Markdown的规则 /// Doc注释,所以是这样的 在其他编辑器中使用文档的方式,而不是Markdown文件的方式: **bold** 和 *italic* 保留注释的颜色并只更改字体,代码跨度采用主题的颜色 代码跨度颜色,以及文档链接,如 [Name] 使用带有下划线的颜色(注释的 颜色(下划线,在没有代码跨度颜色的主题中)。 withNxDocCommentStyles(theme) 应用 对于以其他方式定义主题的主机,主题对象也适用相同的规则。

幂等。 对同一个Monaco名称空间的重复调用将返回现有名称空间的句柄 注册而不是再次注册,所以 @monaco-editor/react的 beforeMount 和 onMount pair和React严格模式的双挂载,注册一组提供商和每个完成 出现一次。没有服务的调用只注册高亮显示;第一个后来叫那个 将悬停和完成提供程序添加到现有的注册中,因此是一个宿主 在它的服务准备好之前设置高亮仍然得到他们。当 处置最后一个句柄;语言,它的结构和荧光笔都保留了下来,因为 摩纳哥没有办法取消一种语言的注册,而在此之后进行的注册则会重新使用它们 然后再装上荧光笔。一个React效果,在mount时注册,在cleanup时销毁 因此,无论它运行的频率有多高,都需要一个高光笔负载。

主题。 荧光笔加载后 registerNxLanguage 的回报。之前选择的主题 ready 解决,通过 monaco.editor.setTheme 或者是编辑的 theme 选择权,一旦有了就保留,所以 上面的例子都不需要等待 ready 让它的主题保持不变。一个不属于 themes 保持编辑器的主题,但高亮笔无法为其重新上色,并保持在其第一个。

的位置。 摩纳哥的一基行和一列成为协议的零基行和UTF-16 字符和答案范围以另一种方式返回。模型的文本在的时刻被读取 编辑后立即悬停的查询询问已编辑的文本。摩纳哥 取消令牌终止服务调用。

悬停代码块 由摩纳哥自己的着色器通过代币提供商Shiki突出显示 使用与缓冲区相同的语法进行安装。

与 @monaco-editor/react

import Editor, { type BeforeMount, type OnMount } from "@monaco-editor/react";
import { registerNxLanguage, setNxMarkers } from "@nx-lang/monaco";
import { createHttpLanguageService } from "@nx-lang/language-client";

const service = createHttpLanguageService({
  baseUrl: "/api/language",
  headers: async () => ({ authorization: `Bearer ${await getToken()}` }),
});

// A multi-file configuration: the model being edited plus its siblings, with unsaved text.
const beforeMount: BeforeMount = (monaco) => {
  registerNxLanguage(monaco, {
    service,
    workspace: (model) => [
      { uri: model.uri.toString(), source: model.getValue(), version: model.getVersionId() },
      ...otherFiles.map((file) => ({ uri: file.uri, source: file.draftText })),
    ],
    onError: (error) => console.warn("nx language", error),
  });
};

const onMount: OnMount = (editor, monaco) => {
  const model = editor.getModel();
  if (model) {
    setNxMarkers(monaco, model, diagnosticsForThisFile);
  }
};

<Editor language="nx" theme="github-dark" beforeMount={beforeMount} onMount={onMount} value={text} />;

标记

toMonacoMarkers(diagnostics) 转换协议诊断-或任何与 severity, message, code 和一个 range 这可能是 null - IMarkerData[]:严重性映射到 摩纳哥的,以列为基础,零宽度范围扩大了一列,因此插入点 诊断(expected } here)保持可见,并且省略了无范围的诊断。 setNxMarkers(monaco, model, diagnostics, owner = "nx") 将它们设置在一个模型上。

出口

registerNxLanguage, NX_LANGUAGE_ID, NX_DEFAULT_LIGHT_THEME, NX_DEFAULT_DARK_THEME, NX_COMPLETION_TRIGGER_CHARACTERS, defaultWorkspace, toMonacoLanguageConfiguration, nxShikiLanguage, toProtocolPosition, toMonacoRange, toMonacoCompletionKind, toMonacoMarkers, setNxMarkers,以及类型 MonacoNamespace, RegisterNxLanguageOptions, NxLanguageRegistration, NxMonacoTheme, MarkerDiagnostic, NxLanguageService.

版本与发布记录

@nx-lang/monaco 共发布 10 个版本,首次发布于 2026/09/15;过去 12 个月发布了 10 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.10.0latest2026/11/021 天前
0.9.02026/10/268 天前
0.8.02026/10/1816 天前
0.7.02026/10/1024 天前
0.6.02026/10/0628 天前
0.5.02026/09/291 个月前

关于 @nx-lang/monaco 的常见问题

@nx-lang/monaco 是什么?

针对NX的一个Monaco集成:通过Shiki突出显示已发布的语法,在NxLanguageService上悬停和补全,以及从诊断到标记的映射。

如何安装 @nx-lang/monaco?

在项目目录运行 npm install @nx-lang/monaco,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:shiki(^4.0.0)、monaco-editor(>=0.52.0)、@shikijs/monaco(^4.0.0)、@nx-lang/language(>=0.1.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@nx-lang/monaco 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@nx-lang/monaco 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@nx-lang/monaco 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@nx-lang/monaco 可以商用吗?

@nx-lang/monaco 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@nx-lang/monaco 还在维护吗?

最新版本 0.10.0 发布于 2026/11/02(1 天前);至今共发布 10 个版本,其中过去 12 个月发布了 10 个;首次发布于 2026/09/15。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。