Как добавить JS файлы HTML в @Template в Angular 2 (например, $templateCache)

Это, вероятно, плохо сформулировано, но в моих существующих проектах Angular 1 я использую кучу ресурсов HTML, которые предварительно скомпилированы в JS файл с использованием HTML2JS. Это отлично работает, поэтому теперь я рассматриваю свой подход для Angular 2. Поскольку HTML2JS не обновлен, все, кажется, вращается вокруг двух стратегий.

Сначала вы добавляете встроенную строку HTML внутри @tempate atScript. Это кэширует его, поэтому я не хожу на сервер все время, но это также затрудняет форматирование в IDE и уменьшает читаемость IMHO.

Второй способ - использовать внешний файл и использовать URL-адрес внутри @template. Это, по-видимому, делает вещи более читабельными, но ограничивает количество кеширования. Это означает, что мне нужно делать большие серверные вызовы, которые я бы хотел избежать.

Есть ли способ запустить файл в HTML, затем скомпилироваться в файл .js и включен в компонент Angular2?

Ответ 1

Так как Webpack является новым Gulp (также Gulp нуждается в некоторой помощи), вот что я придумал (использует стилус и нефрит)...

Используйте такие загрузчики Webpack, как это...

loaders: [
  {
    include: /\.pug/,
    loader: 'pug-html-loader'
  },
  {
    test: /\.styl$/,
    loader: 'style-loader!css-loader!stylus-loader'
  },
  {
    test: /\.ts$/,
    loader: 'ts'
  }
]

Затем использование требует в ваших компонентах, как это...

@Component({
    ...
    template: String(require('./navbar.component.pug')),
    styles: [String(require('./navbar.component.styl'))],
    ...
})

Обязательно используйте styles и template вместо templateUrl и styleUrls

Ответ 2

Если вы используете gulp для компиляции, вы можете использовать плагин angular -embed-templates. Здесь я загружаю templateUrl в шаблон, перед компиляцией в javascript в папке dist с исходными картами:

var gulp           = require('gulp');
var ts             = require('gulp-typescript');
var sourcemaps     = require('gulp-sourcemaps');
var embedTemplates = require('gulp-angular-embed-templates');

gulp.task('ts:build', function () {
    gulp.src('app/**/*.ts')
        .pipe(embedTemplates())
        .pipe(sourcemaps.init())
        .pipe(ts({
            noImplicitAny: true,
            module: 'system',
            target: 'ES5',
            experimentalDecorators: true,
            moduleResolution: 'node',
            emitDecoratorMetadata: true
        }))
        .pipe(sourcemaps.write())
        .pipe(gulp.dest('./dist'));
});