2017-02-02 6 views
2

私はエルムの新人だと言って始めましょう。 JavaScriptライブラリを作成するのに私の関心が寄せられています。私が理解しようとしているのは、新しいオブジェクトなどをエンドユーザの観点からインスタンス化する方法です。Elmを使用してJavaScriptライブラリを作成する。どのようにインスタンス化するのですか?

JavaScriptでは私が使用する可能性があります:var my_lib = new MyLibrary();

はエルムでは、私はvar my_lib = Elm.MyLibrary.worker();

を行う必要があるでしょう、私はエルムの方法、それを行うには、エンドユーザーが必要とする必要はありません。私はそれがバニラのJavaScriptのように動作するようにします。

私はGulpワークフローを使用していますので、おそらく答えはその視点から来る可能性があります。私は何も見つけていない。

+2

Elmコード_from_ javascriptを呼び出す場合は、おそらく '.worker()'が最適です。これにより、コマンドとサブスクリプションを通じて 'update'機能を介してポートにアクセスできます。残念ながら、Elmは標準化された将来的な方法でjavascriptに関数を公開していません(javascriptを発行して以来、常に何かをハックすることができますが、後方互換性は保証されません) –

+0

素早い返信。それは私が想定したものです。私は健全性チェックに感謝します。 ;-) –

答えて

1

「バニラのJavaScriptのように振る舞う」という言い方によって異なります。

function myModuleName (maybeSomeArgs) { 
    return new Promise((resolve, reject) => { 
    var app = Elm.MyLibrary.worker(maybeSomeArgs); 
    app.ports.out.subscribe(resolve); 
    app.ports.error.subscribe(reject); 
    }); 
} 

とエンドユーザーはちょうどそれが好きで使用します:もちろん

myModuleName(42).then(doSomething); 

これは、あなたに適応していると仮定しPromiseあなたは単にあなた自身の機能にエルム・インターフェースをラップすることができjavascriptのバニラされた場合このように使用されるElmスクリプト。公開したい機能が複数ある場合は、ポートでそれを処理する必要があります。あなたのエルムアプリのメインはmain = text "some result"のようなものであれば

function myModuleName (maybeSomeArgs) { 
    return new Promise((resolve, reject) => { 
    var node = document.createElement("div"); 
    var app = Elm.MyLibrary.embed(node, maybeSomeArgs); 

    setTimeout(() => { 
     resolve(node.innerText); 
    }, 0); 
    }); 
} 

:あなただけの機能を持っており、クリーンエルムと引き換えに汚れjsのを好むならば、あなたのような何かを行うことができます。

これをエンドユーザー向けにパッケージ化するには、これはファイルで、 cat elm.js > dist.js && cat interfaceCode.js >> dist.jsとするだけです。私は確信している ガルプはそれをやってより複雑な方法があります。

関連する問題