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.
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.
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?
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.
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ć.
@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ć
}
Do czego ci to konkretnie potrzebne?
@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.
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