Как получить один файл в качестве вывода angular cli

Я работаю над приложением ng2 и использую @angular/cli для его сборки. В качестве вывода он генерирует несколько js файлов, таких как .inline.js, .vendor.js и т.д.

Вопрос в том, как настроить angular- vendor.js inline.js в результате только одного файла, то есть связать vendor.js, inline.js и т.д. В один большой файл?

Я понимаю, что это можно сделать с помощью дополнительного упаковщика, но было бы неплохо сделать это с помощью ng-cli

PS Я не использую ленивую загрузку в этом приложении и определенно не буду.

PPS Просто конкатать файлы потом не вариант, потому что:

  • он не работает с хэшем в имени файла, также необходимо обновить HTML
  • он вводит дополнительный шаг сборки, который не является необходимым

На данный момент похоже, что переход на чистый веб-пакет будет самым простым и лучшим вариантом.

ОБНОВИТЬ

есть возможность избежать vendor.js установив --vendor-chunk в true но в результате я все равно получаю несколько файлов: inline.bundle.js main.bundle.js polyfills.bundle.js

Ответ 1

Angular CLI изначально не поддерживает это.

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

Поскольку команда ng eject также устарела, возможность перенастроить веб-пакет не так привлекательна, как раньше. Однако технически это все еще возможно.

Мое решение:

Лучшее решение, которое я нашел, - это плагин ngx-build-plus, который можно найти на https://github.com/manfredsteyer/ngx-build-plus или добавить в проект с помощью команды ng add ngx-build-plus Angular-CLI. После установки он предоставляет дополнительные параметры конфигурации для сборки, включая флаг --single-bundle true, который можно добавить к команде ng build или ng serve.

С этим флагом создаются файл main.js и файл main.js.map, на которые уже есть ссылки в HTML, и он будет так же корректно работать из коробки, с полным сопоставлением исходного кода и отладкой.

Ответ 2

Я не видел никакой функциональности в angular-cli, которая встроена в один пакет, однако это должно быть довольно легко сделать с помощью скрипта nodejs или с использованием одной из доступных библиотек concat, таких как concat-files https://www.npmjs.com/package/concat-files

установите concat файлы затем: добавьте файл concat.js в свой проект на том же уровне, что и папка dist

var concat = require('concat-files');
concat([
    './dist/inline.bundle.js',
    './dist/vendor.bundle.js',
    './dist/vendor.bundle.js'
], './dist/app.js', function(err) {
    if (err) throw err
    console.log('done');
});

в свой package.json под scripts добавьте новый скрипт build:

"scripts":{
    "build": "ng build && node concat.js"
}

затем запустите его npm run build, сначала он запустит угловую сборку cli, запустив скрипт concat.js, который объединит полученные пакеты

Ответ 3

1- использует ng build --prod --output-hashing=none, который создает файлы без кэшбастера (случайного хэша).

2- Используйте cat чтобы связать их в один файл

"build":"ng build --prod --output-hashing=none",
"package":" cat dist/angular-project/{polyfills,runtime,main}.js > ./package.js",
"bundle":"npm run build && npm run package"

И используйте это как:

npm run bundle

Ответ 4

Я решил это в своем проекте с помощью специального сценария, который я запускаю после ng build.

Сценарий выполняет следующие действия:

  • Сканирует файл dist/index.html для всех тегов <link> и <script>.
  • Объединяет все файлы, на которые ссылаются теги <link>/<script>, в свои соответствующие пакеты.
  • Удаляет все эти элементы из файла index.html и добавляет новый элемент, ссылающийся на пакеты.

Например, этот файл index.html...

<html>
    <head>
        <link rel="stylesheet" src="/dist/styles.css">
        <link rel="stylesheet" src="/dist/foo.css">
        <link rel="stylesheet" src="/dist/bar.css">
    </head>
    <body>
        <script src="/dist/main.js">
        <script src="/dist/inline.js">
        <script src="/dist/scripts.js">
        <script src="/dist/foo.js">
        <script src="/dist/bar.js">
    </body>
</html>

... превратится в это:

<html>
    <head>
        <link rel="stylesheet" src="/dist/bundle.css">
    </head>
    <body>
        <script src="/dist/bundle.js">
    </body>
</html>

Это очень хорошо работает для меня, используя Angular 8.