2016-05-16 16 views
9

I have a Node.js & App AngularJS scritta in TypeScript, in cui sto provando a caricare i moduli utilizzando System.js.Caricamento dei moduli in TypeScript utilizzando System.js

Funziona correttamente se si importa solo una classe per specificare un tipo. per esempio:

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

Tuttavia, quando cerco di istanziare una variabile con una classe importata, ottengo un'eccezione a run-time. per esempio:

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

Uncaught ReferenceError: require is not defined

io uso CommonJS. Non posso usare AMD perché ho un progetto per lato server e lato client. Questo è il motivo per cui utilizzo System.js per caricare i moduli nel client.

Questa è la mia definizione System.js:

<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> 

Questo è il contenuto del file di 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; 
    } 
} 

E questa è la linea di JS che produce l'eccezione:

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

Uncaught ReferenceError: require is not defined

Qualsiasi aiuto sarà profondamente apprezzato!

+0

presumo che model.ts contenga la definizione per 'BlogModel', puoi condividere il codice per questo, anche tu devi avere systemjs importati nella pagina html principale, puoi condividere il codice anche per quello? Idealmente non è necessario importare tutti i moduli e verrà caricato come e quando necessario, quindi System.import ('classes.ts') . (Null, console.error.bind (console)); dovrebbe essere sufficiente, anche tu non hai bisogno dell'estensione di ts, –

+0

@Madhu Ranjan Ho modificato la domanda originale e aggiunto il contenuto di model.ts e dei tag di script per System.js – Alon

risposta

5

Proviamo a semplificare le cose un po ':

1) Configurare i systemjs come segue:

System.defaultJSExtensions = true; 

2) Assicurarsi che sia il classes.ts e e bootstrap.ts (questo è nuovo file si dovrebbe create, che eseguirà il bootstrap della vostra app) i file sono transpiled e si trovano nella stessa directory index.html (index.html dovrebbe contenere script per configurare systemjs come specificato sopra)

3) In bootstrap.ts:

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

3) bootstrap l'applicazione con singola chiamata a System.import:

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

provare questi passi e penso che sarà risolvere il tuo problema.

+0

OK l'ho fatto, ma ora ce n'è un altro problema: utilizzo molti file ts. Li carico con gli elementi script, quindi vengono caricati prima che bootstrap.ts finisca di caricare i moduli, quindi generano eccezioni di riferimento. Ho provato a risolverlo temporaneamente copiando tutti i contenuti del file in bootstrap.ts e rimuovendo gli elementi dello script. Tuttavia, sto ancora ricevendo un'eccezione perché uso l'angolare.js che prova a trovare un modulo dichiarato nell'attributo ng-app dell'elemento html. BTW Non aiuta se metto gli elementi di script sotto quello in cui configuro System.js. – Alon

+0

Rimuovi tutti gli elementi di script tranne quello per systemjs. Tutto il caricamento verrà eseguito dal caricatore di moduli (systemjs) in base alle istruzioni 'import' a partire dal tuo modulo bootstrap (nel tuo caso è bootstrap.ts). Questo è tutto ciò che riguarda i moduli in TS/JS. – Amid

+0

Ma cosa dovrei fare con le librerie di terze parti come angular.js? Il compilatore TypeScript dice: "TS2306: 'angular-1.4.7' non è un modulo". – Alon

Problemi correlati