Εισαγωγή ES6 με παραμέτρους

Τρόπος μετάδοσης παραμέτρων σε μια μονάδα ES6 κατά την εισαγωγή της

Παράμετροι για εισαγωγή ES6

Πρόσφατα αναρωτήθηκα εάν είναι πραγματικά δυνατό να χρησιμοποιώ τις δηλώσεις εισαγωγής συστήματος λειτουργικών μονάδων ES6 σε Javascript όχι μόνο με τον κοινό τρόπο (εισαγωγή μόνο μιας τοπικής μονάδας μέσω σχετικής διαδρομής ή ονόματος του πακέτου), αλλά και με παραμέτρους.

Η περίπτωση χρήσης μου θα ήταν κάτι τέτοιο: παρέχετε κάποιες παραμέτρους κατά τη διάρκεια της εισαγωγής, ώστε η εισαγόμενη μονάδα να μπορεί από μόνη της να αντιμετωπίζει αυτές τις παραμέτρους ως σημαία για εισαγωγές υπό όρους ή για ειδικό χειρισμό κώδικα.

Όπως αποδεικνύεται, αυτό είναι απολύτως δυνατό!

Οι εισαγωγές ES6 είναι απλώς διευθύνσεις URL

Πριν ρίξουμε μια ματιά στον κώδικα, είναι σημαντικό να θυμόμαστε ότι οι δηλώσεις εισαγωγής στο Node.js είναι πρακτικά μόνο URL. Το Node.js από προεπιλογή χρησιμοποιεί έναν αλγόριθμο για να καθορίσει πώς μοιάζουν πραγματικά οι διευθύνσεις URL όταν επιλυθούν πλήρως. Για παράδειγμα, εάν παρέχετε μόνο τη σχετική διαδρομή ως προσδιοριστή εισαγωγής, το Node.js εξακολουθεί να επιλύει τη συμβολοσειρά σε απόλυτη διεύθυνση URL για την εισαγωγή πίσω από τα παρασκήνια.

Χρήση παραμέτρων ερωτήματος URL για εισαγωγή

Και επειδή η εισαγωγή καταλήγει σε μια διεύθυνση URL, μπορούμε να χρησιμοποιήσουμε τις κοινές παραμέτρους αναζήτησης URL καθώς και τα τμήματα URL στις εισαγωγές μας.

Αρχικά, βεβαιωθείτε ότι υποστηρίζονται οι μονάδες ES6 για να δοκιμάσετε αυτήν τη δυνατότητα. Αυτό απαιτεί μια μικρή αλλαγή στο package.json μας, όπου το "type" -field πρέπει να οριστεί σε "module". Σημειώστε ότι πρέπει να χρησιμοποιήσετε το Node.js έκδοση 12 ή νεότερη.

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

Στη συνέχεια, ορίστε δύο ελάχιστες ενότητες για ένα απλό 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"}`);
}

Πολλαπλές εισαγωγές με διαφορετικές παραμέτρους

Όπως γράφεται στην τεκμηρίωση του Node.js, κάθε εισαγωγή γίνεται προσωρινά αποθηκευμένη στο χρόνο εκτέλεσης για ταχύτερες επακόλουθες εισαγωγές σε άλλες ενότητες. Επομένως, είναι σημαντικό να γνωρίζετε ότι οι εισαγωγές από την ίδια λειτουργική μονάδα, αλλά με διαφορετικές παραμέτρους, κάθε μία αποθηκεύεται προσωρινά στην κρυφή μνήμη. Φυσικά οι εισαγωγές με αντίστοιχη υπογραφή, στη συνέχεια εξακολουθούν να διαβάζονται από την προσωρινή μνήμη.

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

Χρησιμοποιήστε θήκες

Τα παραδείγματα σε αυτό το άρθρο είναι σκόπιμα πολύ σύντομα, αλλά έχετε την ιδέα. Ανάλογα με τις απαιτήσεις σας, η χρήση παραμέτρων ερωτήματος με εισαγωγές μπορεί να είναι μια πολύ κομψή επιλογή για τον καθορισμό "καθολικών" μεταβλητών για κάθε ενότητα. Αυτό εξαλείφει την ανάγκη παροχής παρόχων και ρυθμιστών για την επίτευξη του ίδιου στόχου.

Προτάσεις

Σχετικά

Προσάρτημα

Γλώσσες