使用 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 库更简单
无论如何,祝你好运!无论哪种方式似乎都是一个有趣的挑战:)
我已经用 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 库更简单无论如何,祝你好运!无论哪种方式似乎都是一个有趣的挑战:)