Monaco エディターを使用して JSON プロパティ内の JavaScript を強調表示する
の モナコ編集者 は強力なコード エディターであり、Visual Studio Code の中心となるものとして広く知られています。構文の強調表示、トークン化、ファイル内でのさまざまな言語の埋め込みなど、広範なカスタマイズが可能です。ただし、JavaScript を埋め込むなど、開発者が高度な設定を必要とする場合があります。 JSON プロパティ。
JSON プロパティ内にある JavaScript コードをスタンドアロンであるかのように表示しようとすると、一般的な問題が発生します。 JavaScript ブロック。これは、JSON がデータ ストレージとして機能するだけでなく、実行可能コードのスニペット (たとえば、 「評価」 財産。
この記事では、JSON フィールド内に埋め込まれた JavaScript を認識して正しく表示するように Monaco Editor を構成するために必要な手順を説明します。既存のチュートリアルや提案にもかかわらず、目的の構文強調表示を実現するには、よりカスタマイズされたアプローチが必要です。これについては、ここで説明します。
権利の使用 トークン化パターン 設定により、Monaco Editor が意図したとおりに動作することが保証されます。提供されているサンプル コードには、JavaScript コードを保持する「eval」フィールドを持つ JSON 構造が含まれています。ソリューションを案内し、Copilot の提案を使用してこの機能を実装しようとしたときに遭遇したいくつかの落とし穴に焦点を当てます。
指示 | 使用例 |
---|---|
monaco.languages.register() | これにより、新しいカスタム言語が Monaco Editor に登録され、デフォルトの動作を拡張または変更できるようになります。これは、JSON プロパティ内に JavaScript を埋め込むときに重要です。 |
monaco.languages.setMonarchTokensProvider() | 言語のカスタム構文強調表示ルールを定義します。これは、エディターが JSON および埋め込み JavaScript フィールドをトークン化する方法を指定するために使用されます。 |
nextEmbedded | Monarch に現在の言語内に別の言語を埋め込むように指示する特定の Monarch トークン化プロパティ。 JSON 内の JavaScript を処理するために使用されます。 |
monaco.editor.create() | 指定された DOM 要素内に新しい Monaco Editor インスタンスを作成します。必要な言語構成とコード コンテンツを使用してエディターを初期化します。 |
require(['vs/editor/editor.main']) | メインの Monaco Editor モジュールを非同期的にロードし、すべてのエディター機能が使用前に適切に初期化されていることを確認します。 |
getModel().getValue() | Monaco Editor の現在のコンテンツを取得します。単体テストでは、これは、「eval」フィールドに予期される JavaScript コードが含まれていることを検証するために使用されます。 |
token: 'source.js' | これにより、埋め込み JavaScript コードのトークン タイプが指定され、コードが JSON 構造内で JavaScript 構文の強調表示を受け取ることが保証されます。 |
test() | 単体テストを定義するために使用される Jest テスト関数。このコンテキストでは、エディターが JSON プロパティ内の埋め込み JavaScript コードを適切に識別して強調表示するようにします。 |
console.error() | このコマンドは、Monaco の初期化に失敗した場合にコンソールにエラーを記録し、開発者がセットアップ中に問題をデバッグできるようにします。 |
Monaco Editor を使用して JSON に JavaScript を埋め込む方法
前に提供したスクリプトは、 モナコ編集者 JSON プロパティ内 (具体的には「eval」フィールドの下) に埋め込まれた JavaScript を認識し、正しく表示します。この設定により、エディターは埋め込まれた JavaScript をスタンドアロン JavaScript ファイルの一部であるかのように解析できるようになります。これを達成する鍵は、次を使用してカスタム トークナイザーを定義することにあります。 君主 これにより、エディターは JavaScript セクションを識別し、JSON 構造内で適切な構文強調表示を適用できるようになります。
この例で最も重要なコマンドの 1 つは次のとおりです。 モナコ.言語.登録。このコマンドは新しい言語設定を登録し、Monaco のデフォルトの動作を効果的に拡張します。これを使用して、「jsonWithJS」と呼ばれるカスタム言語を導入し、拡張された JSON セットアップを標準のものと区別します。弊社でも採用しております setMonarchTokensProviderこれにより、新しく登録された言語のトークン化ルールを宣言できるようになります。これは、「eval」プロパティ内に埋め込まれた JavaScript を処理する方法をエディターに伝えるために重要です。
の 次へ埋め込み プロパティは、単一のトークン内で JSON から JavaScript への移行を可能にする上で重要な役割を果たします。これにより、「eval」フィールド内のコンテンツが、JSON ファイル内に存在する場合でも、確実に JavaScript として扱われるようになります。このシームレスな移行により、「eval」フィールド内のコードが JavaScript として表示されるため、Monaco の構文強調表示機能を利用して読みやすさを向上させている開発者にとっては有益です。さらに、 モナコエディター作成 メソッドは、Monaco Editor を初期化し、指定された HTML コンテナー内でエディター インスタンスをレンダリングするために使用されます。
Jest を使用した単体テストでは、JSON プロパティ内の JavaScript が正しく認識され、強調表示されていることを検証します。これにより、当社のソリューションは信頼性が高く、さまざまな環境で動作することが保証されます。エラー処理も実装します コンソールエラー エディターの初期化中に発生した問題をログに記録します。このモジュール設計により、開発者はコードを簡単に再利用し、言語の埋め込みが必要な他のシナリオに拡張することができます。これらの構成により、開発者は、実行可能な JavaScript コードを含む JSON ファイルを操作する際に、より動的で読みやすいエクスペリエンスを活用できるようになります。
Monaco Editor を使用した JSON プロパティへの JavaScript の埋め込み
Monaco Editor 内の 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'
});
});
Monaco Editor と JSON および JavaScript 埋め込みを使用した代替アプローチ
改良されたエラー処理とモジュール式セットアップによるトークン化を使用したソリューション
// 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 エディター構成の単体テスト
JSON プロパティ内の埋め込み JavaScript トークン化を検証するための Jest ベースの単体テスト
// 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 での構文の強調表示の強化
これまでに説明されていない側面の 1 つは、埋め込み JavaScript を含む大きな JSON ファイルを処理するときにエディターのパフォーマンスを最適化することの重要性です。 Monaco Editor は複数の言語を処理できますが、相互に言語を埋め込むと複雑さが増します。慎重に構成しないと、特に次の場合にパフォーマンスが低下する可能性があります。 トークン化 プロセスが非効率になります。これを回避するには、開発者は次のことを確認する必要があります。 モナークトークナイザー は明確に定義されており、最適化された正規表現を使用して処理時間を最小限に抑えます。
もう 1 つの重要な考慮事項は、オートコンプリートによるエディターの柔軟性です。開発者は、JSON キーと JavaScript コードの両方のオートコンプリートを有効にして、JSON-with-JavaScript エディターを強化したい場合があります。このために、 完了アイテムプロバイダー Monaco の API を使用すると、ユーザーの入力時に動的に提案を提供できます。この機能により、評価コード ブロックを含む複雑な JSON 構造を操作する際の生産性が大幅に向上します。
セキュリティも重要な側面です。 JSON 内に JavaScript を埋め込むと、次のような懸念が生じる可能性があります。 コードインジェクション 特にユーザー作成コンテンツが許可されている環境では、リスクが高まります。 JSON コンテンツをエディターでレンダリングする前に、検証してサニタイズすることをお勧めします。さらに、開発者は潜在的なセキュリティ脆弱性を回避するために、サンドボックス化または埋め込み JavaScript の実行を制限することを検討する必要があります。これらのプラクティスを組み合わせることで、JavaScript の JSON への統合がスムーズかつ安全になり、開発基準と安全基準を満たせるようになります。
Monaco Editor を使用した JSON への JavaScript の埋め込みに関するよくある質問
- Monaco Editor を使用して JSON に JavaScript を埋め込む際の主な課題は何ですか?
- 主な課題は、埋め込まれた JavaScript を正しく識別して強調表示するようにトークナイザーを構成することです。 nextEmbedded。
- 同じ Monaco エディターで JSON と JavaScript の両方のオートコンプリートを有効にするにはどうすればよいですか?
- 使用できます monaco.languages.registerCompletionItemProvider JSON キーと JavaScript 構文の両方に対する提案を動的に提供します。
- 大きな JSON ファイルを使用する際のパフォーマンスの問題を防ぐにはどうすればよいですか?
- 正規表現の最適化 setMonarchTokensProvider 大きなファイルの処理オーバーヘッドを軽減します。
- エディタの初期化中にエラーを処理する方法はありますか?
- はい、初期化コードを try...catch ブロックを使用すると、エラーをログに記録できます console.error セットアップが失敗した場合。
- セキュリティ目的で埋め込み JavaScript の実行を制限できますか?
- はい、入力をサニタイズし、サンドボックス技術を適用して、JSON ファイル内の悪意のあるコードの実行を防ぐことができます。
埋め込み JavaScript で JSON に Monaco を使用する場合の最終的な考え方
Monaco Editor は、JavaScript コードを埋め込み、適切な構文強調表示を適用することにより、JSON ファイルを強化する強力な方法を提供します。トークン化の構成は難しい場合がありますが、 君主 トークン化により、開発者はこれをシームレスに処理し、混合言語ファイル内のコードを確実に読み取れるようにすることができます。
この設定により生産性が向上しますが、パフォーマンスとセキュリティを慎重に考慮することが重要です。トークナイザーを最適化し、ユーザー生成コンテンツをサニタイズすることで、安定性を維持し、悪意のあるコードの挿入を防ぐことができます。適切なセットアップを行うことで、Monaco は複雑な JSON 構造を操作するための柔軟で安全な環境を提供できます。
埋め込み JavaScript を使用して Monaco を実装するためのソースとリファレンス
- 多言語サポートのための Monaco Editor の使用について詳しく説明します。公式ドキュメントを参照してください。 モナコエディターのドキュメント 。
- 高度な構文強調表示のための Monaco での Monarch トークン化の構成に関する参考資料。詳細については、次のサイトを参照してください。 Monarch 構文ドキュメント 。
- Monaco でカスタム言語定義と埋め込みを実装する方法について説明します。詳細については、こちらをご覧ください VS Code 言語拡張ガイド 。
- 埋め込みコードの実行を検証するための Jest テストに関するガイド。訪問 Jest 公式ドキュメント 詳細については。