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.

199
demandé sur Davy 2016-01-07 19:28:17

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".

349
répondu Taytay 2018-07-27 09:29:55

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',
57
répondu Marcus 2017-05-23 10:31:39

É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);
23
répondu Vi137 2016-05-16 10:35:50

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:

enter image description here

Bonne Chance.

21
répondu Akash 2017-11-23 04:14:04

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

13
répondu Dhruvan Ganesh 2016-10-13 08:10:04

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' }

10
répondu smartmouse 2016-07-13 16:31:23

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);
})
7
répondu Pian0_M4n 2016-12-22 09:16:21

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:

  1. installation de la bibliothèque npm install lodash --save
  2. ajouter les définitions dactylographiées pour Lodash tsd install underscore
  3. Y Compris Script <script src="node_modules/lodash/index.js"></script>
  4. Configurer SystemJS System.config({ paths: { lodash: './node_modules/lodash/index.js'
  5. Module D'Importation import * as _ from ‘lodash’;

j'espère que cela peut être utile pour votre cas trop

7
répondu maufarinelli 2017-06-22 07:55:38

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.

4
répondu Bart 2016-08-17 14:49:16

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.

4
répondu avi.elkharrat 2016-11-23 12:22:03

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.

3
répondu Stephen Lautier 2017-01-05 22:18:57

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';
3
répondu Alex Dzeiko 2017-07-18 18:20:19
  1. Installer lodash

sudo npm install typings --global npm install lodash --save typings install lodash --ambient --save

  1. Dans l'index.html, ajouter une carte pour lodash:

System.config({ packages: { app: { format: 'register', defaultExtension: 'js' } }, map: { lodash: 'node_modules/lodash/index.js' } });

  1. In .code ts import module lodash

import _ from 'lodash';

1
répondu user3437231 2016-04-24 21:49:29

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';
1
répondu FrontEndFire 2016-06-16 10:35:10

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.

1
répondu parliament 2016-09-18 23:09:38

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
1
répondu Ahmet Deveci 2017-09-21 04:53:54

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

1
répondu Sajib Khan 2018-02-12 05:19:34

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'
0
répondu Milan Milanovic 2016-03-05 21:40:06

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, ...
0
répondu Guentersniden 2017-05-06 02:56:07

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 .

0
répondu Arsen Khachaturyan 2018-09-26 06:36:02

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.

-1
répondu Marc 2018-06-01 04:42:49

essayer >> tsd install lodash --save

-2
répondu mat 2016-02-24 08:20:57