No se puede encontrar el nombre 'require' después de actualizar a Angular4

120

Quiero usar Chart.js dentro de mi proyecto Angular. En versiones anteriores de Angular2, lo he estado haciendo bien usando un 'chart.loader.ts' que tiene:

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

Luego, en el código del componente, solo

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

Pero después de actualizar a cli 1.0.0 y Angular 4, aparece el error: "No se puede encontrar el nombre 'require'".

Para reproducir el error:

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

En mi 'tsconfig.json', tengo

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

Y en 'node_modules/@types/node/index.d.ts' hay:

declare var require: NodeRequire;

Entonces estoy confundido.

Por cierto, me encuentro constantemente con la advertencia:

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

Aunque he establecido el "prefijo": "" en mi '.angular-cli.json'. ¿Podría ser porque el cambio de 'angular-cli.json' a '.angular-cli.json' es la causa?

Thomas Wang
fuente
El problema está en su archivo tsconfig.json. Vea la solución aquí: stackoverflow.com/questions/31173738/…
IndyWill
@IndyWill Gracias, en realidad debería estar en src / tsconfig.app.json. ¿Puedes escribir esto como respuesta?
Thomas Wang
Para electron + angular 2/4, consulte: stackoverflow.com/a/47364843/5248229
mihaa123

Respuestas:

232

El problema (como se describe en el texto mecanografiado que obtiene el error TS2304: no se puede encontrar el nombre 'require' ) es que las definiciones de tipo para el nodo no están instaladas.

Con una generación proyectada with @angular/cli 1.x, los pasos específicos deben ser:

Paso 1 :

Instale @types/nodecon cualquiera de los siguientes:

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

Paso 2 : Edite su archivo src / tsconfig.app.json y agregue lo siguiente en lugar del vacío "types": [], que ya debería estar allí:

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

Si me he perdido algo, escriba un comentario y editaré mi respuesta.

IndyWill
fuente
11
Bueno, no funcionó para mí ... ¿Tengo que instalar algo más?
1
También para mí no funciona. Detalles aquí: stackoverflow.com/questions/44421367/types-not-found
user3471528
49
Nota: debe cambiar tsconfig.app.jsonen la srccarpeta de agregar "types": ["node"], no está en la raíz tsconfig
BrunoLM
11
Tampoco funcionó para mí. otra respuesta que sugiere solo agregar declare var require: any;ayudó sorprendentemente.
Paritosh
Me perdí el paso 2. ¡¡Gracias !!
Robbie Smith
25

Finalmente obtuve una solución para esto, verifique el archivo del módulo de mi aplicación:

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

Aviso declare var require: any;en el código anterior.

GsMalhotra
fuente
1
Tuve este problema en el archivo polyfills.ts, pero su "declare var require: any;" arreglado. gracias
Andre
18

Funcionará en Angular 7+


Estaba enfrentando el mismo problema, estaba agregando

"types": ["node"]

a tsconfig.json de la carpeta raíz.

Había un tsconfig.app.json más en la carpeta src y lo resolví agregando

"types": ["node"]

al archivo tsconfig.app.json encompilerOptions

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

En cuanto a mí, al usar VSCode y Angular 5, solo tuve que agregar "nodo" a los tipos en tsconfig.app.json. Guarde y reinicie el servidor.

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

Una cosa curiosa, es que este problema "no se puede encontrar require (", no ocurre al ejecutar con ts-node

Val Martinez
fuente
1
Funcionó como un encanto en Angular 6 para mí.
Pic Mickael
Esta solución me funcionó en una biblioteca de Angular 6. Necesitaba agregar el "types": [ "node" ],al tsconfig.lib.jsonaunque.
Gus
Y REINICIE EL SERVIDOR. Dios mío, fue esto todo el tiempo. Trabajando en Angular 9. 👍
Anders8
13

Todavía no estoy seguro de la respuesta, pero una posible solución es

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

yo añadí

"types": [ 
   "node"
]

en mi archivo tsconfig y me funcionó el archivo tsconfig.json parece

  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "module": "es2015",
    "types": [ 
      "node",
      "underscore"
    ]
  },  
Nizam Khan
fuente
Si bien este código podría responder a la pregunta, aún podría considerar agregar algunas oraciones explicativas, ya que esto aumenta el valor de su respuesta para otros usuarios.
MBT
1

Agregue la siguiente línea en la parte superior del archivo que da el error:

declare var require: any
Vardan Nadkarni
fuente
0

Moví el tsconfig.jsonarchivo a una nueva carpeta para reestructurar mi proyecto.

Por lo tanto, no pudo resolver la ruta a la carpeta node_modules / @ types dentro de la typeRootspropiedad de tsconfig.json

Así que actualiza la ruta desde

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

a

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

Para asegurarse de que la ruta a node_modules se resuelva desde la nueva ubicación del tsconfig.json

Mahesh
fuente