Maison > interface Web > js tutoriel > Comment mettre à niveau AngularJS vers Angular2+ ? Exemple d'introduction à la mise à niveau d'Angularjs

Comment mettre à niveau AngularJS vers Angular2+ ? Exemple d'introduction à la mise à niveau d'Angularjs

寻∝梦
Libérer: 2018-09-08 15:53:53
original
2074 Les gens l'ont consulté

Cet article présente principalement la mise à niveau de angularjs, d'angularjs vers angulairejs2+. Lisons maintenant cet article ensemble

Résumons les derniers mois Nous avons travaillé des heures supplémentaires pour mettre à niveau deux projets. Le projet utilise UpgradeModule et l'autre utilise DowngradeModule. Créez un enregistrement comme suit : (ng1->AngularJS; ng2+->Angular2+). Pour plus de détails, veuillez consulter la documentation officielle : https://angular.io/guide/upgrade<.>

Les avantages, les inconvénients et les méthodes d'utilisation du dactylographié qui doivent être utilisés ne seront pas décrits ici.


1. UpgradeModule : il s'agit de la première méthode de mise à niveau parallèle publiée par Angular. L'inconvénient est que les performances sont relativement faibles. Elle est relativement simple à comprendre d'abord, puis. ajoutez le contrôleur ng1 Enveloppez-les directement dans /service/directive et ainsi de suite, afin qu'ils puissent s'exécuter directement dans l'environnement ng2+.

Étape par étape :

* Démarrer à partir de l'application ng2 :

** Supprimer ng-app de index.html ;

** Ajouter principal. ts :

import { NgModule } from '@angular/core';
import { UpgradeModule } from '@angular/upgrade/static';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 
import { AppModule } from './app/app.module';
 
platformBrowserDynamic().bootstrapModule(AppModule).then(platformRef => {
    const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
    upgrade.bootstrap(document.body, ['carepilot'], { strictDi: true });
});
Copier après la connexion
** Ajouter app.module.ts : Tous les modules sont définis ici


import { NgModule, forwardRef } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { UpgradeModule } from '@angular/upgrade/static';
 
@NgModule({
    imports: [
        BrowserModule,
        UpgradeModule
    ],
    bootstrap: []
})
 
export class AppModule {
    ngDoBootstrap() {}
}
Copier après la connexion
** Ajouter tsconfig.json : définir comment compiler ts - >js

{
    "compileOnSave": false,
    "compilerOptions": {
        "sourceMap": true,
        "declaration": false,
        "moduleResolution": "node",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "noImplicitAny": true,
        "target": "es5",
        "typeRoots": [
            "node_modules/@types"
        ],
        "lib": [
            "es2015",
            "dom"
        ]
    },
    "exclude": [
        "node_modules"
    ]
}
Copier après la connexion
** systemjs.config.js : utilisez systemjs pour charger les modules dépendants. Lors de la conversion parallèle, l'exemple général consiste à utiliser systemJS pour charger les modules

** Modifier index.html : vous devez charger certaines bibliothèques requises par ng2 (remarque : les zone.js suivants, etc., doivent être copiés dans votre répertoire d'exécution à l'aide d'outils tels que gulp)
/**
 * System configuration for Angular samples
 * Adjust as necessary for your application needs.
 */
(function (global) {
    System.config({
        paths: {
            'npm:': 'node_modules/'
        },
        map: {
            app: 'app',
            '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
            '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
            '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
            '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
            '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
            '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
            '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
            '@angular/upgrade/static': 'npm:@angular/upgrade/bundles/upgrade-static.umd.js',
            '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
            'rxjs': 'npm:rxjs'
        },
        packages: {
            app: {
                defaultExtension: 'js'
            },
            rxjs: {
                defaultExtension: 'js',
                format: 'cjs'
            }
        }
    });
})(this);
Copier après la connexion

Maintenant, cette application hybride devrait pouvoir fonctionner. La tâche suivante consiste à mettre à niveau le contrôleur un par un et à éliminer les pièges un par un
<script></script>
<script></script>
<script></script>
<script></script>

<!-- inject:js -->
<!-- endinject -->

<script>
System.import(&#39;main.js&#39;)
.then(null, console.error.bind(console));
</script>
Copier après la connexion

Pour faire simple, lors de la mise à niveau, le contrôleur-> ; ;component, directive -> composant/directive, service -> service, pipe/filter -> pipe;


* Exemple : Mettre à niveau un contrôleur vers un composant (si vous voulez en voir plus, allez sur le site Web PHP chinois

Manuel de développement AngularJS

)

* Parce que la majeure partie du programme est toujours du code ng1, afin de permettre à ng1 et ng2+ de communiquer, le module ng2+ doit be Premier downgrade :
import {
    Component,
    Inject
} from '@angular/core';
import { Broadcaster } from '../../services/broadcaster';
 
@Component({
    selector: 'about',
    templateUrl: './about.component.html'
})
export class AboutComponent {
 
    constructor(private broadcaster: Broadcaster) {
    }
 
    print(): void {
        this.broadcaster.broadcast('printContents', 'printable');
    }
}
Copier après la connexion

Mettre à jour le routage dans config.js (en supposant que l'état de l'interface utilisateur soit utilisé) :
angular.module('interestApp')

.directive('pinControls',

upgradeAdapter.downgradeNg2Component(PinControlsComponent));
Copier après la connexion

* Le même problème, certains contrôleurs doivent s'appuyer sur certains les précédents après la mise à niveau du service. À ce stade, vous devez mettre à niveau temporairement le service de ng1 vers ng2+ pour une utilisation par les composants de ng2+. Au cours du processus de mise à niveau, je n'ai rencontré que ui-route et j'ai dû le faire. le temps, vous devez utiliser des types. Vous pouvez trouver la bibliothèque correspondante ici La définition de http://definitelytyped.org/docs/angular-ui--angular-ui-router/modules/ng.html
.state('add', {

template: "<add-pin></add-pin>",

url: '/add'
Copier après la connexion
* Après la mise à niveau, la chose la plus gênante est $scope et $rootscope. Dans ng1, le rootscope global est très confortable à utiliser. Il a été annulé dans ng2+. Vous devez définir un service pour remplacer le rootscope précédent. Le composant actuel ne peut pas utiliser directement la portée et utiliser =, > pour lier la valeur. Vous devez utiliser les valeurs de transmission @input et @output, correspondant au processus de transmission de valeur =,> >

* Utilisez ng2+ Router pour définir des itinéraires : Bien sûr, vous pouvez également continuer à utiliser la version améliorée de ui-route @ui-route

* Après des luttes douloureuses (l'utilisation de nouvelles méthodes, changements d'habitudes, il s'avère que certaines bibliothèques ng1 ne sont pas maintenues ou mises à niveau vers ng2+, nous devons donc trouver des alternatives ou les écrire nous-mêmes (

), enfin toutes les choses ng1 ont été mises à niveau. pour supprimer les programmes hérités et pris en charge de ng1 et le transformer en un programme ng2+ complet.

const AppRouting: Routes = [
    { path: 'app', component: DashboardComponent, canLoad: [AuthGuard], canActivate: [AuthGuard], data: { pageTitle: 'Dashboard' }];
Copier après la connexion

** Supprimer le module de mise à niveau :Comment mettre à niveau AngularJS vers Angular2+ ? Exemple dintroduction à la mise à niveau dAngularjs

** Supprimez tous les modules de mise à niveau et les modules de rétrogradation

** Ajoutez un composant d'application pour charger le routage initial : (Ici, on suppose que vous utilisez ng2+default route. Si vous continuez à utiliser ui-route, continuez à utiliser ui-view)
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
 
platformBrowserDynamic().bootstrapModule(AppModule);
Copier après la connexion

* Cela a réussi immédiatement et a finalement utilisé angulaire -cli Pour gérer le processus de compilation et le chargement des modules, cette chose est une bonne chose (même s'il y a quelques aspects insatisfaisants, comme le fait que la version ne prend pas en charge JIT, etc.
)

import { Component } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
 
@Component({
  selector: 'app-root',
    template: `
    <p>
    <router-outlet></router-outlet>
    </p>
  `
})
export class AppComponent {
  constructor(private route: Router) {
        let loc = window.location.pathname.toString();
        if (loc == '/login' || loc == '/') {
            this.route.navigate(['login']);
        }
    }
}
Copier après la connexion

Comment mettre à niveau AngularJS vers Angular2+ ? Exemple dintroduction à la mise à niveau dAngularjs


Maintenant, vous n'avez besoin que de npm (certaines personnes utilisent du fil), et Bower peut être licencié.

  • Systemjs peut également s'incliner ;

  • Gulp ou grognement doit être analysé en détail à ce stade. Si le serveur est plus complexe, il est recommandé de le conserver pour démarrer le serveur. En utilisant concurrent, vous pouvez gérer le code client. avec angulaire-cli lorsque npm exécute dev, gulp /grunt gère le serveur ;

  • Maintenant, toutes les mises à niveau sont terminées. Bien sûr, le processus lui-même rencontrera certainement diverses insatisfactions. la situation spécifique. Si le projet est petit de cette manière, il peut être adopté, il est relativement facile à comprendre, il existe de nombreux exemples sur Internet et il sera mis à niveau rapidement. Si le projet est relativement important et que sa mise à niveau prend plusieurs mois, la méthode de rétrogradation suivante doit être utilisée.

  • 2. Downgrade : L'introduction officielle est très difficile à comprendre pour les personnes qui essaient cela pour la première fois.

原理:downgrade是不改变原来的ng1程序,新建一个ng2+程序,然后把这个程序做成一个模块,直接注入到ng1里头,这样会避免一些额外的change事件,从而避免了不必要的消息循环,这样来提升性能。

用下面的5步升级到ng2+:

第一步:写一个新的ng2+程序,然后注入到ng1里头:

main.ts: (XXXXXX替换成你的ng1的app的名字就行了)

import { NgModule, forwardRef, StaticProvider } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { downgradeModule, downgradeComponent, setAngularLib } from '@angular/upgrade/static';
 
declare const angular: any;
declare const window: any;
const bootstrapFn = (extraProviders: StaticProvider[]) => {
    const platformRef = platformBrowserDynamic(extraProviders);
    return platformRef.bootstrapModule(AppModule);
};
 
const downgradedModule = downgradeModule(bootstrapFn);
 
angular.module('XXXXXX.ng2', [
    downgradedModule
]);
angular.module('XXXXXX.ng2').directive('template', downgradeComponent({ component: template}));
Copier après la connexion

* app.js (就这里麻烦,试了一天才试出来,这么注入,然后加载)

(function() {
    angular.module('XXXXXXX', [
        // all the old modules
        'XXXXXXX.ng2'
    ]);
    // eslint-disable-next-line
    if (window.ignoreNg2ForTest) {
        // temporary not load ng2 module in karma test
        fetchData().then(bootstrapApplication);
    } else {
        // normal hybrid entrance
        loadMain().then(fetchData).then(bootstrapApplication);
    }
 
 
    function loadMain() {
        return System.import('main');   // load main.ts
    }
 
    function fetchData() {
        // old logic
    }
 
    function bootstrapApplication() {
        angular.element(document).ready(function() {
            angular.bootstrap(document, ['XXXXXXXX'], { strictDi: true }); // bootstrap app with ng1
        });
    }
 
}());
Copier après la connexion

* 同样,在index.html里加入一些依赖(升级完都可以删)

<script></script>
<script></script>
<script></script>
<script></script>
Copier après la connexion

* 手动拷一些依赖到dest 文件夹:(我们用的gulp)

pipes.builtAngularVendorScriptsDev = function() {
    return gulp.src([
        './node_modules/core-js/client/shim.min.js',
        ............
    ], {base: './node_modules'})
        .pipe(gulp.dest('dist.dev/node_modules'));
};
Copier après la connexion

* JSPM: 不用这东西的话release 里头的客户端有近百M,会疯的,虽然这个东西也bug重重,临时用用还是可以的。用它以后release的客户端代码只有十几M,可以接受了。

gulp.task('build-jspm-prod', ['hybrid-tsbuild'], function() {
    return jspm({
            config: './client/systemjs.config.js',
            bundleOptions: {
                minify: true,
                mangle: false
            },
            bundleSfx: true,
            bundles: [
                { src: paths.tsOutput + '/*', dst: 'main.js' }
            ]
        }).pipe(gulp.dest('dist.prod'));
});
Copier après la connexion


第二步:升级一个个的controller/service/pipe/directive等等,这个过程相当痛苦,原来代码的耦合,莫名其妙的event emit和不知道在哪儿的event handler。全局的rootscope遍地都是,牵一发动全身。自己解耦吧,没什么好办法。


第三步:升级路由,这个虽然没有上一步那么煎熬,也很头疼,很多地方都要改,

* 如果用route的话参见上面upgrademodule里的例子就好了;

* 如果使用@ui-route的话,state现在需要这么定义:(abstract我还没有研究出来有什么用)

export const registerState = {
    parent: 'app',
    name: 'register',
    url: '/register/{activationCode}',
    component: RegisterComponent,
    data: { pageTitle: 'Register' }
};
Copier après la connexion

第四步:删除ng1的东西;

第五步:使用angular-cli管理依赖:

* 参照上面upgrademodule对应的步骤就好;

* 这时候可以删除JSPM了,这东西和SystemJS都是定时炸弹,bug重重啊,目前angular-cli比较稳定;


到这里,应该你的程序已经升级到了ng2+,目前是ng5,建议升级过程中把anglar相应的版本写死,这东西更新太快,你随着它升随时出现已有的包不兼容,很头疼,我们暂时定格在5.0。

我是升级完了站着说话不腰疼,上面的东西只能帮有需要的朋友节约一点点时间,最大的时间消耗在升级controller和解耦的过程中。那里如果有什么问题可以在下面留言,能帮上的话尽量帮大家省省时间。Comment mettre à niveau AngularJS vers Angular2+ ? Exemple dintroduction à la mise à niveau dAngularjs



备注一:替换规则。


  • ng-bind-html       [innerHTML]

  • ng-model             [(ngModel)]                                        // 这个和ng1的双向绑定基本一个意思

  • ng-class                [ngClass]

  • ng-disabled          [disabled]

  • ng-click                 (click)

  • ng-if                     *ngIf

  • ng-repeat           *ngFor                                              // E.g. *ngFor="let task of currentChecklist.open; let i = index;"

  • ng-show               *ngIf

  • ng-src                   [src]

  • ng-hide                 *ngIf

  • ng-submit            (ngSubmit)

  • ng-style                [ngStyle]

备注二:可能遇到的问题

  • JS:

    • 消息处理:ng2+里没有了scope继承,所以自己定义全局的消息处理是必要的;

  • HTML模板:

    • Conflit de directives : il est préférable de séparer les noms définis. S'il s'appelle

Cet article se termine ici (si vous voulez en voir plus, rendez-vous sur le site Web PHP chinois Manuel de l'utilisateur AngularJS pour apprendre). Si vous avez des questions, vous pouvez les poser ci-dessous. Laissez un message avec une question.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal