Cannot find name 'require' after upgrading to Angular4

125,872

Solution 1

The problem (as outlined in typescript getting error TS2304: cannot find name ' require') is that the type definitions for node are not installed.

With a projected genned with @angular/cli 1.x, the specific steps should be:

Step 1:

Install @types/node with either of the following:

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

Step 2: Edit your src/tsconfig.app.json file and add the following in place of the empty "types": [], which should already be there:

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

If I've missed anything, jot a comment and I'll edit my answer.

Solution 2

Will work in Angular 7+


I was facing the same issue, I was adding

"types": ["node"]

to tsconfig.json of root folder.

There was one more tsconfig.app.json under src folder and I got solved this by adding

"types": ["node"]

to tsconfig.app.json file under compilerOptions

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

Solution 3

Finally I got solution for this, check my App module file :

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

Notice declare var require: any; in the above code.

Solution 4

Still not sure the answer, but a possible workaround is

import * as Chart from 'chart.js';

Solution 5

As for me, using VSCode and Angular 5, only had to add "node" to types in tsconfig.app.json. Save, and restart the server.

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

One curious thing, is that this problem "cannot find require (", does not happen when excuting with ts-node

Share:
125,872
Thomas Wang
Author by

Thomas Wang

Updated on June 21, 2020

Comments

  • Thomas Wang
    Thomas Wang almost 4 years

    I want to use Chart.js within my Angular project. In previous Angular2 versions, I have been doing this well by using a 'chart.loader.ts' which has:

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

    Then in the component code I just

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

    But after upgrading to cli 1.0.0 and Angular 4, I get the error: "Cannot find name 'require'".

    To reproduce the 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
    

    In my 'tsconfig.json', I have

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

    And in 'node_modules/@types/node/index.d.ts' there is:

    declare var require: NodeRequire;
    

    So I'm confused.

    BTW, I constantly encounter the warning:

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

    Though I have set the "prefix": "" in my '.angular-cli.json'. Could it because changing from 'angular-cli.json' to '.angular-cli.json' the cause?

  • Admin
    Admin about 7 years
    well didnt work for me... do i have to install something else?
  • user3471528
    user3471528 almost 7 years
    Also for me it doesn't work. Details here: stackoverflow.com/questions/44421367/types-not-found
  • BrunoLM
    BrunoLM almost 7 years
    Note: You have to change tsconfig.app.json under src folder adding "types": ["node"], it is not in the root tsconfig
  • Andre
    Andre over 6 years
    I had this issue in the polyfills.ts file, but your "declare var require: any;" fixed it. thanks
  • Paritosh
    Paritosh about 6 years
    Didn't work for me either. another answer suggesting just to add declare var require: any; helped surprisingly.
  • MBT
    MBT almost 6 years
    While this code might answer the question you still might consider adding a few explanatory sentences as this increases the value of your answer for other users.
  • Robbie Smith
    Robbie Smith almost 6 years
    I missed step 2. Thanks!!
  • Artanis Zeratul
    Artanis Zeratul almost 6 years
    it worked for me but I have to remove "typeRoots": [ "../node_modules/@types" ], I am using Angular 5.
  • Pic Mickael
    Pic Mickael over 5 years
    Worked like a charm in Angular 6 for me.
  • Gus
    Gus over 5 years
    This solution worked for me in an Angular 6 library. I needed to add the "types": [ "node" ], to the tsconfig.lib.json though.
  • Kon
    Kon about 5 years
    @BrunoLM you are a lifesaver!
  • httpete
    httpete over 4 years
    in angular 8 I just added "types": [ "node" ] to tsconfig.app.json and it worked.
  • Anders8
    Anders8 almost 4 years
    AND RESTART SERVER. My goodness, it was this all along. Working on Angular 9. 👍
  • Nasenbaer
    Nasenbaer over 3 years
    It did not work for me at step - yarn add @types/node -D because yarn is not a known command. Windows 10, Angular 10.
  • Vinicius
    Vinicius over 3 years
    I needed to restart the ng server to have this working
  • Buchi
    Buchi about 2 years
    simple and easy, solved my problem angular 12