可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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