ES6-import paraméterei
Nemrégiben feltettem magamnak a kérdést, hogy valóban lehetséges-e az ES6 modulos rendszer import-utasításainak használata a Javascriptben nemcsak a szokásos módon (csak egy helyi modul importálása relatív elérési útvonalon vagy a csomag nevén keresztül), hanem paraméterekkel is.
A felhasználási esetem ilyesmi lenne: adjon meg valamilyen paramétert az importálás során, hogy az importált modul maga is kezelhesse ezeket a paramétereket feltételes importálás vagy speciális kódkezelés jelzőjeként.
Mint kiderült, ez teljesen lehetséges!
Az ES6 import csak URL-ek
Mielőtt megnéznénk a kódot, fontos megjegyezni, hogy az import-utasítások a Node.js-ben gyakorlatilag csak URL-ek. A Node.js alapértelmezés szerint algoritmust használ annak meghatározására, hogy az URL-ek valójában hogyan néznek ki, ha teljesen fel vannak oldva. Például, ha csak a relatív elérési utat adja meg importálási specifikációként, a Node.js továbbra is abszolút URL-re oldja fel a karakterláncot a kulisszák mögötti importáláshoz.
URL-lekérdezési paraméterek használata importáláshoz
Mivel az importálás URL-re oldódik fel, importálásunk során felhasználhatjuk a gyakori URL-keresési paramétereket, valamint az URL-töredékeket.
Először ellenőrizze, hogy az ES6-modulok támogatottak-e a szolgáltatás teszteléséhez. Ehhez egy kis változtatásra van szükség a csomagunkban.json, ahol a "type" mezőt "module" -ra kell állítani. Ne feledje, hogy a Node.js 12-es vagy újabb verzióját kell használnia.
{
"name": "es6-import-params",
"version": "1.0.0",
"main": "index.js",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": ""
}
Ezután definiáljon két minimális modult egy egyszerű bemutatóhoz.
//
// index.js
//
import {greet} from "./lib.js?name=Tom";
// This will print "Hello Tom".
greet();
//
// lib.js
//
// We're using Node's native 'URL'-module
// to transform the provided string into
// a usable representation.
//
// Note that 'import' here isn't part of
// an acutal import, but rather resolved
// to a global variable.
const url = new URL(import.meta.url);
// A simple greeter for demo purposes.
// We just access the map 'searchParams'
// from our usable 'url'-object and use
// a fallback if no params are provided.
export function greet() {
console.log(`Hello ${url.searchParams.get("name") || "World"}`);
}
Több import különböző paraméterekkel
Amint a Node.js dokumentációjában meg van írva, minden egyes import futás közben kerül gyorsítótárba a későbbi gyorsabb importáláshoz más modulokban. Ezért fontos tudni, hogy ugyanabból a modulból, de különböző paraméterekkel történő importálás esetén mindegyik külön-külön tárolja a gyorsítótárat. Természetesen a megfelelő aláírással ellátott import akkor is olvasható a gyorsítótárból.
//
// index.js
//
// A small adaptation for the index.js
// file, this time importing the same
// module twice w/ different params. Each
// module gets cached twice, too.
import * as tomLib from "./lib.js?name=Tom";
import * as lukeLib from "./lib.js?name=Luke";
// 'Hello Tom'.
tomLib.greet();
// 'Hello Luke'.
lukeLib.greet();
// Still 'Hello Tom', as it's
// its own module.
tomLib.greet();
Felhasználási esetek
A cikk példái szándékosan nagyon rövidek, de megkapja az ötletet. Az Ön igényeitől függően a lekérdezési paraméterek importálással történő használata elég elegáns lehetőség a globális változók beállításához az egyes modulokhoz. Ez kiküszöböli annak szükségességét, hogy ugyanazon cél elérése érdekében szolgáltatókat és beállítókat vegyenek igénybe.