В этом разделе серии 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»