2017-06-02 1 views
0

J'utilise le compilateur dactylographiée pour regrouper mes modules dans un seul fichier main.js, en utilisant ces paramètres dans tsconfig.json:Comment démarrer une application Typescript avec des modules SystemJS?

"module": "system", 
"out": "docs/js/main.js" 

Cela fonctionne, donc selon le SystemJS documentation, je ne dispose que d'inclure les SystemJS fichier de production et relancer l'application avec ces balises dans mon HTML:

<script src="js/system.js"></script> 
<script> 
    SystemJS.import('js/main.js'); 
</script> 

mon application:

import { Message } from "./message"; 

export class App { 
    constructor() { 
     let demomessage = new Message("hello"); 
    } 
} 

export class Message {  
    constructor(str:string) { 
     console.log(str); 
    } 
} 

Cette rESU LTS dans ce code javascript main.js:

System.register("message", ...) { 
    // message code here 
}); 
System.register("app", ...) { 
    // app code here 
}); 

La partie que je manque (et qui est pas non plus expliqué dans Microsoft's always-lacking-Typescript-documentation) est de savoir comment réellement commencer l'application ... Comment ne SystemJS savoir quelle classe est le point de départ? Même si je viens de mettre console.log dans mon application n'exécute pas ....

EDIT

j'ai découvert que l'utilisation system.js au lieu de système production.js au moins démarre le processus . Après beaucoup de bidouillage, j'ai eu mon application pour commencer avec le code suivant, mais ça a l'air bizarre et moche. Est-ce que c'est comme ça que ça marche ???

<script src="js/system.js"></script> 
<script> 
    // get the anonymous scope 
    System.import('js/main.js') 
    .then(function() { 
     // now we can get to the app and make a new instance 
     System.import('app').then(function(m){ 
     let app = new m.App(); 
     }) 
    }); 
</script> 
+0

Oui, c'est comme ça que ça doit marcher. La première importation charge le paquet juste pour pré-remplir le registre du module, il n'y a rien dans le paquet indiquant quel module doit être exécuté, c'est le but de la deuxième importation. – artem

+0

Merci, mais existe-t-il un moyen par lequel l'application peut se lancer après avoir été chargée? La plupart des didacticiels systemjs ne mentionnent que import (js/main.js) et cela semble suffisant ...? – Kokodoko

+0

Il n'y a aucun moyen si 'js/main.js' est un paquet contenant plusieurs modules, en d'autres termes, il a plusieurs' System.register() 'appels. Je suppose que tous les tutoriels supposent qu'il s'agit d'un seul module, peut-être construit avec rollup, ou juste dégroupé et le chargement de tous les autres modules séparément. – artem

Répondre

0

Après beaucoup de tête-éraflure Je trouve la réponse est plus simple que prévu: il suffit de charger le faisceau d'abord comme un fichier régulier .js, et vous pouvez importer l'application directement:

<script src="js/system.js"></script> 
<script src="js/main.js"></script> 
<script> 
    System.import('app').then(function(module) { 
    let a = new module.App(); 
    }); 
</script>