Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

Angular’s NG3003 means the compiler would need to add an import for a component, directive, or pipe used in a template, but that import would create a cycle. Start with the file path shown in the error, trace the dependency back to the component being compiled, then remove the back-reference or—where appropriate—use an NgModule compilation path that supports remote scoping. Angular’s NG3003 reference documents the diagnostic and its remedies.

What NG3003 means

NG3003, “Import Cycle Detected,” is a compiler diagnostic about a template dependency. A component’s template references a component, directive, or pipe, and compiling that reference would require Angular to add an import. If the referenced declaration already depends on the component being compiled, the added import would close a cycle.

For example, a parent component’s template uses a child component, while the child imports or injects the parent. The compiler-generated dependency can form parent.ts -> child.ts -> parent.ts. The issue is not simply that Angular found any circular dependency: NG3003 identifies a cycle that would be introduced by an import needed to compile a template reference.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

How to trace the cycle in the error

  1. Read the emitted path. Angular includes the generated cycle in the diagnostic, such as /parent.ts -> /child.ts -> /parent.ts. Treat that path as the starting point rather than guessing from the error name.
  2. Identify the component being compiled. Check which component, directive, or pipe is named by the diagnostic, then note the template reference that requires Angular to import another declaration.
  3. Follow the dependency back. Inspect the files in the path to find the import or other dependency that points back to the original declaration. In the parent-child example, the parent template needs the child, and the child has a dependency on the parent.
  4. Choose a fix that removes the cycle-causing file dependency. Restructure the shared contract, colocate mutually dependent classes, or use a type-only import if the imported declaration is needed only as a type.

Choose a fix that matches the dependency

Approach When it fits What it changes Important boundary
Move a shared abstraction to an independent file Both sides need the same interface or contract, but should not depend on each other directly. Both declarations import the shared interface from a separate file, removing the direct back-reference. The interface should represent the shared contract; moving it does not itself remove a separate runtime dependency if one remains.
Colocate mutually dependent classes Two classes genuinely reference one another and can reasonably live in one file. Removes the import edge between those files, so that edge cannot participate in the cycle. Use this when the shared-file arrangement remains understandable and maintainable.
Use import type The imported declaration is used only in a type position. Makes the import type-only; Angular notes that type-only imports do not contribute to the cycle. Do not use it when the declaration is needed as a runtime value, such as for runtime behavior or a value reference.
Rely on NgModule remote scoping An NgModule-based application can connect the dependencies through its NgModule rather than adding the cycle-causing import to the component. Angular places additional remote-scoping code in the NgModule. The code is side-effectful and prevents tree shaking. Angular says this approach cannot be used in libraries; a library using compilationMode: partial raises NG3003 when a component needs a cyclic import.

Why library builds can expose NG3003

NgModule remote scoping is a workaround for some application builds, not a general solution for libraries. Because the generated remote-scoping code is side-effectful and prevents tree shaking, Angular cannot use it in libraries. In partial-compilation mode, a library component that needs a cycle-causing import therefore surfaces NG3003. For that case, fix the dependency structure—such as by extracting a shared interface, colocating mutually dependent classes, or making a genuinely type-only import—instead of relying on remote scoping.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Keep the diagnosis focused

Use the compiler’s cycle path to distinguish NG3003 from other circular-dependency problems in an Angular project. This diagnostic concerns an import the compiler would need for a referenced component, directive, or pipe; tracing that specific path reveals the dependency direction that must change.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.