29

Angular 2 の公式 AoT ガイドに従おうとしていますが、アプリケーションで Moment.js を使用しています。Moment.js はpackages.jsonファイルにあり、バージョン 2.15.0 を使用しています。これまで、次のようにインポートしてきました。

import * as moment from 'moment';

しかし、ロールアップを実行する必要がある部分に到達すると、次のエラーが発生します。

名前空間を呼び出せません ('moment')

thisによると、私が瞬間をインポートする方法に関連しているようです。それで、私はこれをどのように行うべきですか?他の方法で瞬間をインポートできないようです。私が使用する場合

import moment from 'moment'

コンパイルエラーが発生します

外部モジュール ''moment'' にはデフォルトのエクスポートがありません

4

9 に答える 9

22

私はついに両方のエラーを取り除くことができました。確かに避けるために:

名前空間を呼び出せません ('moment')

以下を使用する必要があります。

import moment from 'moment'

それから避けるために

「瞬間」にはデフォルトのエクスポートがありません

tsconfig.json (compilerOptions) に追加する必要があります。

"allowSyntheticDefaultImports": true

編集 17/11/2016

また、rollup-config.js ファイルに以下を追加する必要がありました。

plugins: [
  nodeResolve({jsnext: true, module: true}),
  commonjs({
    include: [
        'node_modules/rxjs/**',
        'node_modules/moment/**'
      ]
    }
  }),
  uglify()
]
于 2016-10-31T16:08:52.703 に答える
7

タイプスクリプト(2.1.6)とロールアップ(0.41.4)を使用して作業を行うために私がしたことは次のとおりです。

  1. モーメントをインポートするには、標準的な方法を守ってください:

    import * as moment from 'moment';

import moment from 'moment';デフォルトのエクスポートを持たないパッケージでは非標準です。実行時にエラーが発生します。moment_1.default is not a function

  1. typescript では、 moment を any としてキャストして moment を使用し、default関数を呼び出します。

    var momentFunc = (moment as any).default ? (moment as any).default : moment;
    var newFormat = momentFunc(value).format( format );
    

moment(value).format(format)ロールアップ ツリーの揺れでエラーが発生します。Cannot call a namespace ('moment')

于 2017-02-16T09:43:02.137 に答える
3

上記と同じ問題を抱えていました。

import * as moment from 'moment';- systemjs を介して開発およびロードする場合は機能しましたが、ロールアップ中は機能しませんでした。

import moment from 'moment';- ロールアップ ビルドでは機能しましたが、開発中は機能しませんでした。

ビルド タイプに応じてコードを変更する必要がないように、moment をグローバルとして追加し、moment をインポートする代わりに使用する必要があるすべての場所にインポートするヘルパー関数を作成しました。

これは、同じコードが両方のタイプのシナリオで機能することを意味します。それは特にきれいではありませんが、より良い方法があれば私/私たちに知らせてください!

これが独自のファイルに追加されたヘルパー関数ですmomentLoader.ts

import { default as mom } from 'moment';
export default function moment(args?: any): mom.Moment {
    let m = window["moment"];
    if (!m) { 
        console.error("moment does not exist globally.");
        return undefined;
    }
    return m(args);
}

他のクラスでモーメントを使用するには、関数をインポートして、モーメントを直接インポートしたかのように呼び出します。

import moment from '../../momentLoader';

let d = moment().utc("1995-12-25");

let m = moment("1995-12-25");

systemjs をグローバルとしてロードするには、次の手順に従いました。 http://momentjs.com/docs/#/use-it/system-js/

私の場合、systemjs の設定は次のようになります。

let meta = {
    'lib:moment/moment.js': { format: 'global' }
};

System.config({
    paths: paths,
    map: map,
    packages: packages,
    meta: meta
});

System.import('lib:moment/moment.js');

ロールアップ ビルドの場合、残念ながらロールアップ ビルド ファイルに含まれないので、スクリプト タグを使用して moment.js がページのどこかに追加されていることを確認する必要があります。

于 2016-12-09T02:05:20.060 に答える
0

バージョン 2.13.0 の時点で、

import * as moment from 'moment';

于 2016-09-18T08:06:27.640 に答える