Introduction
Angular 14+ introduced standalone components that don't require NgModule. Import errors occur when the imports array is missing required modules, or when bootstrapping is misconfigured.
Symptoms
Missing import error:
```bash $ ng build
- 1.Error: 'NgIf' is not a known element:
- 2.If 'ngIf' is an Angular component, verify that it's part of this module.
- 3.If 'ngIf' is an Angular directive, add it to the imports array.
- 4.
`
Provider not found:
Error: NullInjectorError: No provider for HttpClient!Bootstrap error:
Error: The standalone component 'AppComponent' needs to be bootstrapped using 'bootstrapApplication'Common Causes
- 1.Missing CommonModule - NgIf, NgFor not available
- 2.Missing FormsModule - ngModel not working
- 3.Missing HttpClient - HTTP client not provided
- 4.Wrong imports syntax - Using NgModule imports style
- 5.Bootstrap configuration - Not using bootstrapApplication
- 6.Module vs Standalone mixing - Conflicting patterns
Step-by-Step Fix
- 1.Identify the error in logs
- 2.Verify configuration settings
- 3.Test connectivity
- 4.Apply corrective action
- 5.Verify the fix
Step 1: Add Required Imports
typescript
// WRONG: Missing imports
@Component({
selector: 'app-user',
standalone: true,
template:
<div *ngIf="user">{{ user.name }}</div>
<ul>
<li *ngFor="let item of items">{{ item }}</li>
</ul>
`
})
export class UserComponent {
// Error: NgIf, NgFor not found!
}
// CORRECT: Import required directives import { NgIf, NgFor } from '@angular/common';
@Component({
selector: 'app-user',
standalone: true,
imports: [NgIf, NgFor], // Add required imports
template:
<div *ngIf="user">{{ user.name }}</div>
<ul>
<li *ngFor="let item of items">{{ item }}</li>
</ul>
})
export class UserComponent { }
```
Step 2: Import CommonModule (Alternative)
```typescript // Import entire CommonModule import { CommonModule } from '@angular/common';
@Component({
selector: 'app-user',
standalone: true,
imports: [CommonModule], // Includes NgIf, NgFor, etc.
template: ...
})
export class UserComponent { }
// Or import specific items (recommended for tree-shaking) import { NgIf, NgFor, NgClass, NgStyle } from '@angular/common';
@Component({ standalone: true, imports: [NgIf, NgFor, NgClass, NgStyle], // ... }) ```
Step 3: Import Forms Modules
```typescript // For template-driven forms import { FormsModule } from '@angular/forms';
@Component({
standalone: true,
imports: [FormsModule],
template:
<input [(ngModel)]="name" />
})
export class FormComponent { }
// For reactive forms import { ReactiveFormsModule } from '@angular/forms';
@Component({
standalone: true,
imports: [ReactiveFormsModule],
template:
<form [formGroup]="form">
<input formControlName="email" />
</form>
})
export class ReactiveComponent { }
```
Step 4: Import RouterModule
```typescript import { RouterModule } from '@angular/router';
@Component({
standalone: true,
imports: [
RouterModule,
// Or specific router directives
// RouterOutlet, RouterLink, RouterLinkActive
],
template:
<nav>
<a routerLink="/home">Home</a>
</nav>
<router-outlet></router-outlet>
})
export class AppComponent { }
// For routing in standalone import { provideRouter } from '@angular/router';
// main.ts bootstrapApplication(AppComponent, { providers: [ provideRouter(routes) ] }); ```
Step 5: Provide HttpClient
```typescript // In main.ts for standalone app import { provideHttpClient } from '@angular/common/http';
bootstrapApplication(AppComponent, { providers: [ provideHttpClient() ] });
// Or in component with providers @Component({ standalone: true, imports: [HttpClientModule], // Deprecated in Angular 15+ providers: [ // Component-level providers ] }) export class ApiComponent { }
// Angular 15+ approach bootstrapApplication(AppComponent, { providers: [ provideHttpClient( withInterceptors([authInterceptor]) ) ] }); ```
Step 6: Bootstrap Standalone App
```typescript // main.ts - Correct standalone bootstrap import { bootstrapApplication } from '@angular/platform-browser'; import { AppComponent } from './app/app.component'; import { provideRouter } from '@angular/router'; import { provideHttpClient } from '@angular/common/http'; import { routes } from './app/app.routes';
bootstrapApplication(AppComponent, { providers: [ provideRouter(routes), provideHttpClient() ] }).catch(err => console.error(err));
// WRONG: Using NgModule bootstrap for standalone platformBrowserDynamic().bootstrapModule(AppModule); // This fails for standalone components
// CORRECT: Use bootstrapApplication for standalone ```
Step 7: Import Other Standalone Components
typescript
// Child standalone component
@Component({
selector: 'app-child',
standalone: true,
template: <p>Child component</p>`
})
export class ChildComponent { }
// Parent imports child
@Component({
selector: 'app-parent',
standalone: true,
imports: [ChildComponent], // Import standalone component
template:
<app-child></app-child>
})
export class ParentComponent { }
```
Step 8: Import NgModules into Standalone
```typescript // You can import NgModules into standalone components import { SharedModule } from './shared/shared.module';
@Component({ standalone: true, imports: [ CommonModule, FormsModule, SharedModule, // NgModule with shared components MatInputModule // Angular Material module ] }) export class FormComponent { }
// The NgModule's exports become available ```
Step 9: Configure Providers
```typescript // App-level providers bootstrapApplication(AppComponent, { providers: [ provideRouter(routes), provideHttpClient(), { provide: API_URL, useValue: 'https://api.example.com' }, UserService, AuthService ] });
// Component-level providers @Component({ standalone: true, providers: [ LocalService, // New instance for each component { provide: SomeToken, useFactory: () => new SomeService() } ] }) export class StandaloneComponent { }
// Use viewProviders for providers visible to children @Component({ standalone: true, viewProviders: [SharedService] }) ```
Step 10: Migrate from NgModule
```typescript // BEFORE: NgModule-based component @NgModule({ imports: [CommonModule, FormsModule, RouterModule], declarations: [UserComponent], exports: [UserComponent] }) export class UserModule { }
// AFTER: Standalone component
@Component({
selector: 'app-user',
standalone: true,
imports: [CommonModule, FormsModule, RouterModule],
template: ...
})
export class UserComponent { }
// No module needed!
// Update routing // BEFORE { path: 'users', loadChildren: () => import('./users/users.module').then(m => m.UsersModule) }
// AFTER { path: 'users', loadComponent: () => import('./users/user.component').then(c => c.UserComponent) } ```
Standalone Imports Reference
| Import | For |
|---|---|
| CommonModule | NgIf, NgFor, NgClass, etc. |
| FormsModule | ngModel, template forms |
| ReactiveFormsModule | FormGroup, FormControl |
| RouterModule | routerLink, router-outlet |
| HttpClientModule | HttpClient (deprecated) |
| provideHttpClient() | HttpClient (Angular 15+) |
Verification
```bash # After configuring standalone imports
# 1. Build should succeed ng build
# Should not see "not a known element" errors
# 2. Check tree-shaking ng build --stats-json npx webpack-bundle-analyzer dist/stats.json
# Standalone imports should result in smaller bundles
# 3. Run application ng serve
# Should start without import errors
# 4. Test components render # Navigate to routes, check components appear
# 5. Check console # Should not see NullInjectorError ```
Prevention
To prevent Angular standalone component import issues from recurring, implement these proactive measures:
1. Use Strict Template Type Checking
```json // tsconfig.json { "angularCompilerOptions": { "strictTemplates": true, "strictInjectionParameters": true } }
// Catches import errors at compile time ```
2. Document Component Dependencies
// Use JSDoc to document required imports
/**
* UserListComponent - Displays list of users
* @requires CommonModule - For *ngFor, *ngIf
* @requires RouterModule - For routerLink
* @requires UserService - For user data
*/
@Component({
standalone: true,
imports: [CommonModule, RouterModule],
// ...
})
export class UserListComponent { }3. Create Import Presets
```typescript // shared-imports.ts - Pre-configured import sets import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router';
export const COMMON_IMPORTS = [ CommonModule, FormsModule, RouterModule ] as const;
export const FORM_IMPORTS = [ CommonModule, FormsModule, ReactiveFormsModule ] as const;
// Usage in component @Component({ standalone: true, imports: [...COMMON_IMPORTS, MyCustomService] }) ```
Best Practices Checklist
- [ ] Enable strict template type checking
- [ ] Document component dependencies
- [ ] Create reusable import presets
- [ ] Test components in isolation
- [ ] Use Angular CLI linting
- [ ] Review imports during code review
Related Issues
- [Fix Angular Module Not Found](/articles/fix-angular-module-not-found)
- [Fix Angular Dependency Injection Error](/articles/fix-angular-dependency-injection-error)
- [Fix Angular Ivy Compilation Failed](/articles/fix-angular-ivy-compilation-failed)
Related Articles
- [Technical troubleshooting: Fix Browser Back Button State Lost Spa Navigation ](browser-back-button-state-lost-spa-navigation)
- [Fix Cors Fetch Localhost Development Blocked Issue in Frontend](cors-fetch-localhost-development-blocked)
- [Fix Csp Violation Blocked Inline Script Style Issue in Frontend](csp-violation-blocked-inline-script-style)
- [Fix Angular Change Detection Loop](fix-angular-change-detection-loop)
- [Fix Angular Dependency Injection Error](fix-angular-dependency-injection-error)
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "Fix Angular Standalone Component Import", "description": "Troubleshoot Angular standalone component import errors. Configure imports array and bootstrap correctly.", "url": "https://www.fixwikihub.com/fix-angular-standalone-component-import", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2026-04-04T04:44:28.429Z", "dateModified": "2026-04-04T04:44:28.429Z" } </script>