# Angular Migration > Migra de AngularJS a Angular usando modo híbrido, reescritura incremental de componentes y actualización de la inyección de dependencias. Fuente: https://skillsagentes.com/skills/wshobson/agents/angular-migration Markdown: https://skillsagentes.com/skills/wshobson/agents/angular-migration.md Repositorio: https://github.com/wshobson/agents Autor: wshobson Licencia: MIT Actualizado: hace 4 meses Coste de contexto: 57 tok instalada, 1.8k tok al activarse, 2.2k tok con todos los archivos del bundle Bundle: 2 archivos, 9 KB Permisos que pide: ninguno declarado ## Instalación Un skill son archivos markdown: los mismos archivos valen para cualquier agente y lo único que cambia es el directorio de destino, es decir la bandera `--agent`. Añade `-g` para instalarlo en todos los proyectos de la máquina. ```bash # Claude Code npx -y skills add wshobson/agents --skill angular-migration --agent claude-code # Cursor npx -y skills add wshobson/agents --skill angular-migration --agent cursor # Codex npx -y skills add wshobson/agents --skill angular-migration --agent codex # Gemini CLI npx -y skills add wshobson/agents --skill angular-migration --agent gemini # Windsurf npx -y skills add wshobson/agents --skill angular-migration --agent windsurf # Cline npx -y skills add wshobson/agents --skill angular-migration --agent cline ``` ## Qué hace - Aporta estrategias y patrones de código para migrar aplicaciones AngularJS a Angular - Ofrece ejemplos de modo híbrido con ngUpgrade y bootstrap combinado - Muestra cómo convertir controladores, directivas y servicios de AngularJS a componentes y servicios Angular - Explica actualización/downgrade de inyección de dependencias entre AngularJS y Angular - Documenta la migración de rutas de $routeProvider a Angular Router ## Cuándo usarla - Migrar aplicaciones AngularJS (1.x) a Angular (2+) - Ejecutar aplicaciones híbridas AngularJS/Angular - Convertir directivas en componentes - Modernizar la inyección de dependencias o migrar el sistema de rutas ## Qué la activa - "Ayúdame a migrar mi app AngularJS a Angular en modo híbrido" - "Convierte este directive de AngularJS en un componente Angular" - "Cómo hago downgrade de un servicio Angular para usarlo en AngularJS" - "Necesito migrar mis rutas de $routeProvider a Angular Router" ## Antes de instalar - Para patrones y ejemplos completos adicionales, consulta references/details.md. ## Archivos - SKILL.md — 7 KB - references/details.md — 2 KB ## SKILL.md Reproducido tal cual desde wshobson/agents bajo MIT. Esta sección es el documento original y está en inglés. # 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 ```typescript // 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 }); }); ``` ```typescript // 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 ```javascript // 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); }; }); ``` ```typescript // After: Angular component import { Component, OnInit } from "@angular/core"; import { UserService } from "./user.service"; @Component({ selector: "app-user", template: `

{{ user.name }}

`, }) 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 ```javascript // Before: AngularJS directive angular.module("myApp").directive("userCard", function () { return { restrict: "E", scope: { user: "=", onDelete: "&", }, template: `

{{ user.name }}

`, }; }); ``` ```typescript // After: Angular component import { Component, Input, Output, EventEmitter } from "@angular/core"; @Component({ selector: "app-user-card", template: `

{{ user.name }}

`, }) export class UserCardComponent { @Input() user: any; @Output() delete = new EventEmitter(); } // Usage: ``` ## Service Migration ```javascript // 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); }, }; }); ``` ```typescript // 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 { return this.http.get(`/api/users/${id}`); } saveUser(user: any): Observable { return this.http.post("/api/users", user); } } ``` ## Dependency Injection Changes ### Downgrading Angular → AngularJS ```typescript // 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 ```typescript // 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('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 ```javascript // Before: AngularJS routing angular.module("myApp").config(function ($routeProvider) { $routeProvider .when("/users", { template: "", }) .when("/users/:id", { template: "", }); }); ``` ```typescript // 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. ## Dónde encaja - Categoría: [Herramientas para desarrolladores](https://skillsagentes.com/categorias/herramientas-desarrollo.md) — Skills que cambian cómo tu agente escribe, revisa y despliega código. - Creador: [wshobson](https://skillsagentes.com/creators/wshobson.md) — 183 skills en el directorio - [Todas las skills](https://skillsagentes.com/skills.md) - [Ranking de instalaciones](https://skillsagentes.com/ranking.md) ## Otras skills del mismo repositorio - [Hermes Tweet](https://skillsagentes.com/skills/wshobson/agents/hermes-tweet.md): Instala y opera Hermes Tweet, un plugin de Hermes Agent para investigar X/Twitter, leer timelines, analizar tweets y ejecutar operaciones privadas o de cambio de estado con aprobación previa. - [Grounded Vault](https://skillsagentes.com/skills/wshobson/agents/grounded-vault.md): Úsalo para mantener un almacén Markdown de conocimiento donde cada afirmación compilada se rastrea hasta una fuente inmutable y el drift se detecta con git diff sin gastar tokens. - [Postgresql Table Design](https://skillsagentes.com/skills/wshobson/agents/postgresql-table-design.md): Úsalo al diseñar o revisar un esquema específico de PostgreSQL: buenas prácticas, tipos de datos, indexación, restricciones, patrones de rendimiento y funciones avanzadas. - [Superself](https://skillsagentes.com/skills/wshobson/agents/superself.md): Úsalo cuando un proyecto guarda su estado en Superself: lee `self context` al iniciar sesión, vincula el trabajo a una work unit, reporta con evidencia y registra decisiones confirmadas. - [Prompt Engineering Patterns](https://skillsagentes.com/skills/wshobson/agents/prompt-engineering-patterns.md): Úsalo cuando pidan optimizar un prompt, mejorar su rendimiento, diseñar una plantilla, aplicar chain-of-thought, few-shot prompting o técnicas avanzadas de prompt engineering para producción. ## Skills relacionadas - [Architecture Patterns](https://skillsagentes.com/skills/wshobson/agents/architecture-patterns.md): Implementa patrones de arquitectura backend probados: Clean Architecture, Hexagonal Architecture y Domain-Driven Design, para construir sistemas mantenibles, testeables y escalables. - [Async Python Patterns](https://skillsagentes.com/skills/wshobson/agents/async-python-patterns.md): Domina asyncio, programación concurrente y patrones async/await para apps de alto rendimiento con operaciones no bloqueantes. - [Changelog Automation](https://skillsagentes.com/skills/wshobson/agents/changelog-automation.md): Automatiza la generación de changelogs a partir de commits, PRs y releases siguiendo el formato Keep a Changelog. Útil al configurar flujos de release o estandarizar convenciones de commits. - [Cqrs Implementation](https://skillsagentes.com/skills/wshobson/agents/cqrs-implementation.md): Implementa Command Query Responsibility Segregation para arquitecturas escalables; separa modelos de lectura/escritura, optimiza consultas o construye sistemas event-sourced. - [Dependency Upgrade](https://skillsagentes.com/skills/wshobson/agents/dependency-upgrade.md): Gestiona actualizaciones de versiones mayores de dependencias con análisis de compatibilidad, despliegue escalonado y pruebas exhaustivas. --- Skills Agentes · [Índice de páginas en markdown](https://skillsagentes.com/sitemap.md) · [Inicio](https://skillsagentes.com/index.md)