• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Odwleczone ładowanie modułów z użyciem getter

Object Storage Arubacloud
+1 głos
154 wizyt
pytanie zadane 21 maja 2021 w JavaScript przez Author[] Gaduła (3,130 p.)
zamknięte 21 maja 2021 przez Author[]

Próbuję odroczyć ładowanie modułów w nodejs (wraz z Electron) za pomocą funkcji getter:

Object.defineProperty(global, "path", {
    get: function(){
         if (!this.path.value)
            this.path.value = require("path");
         return this.path.value;
    }
})

Problem polega na tym że przy próbie sprawdzenia wartości this.path.value po raz kolejny wyzwala się getter co w ostateczności prowadzi do błędu przepełnienia stosu wywołań.

Czy można zmienić ten kod tak aby getter wyzwalał się tylko raz? Ewentualnie jak inaczej odroczyć ładowanie modułu.

komentarz zamknięcia: Udało się rozwiązać problem
1
komentarz 21 maja 2021 przez ScriptyChris Mędrzec (190,190 p.)

Czy możesz podać szerszy kontekst? Jak chcesz tego używać? To bardziej wygląda na próbę cache'owania modułu (co Node robi sam domyślnie) niż lazy loading (jeśli to masz na myśli przez "odraczanie").

komentarz 21 maja 2021 przez Author[] Gaduła (3,130 p.)
Chodzi o stworzenie zmiennej globalnej przechowującej moduł. Zmienna ta powinna być dostępna od samego rozpoczęcia programu. Przy pierwszej próbie dostępu do zmiennej jest ona zastępowana prawdziwym modułem.

Chodzi mi o to żeby zmienna była ładowana dopiero przy pierwszym jej użyciu. Z racji iż jest to Electron JS, każde opóźnienie ładowania modułu przyśpiesza czas startu aplikacji.

Niestety nie mogę użyć funkcji import() która jest asynchroniczna bo konstruktory obiektów są synchroniczne.
1
komentarz 21 maja 2021 przez Author[] Gaduła (3,130 p.)

@ScriptyChris, dziękuję za pomoc. Źle rozumiałem cache'owania moduł. Doczytałem że moduł nie jest ładowany ponownie tylko ładowany z require.cache. 

Lazy loading in node.js - Stack Overflow

Wobec tego wystarczy: 

Object.defineProperty(global, "path", {
  get: function(){
    return require("path");
  }
})

 

Podobne pytania

0 głosów
1 odpowiedź 252 wizyt
+2 głosów
1 odpowiedź 322 wizyt
pytanie zadane 31 stycznia 2023 w PHP przez Grzegorz Mikina Dyskutant (8,060 p.)
0 głosów
2 odpowiedzi 280 wizyt
pytanie zadane 14 czerwca 2018 w HTML i CSS przez Suska Łukasz Użytkownik (560 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...