Module.exports untuk Menjaga Kode Node.js Tetap Terorganisir
Menulis seluruh proyek ke satu file index.js besar tidak mengganggu Node.js. Namun, jika Anda ingin orang lain membaca kode Anda, Anda perlu mengatur kode Anda dengan cara yang bermakna dan dapat dipelihara. Masuk ke Node module system!
Apa sebenarnya module itu? module menggabungkan fungsionalitas terkait ke dalam satu file sehingga Anda dapat mengimpornya saat anda perlu menggunakannya nanti. module merangkum kode yang relevan ke dalam satu unit dan biasanya disimpan dalam file. Setiap file di Node dapat dianggap sebagai module, dan setiap file memiliki objek global modulenya sendiri yang dapat Anda gunakan dalam file yang Anda gunakan untuk mengekspos kode yang akan diimpor ke file lain.
Dalam tutorial ini, Anda akan melakukan hal berikut:
- Pelajari tentang module.exports
- Ekspor function helper dari file
- Gunakan kebutuhan untuk memasukkan function helper dalam file terpisah
pada akhir tutorial ini, Anda akan dapat menggunakan sistem module Node untuk membuat module Anda sendiri dan menggunakan kembali kode Anda dalam proyek Anda.
Tujuan
import fungsi helper dari helpers.js ke file lain index.js.
Apa itu module.exports?
Untuk mengekspor kode dari file, tetapkan nilai ke objek module.exports dalam file. Setiap file JavaScript Node memiliki objek module.exports dalam lingkup global yang mewakili file tertentu. Objek itu menyimpan kode yang ingin Anda ekspor dari file. Anda dapat menetapkan objek, satu fungsi, atau nilai apa pun ke module.exports dan menggunakannya lagi di file lain.
Ini adalah bagian dari module system pada node. Ruang lingkup setiap file memiliki objek global yang disebut module yang menyimpan informasi tentang file tertentu. Anda dapat memublikasikan kode dari file itu dengan menetapkannya ke module.exports.
Apa itu requeire
Require membantu memuat module. Untuk mengimpor kode dari file, Anda dapat melakukannnya dengan memanggil file ke require('./ filepath'). Memanggil require dalam file JavaScript mengeksekusi kode dalam file dan mengembalikan nilai module.exports.
Ini sebenarnya sangat mirip dengan apa yang terjadi ketika Anda membutuhkan module npm. Kecuali dalam kasus ini, Anda memerlukan path ke file, bukan nama paket. Jika Anda membutuhkan paket npm, hal yang sama terjadi di belakang layar di folder node_modules/tempat paket tersebut diinstal.
Di sini, kita akan mengekspor string dari file bernama testmodule.js.
// testmodule.js
module.exports = "This is a test!"// index.js
const test = require('./testmodule.js')
console.log(test) // => "This is a test!"
File apa pun dapat ditetapkan ke module.exports sehingga dapat diimpor ke file lain menggunakan pernyataan require. Saat require dipanggil pada path file, kode dalam file tersebut dievaluasi dan module.exports dikembalikan.
// helpers.js
console.log('I got required!)
module.exports = "Exported!"// index.js
const exportedValue = require('./helpers.js')
Kode di atas akan menampilkan "Saya diminta!". Saat dikirim ke konsol, nilai yang diekspor sama dengan "Diekspor!". .. Jika Anda menjalankan kembali pernyataan require (setelah instance pertama), Anda akan mendapatkan nilai module.exports yang diekspor, tetapi console.log tidak akan dijalankan lagi. Ini karena pernyataan yang dibutuhkan di-cache. Mereka berjalan sekali, lalu memanggilnya lagi dan mereka mengembalikan nilai module.exports. Juga, di beberapa titik Anda mungkin melihat kode ES6 yang mirip dengan berikut ini:
// helpers.js
export default = "I'm an export!"// index.js
import helpers from './helpers.js'
Ini menggunakan sintaks module ES6 dan saat ini tidak ada Node Engine untuk mendukungnya secara default. Anda dapat menggunakan gaya ini jika Anda bekerja dengan sesuatu seperti Babel yang mengubah kode Anda. Namun, untuk saat ini, ketahuilah bahwa kita berbicara tentang module sintaks Ekspor CommonJS.
Membuat file Helpers
Sekarang mari kita gunakan module.exports untuk mengekspor beberapa fungsi dari file helpers.js, melakukan beberapa perhitungan sederhana, dan kemudian menggunakan require untuk menggunakannya di file lain index.js.
Salah satu opsi adalah mengekspor satu fungsi anonim dari file. Mari mengekspor satu fungsi yang mengalikan angka dengan 2 dan menggunakannya dalam file index.js.// helpers.js
module.exports = function(x) {
return x * 2
}// index.js
const helpers = require('./helpers.js')
helpers(4) // => 8
Setel nilai module.exports ke fungsi yang ingin Anda impor dan minta di index.js.
Ini nyaman, tetapi bagaimana jika Anda ingin mengekspor beberapa fungsi sekaligus? Sekarang Anda dapat mengekspor literal objek yang menyimpan beberapa fungsi dan kemudian mengakses fungsi dengan namanya. Ini juga dikenal sebagai ekspor bernama. Ini karena nantinya Anda dapat memilih untuk mengimpor hanya properti yang Anda perlukan berdasarkan nama.
// helpers.js
module.exports = {
multiplyByTwo: function(x) { return x *2 },
divideByTwo: function(x) { return x / 2}
}// index.js
const helpers = require('./helpers.js')
helpers.multiplyByTwo(10) // => 5
// or, you can import just the named property you need
const divideByTwo = require('./helpers.js').divideByTwo
divideByTwo(18) // => 9
Meminta file mengembalikan objek yang diekspor oleh module.exports. Anda juga dapat menggunakan sintaks titik setelah pernyataan require untuk mengimpor hanya properti yang Anda butuhkan. Alih-alih mendeklarasikan semua fungsi di satu tempat, Anda dapat menggunakan sintaks yang berbeda. Di sini kita mengekspor properti bernama dari objek module.exports secara langsung.
// helpers.js
module.exports.multiplyByTwo = function(x) { return x * 2 }
module.exports.divideByTwo = function(x) { return x / 2 }
function nonExportedFunction(x) {
return x * 3
}// index.js
const helpers = require('./helpers.js/)
const divideByTwo = require('./helpers.js').divideByTwo
Pada kode di atas, module.exports terlihat seperti objek yang diekspor pada contoh sebelumnya. Keduanya akan menjadi objek dengan dua kunci, multiplyByTwo dan divideByTwo. Satu-satunya perbedaan adalah bahwa Anda telah menetapkan satu per satu.
Catatan: Berhati-hatilah untuk tidak mengacaukan sintaks di atas dengan ekspor langsung objek. Menetapkan sesuatu ke module.exports nanti di file akan menimpa semua yang telah Anda ekspor.
// helpers.js
module.exports.multiplyByTwo = function(x) { return x * 2 }
module.exports.divideByTwo = function(x) { return x / 2 }
module.exports = "I just overwrote all my exports! Don't mix these styles!"
Passing argumen ke module
Dengan kari, Anda bisa sedikit bersenang-senang dengan asisten matematika. Currying adalah konsep pemrograman fungsional. Panggil fungsi dengan variabel untuk mendapatkan fungsi lain yang telah dipanggang. Jika perlu, ini adalah semacam konfigurasi. Ini adalah kata yang sederhana, tetapi bisa sangat kuat.
.Mari kita membuat fungsi matematika di sekitar satu angka untuk melakukan operasi. Anda dapat meneruskan nomor itu saat Anda membutuhkan file, dan Anda bisa mendapatkan kembali fungsi yang mengalikan, membagi, atau menambahkan dengan nomor yang awalnya Anda berikan ke fungsi kari.
// curryHelpers.js
module.exports = function(x) {
return {
multiply: function(y) { return y * x },
divide: function(y) { return y / x },
add: function(y) { return y + x }
}
}// index.js
const byTwo = require('./curryHelpers.js')(2)
const byTen = require('./curryHelpers.js')(10)byTwo.multiply(5) // => 10
byTwo.divide(14) // => 7
byTwo.add(9) // => 11byTen.multiply(5) // => 50
Ini adalah contoh penggunaan require dan module.exports untuk meneruskan variabel ke ruang lingkup file. Saya meneruskan nomor 2 ke ruang lingkup file curryHelpers dengan memanggil fungsi yang dikembalikan oleh require. Objek fungsi yang diekspor dikonfigurasikan untuk mengalikan, membagi, dan menambahkan angka apa pun yang dilewati oleh angka 2 pertama yang dilewati. Saya melakukan hal yang sama dengan nomor 10 dan mendapatkan objek untuk fungsi yang terdiri dari. Nomor 10.
exports sebagai singkatan dari module.exports
Terakhir, Anda dapat menggunakan singkatan untuk module.exports. Objek eksports juga tersedia secara global dan menunjuk ke objek yang sama dengan module.exports. Oleh karena itu, kode berikut setara.
// assigning named exports
module.exports.pizza = true
exports.pizza = true// exporting an object
module.exports = {}
exports = {}
kesimpulan
Node adalah bahasa yang sangat modular yang dapat Anda gunakan sendiri dengan mengekspor dan menggunakan kembali kode Anda dalam proyek Anda menggunakan module.exports. Anda dapat menggunakan persyaratan untuk mengimpor kode itu ke file lain di proyek Anda. Gagasan mengimpor module sangat umum di Node, dan memahami module.exports akan membantu Anda menavigasi pendekatan modularnya.
Saya harap Anda dapat menggunakan beberapa pola ini dalam kode Anda.