Saya baru saja mulai bekerja pada proyek simpul kecil yang akan berinteraksi dengan MongoDB. Namun, sepertinya saya tidak bisa mendapatkan modul simpul yang relevan untuk mengimpor dengan benar, meskipun saya telah menginstalnya dengan benar npm
.
Misalnya, kode berikut melempar kesalahan, memberi tahu saya bahwa "express tidak memiliki ekspor default":
import express from "express";
Namun, kode ini berfungsi:
const express = require("express");
Jadi pertanyaan saya adalah, apa perbedaan dalam bagaimana fungsi impor dan variabel / memerlukan metode? Saya ingin memperbaiki apa pun yang mengganggu impor saya di proyek ini, karena sepertinya akan menimbulkan masalah tambahan.
node.js
typescript
import
require
austinthemassive
sumber
sumber
express
akan bertipeany
. Anda dapat memasukkan definisi dari sini npmjs.com/package/@types/expressJawaban:
Diagram sederhana ini yang membantu saya memahami perbedaan antara
require
danimport
.Selain itu,
Anda tidak dapat secara selektif memuat hanya potongan-potongan yang Anda butuhkan
require
tetapi denganimports
, Anda dapat memuat secara selektif hanya potongan-potongan yang Anda butuhkan. Itu bisa menghemat memori.Memuat sinkron (langkah demi langkah) karena
require
di sisi lainimport
dapat asinkron (tanpa menunggu impor sebelumnya) sehingga dapat melakukan sedikit lebih baik daripadarequire
.sumber
module.exports
ketika kode inisialisasi modul selesai berjalan. Perbedaan ini sendiri menciptakan sakit kepala kompatibilitas dalam mencoba membuat satu modul berfungsi baik untuk ESM dan CommonJS.Perbedaan utama antara
require
danimport
, adalah bahwa iturequire
akan secara otomatis memindainode_modules
untuk menemukan modul, tetapiimport
, yang berasal dari ES6, tidak akan.Kebanyakan orang menggunakan babel untuk mengkompilasi
import
danexport
, yang membuatimport
bertindak sama denganrequire
.Versi Node.js yang akan datang mungkin mendukung
import
dirinya sendiri (sebenarnya, versi eksperimental sudah melakukannya ), dan menilai berdasarkan catatan Node.js,import
tidak akan mendukungnode_modules
, itu berdasarkan ES6, dan harus menentukan jalur modul.Jadi saya sarankan Anda tidak menggunakan
import
dengan babel, tetapi fitur ini belum dikonfirmasi, mungkin mendukungnode_modules
di masa depan, siapa yang tahu?Untuk referensi, di bawah ini adalah contoh bagaimana babel dapat mengubah
import
sintaks ES6 menjadi sintaks CommonJSrequire
.Katakanlah file
app_es6.js
berisi impor ini:Ini adalah arahan untuk mengimpor fungsi format dari paket node date-fns .
File terkait
package.json
dapat berisi sesuatu seperti ini:File terkait
.babelrc
bisa seperti ini:build-server-file
Script ini didefinisikan dalampackage.json
file adalah arahan bagi babel untuk menguraiapp_es6.js
file dan output fileapp.js
.Setelah menjalankan
build-server-file
skrip, jika Anda membukaapp.js
dan mencaridate-fns
impor, Anda akan melihatnya telah diubah menjadi ini:Sebagian besar file itu adalah gobbledygook bagi kebanyakan manusia, namun komputer memahaminya.
Juga untuk referensi, sebagai contoh bagaimana modul dapat dibuat dan diimpor ke proyek Anda, jika Anda menginstal
date-fns
dan kemudian bukanode_modules/date-fns/get_year/index.js
Anda dapat melihatnya berisi:Menggunakan proses babel di atas,
app_es6.js
file Anda kemudian dapat berisi:Dan babel akan mengubah impor menjadi:
Dan menangani semua referensi ke fungsi yang sesuai.
sumber
require
tetapimport won't support node_modules
Apa yang kamu maksud dengan itu?Biarkan saya memberi contoh untuk Termasuk modul kilat dengan memerlukan & impor
-memerlukan
-impor
Jadi setelah menggunakan salah satu dari pernyataan di atas kita akan memiliki variabel yang disebut sebagai 'ekspres' dengan kami. Sekarang kita dapat mendefinisikan variabel 'aplikasi' sebagai,
Jadi kami menggunakan 'wajib' dengan 'CommonJS' dan 'impor' dengan 'ES6'.
Untuk info lebih lanjut tentang 'wajib' & 'impor', baca tautan di bawah ini.
membutuhkan - Membutuhkan modul di Node.js: Semua yang perlu Anda ketahui
import - Pembaruan pada Modul ES6 di Node.js
sumber
Bukan jawaban di sini dan lebih seperti komentar, maaf tapi saya tidak bisa berkomentar.
Di simpul V10, Anda bisa menggunakan flag
--experimental-modules
untuk memberi tahu Nodejs yang ingin Anda gunakanimport
. Tetapi skrip entri Anda harus diakhiri dengan.mjs
.Perhatikan ini masih merupakan hal yang eksperimental dan tidak boleh digunakan dalam produksi.
Ref 1 - Nodejs Doc
Ref 2 - masalah github
sumber
ES6 baru:
'import' harus digunakan dengan kata-kata kunci 'export' untuk berbagi variabel / array / objek antara file js:
skool lama:
'wajib' harus digunakan dengan 'module.exports'
sumber