Angular2 CLI: почему размер пакета «—prod» меньше, чем «—prod —aot»?

#angular #webpack #angular2-aot

#angular #webpack #angular2-aot

Вопрос:

Я использую последнюю версию angular-cli (бета-версия 18) для проекта. Я знаю, что cli все еще находится на очень ранних стадиях, но я озадачен тем, почему мой конечный размер пакета на самом деле меньше, без AoT.

Когда я запускаю ng build --prod , это 1,08 мб:

                                  Asset       Size  Chunks             Chunk Names                                                        
   main.53d637ff9422b65418e6.bundle.js    1.08 MB    0, 2  [emitted]  main                                                               
 styles.01cffb95000fdb84402c.bundle.js     8.9 kB    1, 2  [emitted]  styles                                                             
                             inline.js    1.45 kB       2  [emitted]  inline                                                             
  main.53d637ff9422b65418e6.bundle.map    7.24 MB    0, 2  [emitted]  main                                                               
styles.01cffb95000fdb84402c.bundle.map    40.3 kB    1, 2  [emitted]  styles                                                             
inline.d41d8cd98f00b204e980.bundle.map    13.5 kB       2  [emitted]  inline                                                             
main.53d637ff9422b65418e6.bundle.js.gz     236 kB          [emitted]                                                                     
                            index.html  907 bytes          [emitted]                                                                     
                     assets/.npmignore    0 bytes          [emitted]                                                                     
                           favicon.ico    5.43 kB          [emitted] 
  

Когда я запускаю ng build --prod --aot , это 1,26 мб.

                                  Asset       Size  Chunks             Chunk Names                                                        
styles.01cffb95000fdb84402c.bundle.map    40.3 kB    1, 2  [emitted]  styles                                                             
     0.688d48f52a362bd543fc.bundle.map    2.94 kB          [emitted]                                                                     
 styles.01cffb95000fdb84402c.bundle.js     8.9 kB    1, 2  [emitted]  styles                                                             
                             inline.js    1.45 kB       2  [emitted]  inline                                                             
  main.6490041404a193461c3c.bundle.map    6.81 MB    0, 2  [emitted]  main                                                               
   main.6490041404a193461c3c.bundle.js    1.26 MB    0, 2  [emitted]  main                                                               
inline.d41d8cd98f00b204e980.bundle.map    13.5 kB       2  [emitted]  inline                                                             
main.6490041404a193461c3c.bundle.js.gz     223 kB          [emitted]                                                                     
                            index.html  907 bytes          [emitted]                                                                     
                     assets/.npmignore    0 bytes          [emitted]                                                                     
                           favicon.ico    5.43 kB          [emitted] 
  

Для tsconfig выглядит как:

 {
  "compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": [
      "es6",
      "dom"
    ],
    "mapRoot": "./",
    "module": "es6",
    "moduleResolution": "node",
    "outDir": "../dist/out-tsc",
    "sourceMap": true,
    "target": "es5",
    "typeRoots": [
      "../node_modules/@types"
    ]
  },
  "exclude": [
    "**/*.spec.ts"
  ]
}
  

Ответ №1:

Я ответил на этот вопрос на нашем GitHub, но вот мой ответ для справки:

Если вы используете определенные библиотеки, которые не поддерживают AoT (и выпускают пакеты UMD), это может произойти. Причина в том, что мы не можем оптимизировать компоненты, которые являются чистым JavaScript. К сожалению, это не то, что мы можем исправить на нашей стороне.

Эти библиотеки должны предоставлять модули ES2015 с удаленными декораторами, а их компоненты / модули уже AoT скомпилированы. Мы работаем над рекомендациями для библиотек для поддержки компиляции как JIT, так и AoT.

Кроме того, иногда в некоторых шаблонах размер AoT может быть больше, чем JIT. Сжатые версии должны быть наоборот, поскольку большая часть содержимого AoT — это одни и те же инструкции, повторяющиеся снова и снова.

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

Комментарии:

1. Это именно тот случай… CLI прилагает все усилия, чтобы уменьшить размер производственных сборок. Обучение и инструментарий для библиотек помогут убедиться, что они следуют лучшим практикам.

Ответ №2:

Сгенерированный шаблон JavaScript намного больше, чем сам шаблон. Это компромисс между размером файла и временем выполнения.

Комментарии:

1. Я не думаю, что это правильно … при использовании AoT компилятор angular не нужно загружать в браузер вместе с остальной частью пакета, и это приводит к «меньшему размеру загрузки Angular framework», потому что «компилятор составляет примерно половину самого Angular» согласно официальным документам angular: angular.io/docs/ts/latest/cookbook/aot-compiler.html #!#aot-jit

2. @Rob, я думаю, он говорит о шаблонах (то есть HTML), а не об общем размере файла js. Да, модуль компилятора не обязательно отправлять, но «скомпилированные» шаблоны могут быть больше.