Рубрики
Uncategorized

Построить угловой, как архитектор (часть 2)

В этом разделе серии блогов Создайте угловую угловую, как архитектор, мы смотрим на оптимизацию производства … Теги с угловым, DevOps, JavaScript, WebDev.

В этом разделе серии Blog Build Angular, как архитектор, мы смотрим на оптимизацию производственного сборки с Angular-devkit, и охватываем нашу собственную сборку, путем выяснения того, как реализовывать условия.

Реконструировать

В сборке угловой, как архитектор (часть 1), мы посмотрели на работу с последними API архитектора. Кодируя Builder с API Architect API и RXJS, мы смогли расширить угловую CLI с новой продукцией, который оптимизирует угловую с помощью компилятора замыкания.

Мы оказались функцией, которая выполняет наблюдаемые RXJS так:

export function executeClosure(
  options: ClosureBuilderSchema,
  context: BuilderContext
): Observable {
  return of(context).pipe(
    concatMap( results => ngc(options, context) ),
    concatMap( results => compileMain(options, context)),
    concatMap( results => closure(options, context) ),
    mapTo({ success: true }),
    catchError(error => {
      context.reportStatus('Error: ' + error);
      return [{ success: false }];
    }),
  );
}

В начале этого раздела давайте добавим дополнительную оптимизацию на производственный пакет с помощью инструмента в @ angular-devkit под названием ContingOptimizer Отказ

Создайте новый метод под названием OptimizeBuild, который возвращает RXJS наблюдаемый и добавить метод для труба в ExecutEcluity Отказ

  return of(context).pipe(
    concatMap( results => ngc(options, context) ),
    concatMap( results => compileMain(options, context)),
    concatMap( results => optimizeBuild(options, context)),
    concatMap( results => closure(options, context) ),

Установить @ angular-devkit/build-Optimizer В каталоге build_tools.

npm i @angular-devkit/build-optimizer --save-dev

Импорт ContingOptimizer вот так.

import { buildOptimizer } from '@angular-devkit/build-optimizer';

По сути после запуска угловых компилятора каждый файл Component.js в OUT-TSC должен быть постпроцессирован с buckoptimizer. Этот инструмент удаляет ненужные декораторы, которые могут раздувать пучок.

Алгоритм для скрипта выглядит следующим образом:

  • Перечислите все файлы с расширением .Component.js в каталоге OUT-TSC
  • Прочитайте каждый файл в массиве файлов
  • Вызов BuckOptimizer, прохождение в содержимое каждого файла
  • Написать файлы на диск с выходом BuildOptimizer

Давайте используем удобный пакет NPM, называемый GLOC, чтобы переписать все файлы с заданным расширением.

Установите шаблон в каталоге build_tools.

npm i glob --save-dev

Импорт шаблон в SRC/закрытие/index.ts.

import { glob } from 'glob';

В OptimizeBuild Метод, объявить новый Const и назовите это Файлы Отказ

const files = glob.sync(normalize('out-tsc/**/*.component.js'));

Glob.sync Будет синхронно отформатировать все файлы, соответствующие шарику в массив строк. В приведенном выше примере Файлы Равновает массив строк, которые включают пути ко всем файлам с расширением .component.js. .

Теперь у нас есть массив имена файлов, которые требуют постпроцессирования с ContingOptimizer Отказ Наша функция OptimizeBuild Нужно вернуть наблюдаемый, но у нас есть массив имена файлов.

По существу OptimizeBuild Не следует излучать, пока все файлы будут обработаны, поэтому нам нужно отображать файлы на массив наблюдаемых и использовать метод RXJS, называемый Форкжойин ждать, пока все наблюдаемые не будут сделаны. Шаг на работе в сборке состоит в том, чтобы объединить приложение с компилятором закрывания. Эта задача должна ждать OptimizeBuild завершить.

const optimizedFiles = files.map((file) => {
    return new Observable((observer) => {
        readFile(file, 'utf-8', (err, data) => {
        if (err) {
            observer.error(err);
        }
        writeFile(file, buildOptimizer({ content: data }).content, (error) => {
            if (error) {
                observer.error(error);
            }
            observer.next(file);
            observer.complete();
        });
    });
    });
});

return forkJoin(optimizedFiles);

Каждый файл читается с диска с readfile Содержимое файла постпроцессировано с ContingOptimizer И полученный контент записывается на диск с прививать . Наблюдатель звонит Следующий и полный Уведомить Форкжойин Асинхронное действие было выполнено.

Если вы посмотрите на файлы в каталоге OUT-TSC перед запуском этой оптимизации, файлы будут включать в себя такие декораторы:

AppComponent.decorators = [
{ type: Component, args: [{
            selector: 'app-root',
            templateUrl: './app.component.html',
            styleUrls: ['./app.component.css']
        },] },
];

Теперь декораторы удаляются с ContingOptimizer с вами беги архитектор build_repo: clackure_build Отказ

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

Обработка сред

Обработка конфигурации окружающей среды намного проще, чем предыдущие упражнения. Сначала давайте посмотрим на проблему.

В SRC/средах по умолчанию есть два файла.

  • окружающая среда
  • envireoment.prod.ts.

Окружающая среда. Prod.ts выглядит так по умолчанию.

export const environment = {
  production: true
};

SRC/Main.ts ссылаются на эту конфигурацию в новом проекте по лесам.

import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

Обратите внимание, что объект окружающей среды всегда импортируется из ./environments/environment, но у нас разные файлы на окружающую среду?

Решение довольно простое.

После запуска компилятора AOT и выводит JavaScript в каталог OUT-TSC, но до того, как приложение будет включено, мы должны поменять файлы.

cp out-tsc/src/environment/environment.prod.js out-tsc/src/environment/environment.js

Вышеуказанный фрагмент использует команду CP Unix для копирования файла производственной среды в среду по умолчанию .JS.

После того, как файл Current.js заменяется текущей средой, приложение в комплекте и все ссылки на окружающая среда В приложении соответствуют правильной среде.

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

export function handleEnvironment(
    options:ClosureBuilderSchema,
    context: BuilderContext
  ): Observable<{}> {

}

Если у нас есть env определяется как опция в Schema.json.

"env": {
    "type": "string",
    "description": "Environment to build for (defaults to prod)."
  }

Мы можем использовать тот же аргумент для выполнения этой сборки с помощью архитектора CLI.

architect build_repo:closure_build --env=prod

В методе мы только что создали, мы можем ссылаться на env. аргумент на Варианты объект.

const env = options.env ? options.env : 'prod';

Чтобы скопировать правильную среду, мы можем использовать инструмент, доступный в узле, называемых предпринять .

import { exec } from 'child_process';

Exec Позволяет запустить команды Bash, как вы обычно будете в терминале.

Функции, как Exec Это упаковано с узлом, на основе обещания. К счастью, наблюдаемые RXJS взаимосвязаны с обещаниями. Мы можем использовать Метод упакован в RXJS конвертировать Exec в наблюдаемый. Готовый код ниже.

export function handleEnvironment(
    options:ClosureBuilderSchema,
    context: BuilderContext
  ): Observable<{}> {

    const env = options.env ? options.env : 'prod';

    return of(exec('cp '+
                normalize('out-tsc/src/environments/environment.' + env + '.js') + ' ' +
                normalize('out-tsc/src/environments/environment.js')
             ));
}

Добавьте новый метод для ExecutEcluity с другим звонком в CONCATMAP Отказ Это должно чувствовать себя как иглу и нить в этой точке.

  return of(context).pipe(
    concatMap( results => ngc(options, context) ),
    concatMap( results => compileMain(options, context)),
    concatMap( results => optimizeBuild(options, context)),
    concatMap( results => handleEnvironment(options, context)),
    concatMap( results => closure(options, context) ),

Найдите минутку, чтобы задуматься о сборке Гуру, который вы стали. Все шаги теперь на месте для производственной сборки!

Оригинал: «https://dev.to/steveblue/build-angular-like-an-architect-part-2-208l»