У меня было очень медленное время «загрузки» для запуска тестов Karma, и после профилирования запуска я понял, что самое большое замедление было вызвано созданием исходных карт.
В частности, учитывая, что я использую karma-webpack
и веб-пакет в качестве препроцессора, каждый раз, когда тестовый файл загружается кармой, он передается в веб-пакет, который генерирует для него исходную карту.
Учитывая, что я не разделял код приложения и поставщика на части, каждый тестовый файл получал одну и ту же исходную карту поставщика (встроенную).
Я думал, что смогу исправить это, просто предотвратив сопоставление исходного кода для node_modules/
файлов, но понял, что вы можете исключить файлы из сопоставления исходного кода только на основе конечных файлов ресурсов, а не на входных файлах исходного кода/модуля.
Поэтому я нашел этот плагин для автоматического разделения моего кода приложения и кода поставщика на отдельные части. (в отличие от необходимости вручную перечислять каждый модуль поставщика).
Тем не менее, я начал получать эту ошибку при запуске Karma: ReferenceError: Can't find variable: webpackJsonp
Я почти уверен, что это вызвано тем фактом, что Karma не улавливает тот факт, что код поставщика и приложения разбивается на отдельные фрагменты и, следовательно, включает только код, сконфигурированный с опцией files
(т. е. сами тестовые файлы и а не файл поставщика).
Кажется, что этот параметр конфигурации files
анализируется и обрабатывается до того, как каждый тестовый файл будет предварительно обработан, что означает, что я не думаю, что возможно указать чанк поставщика в параметре files
, потому что Карма не будет знать об этом в то время он пытается искать его (слишком рано).
Единственные решения, которые я вижу, это:
- Измените способ реализации Karma, чтобы он мог обрабатывать разделение файлов поставщиков и приложений.
- Вместо использования
karma-webpack
и предварительной обработки создайте приложение в тестовом режиме, а затем запустите Karma из каталога тестовой сборки (чтобы фрагмент поставщика существовал достаточно рано).
Есть ли решение, которое я пропустил?
Мне кажется странным, что это не распространенная проблема.
Изменить 1
Я нашел это, но люди предлагают использовать несколько точек входа в конфигурация веб-пакета (т. е. один для приложения и один для поставщика). Я попытаюсь посмотреть, работает ли это с Karma, но у него все еще есть большой недостаток (на мой взгляд): вам нужно вручную отслеживать то, что вы помещаете в массив vendor
. т.е. каждый раз, когда вы устанавливаете пакет, вы должны добавить его в массив и наоборот.
Изменить 2
Использование нескольких точек входа (в конфигурации веб-пакета) не работает даже до того, как я настрою плагин веб-пакета исходной карты для исключения файлов поставщиков (тогда как это было бы с плагином webpack-split-by-path
).
Я собираюсь попробовать реализовать подход «сначала построить, а затем протестировать».