4

私は JS と Kotlin/JS が初めてです。例から、Obsidianのプラグイン用の次の最小限の作業 Javascript コードがあります。期待どおりに動作します:

var obsidian = require('obsidian');
class SomePlugin extends obsidian.Plugin {
    onload() {
        new obsidian.Notice('This is a notice!');
    }
}
module.exports = Plugin;

私は言語を知っているので、Kotlin を使用してこのプラグインを拡張したいと考えていましたが、これを Kotlin/JS に変換する際に問題が発生しました。これまでの私のアプローチ:

実行可能なプロジェクトは、こちらの Github にあります。を実行gradle buildして、ビルド フォルダーを生成します。ブラウザーのステップで失敗しますが、そのステップは必要ありません。ビルド後、生成された js ファイルはbuild\js\packages\main\kotlin\main.js.

main.kt

@JsExport
class SomePlugin: Plugin() {
    override fun onload() {
        Notice("This is a notice!")
    }
}
@JsModule("obsidian")
@JsNonModule // required by the umd moduletype
external open class Component {
    open fun onload()
}
@JsModule("obsidian")
@JsNonModule
external open class Plugin : Component {
}
@JsModule("obsidian")
@JsNonModule
external open class Notice(message: String, timeout: Number = definedExternally) {
    open fun hide()
}

編集:@S.Janssenのコメントのおかげで、モジュールタイプをumdに切り替えました

build.gradle.kts

plugins {
    kotlin("js") version "1.5.20"
}
group = "de.example"
version = "1.0-SNAPSHOT"
repositories {
    mavenCentral()
}
dependencies {
    implementation(npm("obsidian", "0.12.5", false))
}
kotlin {
    js(IR) {
        binaries.executable()
        browser {
            webpackTask {
                output.libraryTarget = "umd"
            }
        }
    }
}

tasks.withType<KotlinJsCompile>().configureEach {
    kotlinOptions.moduleKind = "umd"
}

で実行できる結果は実際には必要ありませんがbrowser、定義がなければbrowser、js ファイルも生成されません。そのbrowser部分では、と言って例外がスローされますCan't resolve 'obsidian' in 'path\kotlin'。ただし、少なくとも .js ファイルは の下に作成されbuild/js/packages/test/kotlin/test.jsます。しかし、コードは私の期待したコードとは完全に異なっており、有効なプラグイン コードとしてオブシディアンに受け入れられていません。他のいくつかのgradleオプションも試しました。「umd」、「amd」、「plain」、IR の代わりのレガシー コンパイラ、ブラウザの代わりの nodejs など。しかし、実行可能な js ファイルを作成するものは何もありません。エラー メッセージが異なります。従来のコンパイラでは、kotlin.js ファイルが必要であり、フォルダのすぐ隣に配置したり、コンテンツをスクリプトにコピーしたりしても、見つけることができません。

上記の Javascript コードと機能的に似たコードを取得するにはどうすればよいですか? オーバーヘッドがあることは理解していますが、現在生成されているコードは、私の理解ではクラスを定義またはエクスポートすることさえありません。

obisidan デバッガーから表示されるエラー メッセージ:

Plugin failure: obsidian-sample-plugin TypeError: Object prototype may only be an Object or null: undefined

生成されたコード:

    (function (root, factory) {
  if (typeof define === 'function' && define.amd)
    define(['exports', 'obsidian', 'obsidian', 'obsidian'], factory);
  else if (typeof exports === 'object')
    factory(module.exports, require('obsidian'), require('obsidian'), require('obsidian'));
  else {
    if (typeof Component === 'undefined') {
      throw new Error("Error loading module 'main'. Its dependency 'obsidian' was not found. Please, check whether 'obsidian' is loaded prior to 'main'.");
    }if (typeof Plugin === 'undefined') {
      throw new Error("Error loading module 'main'. Its dependency 'obsidian' was not found. Please, check whether 'obsidian' is loaded prior to 'main'.");
    }if (typeof Notice === 'undefined') {
      throw new Error("Error loading module 'main'. Its dependency 'obsidian' was not found. Please, check whether 'obsidian' is loaded prior to 'main'.");
    }root.main = factory(typeof main === 'undefined' ? {} : main, Component, Plugin, Notice);
  }
}(this, function (_, Component, Plugin, Notice) {
  'use strict';
  SomePlugin.prototype = Object.create(Plugin.prototype);
  SomePlugin.prototype.constructor = SomePlugin;
  function Unit() {
    Unit_instance = this;
  }
  Unit.$metadata$ = {
    simpleName: 'Unit',
    kind: 'object',
    interfaces: []
  };
  var Unit_instance;
  function Unit_getInstance() {
    if (Unit_instance == null)
      new Unit();
    return Unit_instance;
  }
  function SomePlugin() {
    Plugin.call(this);
  }
  SomePlugin.prototype.onload_sv8swh_k$ = function () {
    new Notice('This is a notice!');
    Unit_getInstance();
  };
  SomePlugin.prototype.onload = function () {
    return this.onload_sv8swh_k$();
  };
  SomePlugin.$metadata$ = {
    simpleName: 'SomePlugin',
    kind: 'class',
    interfaces: []
  };
  _.SomePlugin = SomePlugin;
  return _;
}));
4

1 に答える 1