この記事は、Vildan Softicによってピアレビューされました。 SetePointコンテンツを最高にするためにSitePointのピアレビュアーのすべてに感謝します! 原子は、コアハッキング可能なエディターにとってモダンです。これは素晴らしいことですが、Coffeescriptに堪能ではない開発者にとっては、ドキュメントに従うことは困難です。原子の生態系を理解することは混乱する可能性があります。 JavaScriptでAtomパッケージを書く方法のすべての側面を調べましょう。
キーテイクアウト
AtomパッケージをNPMモジュールとして表示するのに役立ちます。 node.jsで実行されているツールと同じAPIにアクセスできます。したがって、必要なNPM依存関係を追加することができます。 Package.jsonも必要です。これには、プロジェクトのすべてのメタデータが含まれています。基本ファイルは次のようにする必要があります:
<span>{ </span> <span>"name": "your-package", </span> <span>"main": "./lib/main", </span> <span>"version": "0.1.0", </span> <span>"description": "A short description of your package", </span> <span>"keywords": [ </span> <span>"awesome" </span> <span>], </span> <span>"repository": "https://github.com/<your-name>/<package>", </span> <span>"license": "MIT", </span> <span>"engines": { </span> <span>"atom": ">=1.0.0 <2.0.0" </span> <span>}, </span> <span>"dependencies": { </span> <span>} </span><span>} </span>
重要なキーはメインです - パッケージのメインエントリポイント(デフォルトはindex.js/index.coffeeにデフォルト) - およびエンジン - パッケージが実行されるバージョンの原子を伝える。また、「WordCount」パッケージドキュメント(セクションpackage.json)。
に記載されているオプションのキーのセットもあります。すべてのパッケージコードは、トップレベルのディレクトリlib/に属します。このフォルダーにもエントリポイントがあることをお勧めします。構造を清潔に保ち、プロジェクトを簡単にスキャンできるようにするためです。
メインファイルは、パッケージのライフサイクル全体を維持するSingletonオブジェクトでなければなりません。パッケージが単一のビューのみで構成されていても、すべてこのオブジェクトから管理されます。エントリポイントには1つのActivate()メソッドが必要ですが、オプションdeactivate()およびserialize()も必要です。
パッケージをアクティブにします<span>// lib/main.js </span><span>'use babel'; </span> <span>// This is your main singleton. </span><span>// The whole state of your package will be stored and managed here. </span><span>const YourPackage = { </span> <span>activate (state) { </span> <span>// Activates and restores the previous session of your package. </span> <span>}, </span> <span>deactivate () { </span> <span>// When the user or Atom itself kills a window, this method is called. </span> <span>}, </span> <span>serialize () { </span> <span>// To save the current package's state, this method should return </span> <span>// an object containing all required data. </span> <span>} </span><span>}; </span> <span>export default YourPackage; </span>
非アクティブ()メソッドはオプションですが、重要です。ウィンドウがシャットダウンされているときにAtomによって呼び出されます。または、ユーザーが設定でそれを無効にします。パッケージがユーザーによって非アクティブ化され、追加のイベント/コマンドを処分しない場合でも、それらはまだ利用可能です。これは、Atomがウィンドウをシャットダウンしている場合、問題ではありません。イベントやコマンドを取り壊します。ただし、パッケージがファイルを監視している場合、または他の作業を行っている場合は、非アクティブ()でリリースする必要があります。
パッケージは通常、カスタムコマンドの追加、変更の聴取、または変更されたファイルなどの複数のイベントを購読します。これらをcompositedisposable()のインスタンスに束ねることは可能です。そして、このようにして、それらはすべて一度に処分することができます。
シリアル化は、アトムパッケージの強力ですが、オプションの機能です。シリアル化/脱介入は、前のセッションからウィンドウがシャットダウン、更新、または復元されているときに発生します。どのコンポーネントがデータをシリアル化するかを定義するのはあなた次第です。重要なのは、JSONを返すことです。ビューがあり、それをリフレッシュできるようにしたい場合は、シリアル化と脱派化と互換性があるようにする必要があります。
この非常に基本的なコンポーネントは、コンポーネントの内部データとして使用されるオブジェクトを取ります。その場合、コンポーネントはデータを使用して何らかの作業を行い、Serialize()メソッドを介してその状態をシリアル化できるようにすることができます。
このすべてを便利にするには、このコンポーネントを呼び出してシリアル化する必要があります。<span>{ </span> <span>"name": "your-package", </span> <span>"main": "./lib/main", </span> <span>"version": "0.1.0", </span> <span>"description": "A short description of your package", </span> <span>"keywords": [ </span> <span>"awesome" </span> <span>], </span> <span>"repository": "https://github.com/<your-name>/<package>", </span> <span>"license": "MIT", </span> <span>"engines": { </span> <span>"atom": ">=1.0.0 <2.0.0" </span> <span>}, </span> <span>"dependencies": { </span> <span>} </span><span>} </span>
シリアル化するすべてのオブジェクトには、serialize()メソッドが必要です。 「シリアル化可能なオブジェクト」と、登録されたデシリアライザーの名前を持つ脱シリアライザーキーを返す必要があります。 Atomによると、「通常、クラス自体の名前です」。それに加えて、クラスにはstatic deserialize()メソッドも必要です。この方法は、オブジェクトを以前の状態から本物のオブジェクトに変換します。
これをすべて可能にするために、atom.deserializers.add()。<span>// lib/main.js </span><span>'use babel'; </span> <span>// This is your main singleton. </span><span>// The whole state of your package will be stored and managed here. </span><span>const YourPackage = { </span> <span>activate (state) { </span> <span>// Activates and restores the previous session of your package. </span> <span>}, </span> <span>deactivate () { </span> <span>// When the user or Atom itself kills a window, this method is called. </span> <span>}, </span> <span>serialize () { </span> <span>// To save the current package's state, this method should return </span> <span>// an object containing all required data. </span> <span>} </span><span>}; </span> <span>export default YourPackage; </span>
ペインはAtomの個々のウィンドウです。 「アイテム」と呼ばれるすべての開いたタブが含まれています。これらのペインは、Atom.workspaceオブジェクトに保存されます。 Atom.workspace.getactivePane()を使用すると、現在のアクティブペインを要求しています。ペインオブジェクトにはDOM要素は含まれていませんが、Atomの内部コンポーネント(Texteditor、GutterContainer、NotificationManagerなど)のすべてのインスタンスが含まれています。これらのペインを理解することは、パッケージのカスタムビューを作成するために不可欠です。
ビューまたは追加する他のカスタムUI要素は、JavaScriptで作成する必要があります。 Atomは完全にWebコンポーネントで構築されていますが、それを行う必要はありません。カスタムモーダルの非常に基本的な例は次のとおりです。
パッケージを構成可能にする
パッケージの構成については、JSONスキーマで説明する必要があります。設定を追加するには、パッケージオブジェクトにはデータを使用して構成キーが必要です。または、構成をConfig-schema.jsonファイルに移動してインポートできます。これにより、構成が分離され、アーキテクチャが整理されます。
<span>// lib/main.js </span><span>import <span>{ CompositeDisposable }</span> from 'atom'; </span> <span>const YourPackage = { </span> <span>subscriptions: null, </span> <span>activate (state) { </span> <span>// Assign a new instance of CompositeDisposable... </span> <span>this.subscriptions = new CompositeDisposable(); </span> <span>// ...and adding commands. </span> <span>this.subscriptions.add( </span> atom<span>.commands.add('atom-workspace', { </span> <span>'your-package:toggle': this.togglePackage </span> <span>}) </span> <span>); </span> <span>}, </span> <span>// When your package get's deactivated, all added </span> <span>// subscriptions will be disposed of at once. </span> <span>deactivate () { </span> <span>this.subscriptions.dispose(); </span> <span>}, </span> <span>togglePackage () { </span> <span>// Code to toggle the package state. </span> <span>} </span><span>}; </span>
<span>// lib/fancy-component.js </span><span>class FancyComponent { </span> <span>constructor (configData) { </span> <span>this.data = configData; </span> <span>} </span> <span>// This method will be called when the class </span> <span>// is restored by Atom. </span> <span>static deserialize (config) { </span> <span>return new FancyComponent(config); </span> <span>} </span> <span>// The returned object will be used to restore </span> <span>// or save your data by Atom. </span> <span>// The "deserializer" key must be the name of your class. </span> <span>serialize () { </span> <span>return { </span> <span>deserializer: 'FancyComponent', </span> <span>data: this.data </span> <span>}; </span> <span>} </span> <span>doSomethingWithData () {} </span><span>} </span> <span>// Add class to Atom's deserialization system </span>atom<span>.deserializers.add(FancyComponent); </span> <span>export default FancyComponent; </span>
これにより、パッケージの設定ページで自動的に構成が作成されます。サポートされているすべてのタイプのリストは、AtomのAPIドキュメントの構成ページにあります。設定オブジェクトは、他のすべてのパッケージ構成とともに、atom.configオブジェクトに保存されます。
取得と設定<span>{ </span> <span>"name": "your-package", </span> <span>"main": "./lib/main", </span> <span>"version": "0.1.0", </span> <span>"description": "A short description of your package", </span> <span>"keywords": [ </span> <span>"awesome" </span> <span>], </span> <span>"repository": "https://github.com/<your-name>/<package>", </span> <span>"license": "MIT", </span> <span>"engines": { </span> <span>"atom": ">=1.0.0 <2.0.0" </span> <span>}, </span> <span>"dependencies": { </span> <span>} </span><span>} </span>
変更を聞くには、変更の構成を観察するか、リスナー(ondidchange()と呼ばれる)をキーパスにすることができます。どちらも、.dispose()を登録解除することができる使い捨てを返します。
繰り返しになりますが、それらを構成不可能なインスタンスに追加すると、一度に複数のイベントを処分できます。または、それらを個別に処分する:
<span>// lib/main.js </span><span>'use babel'; </span> <span>// This is your main singleton. </span><span>// The whole state of your package will be stored and managed here. </span><span>const YourPackage = { </span> <span>activate (state) { </span> <span>// Activates and restores the previous session of your package. </span> <span>}, </span> <span>deactivate () { </span> <span>// When the user or Atom itself kills a window, this method is called. </span> <span>}, </span> <span>serialize () { </span> <span>// To save the current package's state, this method should return </span> <span>// an object containing all required data. </span> <span>} </span><span>}; </span> <span>export default YourPackage; </span>
メニューとキーマップで微調整します
<span>// lib/main.js </span><span>import <span>{ CompositeDisposable }</span> from 'atom'; </span> <span>const YourPackage = { </span> <span>subscriptions: null, </span> <span>activate (state) { </span> <span>// Assign a new instance of CompositeDisposable... </span> <span>this.subscriptions = new CompositeDisposable(); </span> <span>// ...and adding commands. </span> <span>this.subscriptions.add( </span> atom<span>.commands.add('atom-workspace', { </span> <span>'your-package:toggle': this.togglePackage </span> <span>}) </span> <span>); </span> <span>}, </span> <span>// When your package get's deactivated, all added </span> <span>// subscriptions will be disposed of at once. </span> <span>deactivate () { </span> <span>this.subscriptions.dispose(); </span> <span>}, </span> <span>togglePackage () { </span> <span>// Code to toggle the package state. </span> <span>} </span><span>}; </span>
メニュー定義は、メニュー/トップレベルのディレクトリまたはPackage.jsonのメニューキーにJSONファイルとして保存できます。次の例では、パッケージメニューバーとエディターのコンテキストメニューにコマンドを追加します。コンテキストメニューは、エディターの内側を右クリックするときに表示されます。
キーマップを使用すると、パッケージコマンドのショートカットを定義します。それらは特定のスコープに結び付けられており、スコープはAtom-Text-Editor、Atom-Text-Editor:NOT([MINI])またはAtom-WorkspaceなどのCSSセレクターです。セレクターに一致する要素が焦点を合わせ、キーストロークパターンを使用すると、カスタムアクションが放出されます。
<span>// lib/fancy-component.js </span><span>class FancyComponent { </span> <span>constructor (configData) { </span> <span>this.data = configData; </span> <span>} </span> <span>// This method will be called when the class </span> <span>// is restored by Atom. </span> <span>static deserialize (config) { </span> <span>return new FancyComponent(config); </span> <span>} </span> <span>// The returned object will be used to restore </span> <span>// or save your data by Atom. </span> <span>// The "deserializer" key must be the name of your class. </span> <span>serialize () { </span> <span>return { </span> <span>deserializer: 'FancyComponent', </span> <span>data: this.data </span> <span>}; </span> <span>} </span> <span>doSomethingWithData () {} </span><span>} </span> <span>// Add class to Atom's deserialization system </span>atom<span>.deserializers.add(FancyComponent); </span> <span>export default FancyComponent; </span>
Atomでのデバッグは、Webでのデバッグとそれほど違いはありません。 [ビュー]> [開発者]> [開発者]ツールのトグルの下のChrome開発者ツールをアクティブにして、スローされたエラー、コードからログを表示するか、Atomのマークアップの理解を取得できます。
<span>// lib/main.js </span><span>import <span>FancyComponent</span> from './fancy-component'; </span><span>import <span>SomeView</span> from './some-view'; </span> <span>const YourPackage = { </span> <span>fancyComponent: null, </span> <span>someView: null, </span> <span>activate (state) { </span> <span>// If the component has been saved at a previous session of Atom, </span> <span>// it will be restored from the deserialization system. It calls your </span> <span>// your components static 'deserialize()' method. </span> <span>if (state.fancy) { </span> <span>this.fancyComponent = atom.deserializers.deserialize(state.fancy); </span> <span>} </span> <span>else { </span> <span>this.fancyComponent = new FancyComponent({ otherData: 'will be used instead' }); </span> <span>} </span> <span>// More activation logic. </span> <span>}, </span> <span>// As well as your component, your package has a serialize method </span> <span>// to save the current state. </span> <span>serialize () { </span> <span>return { </span> <span>fancy: this.fancyComponent.serialize(), </span> <span>view: this.someView.serialize() </span> <span>}; </span> <span>} </span><span>}; </span>
Atomは、テストのためにJasmineフレームワークを使用します。テストはスペック/トップレベルのディレクトリに配置され、内部のファイルは-spec(例:Fancy-Component-spec.js)で終了する必要があります。テストはパッケージを実行したり公開したりする必要はありませんが、コードの品質をバックアップし、新しい機能を追加するときに何も壊れないことを確認するための良い方法です。
Travis CIでパッケージ仕様を実行したい場合は、Atomのブログにセットアップ方法に関する簡単な投稿があります。
パッケージフロー私の記事が、Atomパッケージ開発の基本的な理解を得るのに役立つことを願っています。まだ多くの機能があり、多くのトピックがありますが、残念ながら1つの記事ではカバーできません。 Atom Flightマニュアルをご覧になって、他に何が可能かを確認してください。
どのパッケージを開発しますか?バニラJavaScriptを使用した原子パッケージの書き込みに関するよくある質問(FAQ)
バニラJavaScriptでモジュールをインポートおよびエクスポートするにはどうすればよいですか?コードにモジュールを含めるための声明をエクスポートします。インポートステートメントを使用すると、別のモジュールから関数、オブジェクト、または値を持ち込むことができますが、エクスポートステートメントでは、モジュールの特定の部分を他のモジュールで利用できるようにすることができます。基本的な例は次のとおりです。
//ここに
} //インポート別のモジュールの関数インポート{myfunction} from './module.js';
Vanilla JavaScriptのモジュール化コードにはいくつかの利点があります。これにより、コードがより整理され、理解しやすくなり、維持されます。また、アプリケーションのさまざまな部分で同じモジュールをインポートして使用できるため、コードの再利用も促進します。さらに、各モジュールは独自の依存関係を指定できるため、依存関係の管理に役立ちます。パッケージをデバッグするために使用できること。このパネルを開くことで、[開発者]> [Developer]ツールを切り替えることができます。ここでは、コードを検査し、ブレークポイントを設定し、変数とネットワークアクティビティを監視できます。さらに、デバッグ目的でコンソールのconsole.log()ステートメントを使用してコンソールに出力してコンソールに出力します。 Atomパッケージが異なるバージョンのAtomと互換性があることを確認するには、Atom APIガイドラインに従い、非推奨APIの使用を避ける必要があります。また、Atomのさまざまなバージョンでパッケージをテストして、互換性の問題を識別および修正する必要があります。さらに、PackageのPackage.jsonファイルに必要な最小Atomバージョンを指定できます。
Try-Catchブロックを使用してAtomパッケージのエラーを処理できます。これにより、コードの実行中に発生する可能性のある例外をキャッチして処理できます。 Atom.Notifications APIを使用して、ユーザーにエラーメッセージを表示することもできます。このAPIは、エラー通知など、さまざまな種類の通知を表示する方法を提供します。
以上がVanilla JavaScriptを使用してAtomパッケージを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。