使用 Moment.js 制作原生 ELM 模块

Making a Native ELM module with Moment.js

我已经用 Elm 玩了几天,我想移植 Moment.JS,因为我发现缺少我想要的库,而 Moment 正好有我需要的一切。

问题是我总是遇到同样的错误。我的本机文件夹中有 Moment.JS(名为 MomentJS.js)和另一个名为 Moment.js 的文件(我的包装器)。问题是,当我在 Moment.js 中调用 moment 时,我收到一条错误消息,指出该 moment 未定义。

我也尝试在我的 elm 文件中导入 MomentJS.js,在 Moment.js 之后的 and/or 之前。我还尝试将整个 JS 复制到 Moment.js 并在其末尾添加我的包装器。 None 这件事奏效了。你知道我能做什么吗?我一直在互联网上寻找类似的回购协议,但我从未见过一个模块有一个包装器和另一个 JS 文件,只用于本机库。

这是我的 Moment.js 代码:

var _user$project$Native_Moment = (function() {

    var moment = require('moment');


    var format = function ( format, date ) {
        return moment().format();
    }

    return {
        format: format
    };

})();

和我的 Moment.elm 代码:

module Moment exposing (format)

{-| A module desc

@docs format

-}

import Native.MomentJS
import Native.Moment

{-| Call the default `Moment.js` format method
-}
format : String -> String -> String
format fm dt = Native.Moment.format fm dt

我尝试的最后一件事是从 npm 下载 Moment,将其文件夹从 node_modules 文件夹复制到我的本机文件夹并执行 moment = require('moment') 但我得到了 TypeError: fun(...) is not a function

有什么建议吗?

Elm 和 JavaScript 有两种 支持的 方式相互通信:端口和标志。两者都是异步的,对您的需求来说会很尴尬。

https://guide.elm-lang.org/interop/javascript.html

你应该写本机代码吗? Elm 的创造者 says no.

因此最好的方法是使用现有的 time/date 库之一或自己编写您需要的库。

经过一些挖掘,你想要做的是完全可能的,是的! :) 但是,它不会是简单的复制粘贴。查看您发布的源代码 here,它需要将每个函数映射到本地 elm 函数,我建议从这个转换开始。

首先,获取一个简单的 hello world Native 示例工作,请参阅 here

其次,将moment.js中一些比较简单的函数一一加入,我建议从moment\src\lib\format\format.js

开始

最后,我知道这不是你想听到的,但如果你真的想用 elm 编写 javascript,也许 Elm 不是你要找的?我真的无法想象转换一个类似于 Moment.js 的整个库会比创建您自己的受 Moment.js

启发的 Elm 库更简单

无论如何,祝你好运!无论哪种方式似乎都是一个有趣的挑战:)