Website-Suche

javascript - Wie richtet man eine grundlegende Angular 8-Anwendung mit ES6/ES2015-Modulen (native Unterstützung) ein?


Da die native Unterstützung von ES6-Modulen in den neuesten Browsern recht gut implementiert ist (siehe https://caniuse.com/#feat=es6-module und https://caniuse.com/#feat=es6-module-dynamic-import), versuche ich, eine sehr einfache Angular-8-Anwendung ohne jeglichen Modul-Loader manuell einzurichten, zu Test- und Lernzwecken (bitte schlagen Sie daher nicht vor, Angular CLI zu verwenden).

Mein Problem ist, dass ich Schwierigkeiten habe, den Component-Dekorator von @angular/core zu importieren.

Hier ist meine Projektstruktur:

+---dist
+---node_modules
+---src
|   +---app
|   |   +---app.component.ts
|   |   +---app.module.ts
|   +---main.ts
+---index.html
+---package.json
+---tsconfig.json

Hier ist meine ./tsconfig.json:

{
    "compilerOptions": {
        "outDir": "dist",
        "target": "ES2015",
        "module": "ES2015",
        "moduleResolution": "node",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true
    }
}

Hier ist mein ./package.json:

{
    "name": "angular-starter",
    "version": "1.0.0",
    "private": true,
    "scripts": {
        "start": "live-server"
    },
    "dependencies": {
        "@angular/common": "8.2.0",
        "@angular/compiler": "8.2.0",
        "@angular/core": "8.2.0",
        "@angular/platform-browser": "8.2.0",
        "@angular/platform-browser-dynamic": "8.2.0",
        "rxjs": "6.5.2",
        "tslib": "1.10.0",
        "zone.js": "0.10.1"
    },
    "devDependencies": {
        "live-server": "1.2.1"
    }
}

Hier ist meine ./src/main.ts-Datei:

import "zone.js/dist/zone";

import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";

import { AppModule } from "./app/app.module";

platformBrowserDynamic()
    .bootstrapModule(AppModule)
    .catch(err => console.error(err));

Hier ist meine ./src/app/app.module.ts Datei:

import { BrowserModule } from "@angular/platform-browser";
import { NgModule } from "@angular/core";

import { AppComponent } from "./app.component";

@NgModule({
    declarations: [AppComponent],
    imports: [BrowserModule],
    providers: [],
    bootstrap: [AppComponent]
})
export class AppModule {}

Hier ist meine ./src/app/app.component.ts Datei:

import { Component } from "@angular/core";

@Component({
    selector: "app-root",
    template: "<h1>Welcome to {{ title }}!</h1>"
})
export class AppComponent {
    title = "Angular";
}

Ich habe [email global installiert.

Meine Schritte

Zuerst führe ich den Typescript-Compiler aus:

tsc

Dieser Befehl erstellt diese Dateien in meinem ./dist-Ordner:

+---dist
|   +---app
|   |   +---app.component.js
|   |   +---app.module.js
|   +---main.js

Dann, wenn ich den Live-Server starte, erhalte ich die folgende Ausgabe in der Konsole:

TypeError: Error resolving module specifier: zone.js/dist/zone main.js:1:7

Das ist normal, da Typescript-Importe nicht dem ES6-Standard entsprechen. Ich muss sie manuell aktualisieren, um sie korrekt zu machen (unter Bezugnahme auf js-Dateien mit Dateiendung).

Also ändere ich die Importe jeder Abhängigkeit, verweise auf die Haupt-Entry-Datei, die in jeder package.json jeder Abhängigkeit zu finden ist, und füge ".js" zu meinen Projektdateien hinzu.

In ./dist/main.js:

import "./../node_modules/zone.js/dist/zone-node.js";
import { platformBrowserDynamic } from "./../node_modules/@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js";
import { AppModule } from "./app/app.module.js";
platformBrowserDynamic()
    .bootstrapModule(AppModule)
    .catch(err => console.error(err));

In ./dist/app/app.module.js:

var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { BrowserModule } from "./../../node_modules/@angular/platform-browser/bundles/platform-browser.umd.js";
import { NgModule } from "./../../node_modules/@angular/core/bundles/core.umd.js";
import { AppComponent } from "./app.component.js";
let AppModule = class AppModule {
};
AppModule = __decorate([
    NgModule({
        declarations: [AppComponent],
        imports: [BrowserModule],
        providers: [],
        bootstrap: [AppComponent]
    })
], AppModule);
export { AppModule };

In ./dist/app/app.component.js:

var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { Component } from "./../../node_modules/@angular/core/bundles/core.umd.js";
let AppComponent = class AppComponent {
    constructor() {
        this.title = "Angular";
    }
};
AppComponent = __decorate([
    Component({
        selector: "app-root",
        template: "<h1>Welcome to {{ title }}!</h1>"
    })
], AppComponent);
export { AppComponent };

Alle Importe scheinen einwandfrei zu funktionieren, außer dem letzten in ./dist/app/app.component.js:

SyntaxError: import not found: Component

Dieser Fehler besagt, dass im @angular/core/bundles/core.umd.js nichts den "Component"-Decorator exportiert.

Warum? Was habe ich verpasst?