Cannot find name 'require' after upgrading to Angular4

匿名 (未验证) 提交于 2019-12-03 08:30:34

问题:

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?

回答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 

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.



回答2:

Still not sure the answer, but a possible workaround is

import * as Chart from 'chart.js'; 


回答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.



回答4:

I moved the tsconfig.json file into a new folder to restructure my project.

So it wasn't able to resolve the path to node_modules/@types folder inside typeRoots property of tsconfig.json

So just update the path from

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

to

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

To just ensure that the path to node_modules is resolved from the new location of the tsconfig.json



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!