Angular 2 Typescriptアプリでmoment.jsライブラリを使用する方法


231

私はそれをtypescriptバインディングで使用しようとしました:

npm install moment --save
typings install moment --ambient -- save

test.ts:

import {moment} from 'moment/moment';

そしてなし:

npm install moment --save

test.ts:

var moment = require('moment/moment');

しかし、moment.format()を呼び出すと、エラーが発生します。簡単なはずですが、誰もが機能するコマンドライン/インポートの組み合わせを提供できますか?


1
エラーを共有してください
basarat

1
moment.d.tsをインストールしてインポートを使用すると、... / typings / browser / ambient / moment / moment.d.ts(9,21)でコンパイルエラーERRORが表示されます:エラーTS2503:名前空間 'moment'が見つかりません。タイピングをインストールせずにrequireを使用すると、Uncaught TypeErrorが発生します。moment.formatは関数ではありません
Sergey Aldoukhov

ここには古い答えが多すぎます。ここを見て下さい:github.com/angular/angular-cli/wiki/...
Didia

3
ハインリックの答えはNG4(2017年6月現在)と私のために働いたstackoverflow.com/a/43257938/1554495
テンダーロイン

SergeyAldoukhovはこれがまだ最良の答えですか?きっと@Hinrichさんは?
jenson-button-event 2017

回答:


513

2017年4月の更新:

バージョン2.13.0以降、Momentにはtypescript定義ファイルが含まれています。https://momentjs.com/docs/#/use-it/typescript/

コンソールタイプにnpmでインストールするだけです

npm install --save moment

そして、Angularアプリでは、インポートは次のように簡単です。

import * as moment from 'moment';

それだけです。Typescriptを完全にサポートします。

ボーナス編集:Moment Typescriptのように変数またはプロパティを入力するには、次のようにします。

let myMoment: moment.Moment = moment("someDate");

1
それをapp.moduleファイルに追加して配列をインポートすることが重要ですか?または、コンポーネント内にインポートして使用できますか?
キャサリンR

3
@Katherine Rどのファイルでも使用できます。Angular固有ではありません。
Hinrich、2018

さて、モーメントラウンドのようなモーメントプラグインはどうですか?
Greywire 2018

2
実際、この回答はAngular固有ではなく、すべてのTypescriptプロジェクトに適用されます。
Hinrich

すばらしい、そしてテンプレートでパイプをどのように使用するのですか?
vladanPro

98

momentサードパーティのグローバルリソースです。windowブラウザでオブジェクトが存続する瞬間。そのためimport、angular2アプリケーションでは正しくありません。代わりに、<script>moment.jsファイルをロードするタグをHTMLに含めます。

TypeScriptを幸せにするために、次を追加できます。

declare var moment: any;

あなたがそれを使用してコンパイルエラーを停止するファイルの上部に、またはあなたは

///<reference path="./path/to/moment.d.ts" />

または、tsdを使用して、TypeScriptが独自に見つけたmoment.d.tsファイルをインストールします。

import {Component} from 'angular2/core';
declare var moment: any;

@Component({
    selector: 'example',
    template: '<h1>Today is {{today}}</h1>'
})
export class ExampleComponent{
    today: string = moment().format('D MMM YYYY');
}

HTMLにスクリプトタグを追加してください。そうしないと、存在しなくなります。

<script src="node_modules/moment/moment.js" />

モジュールの読み込み moment

まず、瞬間commonjsファイルをロードするためにSystem.jsなどのモジュールローダーをセットアップする必要があります。

System.config({
    ...
    packages: {
        moment: {
            map: 'node_modules/moment/moment.js',
            type: 'cjs',
            defaultExtension: 'js'
        }
    }
});

次に、必要に応じてファイルに瞬間をインポートするには

import * as moment from 'moment';

または

import moment = require('moment');

編集:

WebpackやSystemJSビルダー、Browserifyなどの一部のバンドラーには、ウィンドウオブジェクトから離れるオプションもあります。これらの詳細については、それぞれのWebサイトにアクセスしてください。


3
それは可能ですがSystem、commonjsノードバージョンのloadのようなモジュールローダーが必要であり、それを参照しimport * as moment from 'moment';たりimport moment = require('moment');、すべての意図や目的が同じであるが、 typescriptの微妙な違い。
SnareChops 2016

@SnareChops typings install moment --ambient -- savetypings定義ファイルをプルダウンせず、///<reference path="./path/to/moment.d.ts" />?への参照を作成しませんか?実行時に同じエラーが発生するnpm run tsc
Shawn Northrop

これは誤解を招くものです。import瞬間に問題はありません。
Stiggler 2016年

2
モーメントの定義を管理するにはタイピングを使用する必要があるため、この答えは不完全です。また、何もインポートする必要はありません。下の私の答えをください。
Bernardo Pacheco

8
この答えは誤解を招くものです。モーメントがグローバル変数であるという事実は、スクリプトタグとしてロードする必要があることを意味するものではありません。ある種のバンドラー(Webpack)を使用している場合は、ベンダーファイルにバンドルできます。webpackと適切なローダーを使用している場合は、グローバル割り当てを回避することもできます。
Shlomi Assaf

49

以下は私のために働いた。

まず、瞬間の型定義をインストールします。

typings install moment --save

(注:NOT --ambient

次に、適切なエクスポートの欠如を回避するには:

import * as moment from 'moment';

2
import moment from "moment";それを機能させるために代わりにやらなければなりませんでした。
Aetherix

3
何もインポートする必要がないため、この回答は不完全です。下の私の答えをください。
Bernardo Pacheco

1
あなたも、彼らは日付の答えに最もまでかつて一点もののこれらの提案のいくつかを試してみてもので、またイオン2ベータ/角度2 RCのすべての反復は、物事をインポートする新しい方法を持って来るように見えた
discodane

import * as moment from 'moment';キーです。
ニマ2017年

レジストリで「瞬間」(「npm」)が見つかりません。whenI助け、定義をインストールしてくださいしてみてください
セバスティアン・ロハス

28

私は以下で行きます:

npm install moment --save

あなたへのsystemjs.config.jsファイルのmap配列を追加:

'moment': 'node_modules/moment'

packages配列追加:

'moment': { defaultExtension: 'js' }

あなたのcomponent.tsで使用します: import * as moment from 'moment/moment';

以上です。コンポーネントのクラスから使用できます:

today: string = moment().format('D MMM YYYY');


25

現在モジュールを使用しています。

試す import {MomentModule} from 'angular2-moment/moment.module';

npm install angular2-moment

http://ngmodules.org/modules/angular2-moment


76
これはパイプのみをインストールするため、これでは不十分です。どうやら、この方法でモジュールのモーメント日付を操作することはできません。
ntaso

1
コンポーネントクラスでangular2-momentフィルターを使用する方法に関するいくつかのヒントを気に入っていただけると思います
trickpatty

3
これは次のようになります。 '{MomentModule} from' angular2-moment / moment.module ';
yasser 2017

1
これはもはや選択された答えではありません。@Hinrichの回答を見てください。 npm install moment --savenpm install @types/moment --save stackoverflow.com
questions / 35166168 /…

ラッパーをインストールする代わりに、次のようにする必要がありますimport * as moment from 'moment';
M. Atif Riaz

22

Typescriptプロジェクトでそれを使用するには、瞬間をインストールする必要があります:

npm install moment --save

瞬間をインストールした後、それを.tsインポートした後、任意のファイルで使用できます。

import * as moment from "moment";


1
注** @ types / moment @ 2.13.0:これは、モーメント(github.com/moment/moment)のスタブタイプ定義です。Momentは独自のタイプ定義を提供するため、@ types / momentをインストールする必要はありません。
Winnemucca 2017年

1
すごい!ここで公式リファレンス:momentjs.com/docs
Andrea

14

--- 2017年11月1日更新

タイピングは廃止され、npm @typesに置き換えられました。今後は、型宣言を取得するためにnpm以外のツールは必要ありません。Momentはすでに独自の型定義を提供しているため、Moment を使用するために@typesを介して型定義をインストールする必要はありません。

したがって、それはたった3つのステップに削減されます。

1-タイプの定義を含むインストールの瞬間:

npm install moment --save

2-HTMLファイルにスクリプトタグを追加します。

<script src="node_modules/moment/moment.js" />

3-これで使用できます。限目。

today: string = moment().format('D MMM YYYY');

---元の答え

これは、わずか3つのステップで実行できます。

1-モーメント定義をインストール- * .d.tsファイル:

typings install --save --global dt~moment dt~moment-node

2-HTMLファイルにスクリプトタグを追加します。

<script src="node_modules/moment/moment.js" />

3-これで使用できます。限目。

today: string = moment().format('D MMM YYYY');

dtで入手できるタイピングのバージョンに問題があります。使用したい新しいメソッドがない、古いバージョンのモーメントを使用しています。彼らが推奨するとおりに実行すると(momentjs.com/docs/#/use-it/system-js)、アプリケーションはコンパイルされますが、ブラウザーにロードされません。私は行き止まりに
近づいてい

Angular CLIでスクリプトタグを機能させることができませんでした。インポートよりも理にかなっています
Winnemucca 2017年

@Bernardo私はあなたの手順に従って試し、moment.jsをインストールしました。後declare var moment;しかし、タイピングは私のために働いていません。moment().インテリセンスを入力しなかった後。私はここにいくつかのステップが欠けていると思います。
Shyamal Parikh 2017

これが機能しないことを確認してください。Webパックはこれをビルドノードモジュールに含めることをどのように認識しますか?
ジョニー5

12

角度7+(支持体8とも9)

1:コマンドで瞬間をインストール npm install moment --save

2:に何も追加しないでください app.module.ts

3:次のcomponentように、あなたまたは他のファイルの上にインポート文を追加するだけです:import * as moment from 'moment';

4:momentコードのどこでも使用できるようになりました。と同じように:

myDate = moment(someDate).format('MM/DD/YYYY HH:mm');


私は次のようにインポートする必要がありました。 import * as moment_ from 'moment'; const moment = moment_;それ以外の場合は取得していましたError: Cannot call a namespace ('moment')
Snook

聞くのは非常に奇妙です。moment_単なるリテラル名です。それは何でも
Rahmat Ali

1
import * as moment from 'moment';バンドルのサイズを最大500kb増やすことに注意してください。ソリューションの問題を説明する優れた記事があります。medium.jonasbandi.net/…
Kosmonaft

9

ng CLIを使用

> npm install moment --save

app.module

import * as moment from 'moment';

providers: [{ provide: 'moment', useValue: moment }]

コンポーネントで

constructor(@Inject('moment') private moment)

この方法で、瞬間をインポートします

更新角度=> 5

{
   provide: 'moment', useFactory: (): any => moment
}

私にとってaotとユニバーサルの両方で製品を使用しています

私はモーメントを使う以外は好きではありません。

Error   Typescript  Type 'typeof moment' is not assignable to type 'Moment'. Property 'format' is missing in type 'typeof moment'.

Parameter 'moment' implicitly has an 'any' typeエラーが発生します。
アジマス2017年

これは本番モードで機能しますか?開発モードでは問題なく動作しましたが、アプリを本番モードで実行すると失敗します。私のアプリにも遅延読み込みモジュールがあります(問題が発生した場合に備えて)。瞬間はnullになります。
jbgarr 2017

@jbgarrコンストラクタのような遅延モジュールで試しました(@Inject( 'moment')private moment){console.log( 'date'、moment()); 問題なし
Whisher

8

angular2-momentライブラリには、{{myDate | amTimeAgo}}を.htmlファイルで使用します。

これらの同じパイプは、コンポーネントクラス(.ts)ファイル内のTypescript関数としてもアクセスできます。最初に、指示に従ってライブラリをインストールします。

npm install --save angular2-moment

node_modules / angular2-momentには、現在、calendar.pipe.d.tsdate-format.pipe.d.tsなどの「.pipe.d.ts」ファイルがあります。

これらのそれぞれには、同等のパイプのTypescript関数名が含まれています。たとえば、DateFormatPipe()amDateFormatPipeの関数です。

プロジェクトでDateFormatPipeを使用するには、インポートしてapp.module.tsのグローバルプロバイダーに追加します。

import { DateFormatPipe } from "angular2-moment";
.....
providers: [{provide: ErrorHandler, useClass: IonicErrorHandler}, ...., DateFormatPipe]

次に、関数を使用するコンポーネントで、それを上にインポートし、コンストラクターに注入して使用します。

import { DateFormatPipe } from "angular2-moment";
....
constructor(.......,  public dfp: DateFormatPipe) {
    let raw = new Date(2015, 1, 12);
    this.formattedDate = dfp.transform(raw, 'D MMM YYYY');
}

関数のいずれかを使用するには、このプロセスに従います。すべての機能にアクセスする方法が1つあればいいのですが、上記の解決策はどれもうまくいきませんでした。


これは素晴らしい感謝です!angular2 momentのどこでも、テンプレートでのみ使用する方法を示します。あなたの非常に役立つ投稿で、テンプレートに出力する前に値を操作する方法がわかりました。
アンドリュージュニアハワード

@royappaパイプモジュールを使用しているものと、Typescriptでアクセスするために瞬間を使用しているものがあります。TypescriptでPipesバージョンを使用できるとおっしゃっていますが、両方をインストールすると何が害になるのですか?
ジャック

5

さらにサードパーティのパッケージを追加しても問題ない場合は、angular2-momentライブラリを使用しました。インストールは非常に簡単で、READMEの最新の指示に従う必要があります。その結果、タイピングもインストールしました

私にとっては魅力のように動作し、動作させるためにコードを追加することはほとんどありませんでした。


5

これがまだ人々の問題であるかどうかはわかりません...ライブラリとしてSystemJSとMomentJSを使用すると、これで解決しました

/*
 * Import Custom Components
 */
import * as moment from 'moment/moment'; // please use path to moment.js file, extension is set in system.config

// under systemjs, moment is actually exported as the default export, so we account for that
const momentConstructor: (value?: any) => moment.Moment = (<any>moment).default || moment;

そこから私のためにうまくいきます。


5

angular2 RC5の場合、これは私にとってうまくいきました...

npmによる最初のインストールの瞬間

npm install moment --save

次に、使用するコンポーネントにモーメントをインポートします

import * as moment from 'moment';

最後にsystemjs.config.jsの「マップ」と「パッケージ」でモーメントを設定します

// map tells the System loader where to look for things
  var map = {
  ....
  'moment':                     'node_modules/moment'
  };
  // packages tells the System loader how to load when no filename and/or no extension
  var packages = {
    ...
    'moment':                       { main:'moment', defaultExtension: 'js'}
  };

webpackの同等の手順は何ですか?
Bharat Geleda 2016

@BharatGeleda webpackで何もする必要はありません。Angular2とangular-cliを使用して、npmをインストールしてインポートする必要がありました。最新バージョンのMomentはtypescriptをサポートしているので、タイピングは必要ありませんでした。
Stanislasdrgがモニカを復活させる

1
別のロケールをインポートさせた唯一の解決策:import 'moment/locale/de.js';ありがとう!
iBaff

4

SnareChopの回答に加えて、momentjsの入力ファイルを変更する必要がありました。

ではmoment-node.d.tsI置き換えます:

export = moment;

export default moment;


4

Angularでモーメントを使用する私のバージョン

npm i moment --save

import * as _moment from 'moment';

...

moment: _moment.Moment = _moment();

constructor() { }

ngOnInit() {

    const unix = this.moment.format('X');
    console.log(unix);    

}

最初にモーメントをとしてインポートし_moment、次に初期値がのmomentタイプ_moment.Momentで変数を宣言します_moment()

モーメントのプレーンインポートでは自動補完は行われませんが、呼び出されたモーメントネームスペースで初期化されたパッケージのネームスペースからタイプMomentインターフェースでモーメントを宣言すると、モーメントのAPIが自動補完されます。_moment'moment'_moment()

@types typingsモーメントのようなバニラJavaScriptライブラリのオートコンプリートを探している場合、これは使用せずに、または角度プロバイダーなしでモーメントを使用する最も角度のある方法だと思います。


インストールタイプを使用すると、オートコンプリートにアクセスできるようになります:npm install @types/moment --save
jamesjansson

3

に追加"allowSyntheticDefaultImports": trueしてみてくださいtsconfig.json

フラグは何をしますか?

これは基本的に、TypeScriptコンパイラーに、ES6インポートステートメントを使用しても問題ないことを伝えます。

import * as moment from 'moment/moment';

デフォルトのエクスポートを宣言しないMoment.jsのようなCommonJSモジュール。フラグは型チェックにのみ影響し、生成されたコードには影響しません。

SystemJSをモジュールローダーとして使用する場合に必要です。SystemJSを使用することをTSコンパイラーに指示すると、フラグは自動的にオンになります。

"module": "system"

これにより、IDEがを使用するように構成されている場合、IDEによってスローされたエラーも削除されますtsconfig.json


2

systemjsとjspmを使用するangular2の場合は、次のことを行う必要がありました:

import * as moment_ from 'moment';
export const moment =  moment_["default"];

var a = moment.now();
var b = moment().format('dddd');
var c = moment().startOf('day').fromNow();

2

ANGULAR CLIユーザーの場合

外部ライブラリの使用は、ここのドキュメントにあります:

https://github.com/angular/angular-cli/wiki/stories-third-party-lib

ライブラリをインストールするだけです

npm install lib-name --save

コードにインポートします。ライブラリにタイピングが含まれていない場合は、以下を使用してそれらをインストールできます。

npm install lib-name --save

npm install @ types / lib-name --save-dev

次に、src / tsconfig.app.jsonを開き、タイプ配列に追加します。

"タイプ":["lib-name"]

タイプを追加したライブラリがe2eテストでのみ使用される場合は、代わりにe2e / tsconfig.e2e.jsonを使用します。単体テストとsrc / tsconfig.spec.jsonについても同様です。

ライブラリのタイプが@ types /で利用できない場合でも、手動でタイプを追加して使用できます。

まず、src /フォルダーにtypings.d.tsファイルを作成します。

このファイルは、グローバルタイプ定義として自動的に含まれます。次に、src / typings.d.tsに次のコードを追加します。

モジュール 'typeless-package'を宣言します。

最後に、ライブラリを使用するコンポーネントまたはファイルに、次のコードを追加します。

import * as typelessPackage from 'typeless-package'; typelessPackage.method();

できました。注:使用しようとしているライブラリーのタイプをさらに定義する必要がある、または役立つ場合があります。


詳しい手順については、こちらの記事をご覧ください。medium.com/@jek.bao.choo/...
wag0325

1

Systemを使用して、allowSyntheticDefaultImportsを許可するためのアドバイスに従いました(使用する瞬間からのエクスポートがないため)。それから私は誰かのアドバイスに従って使用しました:

import moment from 'moment';

私のsystem.js設定にマッピングされている瞬間。他のインポート文は、何らかの理由で私には機能しません


これが現時点で最後の回答ですが、機能しているのはこれだけです。
TJL

1

以下は私のために働きました:

typings install dt~moment-node --save --global

モーメントノードがタイピングリポジトリに存在しません。プレフィックスdtを使用して機能させるには、Definitely Typedにリダイレクトする必要があります。


1

私がしたことはsystemjsで、私のsystemjs.config内に私はのためのマップを追加しました moment

map: {
   .....,
   'moment': 'node_modules/moment/moment.js',
   .....
}

そして、あなたはmoment単に行うだけで簡単にインポートすることができます

import * as moment from 'moment'

1

私はそれが古いスレッドであることを知っていますが、私にとって実際に機能した最も簡単な解決策は次のとおりでした:

  1. 最初にインストールする npm install moment --save
  2. node_modulesからそれを必要とする私のコンポーネントで、それを使用します:
const moment = require('../../../node_modules/moment/moment.js');

@Component({...})
export class MyComponent {
   ...
   ngOnInit() {
       this.now = moment().format();
   }
   ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.