Подтвердить что ты не робот

Как я фактически развертываю приложение Angular 2 + Typescript + systemjs?

В учебнике angular.io есть учебник быстрого запуска, в котором используются typescript и systemjs. Теперь, когда я запускаю этот мини-принтер, как бы я мог создать что-то развертываемое? Я не мог найти никакой информации об этом вообще.

Нужны ли мне дополнительные инструменты, любые дополнительные настройки в System.config?

(Я знаю, что я мог бы использовать webpack и создать один пакет bundle.js, но я хотел бы использовать systemjs, как он используется в учебнике)

Может ли кто-то поделиться процессом сборки с этой установкой (Angular 2, TypeScript, systemjs)

4b9b3361

Ответ 1

Ключевое значение для понимания на этом уровне состоит в том, что, используя следующую конфигурацию, вы не можете напрямую скомпилировать файлы JS.

В конфигурации компилятора 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"
  ]
}

В HTML

System.config({
  packages: {
    app: {
      defaultExtension: 'js',
      format: 'register'
    }
  }
});

По сути, эти JS файлы будут содержать анонимные модули. Анонимный модуль - это JS файл, который использует System.register, но без имени модуля в качестве первого параметра. Это то, что компилятор TypeScript генерирует по умолчанию, когда systemjs настроен как диспетчер модулей.

Итак, чтобы все ваши модули были в одном JS файле, вам нужно использовать свойство outFile в конфигурации компилятора TypeScript.

Вы можете использовать следующее внутри gulp для этого:

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'));
});

Это может быть связано с некоторой другой обработкой:

  • чтобы обнулить вещи, скомпилированные TypeScript файлы
  • для создания файла app.js
  • создать файл vendor.js для сторонних библиотек
  • создать файл boot.js для импорта модуля, который загружает приложение. Этот файл должен быть включен в конце страницы (когда загружается вся страница).
  • чтобы обновить index.html, чтобы учесть эти два файла

В задачах gulp используются следующие зависимости:

  • gulp -concat
  • gulp -html замены
  • gulp - typescript
  • gulp -uglify

Ниже приведен образец, поэтому его можно было бы адаптировать.

  • Создать app.min.js файл

    gulp.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'));
    });
    
  • Создайте vendors.min.js файл

    gulp.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'));
    });
    
  • Создайте boot.min.js файл

    gulp.task('boot-bundle', function() {
      gulp.src('config.prod.js')
        .pipe(concat('boot.min.js'))
        .pipe(uglify())
        .pipe(gulp.dest('./dist'));
     });
    

    config.prod.js просто содержит следующее:

     System.import('boot')
        .then(null, console.error.bind(console));
    
  • Обновите файл index.html

    gulp.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'));
    });
    

    index.html выглядит следующим образом:

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

Обратите внимание, что System.import('boot'); должен быть выполнен в конце тела, чтобы дождаться, когда все компоненты вашего приложения будут зарегистрированы в файле app.min.js.

Я не описываю здесь способ обработки CSS и HTML-оценки.

Ответ 2

Вы можете использовать команду angular2 -cli build

ng build -prod

https://github.com/angular/angular-cli/wiki/build#bundling

Сгенерированный с помощью -prod флаг с помощью ng build -prod или ng serve -prod связывает все зависимости в один файл и использует дрожание дерева.

Update

Этот ответ был отправлен, когда angular2 находился в rc4

Я попробовал это снова на angular -cli beta21 и angular2 ^ 2.1.0, и он работает как ожидалось

Этот ответ требует инициализации приложения с помощью angular -cli вы можете использовать

ng new myApp

Или на существующем

ng init

Ответ 3

Вы можете построить проект Angular 2 (2.0.0-rc.1) в Typescript с помощью SystemJS с Gulp и SystemJS-Builder.

Ниже приведена упрощенная версия, как строить, связывать и минимизировать Tour of Heroes с 2.0.0-rc.1 (полный источник, живой пример).

gulpfile.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']);

Ответ 4

Здесь мой шаблон MEA2N для Angular 2: https://github.com/simonxca/mean2-boilerplate

Это простой шаблон, который использует tsc, чтобы собрать все вместе. (Фактически использует grunt-ts, который по своей сути является только командой tsc.) Не требуется Wekpack и т.д.

Независимо от того, используете ли вы хрюканье, идея такова:

  • напишите ваше приложение в папке ts/ (пример: public/ts/)
  • используйте tsc, чтобы зеркалировать структуру каталогов вашей папки ts/ в папку js/ и просто ссылаться на файлы в папке js/ в index.html.

Чтобы работать grunt-ts (должна быть эквивалентная команда для обычного tsc, Gulp и т.д.), у вас есть свойство в tsconfig.json, называемом "outDir": "../js", и укажите его в gruntfile.js с помощью:

grunt.initConfig({
  ts: {
    source: {tsconfig: 'app/ts/tsconfig.json'}
  },
  ...
});

Затем запустите grunt ts, который займет ваше приложение в public/ts/ и зеркалирует его до public/js/.

Там. Супер легко понять. Не лучший подход, но хороший, чтобы начать.

Ответ 5

Самый простой способ, который я нашел для пакета angular rc1 для systemJs, - использовать gulp и 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);
        });
});

Как указано в комментариях, в системе в настоящее время возникают проблемы при связывании компонентов с использованием moduleId: module.id

https://github.com/angular/angular/issues/6131

Текущая рекомендация (angular 2 rc1), по-видимому, заключается в использовании явных путей, т.е. moduleId: '/app/path/'

Ответ 7

В разделе Angular.io в разделе "Расширенный/развертывание" рекомендуется, чтобы самый простой способ развертывания - "скопировать среду разработки на сервер".

  • перейдите в раздел под: Простейшее развертывание возможно. Окончательные файлы проекта отображаются внутри раздела кода. Обратите внимание, что он уже устанавливает код для загрузки файлов пакета npm из Интернета (вместо локальной папки npm_modules).

  • убедитесь, что он запущен на вашем локальном компьютере (запуск npm). Затем в папке проекта скопируйте все под подпапкой "/src" в ведро S3, которое вы настроили. Вы можете использовать drag-and-drop для копирования, во время этого процесса вы можете выбрать параметр разрешения для файлов, убедитесь, что они "читаемы" для "всех".

  • под вкладкой "Свойства" в корзине найдите панель "Статический веб-хостинг", установите флажок "Использовать этот ведро для размещения веб-сайта" и укажите "index.html" как для документа Index, так и для документа Error.

  • нажмите на статическую конечную точку сайта, ваш проект будет запущен!