Apakah mungkin untuk meneruskan opsi ke impor ES6?
Bagaimana Anda menerjemahkan ini:
var x = require('module')(someoptions);
ke ES6?
javascript
module
ecmascript-6
es6-modules
Fabrizio Giordano
sumber
sumber
System.import(module)
, tidak yakin apakah itu memungkinkan argumen atau tidak, seseorang yang tahu lebih banyak tentang ES6 mungkin melakukannya?Jawaban:
Tidak ada cara untuk melakukan ini dengan satu
import
pernyataan, itu tidak memungkinkan untuk doa.Jadi Anda tidak akan menyebutnya secara langsung, tetapi pada dasarnya Anda dapat melakukan hal yang sama seperti yang biasa dilakukan oleh ekspor default:
Atau, jika Anda menggunakan pemuat modul yang mendukung janji monadik , Anda mungkin dapat melakukan sesuatu seperti
Dengan
import
operator baru itu mungkinatau
namun Anda mungkin tidak ingin impor dinamis tetapi impor statis.
sumber
import x from 'module' use someoptions;
sintaksisimport {x, y} from 'module'
). Lalu apa yang seharusnya sintaks jika saya ingin melewati beberapa argumen? Atau sebarkan array argumen? Ini adalah kasus penggunaan yang sempit dan pada dasarnya Anda mencoba menambahkan sintaks yang berbeda untuk panggilan fungsi, tetapi kami sudah memiliki panggilan fungsi yang memungkinkan kami untuk menangani semua kasus lainnya.var session = require('express-session'); var RedisStore = require('connect-redis')(session);
saya hanya ingin tahu apakah ada solusi satu baris. Saya benar-benar dapat bertahan hidup dengan membagi tugas RedisStore menjadi 2 baris :)import {default(someoptions) as x} from 'module'
di ES7, jika memang ada kebutuhan untuk ini.session
/connect-redis
contoh, saya telah membayangkan sintaks seperti ini:import session from 'express-session'); import RedisStore(session) from 'connect-redis'
.Konsep
Inilah solusi saya menggunakan ES6
Sangat sesuai dengan respons @ Bergi, ini adalah "templat" yang saya gunakan ketika membuat impor yang memerlukan parameter yang diloloskan untuk
class
deklarasi. Ini digunakan pada kerangka isomorfik yang saya tulis, sehingga akan bekerja dengan transpiler di browser dan di node.js (saya gunakanBabel
denganWebpack
):./MyClass.js
./main.js
Di atas akan ditampilkan
foo
dalam konsolEDIT
Contoh Dunia Nyata
Sebagai contoh dunia nyata, saya menggunakan ini untuk lulus dalam namespace untuk mengakses kelas dan instance lain dalam suatu kerangka kerja. Karena kita hanya membuat fungsi dan meneruskan objek sebagai argumen, kita dapat menggunakannya dengan suka suka deklarasi kelas:
Impornya sedikit lebih rumit dan
automagical
dalam kasus saya mengingat bahwa ini adalah keseluruhan kerangka kerja, tetapi pada dasarnya inilah yang terjadi:Saya harap ini membantu!
sumber
MyView
memperluas item-item tertentu yang tersedia di namespace framework. Meskipun sangat mungkin untuk hanya meneruskannya sebagai parameter ke kelas, itu juga tergantung pada kapan dan di mana kelas dipakai; portabilitas kemudian terpengaruh. Dalam praktiknya, kelas-kelas ini dapat diserahkan ke kerangka kerja lain yang mungkin membuat mereka berbeda (misalnya, komponen kustom Bereaksi). Ketika kelas menemukan dirinya di luar lingkup kerangka kerja, itu masih dapat mempertahankan akses ke kerangka kerja ketika dipakai karena metodologi ini.Membangun jawaban @ Bergi untuk menggunakan modul debug menggunakan es6 adalah sebagai berikut
sumber
Saya yakin Anda bisa menggunakan modul loader ES6. http://babeljs.io/docs/learn-es6/
sumber
m(youroptionshere)
akhirnya? Saya kira Anda bisa menulisSystem.import('lib/math').then(m => m(options)).then(module => { /* code using module here */})
... tetapi tidak terlalu jelas.Anda hanya perlu menambahkan 2 baris ini.
sumber
xModule
menyesatkan di sini. Apa yang sebenarnya Anda miliki adalahimport func from 'module'; func('someOptions');
.Saya telah mendarat di utas ini mencari yang agak mirip dan ingin mengusulkan semacam solusi, setidaknya untuk beberapa kasus (tapi lihat Catatan di bawah).
Gunakan kasing
Saya memiliki modul, yang menjalankan beberapa logika instantiation segera setelah memuat. Saya tidak suka menyebut init logic ini di luar modul (yang sama dengan panggilan
new SomeClass(p1, p2)
ataunew ((p1, p2) => class SomeClass { ... p1 ... p2 ... })
dan sejenisnya).Saya suka bahwa logika init ini akan berjalan sekali, semacam aliran instantiasi tunggal, tetapi sekali per beberapa konteks parametrized tertentu.
Contoh
service.js
memiliki ruang lingkup yang sangat mendasar:Modul A melakukan:
Modul B melakukan:
Sejauh ini bagus: layanan tersedia untuk kedua modul tetapi diinisialisasi hanya sekali.
Masalah
Bagaimana membuatnya berjalan sebagai contoh lain dan init itu sendiri sekali lagi dalam konteks lain, katakanlah di Modul C?
Larutan?
Inilah yang saya pikirkan: gunakan parameter kueri. Dalam layanan kami akan menambahkan yang berikut:
let context = new URL(import.meta.url).searchParams.get('context');
Modul C akan melakukan:
modul akan diimpor kembali, itu logika init dasar akan berjalan dan kita akan lihat di konsol:
initialized in context special
sumber
Inilah pendapat saya tentang pertanyaan ini menggunakan modul debug sebagai contoh;
Pada halaman npm modul ini, Anda memiliki ini:
Pada baris di atas, sebuah string diteruskan ke modul yang diimpor, untuk membangun. Inilah cara Anda melakukan hal yang sama di ES6
Semoga ini bisa membantu seseorang di luar sana.
sumber