[解決済み】angular2 + typescriptアプリケーションにlodashをインポートする。
質問
lodashのモジュールをインポートするのに苦労しています。npm+gulpを使用してプロジェクトをセットアップしましたが、同じ壁にぶつかり続けています。通常のlodashも試しましたが、lodash-esも試しました。
lodashのnpmパッケージです。(パッケージのルートフォルダに index.js ファイルがあります)
import * as _ from 'lodash';
結果が出る。
error TS2307: Cannot find module 'lodash'.
lodash-esのnpmパッケージです。(パッケージルートフォルダの lodash.js にデフォルトでエクスポートされています)
import * as _ from 'lodash-es/lodash';
結果が出る。
error TS2307: Cannot find module 'lodash-es'.
gulpタスクとwebstormの両方が同じ問題を報告します。
面白いことに、これは何のエラーも返しません。
import 'lodash-es/lodash';
... しかし、もちろん "_" はありません ...
私のtsconfig.jsonファイルです。
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules"
]
}
私のgulpfile.jsです。
var gulp = require('gulp'),
ts = require('gulp-typescript'),
uglify = require('gulp-uglify'),
sourcemaps = require('gulp-sourcemaps'),
tsPath = 'app/**/*.ts';
gulp.task('ts', function () {
var tscConfig = require('./tsconfig.json');
gulp.src([tsPath])
.pipe(sourcemaps.init())
.pipe(ts(tscConfig.compilerOptions))
.pipe(sourcemaps.write('./../js'));
});
gulp.task('watch', function() {
gulp.watch([tsPath], ['ts']);
});
gulp.task('default', ['ts', 'watch']);
私が正しく理解していれば、tsconfigのmoduleResolution:'node'は、lodashとlodash-esがインストールされているnode_modulesフォルダをimport文に指定するはずです。また、絶対パス、相対パスなど、様々な方法でインポートを試しましたが、うまくいきません。何かアイデアはありますか?
必要であれば、問題を説明するために小さなzipファイルを提供することができます。
解決方法は?
以下は、Typescript 2.0 での方法です。 (tsd と typings は非推奨となり、以下のようになります)。
$ npm install --save lodash
# This is the new bit here:
$ npm install --save-dev @types/lodash
そして、.ts ファイルに
どちらかです。
import * as _ from "lodash";
または(@Naitikの提案のように)。
import _ from "lodash";
何が違うのか、はっきりしない。私たちは最初の構文を使っていますし、それを好んでいます。しかし、最初の構文ではうまくいかないという報告もありますし、後者の構文は遅延ロードされた webpack モジュールと互換性がないとコメントしている人もいます。YMMV。
2017年2月27日に編集しました。
以下、@Koertさんによると。
import * as _ from "lodash";
は、Typescript 2.2.1, lodash 4.17.4, @types/lodash 4.14.53 の時点で、唯一動作する構文です。彼によると、他の import シンタックスの候補は "has no default export" というエラーを出すそうです。
関連
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み】JavaScriptのボタンonclickが機能しない
-
[解決済み】Syntax error: JavaScriptの不正なreturnステートメント
-
[解決済み] [Solved] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングする
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScriptでの取得と設定
-
[解決済み】TypeScriptのインターフェースと型について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】フォームコントロールの値アクセサがない
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングした
-
[解決済み】React、Uncaught ReferenceError。ReactDOMは定義されていません
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み】リソースはドキュメントと解釈されるが、MIMEタイプはapplication/zipで転送される
-
[解決済み】Jestが予期しないトークンに遭遇した
-
[解決済み] [Solved] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングする
-
[解決済み】react router v^4.0.0 Uncaught TypeError: 未定義のプロパティ'location'を読み取れない
-
[解決済み] npm @types org パッケージにおける TypeScript の型付け