ES6 import paraméterekkel

Hogyan adhatunk át paramétereket egy ES6 modulnak importáláskor

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.

Javaslatok

Kapcsolódó

Kiegészítés

Nyelvek