Comment déployer réellement une application 2 + Typescript + systemjs?
il y a un tutoriel quickstarter à angular.io qui utilise le typographie & systemjs. Maintenant que j'ai cette miniapp, comment créer quelque chose de déployable? Je n'ai pas pu trouver la moindre info à ce sujet.
ai-je besoin d'outils supplémentaires, les paramètres supplémentaires dans le Système.config?
(je sais que je pourrais utiliser webpack et créer un lot unique.js, mais je voudrais utiliser systemjs comme il est utilisé dans le tutoriel)
pourrait quelqu'un partager leur processus de construction avec cette configuration (Angular 2, TypeScript, systemjs)
7 réponses
la principale chose à comprendre à ce niveau est qu'en utilisant la configuration suivante, vous ne pouvez pas concatter des fichiers JS compilés directement.
à la configuration du compilateur TypeScript:
{
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "declaration": false,
    "stripInternal": true,
    "module": "system",
    "moduleResolution": "node",
    "noEmitOnError": false,
    "rootDir": ".",
    "inlineSourceMap": true,
    "inlineSources": true,
    "target": "es5"
  },
  "exclude": [
    "node_modules"
  ]
}
dans le HTML
System.config({
  packages: {
    app: {
      defaultExtension: 'js',
      format: 'register'
    }
  }
});
  en fait, ces fichiers JS contiendront des modules anonymes. Un module anonyme est un fichier JS qui utilise  System.register  mais sans le nom du module comme premier paramètre. C'est ce que le compilateur typescript génère par défaut lorsque systemjs est configuré en tant que gestionnaire de module.  
 donc pour avoir tous vos modules dans un seul fichier JS, vous devez utiliser la propriété outFile  dans votre configuration de compilateur dactylographié.  
vous pouvez utiliser l'inside gulfp suivant pour faire cela:
const gulp = require('gulp');
const ts = require('gulp-typescript');
var tsProject = ts.createProject('tsconfig.json', {
  typescript: require('typescript'),
  outFile: 'app.js'
});
gulp.task('tscompile', function () {
  var tsResult = gulp.src('./app/**/*.ts')
                     .pipe(ts(tsProject));
  return tsResult.js.pipe(gulp.dest('./dist'));
});
peut être combiné avec un autre traitement:
- à uglify choses compilé le fichier d'enregistrement des fichiers
-   pour créer un app.jsfichier
-   pour créer un vendor.jsfichier pour bibliothèques tierces
-  pour créer un fichier boot.jspour importer le module qui bootstrap l'application. Ce fichier doit être inclus à la fin de la page (lorsque toute la page est chargée).
-   pour mettre à jour le  index.htmlpour tenir compte de ces deux fichiers
les dépendances suivantes sont utilisées dans les tâches gulfp:
- gulfp-concat
- gulfp-html-remplacer
- gulp-tapuscrit
- gulp-uglify
voici un exemple qui pourrait être adapté.
-   créer app.min.jsfichiergulp.task('app-bundle', function () { var tsProject = ts.createProject('tsconfig.json', { typescript: require('typescript'), outFile: 'app.js' }); var tsResult = gulp.src('app/**/*.ts') .pipe(ts(tsProject)); return tsResult.js.pipe(concat('app.min.js')) .pipe(uglify()) .pipe(gulp.dest('./dist')); });
-   créer vendors.min.jsfichiergulp.task('vendor-bundle', function() { gulp.src([ 'node_modules/es6-shim/es6-shim.min.js', 'node_modules/systemjs/dist/system-polyfills.js', 'node_modules/angular2/bundles/angular2-polyfills.js', 'node_modules/systemjs/dist/system.src.js', 'node_modules/rxjs/bundles/Rx.js', 'node_modules/angular2/bundles/angular2.dev.js', 'node_modules/angular2/bundles/http.dev.js' ]) .pipe(concat('vendors.min.js')) .pipe(uglify()) .pipe(gulp.dest('./dist')); });
-   créer boot.min.jsfichiergulp.task('boot-bundle', function() { gulp.src('config.prod.js') .pipe(concat('boot.min.js')) .pipe(uglify()) .pipe(gulp.dest('./dist')); });Le config.prod.jscontient tout simplement le suivant:System.import('boot') .then(null, console.error.bind(console));
-    mise à Jour index.htmlfichiergulp.task('html', function() { gulp.src('index.html') .pipe(htmlreplace({ 'vendor': 'vendors.min.js', 'app': 'app.min.js', 'boot': 'boot.min.js' })) .pipe(gulp.dest('dist')); });le index.htmlressemble à ce qui suit:<html> <head> <!-- Some CSS --> <!-- build:vendor --> <script src="node_modules/es6-shim/es6-shim.min.js"></script> <script src="node_modules/systemjs/dist/system-polyfills.js"></script> <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script> <script src="node_modules/systemjs/dist/system.src.js"></script> <script src="node_modules/rxjs/bundles/Rx.js"></script> <script src="node_modules/angular2/bundles/angular2.dev.js"></script> <script src="node_modules/angular2/bundles/http.dev.js"></script> <!-- endbuild --> <!-- build:app --> <script src="config.js"></script> <!-- endbuild --> </head> <body> <my-app>Loading...</my-app> <!-- build:boot --> <!-- endbuild --> </body> </html>
  notez que le  System.import('boot'); doit être fait à la fin du corps pour attendre que tous les composants de votre app soient enregistrés à partir du fichier app.min.js .  
Je ne décris pas ici la façon de gérer la minification CSS et HTML.
Vous pouvez utiliser angular2-cli commande build
ng build -prod
https://github.com/angular/angular-cli/wiki/build#bundling
bâtit créé avec le - prod drapeau via
ng build -prodoung serve -prodregrouper toutes les dépendances dans un single file , et faire usage de tree-shaking techniques.
mise à Jour
cette réponse a été soumise lorsque angular2 était dans rc4
j'avais essayé à nouveau sur angular-cli beta21 et angular2 ^2.1.0 et il fonctionne comme prévu
cette réponse nécessite d'initialiser l'application avec angular-cli vous pouvez utiliser
ng new myApp
Ou sur un existant
ng init
mise à jour 08/06/2018
pour angular 6 la syntaxe est différent.
ng build --prod --build-optimizer
cocher la Case documentation
vous pouvez construire un angle 2 (2.0.0-rc.1) projet en dactylographie en utilisant SystemJS avec Gulp et SystemJS-Builder .
ci-Dessous est une version simplifiée de la façon de construire, bundle, et rapetisser Tour des Héros de course 2.0.0-rc.1 ( source , live exemple ).
gulffile.js
var gulp = require('gulp');
var sourcemaps = require('gulp-sourcemaps');
var concat = require('gulp-concat');
var typescript = require('gulp-typescript');
var systemjsBuilder = require('systemjs-builder');
// Compile TypeScript app to JS
gulp.task('compile:ts', function () {
  return gulp
    .src([
        "src/**/*.ts",
        "typings/*.d.ts"
    ])
    .pipe(sourcemaps.init())
    .pipe(typescript({
        "module": "system",
        "moduleResolution": "node",
        "outDir": "app",
        "target": "ES5"
    }))
    .pipe(sourcemaps.write('.'))
    .pipe(gulp.dest('app'));
});
// Generate systemjs-based bundle (app/app.js)
gulp.task('bundle:app', function() {
  var builder = new systemjsBuilder('public', './system.config.js');
  return builder.buildStatic('app', 'app/app.js');
});
// Copy and bundle dependencies into one file (vendor/vendors.js)
// system.config.js can also bundled for convenience
gulp.task('bundle:vendor', function () {
    return gulp.src([
        'node_modules/jquery/dist/jquery.min.js',
        'node_modules/bootstrap/dist/js/bootstrap.min.js',
        'node_modules/es6-shim/es6-shim.min.js',
        'node_modules/es6-promise/dist/es6-promise.min.js',
        'node_modules/zone.js/dist/zone.js',
        'node_modules/reflect-metadata/Reflect.js',
        'node_modules/systemjs/dist/system-polyfills.js',
        'node_modules/systemjs/dist/system.src.js',
      ])
        .pipe(concat('vendors.js'))
        .pipe(gulp.dest('vendor'));
});
// Copy dependencies loaded through SystemJS into dir from node_modules
gulp.task('copy:vendor', function () {
  gulp.src(['node_modules/rxjs/**/*'])
    .pipe(gulp.dest('public/lib/js/rxjs'));
  gulp.src(['node_modules/angular2-in-memory-web-api/**/*'])
    .pipe(gulp.dest('public/lib/js/angular2-in-memory-web-api'));
  
  return gulp.src(['node_modules/@angular/**/*'])
    .pipe(gulp.dest('public/lib/js/@angular'));
});
gulp.task('vendor', ['bundle:vendor', 'copy:vendor']);
gulp.task('app', ['compile:ts', 'bundle:app']);
// Bundle dependencies and app into one file (app.bundle.js)
gulp.task('bundle', ['vendor', 'app'], function () {
    return gulp.src([
        'app/app.js',
        'vendor/vendors.js'
        ])
    .pipe(concat('app.bundle.js'))
    .pipe(uglify())
    .pipe(gulp.dest('./app'));
});
gulp.task('default', ['bundle']);du système.config.js
var map = {
  'app':                                'app',
  'rxjs':                               'vendor/rxjs',
  'zonejs':                             'vendor/zone.js',
  'reflect-metadata':                   'vendor/reflect-metadata',
  '@angular':                           'vendor/@angular'
};
var packages = {
  'app':                                { main: 'main', defaultExtension: 'js' },
  'rxjs':                               { defaultExtension: 'js' },
  'zonejs':                             { main: 'zone', defaultExtension: 'js' },
  'reflect-metadata':                   { main: 'Reflect', defaultExtension: 'js' }
};
var packageNames = [
  '@angular/common',
  '@angular/compiler',
  '@angular/core',
  '@angular/http',
  '@angular/platform-browser',
  '@angular/platform-browser-dynamic',
  '@angular/router',
  '@angular/router-deprecated',
  '@angular/testing',
  '@angular/upgrade',
];
packageNames.forEach(function(pkgName) {
  packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
});
System.config({
  map: map,
  packages: packages
});Voici mon boilerplate MEA2N pour Angular 2: https://github.com/simonxca/mean2-boilerplate
 c'est une simple bobine qui utilise tsc  pour assembler les choses. (Utilise en fait    grunt-ts   , qui à son cœur est juste la commande  tsc .) No Wekpack, etc. nécessaire.  
que vous utilisiez ou non grunt, l'idée est:
-   écrivez votre app dans un dossier appelé  ts/(exemple:public/ts/)
-   utilisez  tscpour miroir la structure de répertoire de votre dossierts/dans un dossierjs/et juste des fichiers de référence dans le dossierjs/dans votre dossierindex.html.
  Pour obtenir    grunt-ts    de travailler (il devrait y avoir un équivalent de commande pour la plaine tsc, Gulp, etc.) , vous avez une propriété dans votre  tsconfig.json  appelé   "outDir": "../js" , et référence dans votre  gruntfile.js  avec:  
grunt.initConfig({
  ts: {
    source: {tsconfig: 'app/ts/tsconfig.json'}
  },
  ...
});
  puis lancer  grunt ts , qui prendra votre application dans public/ts/ et miroir de public/js/ .   
là. Super facile à comprendre. Pas la meilleure approche, mais bien pour commencer.
  la façon la plus facile que j'ai trouvé pour regrouper RC1 angulaire pour systemJs est d'utiliser  gulp  et  systemjs-builder :  
gulp.task('bundle', function () {
    var path = require('path');
    var Builder = require('systemjs-builder');
    var builder = new Builder('/node_modules');
    return builder.bundle([
        '@angular/**/*.js'
        ], 
        'wwwroot/bundle.js', 
        { minify: false, sourceMaps: false })
        .then(function () {
            console.log('Build complete');
        })
        .catch(function (err) {
            console.log('Build error');
            console.log(err);
        });
});
  tel que souligné dans les commentaires, systemJs présente actuellement des problèmes lorsqu'il s'agit de grouper des composants en utilisant  moduleId: module.id   
https://github.com/angular/angular/issues/6131
  la recommandation actuelle (angular 2 rc1) semble être d'utiliser des chemins explicites i.e.  moduleId: '/app/path/'    
j'ai utilisé expressjs sur le backend pour servir mon projet ng2. Vous pouvez le vérifier à partir de ma page github: https://github.com/echonax/ng2-beta-and-test-framework
Sous Angle.site Web des OI, dans la section "Advanced/Deployment", il est recommandé que le moyen le plus simple de déployer soit de "copier l'environnement de développement sur le serveur".
-    passez par la section Sous: déploiement le plus simple possible. Les fichiers finaux du projet sont affichés dans la section code. Notez qu'il configure déjà le code pour charger les fichiers package npm à partir du web (au lieu du dossier local npm_modules). 
-   assurez-vous qu'il fonctionne sur votre ordinateur local (npm start). Ensuite, sous le dossier projet, copiez tout ce qui se trouve sous le sous-dossier '/src' dans le seau S3 que vous avez créé. Vous pouvez utiliser le glisser-déposer pour copier, pendant ce processus, vous obtenez l'option de sélectionner le paramètre de permission pour les fichiers, assurez-vous de les rendre "lisible" à "tout le monde". 
-    sous l'onglet "Propriétés", recherchez le panneau "hébergement de site Web statique" , case 'Utiliser ce seau de site web hôte", et spécifiez l'indice.html' à la fois de l'Indice de document et le document d'Erreur. 
-   cliquez sur le site Web statique Endpoint, votre projet bien être en cours d'exécution!