Estou com dificuldades para tentar importar os módulos lodash. Eu configurei meu projeto usando npm + gulp e continuo batendo na mesma parede. Eu tentei o lodash regular, mas também lodash-es.
O pacote lodash npm: (possui um arquivo index.js na pasta raiz do pacote)
import * as _ from 'lodash';
Resulta em:
error TS2307: Cannot find module 'lodash'.
O pacote lodash-es npm: (possui uma exportação padrão no lodash.js na pasta raiz do pacote)
import * as _ from 'lodash-es/lodash';
Resulta em:
error TS2307: Cannot find module 'lodash-es'.
A tarefa gulp e o webstorm relatam o mesmo problema.
Fato engraçado, isso não retorna erro:
import 'lodash-es/lodash';
... mas é claro que não há "_" ...
Meu arquivo tsconfig.json:
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules"
]
}
Meu 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']);
Se eu entendi corretamente, moduleResolution: 'node' no meu tsconfig deve apontar as instruções de importação para a pasta node_modules, onde lodash e lodash-es estão instalados. Também tentei várias maneiras diferentes de importar: caminhos absolutos, caminhos relativos, mas nada parece funcionar. Alguma ideia?
Se necessário, posso fornecer um pequeno arquivo zip para ilustrar o problema.
Respostas:
Aqui está como fazer isso no Typescript 2.0: (tsd e tipagens estão sendo preteridos em favor do seguinte):
Em seguida, no seu arquivo .ts:
Ou:
Ou (como sugerido por @Naitik):
Não tenho certeza de qual é a diferença. Usamos e preferimos a primeira sintaxe. No entanto, alguns relatam que a primeira sintaxe não funciona para eles, e outra pessoa comentou que a última sintaxe é incompatível com os módulos do webpack com carregamento lento. YMMV.
Edite em 27 de fevereiro de 2017:
De acordo com @Koert abaixo,
import * as _ from "lodash";
é a única sintaxe de trabalho a partir do Typescript 2.2.1, lodash 4.17.4 e @ types / lodash 4.14.53. Ele diz que a outra sintaxe de importação sugerida fornece o erro "não possui exportação padrão".fonte
typescript 2.0.3
. De fato, remover atypings
favor do@types
pacote npm é muito mais limpo.import * as _ from "lodash";
não estava funcionando para mim, masimport _ from "lodash";
funciona.import _ from "lodash"
sintaxe incompatível com os módulos webpack carregados com atraso. Não sei por que, não investiguei em detalhes.npm install --save-dev @types/lodash
Se você está vendo problemas estranhos e erros, tente o seguinte:npm install --save-dev @types/[email protected]
Atualização 26 de setembro de 2016:
Como a resposta de @ Taytay diz, em vez das instalações de 'digitação' que usamos alguns meses atrás, agora podemos usar:
Aqui estão algumas referências adicionais que suportam essa resposta:
Se ainda estiver usando a instalação de digitações, consulte os comentários abaixo (por outros) sobre '' '--ambient' '' 'e' '' --global '' '.
Além disso, no novo Início rápido, a configuração não está mais em index.html; agora está em systemjs.config.ts (se estiver usando o SystemJS).
Resposta original:
Isso funcionou no meu mac (após a instalação do Angular 2 conforme o Início rápido ):
Você encontrará vários arquivos afetados, por exemplo
O Início rápido do Angular 2 usa System.js, então adicionei 'map' à configuração no index.html da seguinte maneira:
Então, no meu código .ts, eu pude fazer:
Edições a partir de meados de 2016:
Como o @tibbus menciona, em alguns contextos, você precisa:
Se você estiver começando com angular2-seed e não quiser importar todas as vezes, poderá pular o mapa e importar as etapas e apenas descomentar a linha lodash em tools / config / project.config.ts.
Para que meus testes funcionassem com o lodash, eu também precisei adicionar uma linha à matriz de arquivos no karma.conf.js:
fonte
map: { lodash: 'node_modules/lodash/lodash.js' }
noSystem.config
?import * as _ from 'lodash'
vez deimport _ from 'lodash'
?--ambient
é um ex---global
. O último é usado no 1.x e avançando. No entanto, não acho que o último lodash 4.x seja compilado como módulo global como esse.Primeiras coisas primeiro
npm install --save lodash
npm install -D @types/lodash
Carregue a biblioteca completa do lodash
OU carrega apenas funções com as quais vamos trabalhar
UPDATE - March 2017
Atualmente, estou trabalhando com
ES6 modules
e recentemente pude trabalhar da seguintelodash
forma:OU
import
específicolodash functionality
:NOTA - a diferença existente
* as
não é necessária nosyntax
Referências:
Boa sorte.
fonte
import debounce from 'lodash/debounce'
geraTS1192: Module node_modules/@types/lodash/debounce has no default export
quando"allowSyntheticDefaultImports": false
"allowSyntheticDefaultImports": true
opção de compilador no seu arquivo tsconfig.json pode ser necessária para evitar qualquer erro.Etapa 1: Modifique o arquivo package.json para incluir o lodash nas dependências.
Etapa 2: Estou usando o carregador de módulo SystemJs no meu aplicativo angular2. Então, eu estaria modificando o arquivo systemjs.config.js para mapear o lodash.
Etapa 3: Agora, instale o npm
Etapa 4: para usar o lodash em seu arquivo.
fonte
Desde o Typecript 2.0, os módulos @types npm são usados para importar tipagens.
Agora, já que essa pergunta foi respondida, vou abordar como importar com eficiência o lodash
A maneira segura de importar toda a biblioteca (em main.ts)
Esta é a nova parte aqui:
Implementando um lodash mais leve com as funções necessárias
fonte: https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba#.kg6azugbd
PS: O artigo acima é uma leitura interessante sobre como melhorar o tempo de compilação e reduzir o tamanho do aplicativo
fonte
error TS1192: Module '"node_modules/@types/lodash/chain/index"' has no default export.
E assim por diante para outros módulos de tentar os mais curtosimport chain from "lodash/chain"
importaçõesImportei com êxito o lodash no meu projeto com os seguintes comandos:
Então eu importei da seguinte maneira:
import * as _ from 'lodash';
e em systemjs.config.js eu defini isso:
map: { 'lodash' : 'node_modules/lodash/lodash.js' }
fonte
Eu tinha exatamente o mesmo problema, mas em um aplicativo Angular2, e este artigo apenas o resolveu: https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1#.p6gra5eli
Resumo do artigo:
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 também possa ser útil para o seu caso
fonte
Outra solução elegante é obter apenas o que você precisa, não importar todo o lodash
e depois use no seu código
fonte
Se alguém encontrar esse problema e nenhuma das soluções acima funcionar devido a problemas de "Identificador duplicado", execute o seguinte:
Com versões mais antigas de digitação, as coisas ficam complicadas e você terá vários problemas de "identificador duplicado". Além disso, você não precisa usar
--ambient
mais tanto quanto eu poderia dizer.Portanto, uma vez que as digitações estejam atualizadas, isso deve funcionar (usando o início rápido do Angular 2).
Corre:
Primeiro, adicione isso ao systemjs.config.js:
Agora você pode usar isso em qualquer arquivo:
import * as _ from 'lodash';
Exclua sua pasta de digitações e execute
npm install
se você ainda estiver com problemas.fonte
Observe que
npm install --save
promoverá qualquer dependência que seu aplicativo exija no código de produção.Quanto às "digitações", elas são exigidas apenas pelo TypeScript, que é transpilado em JavaScript. Portanto, você provavelmente não deseja tê-los no código de produção. Sugiro colocá-lo no seu projeto
devDependencies
, usandoou
(veja a publicação Akash, por exemplo). A propósito, é assim que é feito no ng2 tuto.
Como alternativa, aqui está como o seu package.json poderia ser:
apenas uma dica
O mais interessante
npm
é que você pode começar simplesmente fazendo umanpm install --save
ou--save-dev
se não tiver certeza da versão mais recente disponível da dependência que está procurando, e ela será automaticamente configurada para você no seupackage.json
uso posterior.fonte
Eu criei letras para
lodash-es
também, então agora você pode realmente fazer o seguinteinstalar
uso
se você usar o pacote cumulativo, sugiro usar isso em vez do,
lodash
pois ele será agitado corretamente.fonte
A importação parcial do lodash deve funcionar no angular 4.1.x usando a seguinte notação:
Ou use 'lodash-es' e importe no módulo:
fonte
import { assign } from 'lodash-es';
parece ainda importar a biblioteca inteira (a julgar pelo tamanho do pacote)Instale via
npm
.Agora,
import
no arquivo:ENV:
fonte
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';
fonte
$ 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
Estou usando o ng2 com webpack, não com o sistema JS. Os passos necessários para mim foram:
e depois no arquivo que desejo importar sublinhado para:
fonte
O gerenciamento de tipos via
typings
etsd
comandos acaba sendo preterido em favor do uso do npm vianpm install @types/lodash
.No entanto, lutei com "Não é possível encontrar o módulo lodash" na declaração de importação por um longo tempo:
Por fim, percebi que o Typescript carregaria apenas tipos do node_modules / @ types start versão 2, e meu serviço VsCode Language ainda estava usando o 1.8, então o editor estava relatando erros.
Se você estiver usando o VSCode, inclua
no arquivo settings.json do VSCode (para configurações da área de trabalho) e verifique se você possui a versão datilografada> = 2.0.0 instalada via
npm install [email protected] --save-dev
Depois disso, meu editor não reclamaria da declaração de importação.
fonte
se não funcionar depois
você tenta isso e importa lodash
fonte
npm install --save @types/lodash
https://www.npmjs.com/package/@types/lodash
fonte
Instale todo o terminal:
Adicionar caminhos no index.html
Importar lodash na parte superior do arquivo .ts
fonte
Estou no Angular 4.0.0 usando o preboot / angular-webpack e tive que seguir uma rota um pouco diferente.
A solução fornecida pela @Taytay funcionou principalmente para mim:
e importar as funções para um determinado arquivo .component.ts usando:
Isso funciona porque não há classe exportada "padrão". A diferença era que eu precisava encontrar a maneira que era fornecida para carregar nas bibliotecas de terceiros: vendor.ts que ficava em:
Meu arquivo vendor.ts se parece com isso agora:
fonte
Talvez seja muito estranho, mas nenhuma das opções acima me ajudou, antes de tudo, porque eu havia instalado corretamente o lodash (também reinstalado pelas sugestões acima).
História tão longa que o problema estava relacionado ao uso do
_.has
método da lodash .Corrigi-o simplesmente usando o
in
operador JS .fonte
tente >>
tsd install lodash --save
fonte
Você também pode prosseguir e importar através de bons e antigos requisitos, ou seja:
Esta é a única coisa que funcionou para nós. Obviamente, certifique-se de que todas as chamadas require () sejam realizadas após as importações.
fonte