ES6 içe aktarma parametreleri
Geçenlerde kendime, Javascript'te ES6-modül sistem içe aktarma ifadelerinin yalnızca yaygın şekilde (yalnızca paketin göreceli yolu veya adı yoluyla yerel bir modülü içe aktararak) kullanmanın gerçekten mümkün olup olmadığını sordum, ancak parametrelerle.
Kullanım durumum şuna benzer: içe aktarma sırasında bir tür parametre sağlayın, böylece içe aktarılan modülün kendisi bu parametreleri koşullu içe aktarma veya özel kod işleme için bayrak olarak değerlendirebilir.
Görünüşe göre, bu tamamen mümkün!
ES6 içe aktarmaları yalnızca URL'lerdir
Koda bakmadan önce, Node.js'deki import ifadelerinin pratikte sadece URL'ler olduğunu hatırlamak önemlidir. Node.js, varsayılan olarak, tamamen çözümlendiğinde URL'lerin gerçekte nasıl göründüğünü belirlemek için bir algoritma kullanır. Örneğin, içe aktarma belirteci olarak yalnızca göreli yolu sağlarsanız, Node.js sahne arkasında içe aktarma için dizeyi yine de mutlak bir URL'ye çözümler.
Bir içe aktarma için URL sorgu parametrelerini kullanma
Ve içe aktarma bir URL'ye çözümlendiğinden, içe aktarmalarımızda ortak URL arama parametrelerinin yanı sıra URL parçalarını da kullanabiliriz.
Öncelikle, bu özelliği test etmek için ES6 modüllerinin desteklendiğinden emin olun. Bu, "type" alanının "module" olarak ayarlanması gereken package.json'da küçük bir değişiklik gerektirir. Node.js sürüm 12 veya üzerini kullanmanız gerektiğini unutmayın.
{
"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": ""
}
Daha sonra basit bir demo için iki minimal modül tanımlayın.
//
// 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"}`);
}
Farklı parametrelerle birden çok içe aktarma
Node.js belgelerinde yazıldığı gibi, diğer modüllerde daha sonra daha hızlı içe aktarmalar için her içe aktarma çalışma zamanında önbelleğe alınır. Bu nedenle, aynı modülden ancak farklı parametrelere sahip içe aktarmaların her birinin ayrı ayrı önbelleğe alındığını bilmek önemlidir. Tabii ki eşleşen bir imzayla içe aktarılır ve ardından yine önbellekten okunur.
//
// 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();
Kullanım durumları
Bu makaledeki örnekler kasıtlı olarak çok kısa, ama siz anladınız. Gereksinimlerinize bağlı olarak, içe aktarmalı sorgu parametrelerini kullanmak, her modül için “genel” değişkenleri ayarlamak için oldukça şık bir seçenek olabilir. Bu, aynı hedefe ulaşmak için sağlayıcı alıcılara ve ayarlayıcılara olan ihtiyacı ortadan kaldırır.