ES6-importado kun parametroj

Kiel transdoni parametrojn al ES6-modulo kiam vi importas ĝin

Parametroj por ES6-importado

Mi ĵus demandis min, ĉu efektive eblas uzi ES6-modulajn sistemajn import-deklarojn en Ĝavaskripto ne nur laŭ la komuna maniero (importi nur lokan modulon per relativa vojo aŭ nomo de la pakaĵo), sed kun parametroj.

Mia uzkazo estus io tia: provizi iajn parametrojn dum la importado por ke la importita modulo mem traktu tiujn parametrojn kiel flagon por kondiĉaj importadoj aŭ speciala koda pritrakto.

Kiel evidentiĝas, tio estas tute ebla!

ES6-importado estas nur URLoj

Antaŭ ol rigardi la kodon, gravas memori, ke import-deklaroj en Node.js estas preskaŭ nur URLoj. Node.js defaŭlte uzas algoritmon por determini kiel efektive aspektas la URL-oj kiam ili estas tute solvitaj. Ekzemple, se vi nur provizas la relativan vojon kiel la importa specifilo, Node.js ankoraŭ solvas la ĉenon al absoluta URL por la importo malantaŭ la kulisoj.

Uzi parametrojn pri URL-konsultoj por importado

Kaj ĉar la importado solviĝas al URL, ni povas uzi la komunajn URL-serĉajn parametrojn kaj ankaŭ URL-fragmentojn en niaj importoj.

Unue certigu, ke ES6-moduloj estas subtenataj por testi ĉi tiun funkcion. Ĉi tio postulas malgrandan ŝanĝon al nia package.json, kie la "tipo" -kampo devas esti agordita al "modulo". Notu, ke vi devas uzi Node.js-version 12 aŭ pli altan.

{
  "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": ""
}

Poste difinu du minimumajn modulojn por simpla elmontro.

//
// 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"}`);
}

Multnombraj importadoj kun malsamaj parametroj

Kiel skribite en la dokumentaro de Node.js, ĉiu importado kaŝiĝas dum rultempo por pli rapidaj postaj importadoj en aliaj moduloj. Tial gravas scii, ke importoj de la sama modulo sed kun malsamaj parametroj ricevas ĉiun kaŝmemoron individue. Kompreneble importadoj kun kongrua subskribo tiam ankoraŭ legiĝas el la kaŝmemoro.

// 
// 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();

Uzkazoj

La ekzemploj en ĉi tiu artikolo estas intence tre mallongaj, sed vi ekhavas la ideon. Depende de viaj postuloj, uzi konsultajn parametrojn kun importoj povas esti sufiĉe eleganta opcio por agordi "tutmondajn" variablojn por ĉiu modulo. Ĉi tio forigas la bezonon, ke provizantoj pli rapidas kaj aranĝas por atingi la saman celon.

Sugestoj

Rilataj

Aldono

Lingvoj