Agent Skillswshobson/agents › angular-migration

angular-migration

GitHub

指导将 AngularJS 应用迁移至 Angular,涵盖混合模式配置、组件转换、依赖注入更新及路由迁移策略,适用于框架升级和遗留代码现代化。

plugins/framework-migration/skills/angular-migration/SKILL.md wshobson/agents

Trigger Scenarios

AngularJS 升级到 Angular 运行混合 AngularJS/Angular 应用 将指令转换为组件 现代化依赖注入

Install

npx skills add wshobson/agents --skill angular-migration -g -y
More Options

Non-standard path

npx skills add https://github.com/wshobson/agents/tree/main/plugins/framework-migration/skills/angular-migration -g -y

Use without installing

npx skills use wshobson/agents@angular-migration

指定 Agent (Claude Code)

npx skills add wshobson/agents --skill angular-migration -a claude-code -g -y

安装 repo 全部 skill

npx skills add wshobson/agents --all -g -y

预览 repo 内 skill

npx skills add wshobson/agents --list

SKILL.md

Frontmatter
{
    "name": "angular-migration",
    "description": "Migrate from AngularJS to Angular using hybrid mode, incremental component rewriting, and dependency injection updates. Use when upgrading AngularJS applications, planning framework migrations, or modernizing legacy Angular code."
}

Angular Migration

Master AngularJS to Angular migration, including hybrid apps, component conversion, dependency injection changes, and routing migration.

When to Use This Skill

  • Migrating AngularJS (1.x) applications to Angular (2+)
  • Running hybrid AngularJS/Angular applications
  • Converting directives to components
  • Modernizing dependency injection
  • Migrating routing systems
  • Updating to latest Angular versions
  • Implementing Angular best practices

Migration Strategies

1. Big Bang (Complete Rewrite)

  • Rewrite entire app in Angular
  • Parallel development
  • Switch over at once
  • Best for: Small apps, green field projects

2. Incremental (Hybrid Approach)

  • Run AngularJS and Angular side-by-side
  • Migrate feature by feature
  • ngUpgrade for interop
  • Best for: Large apps, continuous delivery

3. Vertical Slice

  • Migrate one feature completely
  • New features in Angular, maintain old in AngularJS
  • Gradually replace
  • Best for: Medium apps, distinct features

Hybrid App Setup

// main.ts - Bootstrap hybrid app
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";
import { UpgradeModule } from "@angular/upgrade/static";
import { AppModule } from "./app/app.module";

platformBrowserDynamic()
  .bootstrapModule(AppModule)
  .then((platformRef) => {
    const upgrade = platformRef.injector.get(UpgradeModule);
    // Bootstrap AngularJS
    upgrade.bootstrap(document.body, ["myAngularJSApp"], { strictDi: true });
  });
// app.module.ts
import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { UpgradeModule } from "@angular/upgrade/static";

@NgModule({
  imports: [BrowserModule, UpgradeModule],
})
export class AppModule {
  constructor(private upgrade: UpgradeModule) {}

  ngDoBootstrap() {
    // Bootstrapped manually in main.ts
  }
}

Component Migration

AngularJS Controller → Angular Component

// Before: AngularJS controller
angular
  .module("myApp")
  .controller("UserController", function ($scope, UserService) {
    $scope.user = {};

    $scope.loadUser = function (id) {
      UserService.getUser(id).then(function (user) {
        $scope.user = user;
      });
    };

    $scope.saveUser = function () {
      UserService.saveUser($scope.user);
    };
  });
// After: Angular component
import { Component, OnInit } from "@angular/core";
import { UserService } from "./user.service";

@Component({
  selector: "app-user",
  template: `
    <div>
      <h2>{{ user.name }}</h2>
      <button (click)="saveUser()">Save</button>
    </div>
  `,
})
export class UserComponent implements OnInit {
  user: any = {};

  constructor(private userService: UserService) {}

  ngOnInit() {
    this.loadUser(1);
  }

  loadUser(id: number) {
    this.userService.getUser(id).subscribe((user) => {
      this.user = user;
    });
  }

  saveUser() {
    this.userService.saveUser(this.user);
  }
}

AngularJS Directive → Angular Component

// Before: AngularJS directive
angular.module("myApp").directive("userCard", function () {
  return {
    restrict: "E",
    scope: {
      user: "=",
      onDelete: "&",
    },
    template: `
      <div class="card">
        <h3>{{ user.name }}</h3>
        <button ng-click="onDelete()">Delete</button>
      </div>
    `,
  };
});
// After: Angular component
import { Component, Input, Output, EventEmitter } from "@angular/core";

@Component({
  selector: "app-user-card",
  template: `
    <div class="card">
      <h3>{{ user.name }}</h3>
      <button (click)="delete.emit()">Delete</button>
    </div>
  `,
})
export class UserCardComponent {
  @Input() user: any;
  @Output() delete = new EventEmitter<void>();
}

// Usage: <app-user-card [user]="user" (delete)="handleDelete()"></app-user-card>

Service Migration

// Before: AngularJS service
angular.module("myApp").factory("UserService", function ($http) {
  return {
    getUser: function (id) {
      return $http.get("/api/users/" + id);
    },
    saveUser: function (user) {
      return $http.post("/api/users", user);
    },
  };
});
// After: Angular service
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs";

@Injectable({
  providedIn: "root",
})
export class UserService {
  constructor(private http: HttpClient) {}

  getUser(id: number): Observable<any> {
    return this.http.get(`/api/users/${id}`);
  }

  saveUser(user: any): Observable<any> {
    return this.http.post("/api/users", user);
  }
}

Dependency Injection Changes

Downgrading Angular → AngularJS

// Angular service
import { Injectable } from "@angular/core";

@Injectable({ providedIn: "root" })
export class NewService {
  getData() {
    return "data from Angular";
  }
}

// Make available to AngularJS
import { downgradeInjectable } from "@angular/upgrade/static";

angular.module("myApp").factory("newService", downgradeInjectable(NewService));

// Use in AngularJS
angular.module("myApp").controller("OldController", function (newService) {
  console.log(newService.getData());
});

Upgrading AngularJS → Angular

// AngularJS service
angular.module('myApp').factory('oldService', function() {
  return {
    getData: function() {
      return 'data from AngularJS';
    }
  };
});

// Make available to Angular
import { InjectionToken } from '@angular/core';

export const OLD_SERVICE = new InjectionToken<any>('oldService');

@NgModule({
  providers: [
    {
      provide: OLD_SERVICE,
      useFactory: (i: any) => i.get('oldService'),
      deps: ['$injector']
    }
  ]
})

// Use in Angular
@Component({...})
export class NewComponent {
  constructor(@Inject(OLD_SERVICE) private oldService: any) {
    console.log(this.oldService.getData());
  }
}

Routing Migration

// Before: AngularJS routing
angular.module("myApp").config(function ($routeProvider) {
  $routeProvider
    .when("/users", {
      template: "<user-list></user-list>",
    })
    .when("/users/:id", {
      template: "<user-detail></user-detail>",
    });
});
// After: Angular routing
import { NgModule } from "@angular/core";
import { RouterModule, Routes } from "@angular/router";

const routes: Routes = [
  { path: "users", component: UserListComponent },
  { path: "users/:id", component: UserDetailComponent },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
})
export class AppRoutingModule {}

Additional patterns and templates

More detailed templates and worked examples live in references/details.md. Read that file for the full pattern library.

Version History

  • 367cb6a Current 2026-08-20 06:51

Same Skill Collection

plugins/accessibility-compliance/skills/screen-reader-testing/SKILL.md
plugins/accessibility-compliance/skills/wcag-audit-patterns/SKILL.md
plugins/agent-teams/skills/multi-reviewer-patterns/SKILL.md
plugins/agent-teams/skills/parallel-debugging/SKILL.md
plugins/agent-teams/skills/task-coordination-strategies/SKILL.md
plugins/api-scaffolding/skills/fastapi-templates/SKILL.md
plugins/avoid-ai-writing/skills/avoid-ai-writing/SKILL.md
plugins/backend-development/skills/api-design-principles/SKILL.md
plugins/backend-development/skills/architecture-patterns/SKILL.md
plugins/backend-development/skills/cqrs-implementation/SKILL.md
plugins/backend-development/skills/event-store-design/SKILL.md
plugins/backend-development/skills/microservices-patterns/SKILL.md
plugins/backend-development/skills/projection-patterns/SKILL.md
plugins/backend-development/skills/temporal-python-testing/SKILL.md
plugins/backend-development/skills/workflow-orchestration-patterns/SKILL.md
plugins/before-you-build/skills/before-you-build/SKILL.md
plugins/block-no-verify/skills/block-no-verify-hook/SKILL.md
plugins/blockchain-web3/skills/defi-protocol-templates/SKILL.md
plugins/blockchain-web3/skills/nft-standards/SKILL.md
plugins/blockchain-web3/skills/solidity-security/SKILL.md
plugins/blockchain-web3/skills/web3-testing/SKILL.md
plugins/business-analytics/skills/data-storytelling/SKILL.md
plugins/business-analytics/skills/kpi-dashboard-design/SKILL.md
plugins/cicd-automation/skills/deployment-pipeline-design/SKILL.md
plugins/cicd-automation/skills/github-actions-templates/SKILL.md
plugins/cicd-automation/skills/gitlab-ci-patterns/SKILL.md
plugins/cicd-automation/skills/secrets-management/SKILL.md
plugins/cloud-infrastructure/skills/cost-optimization/SKILL.md
plugins/cloud-infrastructure/skills/hybrid-cloud-networking/SKILL.md
plugins/cloud-infrastructure/skills/istio-traffic-management/SKILL.md
plugins/cloud-infrastructure/skills/linkerd-patterns/SKILL.md
plugins/cloud-infrastructure/skills/mtls-configuration/SKILL.md
plugins/cloud-infrastructure/skills/multi-cloud-architecture/SKILL.md
plugins/cloud-infrastructure/skills/service-mesh-observability/SKILL.md
plugins/cloud-infrastructure/skills/terraform-module-library/SKILL.md
plugins/conductor/skills/track-management/SKILL.md
plugins/conductor/skills/workflow-patterns/SKILL.md
plugins/data-engineering/skills/airflow-dag-patterns/SKILL.md
plugins/data-engineering/skills/data-quality-frameworks/SKILL.md
plugins/data-engineering/skills/dbt-transformation-patterns/SKILL.md
plugins/data-engineering/skills/spark-optimization/SKILL.md
plugins/database-design/skills/postgresql/SKILL.md
plugins/developer-essentials/skills/auth-implementation-patterns/SKILL.md
plugins/developer-essentials/skills/bazel-build-optimization/SKILL.md
plugins/developer-essentials/skills/code-review-excellence/SKILL.md
plugins/developer-essentials/skills/debugging-strategies/SKILL.md
plugins/developer-essentials/skills/e2e-testing-patterns/SKILL.md
plugins/developer-essentials/skills/error-handling-patterns/SKILL.md
plugins/developer-essentials/skills/git-advanced-workflows/SKILL.md
plugins/developer-essentials/skills/monorepo-management/SKILL.md

Metadata

Files
0
Version
367cb6a
Hash
71aba758
Indexed
2026-08-20 06:51

- 위키
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-08-24 21:23
浙ICP备14020137号-1 $방문자$