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

10

我想在Meteor中使用momentjs。 由于Meteor使用自己的包系统,momentjs是一个npm包,所以据我了解,它不能用于Meteor。 所以这里有我的问题:

  • 有人知道如何在Meteor中使用momentjs吗?
  • 是否有一种方法可以在Meteor中使用npm包?

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

5个回答

23

Tyler,我有同样的问题,肯定有很多人都想尽快找到正确答案,因为这是一件容易的事情,即使第一次使用Meteor的人(像我)也会有这种问题...

Meteor包管理

首先,我们不会使用NPM,而是使用AtmosphereJS从Meteor包管理器中获取。在这里,您还可以找到其他令人惊叹的软件包...

让我们开始吧

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

安装唯一的依赖项

这将适用于Meteor 1.*

 meteor add momentjs:moment

编译您的应用程序(现在或稍后都可以)

这将向您的应用程序中添加该软件包,之后再次使用编译器进行编译。

meteor

并且进入您的isClient中的任何文件,就像这样

if (Meteor.isClient) {   }

您可以像他们在网站上展示的那样使用'moment'方法MomentJs示例 举个例子,这是我在我的Meteor应用程序中使用的方式。
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)

我希望这对你们中的任何人都有用,如果你认为它具有有价值的信息,请点赞;)谢谢!

2
非常好的帖子。您包含了Meteor的版本,链接到momentjs的示例,并巧妙地使用了Markdown格式。如果我可以的话,加2分 :) - Dean Radcliffe
你的回答太棒了,帮了我很多! - svelandiag

10

对于像moment.js、validate.js、underscore.string.js等独立的js库,您可以将源文件直接放入lib文件夹中。我使用client/lib存放仅在客户端使用的库(如validate.js),而使用lib存放可能由客户端和服务器同时使用的库(如moment.js)。

如果您使用meteorite,您可以利用atmosphere packages。这些packages中可能包含了您需要的一些内容。

使用meteor从npm模块中获取modules是很多人问及的问题(有很好的原因)。您可以看到一些注释here,但我听说meteor与npm packages通信的方式即将发生重大变化。


太棒了!我肯定想要请求与npm包的直接交互... - Tyler Jones
1
正如David Weldon所说,Meteorite软件包管理器是这里的最佳选择。http://atmosphere.meteor.com有一个moment软件包,我已经使用了几个月而没有任何问题。安装Meteorite,然后运行`mrt add moment`,你就完成了。Meteor开发团队正在开发基于Meteorite的自己的软件包管理器,因此在未来使用大气层软件包应该是一个好的实践。至于npm软件包,在Meteor中使用它们是可能的,但你必须小心确保软件包在服务器上的纤维内工作。 - zorlak
3
关于氛围包我唯一的建议是有些包似乎没有维护。有一些我使用的包,维护者确实非常关注最新版本。另一方面,许多包看起来就像废弃的软件。简而言之,在运行“mrt add”之前,您可能需要做一些功课。 - David Weldon
截至2014年8月,Atmosphere上的所有momentjs和momenttimezone包都已过时。您最好将最新版本放入lib文件夹中。 - Amc_rtty

6

2017年更新 - Meteor 1.4+使用带有ES6的npm模块。OP来自2013年。

因此...

仅限于npm的方法:

使用npmmoment安装到您的Meteor项目中,并以以下方式进行import...

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

// inside your Meteor app files...
import moment from 'moment';
使用meteor-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包的导入,这里有更多相关信息。 (具体提到了moment)。


这个可以稍微改进一下。我能够在meteor 1.5.1中使用import,通过npm安装moment:meteor npm install --save moment,并通过import * as moment from 'moment';导入它。此外,提到的链接已经过时了。 - Dave Gööck

5

这个问题是3年前提出的,当时还没有官方的atmosphere软件包。随着时间的推移,情况发生了变化,我指出当软件包被添加到meteor repos时。

安装来自atmosphere的官方软件包。

meteor add momentjs:moment

如果您正在使用TypeScript,只需要:
import * as moment from "moment/moment";

那么在你的代码中:
let date = moment(<some date>).format('YYYY MM DD');

1
这个问题是3年前提出的,当时大气层还没有官方包。现在看来,你的回答并不是很有用,因为它没有涉及到OP提出问题的原因。如果你在回答中概述了问题提出时的情况,并指出该包何时被添加到Meteor仓库中,那么你的回答将会非常有用和值得注意。 - grochmal
不要忘记在你的 package.json 中添加 "@types/moment",这样你就可以在 TypeScript 编译器中使用它而不会收到任何警告。 - omt66

2

我遇到了比较复杂的问题,因为:

  1. 我想要添加'pl'本地化
  2. 我需要让它与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';

第六步:最后,您可以在任何模块中使用moment.js,只需添加

即可。
import { moment } from "meteor/momentjs:moment";

在文件开头加上以下代码,然后你就可以进行例如以下的操作:
moment(ts).locale('pl').format('LLL');

如果您正在使用'meteor/tap:i18n'包,则可能希望使用与启动期间传递给相同的语言。您可能需要创建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');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接