如何在 Meteor 中使用`moment.js`?

Posted

技术标签:

【中文标题】如何在 Meteor 中使用`moment.js`?【英文标题】:How to use `moment.js` with Meteor? 【发布时间】:2013-01-18 02:31:12 【问题描述】:

我想将 momentjs 与流星一起使用。这是一个 npm 包,所以据我了解,它不能与流星一起使用,因为流星使用它自己的包系统。所以这是我的问题:

有谁知道将 momentjs 与流星一起使用的方法吗? 有没有办法将 npm 包与流星一起使用?

2017 年编辑:从 Meteor 1.4+ 开始,npm 包管理允许标准导入 npm 模块和命名导入 Atmosphere 模块。

【问题讨论】:

【参考方案1】:

Tyler,我也有同样的问题,并且肯定有很多人试图尽快找到正确的答案,因为这是一件容易的事情,即使是第一次使用流星的人(如我)有这样的问题...

流星包管理

首先,我们将不会使用 NPM,我们将使用 Meteor 包管理中使用的“Meteor”AtmosphereJS 此外,您会在这里找到其他令人惊叹的包...

让我们开始吧

打开您的终端并直接转到您的应用所在的位置,您必须安装正确的依赖项才能这样做:

安装唯一的依赖项

这适用于 Meteor 1.*

 meteor add momentjs:moment

编译您的应用(您可以现在或以后进行)

这会将那个包添加到你的应用程序中,然后再次编译它

meteor

然后转到您的 isClient 中的任何文件

if (Meteor.isClient)    

您可以像在他们的网站MomentJs 上显示的那样使用“时刻”方法!

示例

举个例子,这就是我在我的流星应用中使用的方式

moment(dateToPass).fromNow();

因为我使用的是 Mongo,所以原始数据看起来像这样。

"createdAt" : ISODate("2014-12-12T04:01:21.768Z")

我必须做一个简单的查找查询来获取您的数据,然后您可以像这样处理您的数据(此代码将让您了解我如何使用包含 Date() 的 CreatedAt 值与 MomentJS 一起使用)

var theItemsOnTheArray = SomeArray.find();
var dateToPass;
theItemsOnTheArray.forEach(function (item)  dateToPass = item.createdAt );
return moment(dateToPass).fromNow();

结果将是

// 3 years ago
// 2 years ago
// 21 hours ago
// in 3 hours
// 5 minutes ago

代替:

Thu Dec 11 2014 20:14:08 GMT-0800 (PST)

我希望它对你们中的任何人有用,如果您认为它有有价值的信息,请 +1 ;) 谢谢!

【讨论】:

非常好的帖子。您包含 Meteor 的版本,链接到 momentjs 示例,并优雅地使用 Markdown 格式。如果可以的话加 2 :) 惊人的答案,你帮了我很多!【参考方案2】:

对于像 moment.js、validate.js、underscore.string.js 等独立的 js 库,您可以将源文件放到您的 lib 文件夹中。我将 client/lib 用于仅用于客户端的库(如 validate.js),lib 用于客户端和服务器均可使用的库(如 moment.js)。

如果您使用meteorite,则可以利用atmosphere 软件包。您正在寻找的一些内容可能在其中。

使用来自流星的 npm 模块是很多人询问的问题(有充分的理由)。你可以看到一些注释here,尽管我亲耳听说流星与 npm 包的对话方式即将发生重大变化。

【讨论】:

太棒了!我肯定想请求与 npm 包直接交互... 正如 David Weldon 所说,Meteorite 包管理器是您的最佳选择。 atmosphere.meteor.com 有一个包,我已经使用了几个月,没有任何问题。安装 Meteorite 然后运行mrt add moment,你应该完成了。 Meteor 开发团队目前正在开发他们自己的基于 Meteorite 的包管理器,因此使用大气包也应该是未来的一个好习惯。至于 npm 包,可以在 Meteor 中使用它们,但您必须小心确保包可以在服务器上的 Meteor 纤程中工作。 我对气氛包的唯一警告是其中一些似乎没有得到维护。我使用了几个软件包,维护者真正掌握最新版本。另一方面,许多软件包看起来就像废弃软件。长话短说,在运行 mrt add 之前,您可能需要做一些功课。 截至 2014 年 8 月,Atmosphere 上的所有 momentjs 和 momenttimezone 包都已过时。您最好的选择是将最新版本放在 lib 文件夹中【参考方案3】:

2017 更新 - Meteor 1.4+ 在 ES6 中使用 npm 模块。 OP是2013年的。

这样……

只有 npm 的方式:

以这种方式使用npmimportmoment 安装到您的meteor 项目...

$ cd /path/to/my/meteor/project
$ npm install --save moment

// inside your Meteor app files...
import moment from 'moment';

使用一揽子导入的流星-npm 方式:(谢谢,@Dave Gööck)

$ cd /path/to/my/meteor/project
$ meteor npm install --save moment

// Inside Meteor app...
import * as moment from 'moment';
// OR
import moment from 'moment';

更多关于 Meteor-npm 包导入here。 (特别提到moment)。

【讨论】:

这可以改进一点。我可以通过 npm:meteor npm install --save moment 安装 moment 并通过 import * as moment from 'moment'; 导入它来使用流星 1.5.1 的导入 - 提到的链接也已过时。【参考方案4】:

这个问题是3年前问的,当时还没有大气的官方包。自从提出问题以来,事情发生了变化,我指出了该包何时添加到流星存储库中。

从大气中安装官方包

meteor add momentjs:moment

如果您使用的是打字稿,则只需

import * as moment from "moment/moment";

然后在你的代码中

let date = moment(<some date>).format('YYYY MM DD');

【讨论】:

这个问题是3年前问的,当时还没有大气的官方包。就目前而言,您的答案不是很有用,因为它不符合 OP 需要提出问题的事实。如果您在回答中概述了自从提出问题以来情况发生了变化并指出该包何时添加到流星存储库中,那么您的回答将是一个非常有用且值得注意的答案。 不要忘记将“@types/moment”添加到您的 package.json 中,这样您就可以使用它而不会收到来自 TypeScript 编译器的任何警告。【参考方案5】:

我有一个更复杂的问题,因为:

    我想添加“pl”语言环境 我需要它来使用 TypeScript

我很想知道有一种更简单的方法可以实现这些目标,但是 以下是我为最终使其工作而采取的步骤:

第 1 步。$ meteor add momentjs:moment

第 2 步。下载文件 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/moment/moment-node.d.ts 并保存为 ./typings/moment/moment.d.ts (出于某种原因,仅执行 typings install dt~moment--global --save 将无法解决问题,因为它只会下载几乎空的文件https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/moment/moment.d.ts 文件引用了包含真实内容的 moment-node.d.ts 文件)

步骤 3. 将以下行附加到 moment.d.ts:

declare module "meteor/momentjs:moment" 
  var moment: moment.MomentStatic;

第 4 步:下载 https://raw.githubusercontent.com/moment/moment/develop/locale/pl.js(或任何其他语言环境)并将其保存在 ./client/lib/moment/locale/pl.js(或 ./client 下的任何其他目录)中

第 5 步. 编辑 ./client/lib/moment/locale/pl.js 的开头和结尾,在开头用一行替换加载器代码

import  moment  from 'meteor/momentjs:moment';

第 6 步。最后你可以在任何模块中使用 moment js,只需附加

import  moment  from "meteor/momentjs:moment";

在文件的开头,然后你可以这样做例如:

moment(ts).locale('pl').format('LLL');

如果您使用 'meteor/tap:i18n' 包,您可能希望使用在启动期间传递给 TAPi18n.setLanguage(...); 的相同语言。您可能需要使用

创建 typings/globals/meteor_tap_i18n.d.ts 文件
declare module "meteor/tap:i18n" 
  export var TAPi18n : TAPi18nStatic;
  interface TAPi18nStatic
     setLanguage(name:string):any;
     getLanguage():string;
     __(name:string,params?:any):string;
  

然后你可以在你的模块中使用它

import  TAPi18n  from 'meteor/tap:i18n';
//...
moment(ts).locale(TAPi18n.getLanguage()).format('LLL');

【讨论】:

以上是关于如何在 Meteor 中使用`moment.js`?的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中使用moment(moment.js)做大于或等于?

如何使用 npm 在 ES6 中导入 moment.js?

如何在反应应用程序中动态导入moment.js(使用打字稿)

如何在 moment.js 持续时间内使用 format()?

使用moment.js解析时如何忽略时区

如何在 Angular 2 typescript 应用程序中使用 moment.js 库?