2016-05-16 8 views
9

Ich habe eine Node.js & AngularJS App geschrieben in TypeScript, in dem ich versuche, Module mit System.js zu laden.Laden von Modulen in TypeScript mit System.js

Es funktioniert gut, wenn ich nur eine Klasse importieren, um einen Typ anzugeben. z:

import {BlogModel} from "./model" 
var model: BlogModel; 

Allerdings, wenn ich versuche, eine Variable mit einer importierten Klasse zu instanziiert, ich eine Ausnahme zur Laufzeit zu bekommen. z:

import {BlogModel} from "./model" 
var model: BlogModel = new BlogModel(); 

Uncaught ReferenceError: require is not defined

I Commonjs verwenden. Ich kann AMD nicht verwenden, weil ich ein Projekt sowohl für die Serverseite als auch für die Clientseite habe. Aus diesem Grund verwende ich System.js, um Module im Client zu laden.

Dies ist meine System.js Definition:

<script src="/assets/libs/systemjs-master/dist/system-polyfills.js"></script> 
    <script src="/assets/libs/systemjs-master/dist/system.src.js"></script> 

    <script> 
     System.config({ 
      packages: { 
       app: { 
        format: 'register', 
        defaultExtension: 'js' 
       } 
      } 
     }); 
     System.import('classes.ts') 
       .then(null, console.error.bind(console)); 
     System.import('model.ts') 
       .then(null, console.error.bind(console)); 
    </script> 

Dies ist der Inhalt der Datei model.ts:

import {User} from "./classes"; 
import {Post} from "./classes"; 

export class BlogModel{ 
    private _currentUser: User; 
    private _posts: Post[]; 

    get currentUser(){ 
     return this._currentUser; 
    } 

    set currentUser(value: User){ 
     this._currentUser = value; 
    } 

    get posts(){ 
     return this._posts; 
    } 

    set posts(value: Post[]){ 
     this._posts = value; 
    } 
} 

Und das ist die JS Linie, die die Ausnahme erzeugt:

var model_1 = require("./model"); 

Uncaught ReferenceError: require is not defined

Jede Hilfe wird sein zutiefst geschätzt!

+0

ich nehme an, dass model.ts die Definition für 'BlogModel' enthält, können Sie den Code dafür teilen, müssen Sie auch systemjs in der HTML-Hauptseite importiert haben, können Sie Code dafür auch teilen? Im Idealfall müssen Sie nicht alle Module importieren und es wird bei Bedarf geladen, also System.import ('classes.ts') .then (null, console.error.bind (console)); sollte ausreichen, auch brauchen Sie nicht ts Erweiterung, –

+0

@Madhu Ranjan Ich habe die ursprüngliche Frage bearbeitet und fügte den Inhalt von model.ts und die Skript-Tags für System.js – Alon

Antwort

5

Lets versuchen, die Dinge ein wenig zu vereinfachen:

1) Konfigurieren Sie Ihren systemjs, wie folgend:

System.defaultJSExtensions = true; 

2) Vergewissern Sie sich, dass sowohl Ihre classes.ts und und bootstrap.ts (diese neue Datei ist, sollten Sie create, die Ihre App bootstrappt) Dateien werden transpiliert und befinden sich im selben Verzeichnis wie index.html (index.html sollte Skript enthalten, um systemjs wie oben angegeben zu konfigurieren)

3) In bootstrap.ts:

import {BlogModel} from "./model" 
let model = new BlogModel(); 
console.log(model); 

3) Bootstrap Ihre Anwendung mit einzelnen Anruf zu System.import:

System.import('bootstrap').then(null, console.error.bind(console)); 

diese Schritte versuchen, und ich denke, Ihr Problem zu lösen.

+0

OK Ich habe es getan, aber jetzt gibt es ein anderes Problem: Ich benutze viele ts-Dateien. Ich lade sie mit Skript-Elementen, so dass sie geladen werden, bevor bootstrap.ts das Laden der Module beendet, daher werfen sie alle Referenz-Ausnahmen. Ich habe versucht, es vorübergehend zu lösen, indem ich den gesamten Dateiinhalt in bootstrap.ts kopiere und die Skriptelemente entferne. Allerdings bekomme ich immer noch eine Ausnahme, weil ich eckig benutze.js, die versucht, ein Modul zu finden, das im ng-app-Attribut des html-Elements deklariert ist. BTW Es hilft nicht, wenn ich die Skriptelemente unter denen setze, in denen ich System.js konfiguriere. – Alon

+0

Entfernen Sie alle Skriptelemente außer dem für systemjs. Alle Ladevorgänge werden vom Modullader (systemjs) gemäß Ihren 'import' Anweisungen ausgeführt, beginnend mit Ihrem Bootstrap-Modul (in Ihrem Fall ist es bootstrap.ts). Dies sind die Module in TS/JS. – Amid

+0

Aber was soll ich mit Bibliotheken von Drittanbietern wie angular.js tun? Der TypeScript-Compiler sagt: "TS2306: 'angular-1.4.7' ist kein Modul". – Alon