JS куча нехватки памяти для углового тестирования - PullRequest
0 голосов
/ 20 ноября 2018

У меня проблема с памятью, которую я пытаюсь выяснить, и я не знаю, с чего начать.Когда я запускаю тесты, у меня возникает проблема с кучей JS, и мои тесты выдают ошибку, даже не запускаясь.Я догадываюсь, что это вызвано очень большим файлом строк, который я использую для интернационализации.Это унаследованный проект, поэтому я в общих чертах расскажу о том, что происходит в настоящее время, и, возможно, кто-то может помочь мне найти способ улучшить его.Файл inject.en.js - это файл размером 2,2 МБ json, содержащий переведенные строки для приложения.

var INJECT_en = { ... };

Чтобы сделать его доступным как можно раньше, он включен как глобальный var в приложениях.index.html

<script src="js/languages/hybrid.inject.en.js" type="text/javascript"></script>

Затем он используется для создания глобального объекта конфигурации.

var windowJS =  new WindowService().nativeWindow;
var HybridInject = windowJS.HybridInject_en; // custom app strings
var INJECT = windowJS.INJECT_en;
var startInjector = _.merge(_.clone(HybridInject), _.clone(INJECT));

export const CONFIG: ConfigType = {
    ...
    strings: populateStrings(startInjector),
    ...

}

Для тестирования

I'mиспользуя Jest для тестирования этого приложения по ряду причин.Я попробовал несколько вещей, чтобы настроить Jest таким же образом, чтобы эти файлы были доступны при сборке CONFIG, и я остановился на следующем для своего jestGlobalMocks.ts.

Я скопировал файлы в тестированиекаталог и преобразовал их в export объект.

export const INJECT_en = { ... }

Затем сделал их доступными для сборки CONFIG, сделав их доступными в окне.

Object.defineProperty(window, 'HybridInject_en', {value: HybridInject_en});
Object.defineProperty(window, 'INJECT_en', {value: INJECT_en});

Результат

При запуске тестов я получаю следующий вывод

[BABEL] Note: The code generator has deoptimised the styling of "jest/configs/inject.en.ts" as it exceeds the max of "500KB".



<--- Last few GCs --->



[208:0x37d62f0]    86678 ms: Scavenge 1384.7 (1422.5) -> 1383.8 (1423.0) MB, 11.5 / 0.1 ms  (average mu = 0.143, current mu = 0.101) allocation failure 

[208:0x37d62f0]    86694 ms: Scavenge 1384.7 (1423.0) -> 1383.9 (1423.5) MB, 13.5 / 0.1 ms  (average mu = 0.143, current mu = 0.101) allocation failure 

[208:0x37d62f0]    86710 ms: Scavenge 1384.9 (1423.5) -> 1384.2 (1424.0) MB, 13.5 / 0.1 ms  (average mu = 0.143, current mu = 0.101) allocation failure 





<--- JS stacktrace --->



==== JS stack trace =========================================



    0: ExitFrame [pc: 0x255fdc5dbe1d]

Security context: 0x0e1a9b79e6e1 <JSObject>

    1: SourceMapConsumer_allGeneratedPositionsFor [0x32dd014cb6a1] [/var/jenkins_home/workspace/base_jenkins-build/node_modules/source-map/lib/source-map-consumer.js:~178] [pc=0x255fdcb3491a](this=0x0319d2aa8031 <BasicSourceMapConsumer map = 0x68f75371d81>,aArgs=0x1954c0c022a9 <Object map = 0x68f75372671>)

    2: /* anonymous */(aka /* anonymous */...



FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

 1: 0x8daaa0 node::Abort() [node]

 2: 0x8daaec  [node]

 3: 0xad73ce v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]

 4: 0xad7604 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]

 5: 0xec4c32  [node]

 6: 0xec4d38 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [node]

 7: 0xed0e12 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]

 8: 0xed1744 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]

 9: 0xed43b1 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [node]

10: 0xe9d834 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [node]

11: 0x113cf9e v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [node]

12: 0x255fdc5dbe1d 

Aborted

npm ERR! Test failed.  See above for more details.

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Я, после некоторого труда, мне удалось исправить эту проблему, заменив все ^ на ~ из всех зависимостей в файле package.json.

Заменить

  "dependencies": {
     "@agm/core": "^1.0.0-beta.5",
    "@angular/animations": "^7.2.0",
    "@angular/common": "^7.2.0",
    "@angular/compiler": "^7.2.0",
    "@angular/core": "^7.2.0",
    "@angular/forms": "^7.2.0",
    ...

  },

На

  "dependencies": {
     "@agm/core": "~1.0.0-beta.5",
    "@angular/animations": "~7.2.0",
    "@angular/common": "~7.2.0",
    "@angular/compiler": "~7.2.0",
    "@angular/core": "~7.2.0",
    "@angular/forms": "~7.2.0",
    ...

  },

Я думаю, что эта проблема вызвана конфликтом между различными версиями библиотек.

0 голосов
/ 21 ноября 2018

В разделе сценариев вашего package.json вы должны увеличить кучу (пример ниже, но вам нужно будет адаптироваться к вашим потребностям, я никогда не использовал jest)

"gulp": "node --max_old_space_size=2560 ./node_modules/gulp/bin/gulp",
"run-build": "npm run gulp",
"run-build-with-switches": "npm run gulp -- myspecialtarget"

Первая строкаустанавливает скрипт, который запускает gulp с увеличенной кучей каждый раз, когда вы ссылаетесь на него npm run gulp.Во второй строке будет запущен первый скрипт без аргументов (для gulp это означает цель по умолчанию).Третья строка будет запускаться gulp с аргументом myspecialtarget.

...