Não é possível encontrar o nome 'requer' após atualizar para Angular4

120

Eu quero usar Chart.js no meu projeto Angular. Nas versões anteriores do Angular2, tenho feito isso bem usando um 'chart.loader.ts' que tem:

export const { Chart } = require('chart.js');

Então, no código do componente, eu apenas

import { Chart } from './chart.loader';

Mas depois de atualizar para cli 1.0.0 e Angular 4, recebo o erro: "Não é possível encontrar o nome 'requer'".

Para reproduzir o erro:

ng new newapp
cd newapp
npm install chart.js --save
echo "export const { Chart } = require('chart.js');" >> src/app/chart.loader.ts
ng serve

No meu 'tsconfig.json', tenho

"typeRoots": [
  "node_modules/@types"
],

E em 'node_modules/@types/node/index.d.ts' há:

declare var require: NodeRequire;

Então, estou confuso.

BTW, encontro constantemente o aviso:

[tslint] The selector of the component "OverviewComponent" should have prefix "app"(component-selector)

Embora eu tenha definido o "prefixo": "" em meu '.angular-cli.json'. Poderia ser porque mudar de 'angular-cli.json' para '.angular-cli.json' a causa?

Thomas Wang
fonte
O problema está no arquivo tsconfig.json. Veja a solução aqui: stackoverflow.com/questions/31173738/…
IndyWill
@IndyWill Obrigado, na verdade, deve estar em src / tsconfig.app.json. Você pode escrever isso como uma resposta?
Thomas Wang
Para elétron + angular 2/4, consulte: stackoverflow.com/a/47364843/5248229
mihaa123

Respostas:

232

O problema (conforme descrito no erro de digitação que obtém TS2304: não é possível localizar o nome 'require' ) é que as definições de tipo para o nó não estão instaladas.

Com um gerado projetado with @angular/cli 1.x, as etapas específicas devem ser:

Etapa 1 :

Instale @types/nodecom um dos seguintes:

- npm install --save @types/node
- yarn add @types/node -D

Etapa 2 : edite seu arquivo src / tsconfig.app.json e adicione o seguinte no lugar do vazio "types": [], que já deve estar lá:

...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...

Se perdi alguma coisa, faça um comentário e editarei minha resposta.

IndyWill
fonte
11
bem não funcionou para mim ... eu tenho que instalar outra coisa?
1
Também para mim não funciona. Detalhes aqui: stackoverflow.com/questions/44421367/types-not-found
user3471528
49
Nota: Você tem que alterar tsconfig.app.jsonem srcadição de pasta "types": ["node"], não está no tsconfig raiz
BrunoLM
11
Não funcionou para mim também. outra resposta sugerindo apenas adicionar declare var require: any;ajudou surpreendentemente.
Paritosh
Perdi a etapa 2. Obrigado !!
Robbie Smith
25

Finalmente consegui uma solução para isso, verifique meu arquivo de módulo do aplicativo:

import { BrowserModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MaterialModule } from '@angular/material';
import 'hammerjs';
import { ChartModule } from 'angular2-highcharts';
import * as highcharts from 'highcharts';
import { HighchartsStatic } from 'angular2-highcharts/dist/HighchartsService';

import { AppRouting } from './app.routing';
import { AppComponent } from './app.component';

declare var require: any;


export function highchartsFactory() {
      const hc = require('highcharts');
      const dd = require('highcharts/modules/drilldown');
      dd(hc);

      return hc;
}

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    AppRouting,
    BrowserAnimationsModule,
    MaterialModule,
    ChartModule
  ],
  providers: [{
      provide: HighchartsStatic,
      useFactory: highchartsFactory
    }],
  bootstrap: [AppComponent]
})
export class AppModule { }

Observe declare var require: any;no código acima.

GsMalhotra
fonte
1
Tive esse problema no arquivo polyfills.ts, mas seu "declare var require: any;" consertou. obrigado
Andre
18

Funcionará em Angular 7 +


Eu estava enfrentando o mesmo problema, estava adicionando

"types": ["node"]

para tsconfig.json da pasta raiz.

Havia mais um tsconfig.app.json na pasta src e resolvi isso adicionando

"types": ["node"]

para o arquivo tsconfig.app.json emcompilerOptions

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "types": ["node"]  ----------------------< added node to the array
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}
Sunil Garg
fonte
14

Quanto a mim, usando VSCode e Angular 5, só tive que adicionar "nó" aos tipos em tsconfig.app.json. Salve e reinicie o servidor.

{
    "compilerOptions": {
    ..
    "types": [
      "node"
    ]
  }
  ..
}

Uma coisa curiosa, é que este problema "não consegue encontrar o require (", não acontece ao executar com ts-node

Val Martinez
fonte
1
Funcionou como um encanto no Angular 6 para mim.
Pic Mickael
Essa solução funcionou para mim em uma biblioteca Angular 6. Eu precisava adicionar o "types": [ "node" ],ao tsconfig.lib.jsonembora.
Gus,
E REINICIE O SERVIDOR. Meu Deus, foi isso o tempo todo. Working on Angular 9. 👍
Anders8
13

Ainda não tenho certeza da resposta, mas uma possível solução é

import * as Chart from 'chart.js';
Thomas Wang
fonte
3

Eu adicionei

"types": [ 
   "node"
]

no meu arquivo tsconfig e funcionou para mim o arquivo tsconfig.json parece

  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "module": "es2015",
    "types": [ 
      "node",
      "underscore"
    ]
  },  
Nizam Khan
fonte
Embora este código possa responder à pergunta, você ainda pode considerar adicionar algumas frases explicativas, pois isso aumenta o valor da sua resposta para outros usuários.
MBT de
1

Adicione a seguinte linha na parte superior do arquivo que fornece o erro:

declare var require: any
Vardan Nadkarni
fonte
0

Mudei o tsconfig.jsonarquivo para uma nova pasta para reestruturar meu projeto.

Portanto, não foi possível resolver o caminho para a pasta node_modules / @ types dentro da typeRootspropriedade de tsconfig.json

Então, basta atualizar o caminho de

"typeRoots": [
  "../node_modules/@types"
]

para

"typeRoots": [
  "../../node_modules/@types"
]

Apenas para garantir que o caminho para node_modules seja resolvido a partir do novo local do tsconfig.json

Mahesh
fonte