使用Elm创建JavaScript库。如何实例化?

使用Elm创建JavaScript库。如何实例化?,elm,Elm,让我先说我是埃尔姆的新手。我的兴趣是使用它来编写JavaScript库。我试图理解的是如何从最终用户的角度实例化新对象或类似对象 在JavaScript中,我可能会使用:var my_lib=new MyLibrary() 在Elm中,我需要执行var my_lib=Elm.MyLibrary.worker() 我不想要求最终用户以Elm的方式进行操作。我希望它的行为像香草JavaScript 我应该补充一点,我使用的是一个吞咽式工作流,所以也许答案可以从这个角度得出。我找不到任何东西。这取决于

让我先说我是埃尔姆的新手。我的兴趣是使用它来编写JavaScript库。我试图理解的是如何从最终用户的角度实例化新对象或类似对象

在JavaScript中,我可能会使用:
var my_lib=new MyLibrary()

在Elm中,我需要执行
var my_lib=Elm.MyLibrary.worker()

我不想要求最终用户以Elm的方式进行操作。我希望它的行为像香草JavaScript


我应该补充一点,我使用的是一个吞咽式工作流,所以也许答案可以从这个角度得出。我找不到任何东西。

这取决于“像香草JavaScript一样表现”的含义。如果
Promise
是普通javascript,您可以简单地将Elm接口包装到您自己的函数中:

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);
当然,这是假设您已经调整了Elm脚本,以便以这种方式使用。如果要公开多个函数,则需要在端口中处理这些函数。如果您只有一个函数,并且更喜欢dirtier js以换取cleaner Elm,您可以执行以下操作:

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);
  });
}
如果您的Elm应用程序的main类似于
main=text“some result”

为了给最终用户打包,你可以把它放在一个文件中
cat elm.js>dist.js&&cat interfaceCode.js>>dist.js
。我相信
Gulp有一种更复杂的方法来实现它。

如果你想从javascript调用Elm代码,那么
.worker()
可能是你最好的选择。这将使您能够通过命令和订阅通过
update
功能访问端口。不幸的是,Elm并没有(还没有)以标准化和未来证明的方式向javascript公开函数(因为它毕竟发出javascript,所以您总是可以将一些东西拼凑在一起,但不能保证向后兼容),感谢您的快速回复。这几乎就是我所想的。我感谢你的理智检查。;-)