KOTLIN/JSにおけるNPMモジュールの使い方(第1部)


KotlinjsはJavaScriptの利点と利点を組み合わせたJavaScriptプロジェクトを作成するエキサイティングな新しい方法です.プラス能力を簡単にテストを追加しても、プラットフォーム間でコードを共有します.
kotlinjsはKotlinコードをJavaScriptに移しているので、Kotlin言語の利点を楽しんでいる間、あなたにnodeJSプログラムを実行することのすべての利点を与えます.

があるmany use cases Kotlinjsのために、そして、このシリーズでは、我々は不活発なロボットをつくるでしょう.不調和は、友人と連絡を取り合うための素晴らしいプラットフォームであり、ボットを追加することは、その経験を豊かにすることができます.私たちは、このロボットをNPMDiscordJS .
それで、どのように、あなたはKotlinjsを使っている不活発なロボットをつくりますか?これはやや大きな話題なので、このポストは3つのポストのシリーズで最初になるでしょう.
  • このポストでは、我々はKotlinjsがどのようにノードモジュールを使用するかについて行きます.これはKotlinjsへのイントロのより多くで、不和をカバーしません.
  • 次の投稿ではDiscOrdJSの実装とメッセージに対する対応について説明します.
  • 最後のポストでは、私たちは、ボットが展開する前に予想通りに働くことを確認するためにいくつかの単体テストを加えます.
  • 概要


    このシリーズの終わりには、それが実行しているコンピュータの名前と特定のメッセージに応答する小さな不調和ボットを持っているでしょう.この最初の部分では、ボットが起動時にコンソールに印刷されますが、メッセージへの応答は後に別の部分に来るでしょう.

    必要条件

  • コリン経験
  • JS経験
  • Intellijのアイデア(コミュニティ版を使っています)
  • ニュープロジェクト


    始めるには、まずjs project setup 古林遺跡必ず選択するNodeJS Application , ないbrowser )
    これはプロジェクトを作成しますMain.kt ファイルと挨拶機能.プロジェクトを実行するには./gradlew run 端末で.ご覧くださいHello, YOUR_BOT_NAME 端末で!

    ノードモジュールのインポート


    どのようにkotlinjsはノードモジュールを処理する方法に慣れることで始めることができます.
    ボットに名前を付けてメッセージを送るには、単純なノードモジュールを使いましょうcomputer-name . プロジェクトの設定で述べたように、ノードモジュールはbuild.gradle ファイル.必要ありませんrequire または特別なインポート.この行をあなたの依存関係に追加します.
    dependencies {
        implementation(npm("computer-name", "0.1.0"))
    }
    
    あなたが電話しようとするならばcomputerName() さて、あなたはUnresolved reference エラーです.これはJavaScriptとKotlinの重要な違いのためです.

    Javascript is loosely typed and kotlin is strongly typed


    したがって、この関数を使用するには、外部関数を使用して定義する必要があります.

    外部


    Kotlin博士は、言及しますExternal Modifier , これは純粋なJavaScriptコードを宣言するために使用されます.これは、このクラスまたは関数がノードモジュールによって外部で定義されることを期待していることをコンパイラに伝えます.モジュールを使いたいときは、関数とクラスを定義しなければなりません.重要な注意点は以下の通りです.

    You only need to define what you are using


    ですから、参照する必要があるモジュール全体を定義する必要はありません.
    だから私たちはcomputerName() 以下のように定義されているコンパイラに対して定義を行います.
    @JsModule("computer-name")
    external fun computerName(): String
    
    また、モジュール名で関数を注釈する必要があることに注意してください.compilerReferenceError ).
    この定義はNPMページに基づいて理解するのが簡単でした、しかし、我々がわかるように、あなたはドキュメントを元の定義を見つけるためにノード・モジュールのソースコードに掘り下げなければならないかもしれません.

    モジュールシステム
    もう一つの定義は、モジュールシステムです.あなたは、より多くの情報を見つけることができますhere , しかし、短いkotlinjsサポートUMD , AMD and commonJS システムcommonJS ので、我々は追加されますnodejsのために広く使用されますuseCommonJs() 我々にbuild.gradle ファイル.
    kotlin {
        js(IR) {
            useCommonJs()
        }
    }
    
    今すぐ追加println(computerName()) to main() プロジェクトを実行します.
    端末でコンピュータの名前を見るべきです.おめでとう!では、インポートクラスを見てみましょう.

    NODEJSクラスのインポート


    これまでのところ、我々はcomputerName() 例として、一つの関数を持つ小さなモジュールです.また、プロジェクトで使用するモジュールからクラスやインターフェイスをインポートできるようにすることも重要です.
    この例では、YouTubeの動画を探すことができる小さなモジュールです(注:YouTube APIキーなしで結果を得ることはありませんが、コールはまだ必要です).NPMのページからは、カスタム結果を返す検索機能が表示されます.それで、我々はKotlinでこれをどう定義しますか?
    このモジュールで定義がある間、我々はより多くの情報を得るために行く必要があります.それは非常に簡単に定義されているので、このモジュールは簡単にtypescriptで書かれているindex.d.ts .

    デュカート
    手動で変換する前に手動でkotlinコードに変換するには、このツールを自動的に行うにはDukat . それは簡単に変換を助けることができる強力なツールですが、このポストのために私は手動でどのようにそれが動作するかの良い理解を持っているので、手動でkotlinに変換する方法について行きたい.

    手動で
    レポオープンからindex.d.ts ファイルと下部にスクロール機能を検索するスクロールします.
    declare function search(
      term: string,
      opts: search.YouTubeSearchOptions,
      cb?: (err: Error, result?: search.YouTubeSearchResults[], pageInfo?: search.YouTubeSearchPageResults) => void
    ): Promise<{results: search.YouTubeSearchResults[], pageInfo: search.YouTubeSearchPageResults}>;
    
    次のようになります.
  • カスタムオプションクラス
  • オプションのエラーを返すコールバック、結果配列、pageInfo配列
  • それから、ファックは約束を返します.幸いにも、Kollinはエラーを定義しますstdlib また、約束のインポートも含みます.
    import kotlin.js.Promise
    
    だから難しい部分は結果とオプションです.私たちはYouTubeSearchResults and YouTubeSearchPageResults インタフェースですので、以下のように簡単に定義できます:
    @file:JsModule("youtube-search")
    // Note that for multiple definitions in the same file you can use @file
    
    external interface YouTubeSearchPageResults {
      val totalResults: Int
      ...
    }
    
    external interface YouTubeSearchResults {
      val id: String
      ...
    }
    
    現在YouTubeSearchOptions 我々は同じアプローチをすることができました、しかし、我々が使うことができるもう一つのオプションがあります.

    JSON
    我々は、単にJson クラスオブジェクトです.HashMap . この方法では、インターフェイスを定義せずに、欲しいものを渡すことができます.あなたが通過されるオブジェクトの明確な定義を見つけることができないならば、これもよく働きます.
    import kotlin.js.Json
    
    val options = json(
        Pair("maxResults", 1),
        Pair("key", YOUR_YOUTUBE_API_KEY) // Leave this blank if you don't have one
    )
    
    このようにして、外部検索関数を作成することができます.
    @JsModule("youtube-search")
    external fun search(
        term: String,
        opts: Json,
        cb: (
            err: Error?,
            result: Array<YouTubeSearchResults>?,
            pageInfo: YouTubeSearchPageResults?
        ) -> Unit // Unit acts as Void in kotlin
    ) : Promise<Json>
    
    search("your search", options) { err, result, pageInfo ->
        print("Youtube callback $err, $result, $pageInfo\n")
    }
    
    プロジェクトに追加して実行します.APIキーを持っていないなら、端末でこれを見てください.
    Youtube callback Error: Request failed with status code 403, null, null
    
    APIキーを持っているなら、次のようになります.
    Youtube callback null, [...], [object Object]
    

    結論


    おめでとう、あなたは輸入NPMモジュールでKotlinjsプロジェクトを持っています!次の投稿ではDiscOrdJSを使用して私たちの不和のボットを作成するの詳細について行きます.
    読書ありがとう!あなたが質問をするならば、コメントで知らせてください.また、あなたはTwitterで私に手を差し伸べることができます.