Lista wszystkich modułów w legacy aplikacji

0

Jest sobie definicja

let mods = [];

Array fajnie. Potrzebuje wpisać w tablicę wszystkie moduły (grubo ponad 1k) jakich apka używa. Jak to osiągnąć? Tak, aby później móc odwołać się do konkretnego rekordu i wykonać jakąś operację na nim.

0

np. na poziomie bundlera (Webpack itp.). Bundluje to powinien mieć taką informację.

Możesz też napisać jakiś skrypt w Node.js, który by jeździł po plikach i używając jakiegoś parsera (np. https://babeljs.io/docs/en/babel-parser ) wyciągał dane z plików, które moduły są importowane. I później rekurencyjnie przechodzić przez kolejne moduły.

wojtekxtx napisał(a):

Jest sobie definicja

let mods = [];

Tego nie rozumiem. Co ten kawałek kodu ma wspólnego z modułami javascriptowymi?

0

Tego nie rozumiem. Co ten kawałek kodu ma wspólnego z modułami javascriptowymi?

To jest definicja tablicy, do której powinny "zawędrować" nazwy modułów.

1

A możesz jeszcze pokazać jakbyś chciał z tego korzystać po załadowaniu wszystkich modułów do tablicy?

Zbytnio tego nie widzę w taki sposób

const mods = loadAllModules();

// tutaj wywołujemy metodę
// udostępnioną przez 457 moduł
mods[457].foo();

bo jeśli zależy nam na konkretnym module to sami przecież możemy go zaimportować.

1

@Xarviel: na szybko skleciłem coś takiego:

/**
 * @author: @wojtekxtx
 * @version: first-alpha
 */
function coreLoaderChecker_forEach(){
	let mods = [];
	let modfiles = fs.readdirSync(NODE_MOD_DIR);
	modfiles.forEach(file => {
		try {
			mods.push(file);
		} catch (err) {
			logger.error(err);
		}
	})
 return // I tu to co ma zwracać
}
3

Do czego ci to konkretnie potrzebne?

0

@LukeJL: mówiąc wprost: ostatnio "odziedziczyliśmy" jeden projekt-kobyłę (dużo legacy-kodu jak i cała masa kompletnych WTF; jakieś 4-5GB kodu w JSie, którego, uwierz, nie chciałbyś oglądać, a co dopiero na nim pracować) i teraz naszym zadaniem jest "posprzątać" kod.

Generalnie to (przeczuwam) skończy się tym że zrobimy full-rewrite wg obecnych standardów.

0
wojtekxtx napisał(a):

@Xarviel: na szybko skleciłem coś takiego:

/**
 * @author: @wojtekxtx
 * @version: first-alpha
 */
function coreLoaderChecker_forEach(){
	let mods = [];
	let modfiles = fs.readdirSync(NODE_MOD_DIR);
	modfiles.forEach(file => {
		try {
			mods.push(file);
		} catch (err) {
			logger.error(err);
		}
	})
 return // I tu to co ma zwracać
}

Zależy co dokładnie chcesz osiągnąć ¯\(ツ)

Zakładając, że nasz skrypt, byłby w głównym katalogu

node_modules/ <-- katalog, który pomijamy
tutaj-plik-o-ktorym-rozmawiamy.js  <--
module-a.js
module-b.js
foo/
  module-c.js
  bar/
    module-d.js

to można wszystkie pliki z projektu ładować po ścieżce relatywnej przez import lub require (w zależności od konfiguracji projektu, ewentualnie zamiast ścieżki relatywnej może być alias, ale to też trzeba skonfigurować)

import glob from 'glob';

const getAllFiles = async () => {
  return new Promise((resolve) => {
    glob(`!(node_modules)/**/*.js`, (error, files) => {
      return resolve(error ? null : files);
    });
  });
}

const loadAllModules = async () => {
  const files = await getAllFiles();
  const modules = [];

  for (const file of files) {
    try {
      const module = await import(`./${file}`); // <-- przy innych plikach niż js trzeba usunąć rozszerzenie

      modules.push(module);
    } catch (error) {
      console.error(`Nie udało się zaimportować modułu z tej lokalizacji ${file}`);
      console.error(error);
    }
  }

  return modules;
};

console.dir(await loadAllModules());

Pakiet glob zwraca mi listę plików z podanego wzoru !(node_modules)/**/*.js, który nie działa dla monorepo, bo wtedy jest więcej niż jeden katalog node_modules + aktualnie nie pobiera innych rozszerzeń niż .js, czyli odpadają nam kombinacje .jsx, .cjs, .ts, .tsx, .vue, .svelte i co tam dalej jeszcze nawymyślali :D

Dodatkowo trzeba uważać na wszelkie pliki, które po zaimportowaniu uruchamiają jakiś kod javascript

console.log('...');
console.log('...');

class Foo {}

export default Foo;

bo podczas importu może być ciekawie.

Jak na prototyp to wyszło nawet okej, tylko dalej nie wiem jak planujesz z tego korzystać, bo lista modułów może się często zmieniać i nie wiemy co kryje się pod danym indeksem :P

const mods = await loadAllModules();

console.dir(mods[5]); // i teraz zgadywanie, który plik kryje się pod indeksem numer 5

EDIT:

Przy ładowaniu jedynie samych bibliotek, pomijając pliki z projektu wystarczyłoby odczytać zawartość pliku package.json

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