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 iパッケージのルートフォルダーにデフォルトのエクスポートがあります)
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フォルダを指すべきです。絶対パス、相対パスなど、さまざまな方法でインポートすることも試みましたが、うまくいかないようです。何か案は?
必要に応じて私は問題を説明するために小さなZipファイルを提供することができます。
TypeScript 2.0以降でこれを行う方法は次のとおりです。(tsdと入力は、以下の理由により廃止予定です):
$ 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の時点で唯一有効な構文です。彼は、他の推奨されているインポート構文は「デフォルトのエクスポートがありません」というエラーを出すと言っています。
2016年9月26日に更新:
@ Taytayの答えが言うように、数ヶ月前に使用した「タイピング」インストールの代わりに、次のように使用できます。
npm install --save @types/lodash
その答えを裏付ける追加の参考文献があります。
まだtypingsインストールを使用している場合は、 ' - ' - ambient '' 'および' ' - - global' ''に関する以下のコメント(他の人による)を参照してください。
また、新しいクイックスタートでは、configはindex.htmlには含まれていません。これはsystemjs.config.tsにあります(SystemJSを使用している場合)。
元の答え:
これは私のMac上で動作しました( クイックスタート に従ってAngular 2をインストールした後):
Sudo npm install typings --global
npm install lodash --save
typings install lodash --ambient --save
さまざまなファイルが影響を受けます。
Angular 2のクイックスタートはSystem.jsを使用しているので、index.htmlの設定に次のように「map」を追加しました。
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
map: {
lodash: 'node_modules/lodash/lodash.js'
}
});
それから私の.tsコードで私はすることができました:
import _ from 'lodash';
console.log('lodash version:', _.VERSION);
2016年半ばからの編集:
@tibbusが述べているように、いくつかの状況では、あなたが必要とします:
import * as _ from 'lodash';
angular2-seed から開始し、毎回インポートしたくない場合は、マップとインポートの手順をスキップして、tools/config/project.config.tsのlodash行をコメント解除するだけで済みます。
私のテストがlodashで動くようにするために、私はまたkarma.conf.jsのファイル配列に行を追加しなければなりませんでした:
'node_modules/lodash/lodash.js',
ステップ1:依存関係にlodashを含めるようにpackage.jsonファイルを変更します。
"dependencies": {
"@angular/common": "2.0.0-rc.1",
"@angular/compiler": "2.0.0-rc.1",
"@angular/core": "2.0.0-rc.1",
"@angular/http": "2.0.0-rc.1",
"@angular/platform-browser": "2.0.0-rc.1",
"@angular/platform-browser-dynamic": "2.0.0-rc.1",
"@angular/router": "2.0.0-rc.1",
"@angular/router-deprecated": "2.0.0-rc.1",
"@angular/upgrade": "2.0.0-rc.1",
"systemjs": "0.19.27",
"es6-shim": "^0.35.0",
"reflect-metadata": "^0.1.3",
"rxjs": "5.0.0-beta.6",
"zone.js": "^0.6.12",
"lodash":"^4.12.0",
"angular2-in-memory-web-api": "0.0.7",
"bootstrap": "^3.3.6" }
ステップ2:私はAngular 2アプリケーションでSystemJsモジュールローダを使用しています。そのため、system ls.ashをマップするようにsystemjs.config.jsファイルを変更します。
(function(global) {
// map tells the System loader where to look for things
var map = {
'app': 'app', // 'dist',
'rxjs': 'node_modules/rxjs',
'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
'@angular': 'node_modules/@angular',
'lodash': 'node_modules/lodash'
};
// packages tells the System loader how to load when no filename and/or no extension
var packages = {
'app': { main: 'main.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'angular2-in-memory-web-api': { defaultExtension: 'js' },
'lodash': {main:'index.js', defaultExtension:'js'}
};
var packageNames = [
'@angular/common',
'@angular/compiler',
'@angular/core',
'@angular/http',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/router',
'@angular/router-deprecated',
'@angular/testing',
'@angular/upgrade',
];
// add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' }
packageNames.forEach(function(pkgName) {
packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
});
var config = {
map: map,
packages: packages
}
// filterSystemConfig - index.html's chance to modify config before we register it.
if (global.filterSystemConfig) { global.filterSystemConfig(config); }
System.config(config);})(this);
ステップ3:今すぐnpm installを行います
ステップ4:あなたのファイルでlodashを使う。
import * as _ from 'lodash';
let firstIndexOfElement=_.findIndex(array,criteria);
npm install --save lodash
npm install -D @types/lodash
//some_module_file.ts
// Load the full library...
import * as _ from 'lodash'
// work with whatever lodash functions we want
_.debounce(...) // this is typesafe (as expected)
import * as debounce from 'lodash/debounce'
//work with the debounce function directly
debounce(...) // this too is typesafe (as expected)
UPDATE - March 2017
私は現在ES6 modules
で作業しています、そして最近私はlodash
で作業することができました:
// the-module.js (IT SHOULD WORK WITH TypeScript - .ts AS WELL)
// Load the full library...
import _ from 'lodash'
// work with whatever lodash functions we want
_.debounce(...) // this is typesafe (as expected)
...
import
固有のlodash functionality
:import debounce from 'lodash/debounce'
//work with the debounce function directly
debounce(...) // this too is typesafe (as expected)
...
_ note _ - syntax
では* as
という違いは必要ありません
がんばろう。
TypeScript 2.0以降、@ types npmモジュールはタイピングをインポートするために使用されます。
# Implementation package (required to run)
$ npm install --save lodash
# TypeScript Description
$ npm install --save @types/lodash
この質問に回答したので、lodashを効率的にインポートする方法について説明します。
ライブラリ全体をインポートするためのフェイルセーフな方法(main.ts)
import 'lodash';
あなたが必要とする機能を備えた軽量なlodashを実装する
import chain from "lodash/chain";
import value from "lodash/value";
import map from "lodash/map";
import mixin from "lodash/mixin";
import _ from "lodash/wrapperLodash";
ソース: https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba#.kg6azugbd
シモンズ:上記の記事は、ビルド時間の改善とアプリサイズの縮小に関する興味深い記事です。
次のコマンドを使用して、プロジェクトにlodashを正常にインポートしました。
npm install lodash --save
typings install lodash --save
それから私は以下の方法でそれをインポートしました:
import * as _ from 'lodash';
そしてsystemjs.config.jsで私はこれを定義しました:
map: { 'lodash' : 'node_modules/lodash/lodash.js' }
もう一つの優雅な解決策はあなたが必要なものだけを手に入れることであり、すべてのlodashをインポートすることではありません。
import {forEach,merge} from "lodash";
そしてそれをあなたのコードで使う
forEach({'a':2,'b':3}, (v,k) => {
console.log(k);
})
私は全く同じ問題を抱えていましたが、Angular 2アプリで、この記事はそれを解決します: https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1#.p6gra5eli
記事のまとめ:
npm install lodash --save
tsd install underscore
<script src="node_modules/lodash/index.js"></script>
を含めるSystem.config({ paths: { lodash: './node_modules/lodash/index.js'
import * as _ from ‘lodash’;
のインポート私はそれがあなたのケースにも役立つことを願って
他の誰かがこの問題に遭遇し、上記の解決策のどれも「重複した識別子」の問題のためにうまくいかない場合は、これを実行します。
npm install typings --global
タイピングの古いバージョンでは物事がめちゃくちゃになり、あなたは "重複した識別子"の問題の束を得るでしょう。また私が言うことができる限りあなたはもう--ambient
を使う必要はありません。
そのため、タイピングが最新のものになると、これは機能するはずです(Angular 2クイックスタートを使用)。
実行します。
npm install lodash --save
typings install lodash --save
まず、これをsystemjs.config.jsに追加します。
'lodash': 'node_modules/lodash/lodash.js'
これで任意のファイルでこれを使うことができます:import * as _ from 'lodash';
問題が解決しない場合は、typingsフォルダを削除してnpm install
を実行してください。
npm install --save
はあなたのアプリがプロダクションコードに要求するどんな依存性も育てることに注意してください。
「タイピング」に関しては、最終的にはJavaScriptに変換されるTypeScriptによってのみ必要とされます。したがって、あなたはおそらくそれらをプロダクションコードに入れたくないでしょう。代わりに、あなたのプロジェクトのdevDependencies
に入れることをお勧めします。
npm install --save-dev @types/lodash
または
npm install -D @types/lodash
(例えばAkashの投稿を見てください)。ちなみに、それはng2 tutoで行われている方法です。
あるいは、package.jsonは次のようになります。
{
"name": "my-project-name",
"version": "my-project-version",
"scripts": {whatever scripts you need: start, lite, ...},
// here comes the interesting part
"dependencies": {
"lodash": "^4.17.2"
}
"devDependencies": {
"@types/lodash": "^4.14.40"
}
}
ちょっとしたヒント
npm
のいいところは、探している依存関係の最新バージョンがわからない場合は、単にnpm install --save
または--save-dev
を実行するだけで開始できることです。さらに使用するために自動的にpackage.json
に設定されます。
lodash からの部分インポートは、 角度4.1.x で動作します。
let assign = require('lodash/assign');
または 'lodash-es'を使用してモジュールにインポートする:
import { assign } from 'lodash-es';
私もlodash-es
のためのタイピングを作成したので、今あなたは実際に以下をすることができます
npm install lodash-es -S
npm install @types/lodash-es -D
import kebabCase from "lodash-es/kebabCase";
const wings = kebabCase("chickenWings");
ロールアップを使用する場合は、適切にツリーシェイクされるので、lodash
の代わりにこれを使用することをお勧めします。
npm
からインストールしてください。
$ npm install lodash --save
今、ファイル内のimport
:
$ import * as _ from 'lodash';
ENV:
Angular CLI:1.6.6
ノード:6.11.2
OS:ダーウィンx 64
角:5.2.2
TypeScript:2.4.2
ウェブパック:3.10.0
服用しなかった場合
$ npm install lodash --save
$ npm install --save-dev @types/lodash
これを試してlodashをインポートする
typings install lodash --save
Sudo npm install typings --global npm install lodash --save typings install lodash --ambient --save
System.config({ packages: { app: { format: 'register', defaultExtension: 'js' } }, map: { lodash: 'node_modules/lodash/index.js' } });
import _ from 'lodash';
私はシステムJSではなく、webpackでng2を使っています。私に必要な手順は次のとおりです。
npm install underscore --save
typings install dt~underscore --global --save
それから私はアンダースコアをインポートしたいファイルの中で:
import * as _ from 'underscore';
typings
およびtsd
コマンドを使用して型を管理することは、npm install @types/lodash
を介してnpmを使用することになるため、最終的には推奨されません。
しかし、私は長い間import文の中に "module lodashが見つかりません"と苦労しました:
import * as _ from 'lodash';
結局のところ、TypeScriptはnode_modules/@ typesバージョン2以降の型のみをロードすることに気付きました。そして私のVsCode言語サービスはまだ1.8を使っていたので、エディタはエラーを報告していました。
VSCodeを使用している場合は含める必要があります。
"TypeScript.tsdk": "node_modules/TypeScript/lib"
vSCodeのsettings.jsonファイル(ワークスペースの設定用)に、TypeScriptバージョン2.0.0以降がnpm install [email protected] --save-dev
でインストールされていることを確認します。
その後、私の編集者はimport文について文句を言わないでしょう。
私はAngular 4.0.0を使い、 preboot/angular-webpack を使っていますが、やや異なるルートを使用しなければなりませんでした。
@Taytayによって提供された解決策は、ほとんど私のために働きました:
npm install --save lodash
npm install --save @types/lodash
次のようにして、関数を与えられた .component.ts ファイルにインポートします。
import * as _ from "lodash";
「デフォルト」のエクスポートクラスがないため、これは機能します。私の違いは、私がサードパーティのライブラリにロードするために提供された方法を見つける必要があるということでした: vendor.ts
src/vendor.ts
My vendor.ts ファイルは、このようになりました。
import '@angular/platform-browser';
import '@angular/platform-browser-dynamic';
import '@angular/core';
import '@angular/common';
import '@angular/http';
import '@angular/router';
import 'rxjs';
import 'lodash';
// Other vendors for example jQuery, Lodash or Bootstrap
// You can import js, ts, css, sass, ...
端末をすべてインストールします。
npm install lodash --save
tsd install lodash --save
Index.htmlにパスを追加する
<script>
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
paths: {
lodash: './node_modules/lodash/lodash.js'
}
});
System.import('app/init').then(null, console.error.bind(console));
</script>
.tsファイルの先頭にlodashをインポートする
import * as _ from 'lodash'
奇妙なことかもしれませんが、lodashを正しくインストールしていたため(上記の提案を介して再インストールしたため)、上記のいずれも助けにはなりませんでした。
長い話をまとめると、この問題は lodash の_.has
メソッドを使用することに関連していました。
私は単純にJSのin
演算子を使って修正しました。