JavaScript Proxies sind ein leistungsfähiger Mechanismus zum Abfangen und Anpassen von Operationen, die auf Objekten ausgeführt werden.
Viele Bibliotheken und Frameworks, wie z. B. Solid.js, haben sich die Fähigkeiten von Proxies zunutze gemacht, um ihre Funktionalität zu verbessern.
Vor ein paar Wochen habe ich einen Artikel über eine Utility-Funktion für den Zugriff auf Umgebungsvariablen in Node.js veröffentlicht. Dieses Dienstprogramm speichert Umgebungsvariablen effizient im Zwischenspeicher und gibt einen Fehler aus, wenn eine Umgebungsvariable undefined
ist.
Interessanterweise können Sie das gleiche Ziel mit JavaScript Proxys erreichen:
1require("dotenv").config();
2
3const cache = {};
4const cacheHandler = {
5 get: (target, prop) => {
6 if (target[prop]) {
7 const value = Reflect.get(target, prop);
8 console.log(`GET cached ${prop} with value ${JSON.stringify(value)}`);
9 return value;
10 } else {
11 const env = process.env[prop];
12 if (!env) {
13 throw new ReferenceError(`Unknown environment variable: ${prop}`);
14 }
15 cache[prop] = { [prop]: env, time: new Date() };
16 console.log(
17 `GET initial ${prop} with value ${JSON.stringify(cache[prop])}`
18 );
19 return cache[prop];
20 }
21 },
22};
23
24const proxy = new Proxy(cache, cacheHandler);
25
26const accessEnv = (key) => proxy[key];
27
28accessEnv("DB_URL"); // GET initial DB_URL with value {"DB_URL":"mongodb://localhost:27017/db_name","time":"2022-04-06T07:22:04.303Z"}
29console.log("-------");
30accessEnv("DB_URL"); // GET cached DB_URL with value {"DB_URL":"mongodb://localhost:27017/db_name","time":"2022-04-06T07:22:04.303Z"}
31console.log("-------");
32accessEnv("DOES_NOT_EXIST"); // ReferenceError: Unknown environment variable: DOES_NOT_EXIST
Sie können den Code auf stackblitz ausführen, um ihn in Aktion zu sehen.
Außerdem sind JavaScript Proxys in verschiedenen Szenarien nützlich, z. B. bei der Validierung durch setter oder bei der Erstellung von Wrapper für HTTP Aufrufe.