Dynamiczny import klasy

0

Hej mam sobie jakas klase.

const constants = require('./Constants.cjs')

class ExchangesComparision{

    constructor(){
                
}

W kodzie require()uje mase bibliotek ale jest problem z jedna. Coś tam zmienili i teraz trzeba uzyc nowego import, ponieważ kiedy uzywam require() to wyskakuje mi to: "Instead change the require of ..."...to a dynamic import() which is available in all CommonJS modules".

I teraz tak wyczytałem, że dynamiczne importowanie mozna zrobic z uzyciem await. Natomiast ja nad klasa nie moge uzyc await poniewaz mozna to uzywac tylko w asynchronicznych funkcjach. Jest jakis sposob zeby moznabylo to zaimportowac w konstruktorze, czy musze tworzyc jakies metody async init() i w nich importowac biblioteke?

1

Opcja w JS, której szukasz to "top level await"
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
i jeśli używasz modułów z ES6 to jest to dostępne w Node.js, ale w modułach z CommonJS zdaje się, że nie (swoją drogą czemu nie moduły w ES6? To jakiś stary projekt?)

Natomiast ja nad klasa nie moge uzyc await poniewaz

ale await to cukier składniowy na promisy, więc możesz nie używać await i użyć po prostu then:

import('jakis-modul').then(foo => {
});

albo też opakować w jakąś funkcję async

0
LukeJL napisał(a):

Opcja w JS, której szukasz to "top level await"
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
i jeśli używasz modułów z ES6 to jest to dostępne w Node.js, ale w modułach z CommonJS zdaje się, że nie (swoją drogą czemu nie moduły w ES6? To jakiś stary projekt?)

Natomiast ja nad klasa nie moge uzyc await poniewaz

ale await to cukier składniowy na promisy, więc możesz nie używać await i użyć po prostu then:

import('jakis-modul').then(foo => {
});

albo też opakować w jakąś funkcję async

Stary a ja swoja droga wywodze sie z innego jezyka i lubie pisac klasy mimo ze w js te klasy to pic na wode:>
No i na poczatku uzywalem require nie wiem nawet czy byl import.

Mam nadzieje ze w innych klasach ktore z tego korzystaja nie bede musial tez uzywac jakichs callbackow bo niby mala zmiana z przejsiem na import 1 gwna a nagle od groma zmian w kodzie:/

1

Jeżeli sobie coś importujesz z zewnątrz i potrzebujesz tego synchronicznie w konstruktorze np. (stąd niemożność użycia ani await ani Promise) to może coś takiego:


let libka;

import("problematyczna-libka").then((foo) => {
  // ogarnij zawartość `foo`
  libka = foo;
});


class ExchangesComparision {
  constructor() {
    this.costam = libka(5, "stuff");
  }
}

Jedyny problem jest wtedy, kiedy Twoja aplikacja synchronicznie już w pierwszym event loopie potrzebuje utworzyć instancję ExchangesComparsion.

Ale wtedy może da się przepisać aplikację w punkcie startowym (jakiś index.cjs czy coś), żeby pierwsze poczekała na wszystkie asynchroniczne importy, a dopiero potem faktycznie startowała i robiła to, co teraz robi.

0

No i musze tak zrobic ale to sie wiaze z callbackami i to na dodatek jakimis fikusnymi ponieważ poza ciałem klasy ewentualnie hmmm juz lepsze jakies inity i awaity bo chociaz bedzie to w klasie. Problem jest taki ze dynamiczny import trwa a wiec trza czekac az sie zaladuje:/

0

możesz asynchroniczną metodę zrobić w klasie.

class Foo {
   async someMethod() { }
}

z konstruktorem tak się nie da, ale tam można then użyć

Pytanie tylko - czy potrzebujesz dynamicznego importu. Czemu w zasadzie dynamiczny potrzebujesz? (w przeglądarce bym bardziej zrozumiał niż w Node.js, ale być może patrzę zbyt wąsko).

Czy faktycznie potrzebujesz ładować coś dynamicznie, czy może ta potrzeba jest spowodowana tylko koniecznością kompatybilności i tym, że używasz starych importów (require / CommonJS)? Jeśli to mały/nowy projekt, może w ogóle lepiej to przepisać na moduły ES6? Takie, gdzie używasz głównie statycznych importów import / export zamiast require / module.exports

1 użytkowników online, w tym zalogowanych: 0, gości: 1