• 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

VPS Starter Arubacloud
+1 głos
152 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ź 249 wizyt
+2 głosów
1 odpowiedź 302 wizyt
pytanie zadane 31 stycznia 2023 w PHP przez Grzegorz Mikina Dyskutant (8,060 p.)
0 głosów
2 odpowiedzi 276 wizyt
pytanie zadane 14 czerwca 2018 w HTML i CSS przez Suska Łukasz Użytkownik (560 p.)

92,452 zapytań

141,262 odpowiedzi

319,074 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...