ES6 invoer met parameters

Hoe om parameters na 'n ES6-module oor te dra wanneer u dit invoer

Parameters vir 'n ES6-invoer

Ek het myself onlangs afgevra of dit eintlik moontlik is om ES6-module-stelselinvoerverklarings in Javascript te gebruik, nie net op die algemene manier nie (slegs 'n plaaslike module via die relatiewe pad of die naam van die pakket in), maar met parameters.

My gebruiksgeval sou so wees: verskaf 'n soort parameters tydens die invoer, sodat die ingevoerde module daardie parameters self kan hanteer as vlag vir voorwaardelike invoer of spesiale kodehantering.

Soos dit blyk, is dit heeltemal moontlik!

ES6-invoer is slegs URL's

Voordat ons na die kode gaan, is dit belangrik om te onthou dat invoerverklarings in Node.js feitlik net URL's is. Node.js gebruik standaard 'n algoritme om vas te stel hoe die URL's werklik lyk as dit volledig opgelos is. As u byvoorbeeld slegs die relatiewe pad as die invoerbepaler gee, los Node.js die string steeds op na 'n absolute URL vir die invoer agter die skerms.

Gebruik URL-navraagparameters vir 'n invoer

En omdat die invoer na 'n URL oplos, kan ons die algemene URL-soekparameters sowel as URL-fragmente in ons invoer gebruik.

Maak eers seker dat ES6-modules ondersteun word om hierdie funksie te toets. Dit vereis 'n klein verandering aan ons pakket.json, waar die "type" -veld op "module" moet wees. Let daarop dat u Node.js weergawe 12 of hoër moet gebruik.

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

Definieer vervolgens twee minimale modules vir 'n eenvoudige demo.

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

Veelvuldige invoer met verskillende parameters

Soos in die Node.js-dokumentasie geskryf, word elke invoer tydens looptyd geberg vir vinniger invoer in ander modules. Daarom is dit belangrik om te weet dat die invoer uit dieselfde module, maar met verskillende parameters, elkeen afsonderlik gebêre word. Uiteraard word invoer met 'n bypassende handtekening dan steeds gelees uit die kas.

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

Gebruik gevalle

Die voorbeelde in hierdie artikel is doelbewus baie kort, maar u kry die idee. Afhangend van u vereistes, kan die gebruik van navraagparameters met invoer nogal 'n elegante opsie wees om 'globale' veranderlikes vir elke module in te stel. Dit elimineer die behoefte aan aanbieders en setters om dieselfde doel te bereik.

Voorstelle

Verwant

Aanhangsel

Tale