私は 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 _;
}));