Importation de lodash dans l'application angular2 + typescript
j'ai du mal à faire importer les modules lodash. J'ai mis en place mon projet en utilisant npm+gulfp, et je continue à frapper le même mur. J'ai essayé le lodash normal, mais aussi le lodash-es.
le paquet lodash npm: (a un index.fichier js dans le package racine du dossier)
import * as _ from 'lodash';
résultats dans:
error TS2307: Cannot find module 'lodash'.
le paquet lodash-es npm: (a une exportation de défaut dans lodash.js i le dossier racine du paquet)
import * as _ from 'lodash-es/lodash';
résultats dans:
error TS2307: Cannot find module 'lodash-es'.
la tâche gulfp et webstorm rapportent la même chose.
Drôle de fait, cela renvoie pas d'erreur:
import 'lodash-es/lodash';
... mais bien sûr, il n'y a pas de "_" ...
mon tsconfig.dossier json:
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules"
]
}
mon gulffile.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']);
si je comprends bien, moduleResolution: 'node' dans mon tsconfig doit pointer les instructions d'importation vers le dossier node_modules, où lodash et lodash-es sont installés. J'ai aussi essayé de nombreuses façons d'importer: des chemins absolus, des chemins relatifs, mais rien ne semble fonctionner. Des idées?
Si nécessaire, je peux fournir un petit fichier zip pour illustrer le problème.
22 réponses
Voici comment faire cela à partir de la version dactylographiée 2.0: (tsd et typings sont dépréciés en faveur de ce qui suit):
$ npm install --save lodash
# This is the new bit here:
$ npm install --save-dev @types/lodash
alors, dans votre .fichier ts:
soit:
import * as _ from "lodash";
ou (comme suggéré par @Naitik):
import _ from "lodash";
Je ne suis pas sûr de la différence. Nous utilisons et préférons la première syntaxe. Cependant, certains rapportent que la première syntaxe ne fonctionne pas pour eux, et quelqu'un else a fait remarquer que cette dernière syntaxe est incompatible avec les modules webpack chargés paresseux. YMMV.
Edit le 27 février 2017:
selon @Koert ci-dessous, import * as _ from "lodash";
est la seule syntaxe de travail à partir de la Typescript 2.2.1, lodash 4.17.4, et @types/lodash 4.14.53. Il dit que l'autre syntaxe d'importation suggérée donne l'erreur "n'a pas d'exportation par défaut".
Mise À Jour Du 26 Septembre 2016:
comme le dit la réponse de @Taytay, au lieu des installations de "typographie" que nous avons utilisées il y a quelques mois, nous pouvons maintenant utiliser:
npm install --save @types/lodash
voici quelques références supplémentaires à l'appui de cette réponse:
si vous utilisez toujours l'installation de composition, voir les commentaires ci-dessous (par d'autres) concernant "'--ambient"' et " '--global"'.
aussi, dans le nouveau Quick Start, config n'est plus dans index.html; il est maintenant dans systemjs.config.ts (si vous utilisez SystemJS).
Réponse Originale:
cela a fonctionné sur mon mac (après installation D'Angular 2 comme per Quick Start ):
sudo npm install typings --global
npm install lodash --save
typings install lodash --ambient --save
vous trouverez différents fichiers affectés, par exemple
- /typographies/main.d.ts
- / typographies.json
- / colis.json
Angulaire 2 Démarrage rapide utilise le Système.js, j'ai donc ajouté ' map ' à la config dans index.html comme suit:
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
map: {
lodash: 'node_modules/lodash/lodash.js'
}
});
puis dans mon .ts code que j'ai été capable de faire:
import _ from 'lodash';
console.log('lodash version:', _.VERSION);
modifications de mi-2016:
comme @tibbus le mentionne, dans certains contextes, il faut:
import * as _ from 'lodash';
si vous partez de angular2-seed , et si vous ne voulez pas importer à chaque fois, vous pouvez sauter la carte et importer étapes et juste décommenter la ligne lodash dans Outils/config/projet.config.ts.
pour que mes tests fonctionnent avec lodash, j'ai aussi dû ajouter une ligne dans le tableau des fichiers Karma.conf.js:
'node_modules/lodash/lodash.js',
Étape 1: modifier le colis.fichier json pour inclure lodash dans les dépendances.
"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" }
Etape 2: J'utilise SystemJs module loader dans mon application angular2. Donc je serait de modifier les systemjs.config.fichier js à la carte lodash.
(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);
Étape 3: maintenant do npm install
Étape 4: pour utiliser lodash dans votre fichier.
import * as _ from 'lodash';
let firstIndexOfElement=_.findIndex(array,criteria);
tout d'Abord
npm install --save lodash
npm install -D @types/lodash
Charger le plein lodash bibliothèque
//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)
OU charger uniquement les fonctions que nous allons travailler avec
import * as debounce from 'lodash/debounce'
//work with the debounce function directly
debounce(...) // this too is typesafe (as expected)
UPDATE - March 2017
je travaille actuellement avec ES6 modules
, et récemment je a pu travailler avec lodash
comme ça:
// 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)
...
ou import
spécifique lodash functionality
:
import debounce from 'lodash/debounce'
//work with the debounce function directly
debounce(...) // this too is typesafe (as expected)
...
NOTE - la différence étant * as
n'est pas requise dans le syntax
références:
Bonne Chance.
depuis Typescript 2.0, les modules npm @types sont utilisés pour importer des typographies.
# Implementation package (required to run)
$ npm install --save lodash
# Typescript Description
$ npm install --save @types/lodash
maintenant que cette question a été répondue je vais aller dans la façon efficace d'importer lodash
la façon infaillible d'importer la bibliothèque entière (dans la main.ts)
import 'lodash';
C'est le nouveau bit ici:
implémenter un lodash plus léger avec les fonctions dont vous avez besoin
import chain from "lodash/chain";
import value from "lodash/value";
import map from "lodash/map";
import mixin from "lodash/mixin";
import _ from "lodash/wrapperLodash";
source: https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba#.kg6azugbd
PS: l'article ci-dessus est une lecture intéressante sur l'amélioration du temps de construction et la réduction de la taille de l'application
j'ai réussi à importer lodash dans mon projet avec les commandes suivantes:
npm install lodash --save
typings install lodash --save
puis je l'ai importé de la manière suivante:
import * as _ from 'lodash';
et dans systemjs.config.js j'ai défini:
map: { 'lodash' : 'node_modules/lodash/lodash.js' }
une autre solution élégante est d'obtenir seulement ce dont vous avez besoin, pas importer tout le lodash
import {forEach,merge} from "lodash";
et ensuite l'utiliser dans votre code
forEach({'a':2,'b':3}, (v,k) => {
console.log(k);
})
j'ai eu exactement le même problème, mais dans une application Angular2, et cet article vient de le résoudre: https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1#.p6gra5eli
résumé de l'article:
- installation de la bibliothèque
npm install lodash --save
- ajouter les définitions dactylographiées pour Lodash
tsd install underscore
- Y Compris Script
<script src="node_modules/lodash/index.js"></script>
- Configurer SystemJS
System.config({ paths: { lodash: './node_modules/lodash/index.js'
- Module D'Importation
import * as _ from ‘lodash’;
j'espère que cela peut être utile pour votre cas trop
si quelqu'un d'autre se heurte à ce problème et qu'aucune des solutions ci-dessus ne fonctionne en raison des problèmes de "Duplicate identifier", Lancez ceci:
npm install typings --global
avec des versions plus anciennes de typographies, les choses se gâtent et vous aurez un tas de problèmes" D'identification dupliquée". De plus, vous n'avez plus besoin d'utiliser --ambient
autant que je puisse dire.
donc une fois que les typographies sont à jour, cela devrait fonctionner (en utilisant L'Angular 2 quickstart).
Run:
npm install lodash --save
typings install lodash --save
d'abord, ajoutez ceci à systemjs.config.js:
'lodash': 'node_modules/lodash/lodash.js'
Maintenant vous pouvez utiliser ceci dans n'importe quel fichier: import * as _ from 'lodash';
supprimez votre dossier de typographie et lancez npm install
si vous avez encore des problèmes.
s'il vous plaît noter que npm install --save
favorisera n'importe quelle dépendance votre application exige dans le code de production.
En ce qui concerne les" typographies", elles ne sont exigées que par les caractères typographiques, qui sont éventuellement transcrits en JavaScript. Par conséquent, vous ne voulez probablement pas les avoir dans le code de production. Je suggère de le mettre dans votre projet devDependencies
à la place, en utilisant
npm install --save-dev @types/lodash
ou
npm install -D @types/lodash
(voir Akash post pour exemple.) Au fait, c'est comme ça que ça se fait en NG2 tuto.
alternativement, voici comment votre paquet.json pourrait ressembler à:
{
"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"
}
}
juste une pointe de
la bonne chose à propos de npm
est que vous pouvez commencer par simplement faire un npm install --save
ou --save-dev
si vous n'êtes pas sûr de la dernière version disponible de la dépendance que vous recherchez, et il le définira automatiquement pour vous dans votre package.json
pour une utilisation ultérieure.
j'avais créé des typographies pour lodash-es
aussi, donc maintenant vous pouvez réellement faire ce qui suit
installer
npm install lodash-es -S
npm install @types/lodash-es -D
utilisation
import kebabCase from "lodash-es/kebabCase";
const wings = kebabCase("chickenWings");
si vous utilisez rollup, je suggère d'utiliser ceci à la place du lodash
car il sera treeshaken correctement.
importation partielle de lodash devrait fonctionner dans angulaire 4.1.x en utilisant la notation suivante:
let assign = require('lodash/assign');
ou utiliser "lodash-es" et importer dans le module:
import { assign } from 'lodash-es';
- Installer lodash
sudo npm install typings --global
npm install lodash --save
typings install lodash --ambient --save
- Dans l'index.html, ajouter une carte pour lodash:
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
map: {
lodash: 'node_modules/lodash/index.js'
}
});
- In .code ts import module lodash
import _ from 'lodash';
j'utilise ng2 avec webpack, pas system JS. Les étapes besoin de moi ont été:
npm install underscore --save
typings install dt~underscore --global --save
et puis dans le fichier que je souhaite importer souligner:
import * as _ from 'underscore';
Gérer les types via les commandes typings
et tsd
est finalement déprécié en faveur de l'utilisation de npm via npm install @types/lodash
.
cependant, je me suis battu avec" ne peut pas trouver module lodash "dans la déclaration d'importation pendant une longue période:
import * as _ from 'lodash';
finalement J'ai réalisé que Typescript ne chargera que les types de node_modules / @types pour démarrer la version 2, et mon service de langage VsCode utilisait encore 1.8, donc l'éditeur rapportait des erreurs.
si vous utilisez VSCode vous voulez inclure
"typescript.tsdk": "node_modules/typescript/lib"
dans vos paramètres VSCode.fichier json (pour les paramètres de l'espace de travail) et assurez-vous que vous avez la version dactylographiée > = 2.0.0 installé via npm install typescript@2.0.2 --save-dev
après ça, mon éditeur ne s'est pas plaint de la déclaration d'importation.
si vous ne travaillez pas après
$ npm install lodash --save
$ npm install --save-dev @types/lodash
vous essayez cela et d'importation lodash
typings install lodash --save
Installer via npm
.
$ npm install lodash --save
maintenant, import
dans le fichier:
$ import * as _ from 'lodash';
ENV:
Angular CLI: 1.6.6
Noeud: 6.11.2
OS: darwin x64
Angulaire: 5.2.2
Dactylographie: 2.4.2
webpack: 3.10.0
Installer tous thru terminal:
npm install lodash --save
tsd install lodash --save
ajouter les chemins dans l'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>
Importer lodash en haut de l' .fichier ts
import * as _ from 'lodash'
je suis sur Angulaire 4.0.0 à l'aide de la preboot/angulaires-webpack , et il a dû aller un itinéraire légèrement différent.
la solution fournie par @Taytay a surtout fonctionné pour moi:
npm install --save lodash
npm install --save @types/lodash
et l'importation des fonctions dans un donné .composant.ts Fichier utilisant:
import * as _ from "lodash";
cela fonctionne parce qu'il n'y a pas de classe" par défaut " exportée. La différence dans la mienne était que je devais trouver la façon qui a été fournie pour charger dans les bibliothèques de tiers: vendeur.ts , qui était assis à:
src/vendor.ts
mon" vendeur 1519110920".le fichier de ts ressemble à ceci:
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, ...
peut-être que c'est trop étrange, mais aucun de ceux-ci ne m'a aidé, tout d'abord, parce que j'avais correctement installé le lodash (également réinstallé via les suggestions ci-dessus).
Si longue histoire courte, le problème a été connecté avec l'utilisation de _.has
méthode de lodash .
Je l'ai fixé en utilisant simplement l'opérateur JS in
.
vous pouvez également aller de l'avant et d'importer via bon vieux require, i.e.:
const _get: any = require('lodash.get');
C'est la seule chose qui a fonctionné pour nous. Bien sûr, assurez-vous que tous les appels require() viennent après les importations.