Impossible de trouver le nom «requis» après la mise à niveau vers Angular4

120

Je souhaite utiliser Chart.js dans mon projet Angular. Dans les versions précédentes d'Angular2, j'ai bien fait cela en utilisant un 'chart.loader.ts' qui a:

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

Ensuite, dans le code du composant, je viens de

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

Mais après la mise à niveau vers cli 1.0.0 et Angular 4, j'obtiens l'erreur: "Impossible de trouver le nom 'require'".

Pour reproduire l'erreur:

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

Dans mon 'tsconfig.json', j'ai

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

Et dans 'node_modules/@types/node/index.d.ts' il y a:

declare var require: NodeRequire;

Donc je suis confus.

BTW, je rencontre constamment l'avertissement:

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

Bien que j'aie défini le "préfixe": "" dans mon '.angular-cli.json'. Serait-ce parce que changer de «angular-cli.json» à «.angular-cli.json» la cause?

Thomas Wang
la source
Le problème se trouve dans votre fichier tsconfig.json. Voir la solution ici: stackoverflow.com/questions/31173738/…
IndyWill
@IndyWill Merci, en fait, il devrait être dans src / tsconfig.app.json. Pouvez-vous écrire ceci comme réponse?
Thomas Wang
Pour électron + angulaire 2/4 voir: stackoverflow.com/a/47364843/5248229
mihaa123

Réponses:

232

Le problème (comme indiqué dans l'erreur de type TS2304: impossible de trouver le nom 'require' ) est que les définitions de type pour le nœud ne sont pas installées.

Avec un projet défini with @angular/cli 1.x, les étapes spécifiques devraient être:

Étape 1 :

Installez @types/nodeavec l'un des éléments suivants:

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

Étape 2 : Modifiez votre fichier src / tsconfig.app.json et ajoutez ce qui suit à la place du vide "types": [], qui devrait déjà être là:

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

Si j'ai manqué quelque chose, notez un commentaire et je modifierai ma réponse.

IndyWill
la source
11
bien n'a pas fonctionné pour moi ... dois-je installer autre chose?
1
Cela ne fonctionne pas non plus pour moi. Détails ici: stackoverflow.com/questions/44421367/types-not-found
user3471528
49
Remarque: vous devez changer tsconfig.app.jsonsous le srcdossier en ajoutant "types": ["node"], ce n'est pas dans la racine tsconfig
BrunoLM
11
Cela n'a pas fonctionné pour moi non plus. une autre réponse suggérant simplement d'ajouter a declare var require: any;aidé de manière surprenante.
Paritosh
J'ai manqué l'étape 2. Merci !!
Robbie Smith
25

Enfin, j'ai une solution pour cela, vérifiez mon fichier de module d'application:

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

Avis declare var require: any;dans le code ci-dessus.

GsMalhotra
la source
1
J'ai eu ce problème dans le fichier polyfills.ts, mais votre "declare var require: any;" réparé. merci
Andre
18

Fonctionnera dans Angular 7+


J'étais confronté au même problème, j'ajoutais

"types": ["node"]

à tsconfig.json du dossier racine.

Il y avait encore un tsconfig.app.json dans le dossier src et j'ai résolu ce problème en ajoutant

"types": ["node"]

dans le fichier tsconfig.app.json souscompilerOptions

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

Quant à moi, en utilisant VSCode et Angular 5, je n'avais qu'à ajouter "node" aux types dans tsconfig.app.json. Enregistrez et redémarrez le serveur.

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

Une chose curieuse, c'est que ce problème "ne peut pas trouver require (", ne se produit pas lors de l'exécution avec ts-node

Val Martinez
la source
1
A fonctionné comme un charme dans Angular 6 pour moi.
Pic Mickael
Cette solution a fonctionné pour moi dans une bibliothèque Angular 6. J'avais besoin d'ajouter "types": [ "node" ],le tsconfig.lib.jsoncependant.
Gus
ET REDÉMARREZ LE SERVEUR. Mon Dieu, c'était ça depuis le début. Travailler sur Angular 9. 👍
Anders8
13

Toujours pas sûr de la réponse, mais une solution de contournement possible est

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

J'ai ajouté

"types": [ 
   "node"
]

dans mon fichier tsconfig et cela a fonctionné pour moi le fichier tsconfig.json ressemble à

  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "module": "es2015",
    "types": [ 
      "node",
      "underscore"
    ]
  },  
Nizam Khan
la source
Bien que ce code puisse répondre à la question, vous pouvez toujours envisager d'ajouter quelques phrases explicatives, car cela augmente la valeur de votre réponse pour les autres utilisateurs.
MBT
1

Ajoutez la ligne suivante en haut du fichier qui donne l'erreur:

declare var require: any
Vardan Nadkarni
la source
0

J'ai déplacé le tsconfig.jsonfichier dans un nouveau dossier pour restructurer mon projet.

Il n'a donc pas pu résoudre le chemin du dossier node_modules / @ types dans la typeRootspropriété de tsconfig.json

Alors mettez simplement à jour le chemin depuis

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

à

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

Pour simplement vous assurer que le chemin vers node_modules est résolu à partir du nouvel emplacement du tsconfig.json

Mahesh
la source