Me está costando mucho tratar de importar los módulos lodash. He configurado mi proyecto usando npm + gulp, y sigo golpeando la misma pared. He probado el lodash normal, pero también lodash-es.
El paquete lodash npm: (tiene un archivo index.js en la carpeta raíz del paquete)
import * as _ from 'lodash';
Resultados en:
error TS2307: Cannot find module 'lodash'.
El paquete lodash-es npm: (tiene una exportación predeterminada en lodash.js i la carpeta raíz del paquete)
import * as _ from 'lodash-es/lodash';
Resultados en:
error TS2307: Cannot find module 'lodash-es'.
Tanto la tarea de Gulp como la tormenta web informan el mismo problema.
Dato curioso, esto no devuelve ningún error:
import 'lodash-es/lodash';
... pero por supuesto no hay "_" ...
Mi archivo tsconfig.json:
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules"
]
}
Mi 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']);
Si entiendo correctamente, moduleResolution: 'node' en mi tsconfig debería apuntar las declaraciones de importación a la carpeta node_modules, donde están instalados lodash y lodash-es. También probé muchas formas diferentes de importar: rutas absolutas, rutas relativas, pero nada parece funcionar. ¿Algunas ideas?
Si es necesario, puedo proporcionar un pequeño archivo zip para ilustrar el problema.
Respuestas:
Aquí se explica cómo hacer esto a partir de Typecript 2.0: (tsd y typings están en desuso en favor de lo siguiente):
Luego, en su archivo .ts:
Ya sea:
O (como lo sugiere @Naitik):
No estoy seguro de cuál es la diferencia. Usamos y preferimos la primera sintaxis. Sin embargo, algunos informan que la primera sintaxis no funciona para ellos, y alguien más ha comentado que la última sintaxis es incompatible con los módulos de paquete web con carga lenta. YMMV.
Editar el 27 de febrero de 2017:
Según @Koert a continuación,
import * as _ from "lodash";
es la única sintaxis que funciona a partir de Typecript 2.2.1, lodash 4.17.4 y @ types / lodash 4.14.53. Él dice que la otra sintaxis de importación sugerida da el error "no tiene exportación predeterminada".fuente
typescript 2.0.3
. De hecho, eliminartypings
a favor del@types
paquete npm es mucho más limpio.import * as _ from "lodash";
no estaba funcionando para mí peroimport _ from "lodash";
sí.import _ from "lodash"
sintaxis es incompatible con los módulos de paquete web con carga lenta. No estoy seguro de por qué, no he investigado en detalle.npm install --save-dev @types/lodash
Si usted está viendo temas extraños y errores, intente esto:npm install --save-dev @types/[email protected]
Actualización 26 de septiembre de 2016:
Como dice la respuesta de @ Taytay, en lugar de las instalaciones de 'tipings' que usamos hace unos meses, ahora podemos usar:
Aquí hay algunas referencias adicionales que respaldan esa respuesta:
Si todavía usa la instalación de tipings, vea los comentarios a continuación (por otros) con respecto a '' '--ambient' '' y '' '--global' ''.
Además, en el nuevo Inicio rápido, config ya no está en index.html; ahora está en systemjs.config.ts (si usa SystemJS).
Respuesta original
Esto funcionó en mi mac (después de instalar Angular 2 según Quick Start ):
Encontrará varios archivos afectados, p. Ej.
Angular 2 Quickstart usa System.js, así que agregué 'map' a la configuración en index.html de la siguiente manera:
Luego, en mi código .ts pude hacer:
Ediciones de mediados de 2016:
Como @tibbus menciona, en algunos contextos, necesita:
Si comienza desde angular2-seed , y si no desea importar cada vez, puede omitir el mapa e importar los pasos y simplemente descomentar la línea lodash en tools / config / project.config.ts.
Para que mis pruebas funcionen con lodash, también tuve que agregar una línea a la matriz de archivos en karma.conf.js:
fuente
map: { lodash: 'node_modules/lodash/lodash.js' }
en elSystem.config
?import * as _ from 'lodash'
lugar deimport _ from 'lodash'
?--ambient
es un ex para--global
. Este último se usa en 1.x y avanza. Sin embargo, no creo que el último lodash 4.x se compile como un módulo global como ese.Lo primero es lo primero
npm install --save lodash
npm install -D @types/lodash
Cargue la biblioteca completa de lodash
O cargar solo funciones con las que vamos a trabajar
UPDATE - March 2017
Actualmente estoy trabajando
ES6 modules
, y recientemente pude trabajarlodash
así:O
import
específicolodash functionality
:NOTA : la diferencia
* as
no es necesaria en elsyntax
Referencias
Buena suerte.
fuente
import debounce from 'lodash/debounce'
cedeTS1192: Module node_modules/@types/lodash/debounce has no default export
cuando"allowSyntheticDefaultImports": false
"allowSyntheticDefaultImports": true
puede ser necesario agregar la opción del compilador en su archivo tsconfig.json para evitar cualquier error.Paso 1: Modifique el archivo package.json para incluir lodash en las dependencias.
Paso 2: estoy usando el cargador de módulos SystemJs en mi aplicación angular2. Así que estaría modificando el archivo systemjs.config.js para mapear lodash.
Paso 3: ahora instala npm
Paso 4: Para usar lodash en tu archivo.
fuente
Desde Typecript 2.0, los módulos @types npm se utilizan para importar tipings.
Ahora, dado que esta pregunta ha sido respondida, entraré en cómo importar eficientemente lodash
La forma segura de importar la biblioteca completa (en main.ts)
Este es el nuevo bit aquí:
Implementando un lodash más ligero con las funciones que necesita
fuente: https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba#.kg6azugbd
PD: El artículo anterior es una lectura interesante sobre cómo mejorar el tiempo de compilación y reducir el tamaño de la aplicación
fuente
error TS1192: Module '"node_modules/@types/lodash/chain/index"' has no default export.
Y así sucesivamente para otros módulos que intentan lasimport chain from "lodash/chain"
importaciones más cortasImporté con éxito lodash en mi proyecto con los siguientes comandos:
Luego lo importé de la siguiente manera:
import * as _ from 'lodash';
y en systemjs.config.js definí esto:
map: { 'lodash' : 'node_modules/lodash/lodash.js' }
fuente
Tuve exactamente el mismo problema, pero en una aplicación Angular2, y este artículo solo lo resuelve: https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1#.p6gra5eli
Resumen del artículo:
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’;
Espero que también pueda ser útil para su caso
fuente
Otra solución elegante es obtener solo lo que necesita, no importar todo lo
y luego úsalo en tu código
fuente
Si alguien más se encuentra con este problema y ninguna de las soluciones anteriores funciona debido a problemas de "Identificador duplicado", ejecute esto:
Con versiones anteriores de tipings, las cosas se complican y obtendrá un montón de problemas de "identificador duplicado". Además, no necesita usar
--ambient
más, por lo que puedo ver.Entonces, una vez que los tipings estén actualizados, esto debería funcionar (usando el inicio rápido de Angular 2).
Correr:
Primero, agregue esto a systemjs.config.js:
Ahora puede usar esto en cualquier archivo:
import * as _ from 'lodash';
Elimine su carpeta de tipings y ejecútela
npm install
si todavía tiene problemas.fuente
Tenga en cuenta que
npm install --save
fomentará cualquier dependencia que su aplicación requiera en el código de producción.En cuanto a "tipings", solo es requerido por TypeScript, que eventualmente se transpira en JavaScript. Por lo tanto, probablemente no desee tenerlos en el código de producción. Sugiero ponerlo en su proyecto en su
devDependencies
lugar, utilizandoo
(Ver publicación de Akash, por ejemplo). Por cierto, es la forma en que se hace en ng2 tuto.
Alternativamente, así es como podría verse su package.json:
solo un consejo
Lo bueno de esto
npm
es que puede comenzar simplemente haciendo unanpm install --save
o--save-dev
si no está seguro de la última versión disponible de la dependencia que está buscando, y la configurará automáticamente para supackage.json
uso posterior.fuente
También creé tipings para
lodash-es
, así que ahora puedes hacer lo siguienteInstalar en pc
uso
si usa el paquete acumulativo, le sugiero que lo use en lugar de usarlo,
lodash
ya que se sacudirá correctamente.fuente
La importación parcial desde lodash debería funcionar en angular 4.1.x usando la siguiente notación:
O use 'lodash-es' e importe en el módulo:
fuente
import { assign } from 'lodash-es';
Parece que todavía importar toda la biblioteca (a juzgar por el tamaño del paquete)Instalar a través de
npm
.Ahora,
import
en el archivo:ENV:
fuente
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';
fuente
$ typings install lodash --ambient --save typings ERR! message https://api.typings.org/entries/npm/lodash/versions/latest responded with 407, expected it to equal 200
Estoy usando ng2 con webpack, no con el sistema JS. Los pasos necesarios para mí fueron:
y luego en el archivo que deseo importar subrayado:
fuente
La gestión de los tipos a través de
typings
y lostsd
comandos en última instancia está en desuso a favor del uso de npm vianpm install @types/lodash
.Sin embargo, luché con "No se puede encontrar el módulo lodash" en la declaración de importación durante mucho tiempo:
Finalmente, me di cuenta de que Typecript solo cargará tipos de node_modules / @ types start versión 2, y mi servicio de lenguaje VsCode todavía usaba 1.8, por lo que el editor informaba errores.
Si está utilizando VSCode, querrá incluir
en su archivo VSCode settings.json (para la configuración del espacio de trabajo) y asegúrese de tener instalada la versión typecript> = 2.0.0 a través de
npm install [email protected] --save-dev
Después de eso, mi editor no se quejaría de la declaración de importación.
fuente
si no funciona después
intentas esto e importas lodash
fuente
npm install --save @types/lodash
https://www.npmjs.com/package/@types/lodash
fuente
Instale todos los terminales:
Agregar rutas en index.html
Importar lodash en la parte superior del archivo .ts
fuente
Estoy en Angular 4.0.0 usando el preboot / angular-webpack , y tuve que tomar una ruta ligeramente diferente.
La solución proporcionada por @Taytay funcionó principalmente para mí:
e importar las funciones en un archivo .component.ts dado usando:
Esto funciona porque no hay una clase exportada "predeterminada". La diferencia en la mía era que necesitaba encontrar la forma en que se cargaba en bibliotecas de terceros: vendor.ts, que se encontraba en:
Mi archivo vendor.ts se ve así ahora:
fuente
Tal vez sea demasiado extraño, pero nada de lo anterior me ayudó, en primer lugar, porque había instalado correctamente el lodash (también reinstalado a través de las sugerencias anteriores).
En resumen, el problema estaba relacionado con el uso del
_.has
método de lodash .Lo arreglé simplemente usando el
in
operador JS .fuente
prueba >>
tsd install lodash --save
fuente
También puede seguir adelante e importar a través de viejos requisitos, es decir:
Esto es lo único que funcionó para nosotros. Por supuesto, asegúrese de que las llamadas require () vengan después de las importaciones.
fuente