Saat ini saya sedang melakukan ini:
foo.js
const FOO = 5;
module.exports = {
FOO: FOO
};
Dan menggunakannya dalam bar.js
:
var foo = require('foo');
foo.FOO; // 5
Apakah ada cara yang lebih baik untuk melakukan ini? Rasanya canggung untuk mendeklarasikan konstanta pada objek ekspor.
javascript
node.js
Menara
sumber
sumber
exports
. Apa yang canggung tentang itu?export const FOO = 5;
.module.exports={FOO:5};
?Jawaban:
Anda dapat secara eksplisit mengekspornya ke lingkup global dengan
global.FOO = 5
. Maka Anda hanya perlu memerlukan file tersebut, dan bahkan tidak menyimpan nilai pengembalian Anda.Tapi sungguh, Anda tidak harus melakukan itu. Menyimpan segala sesuatu dengan benar adalah hal yang baik. Anda sudah memiliki ide yang tepat, jadi terus lakukan apa yang Anda lakukan.
sumber
Menurut pendapat saya, menggunakan
Object.freeze
memungkinkan untuk gaya KERING dan lebih deklaratif. Pola pilihan saya adalah:./lib/constants.js
./lib/some-module.js
Peringatan Performa yang sudah usang
Masalah berikut ini diperbaiki di v8 pada Jan 2014 dan tidak lagi relevan untuk sebagian besar pengembang:
Sadarilah bahwa kedua pengaturan dapat ditulisi ke false dan menggunakan Object.freeze memiliki penalti kinerja besar-besaran di v8 - https://bugs.chromium.org/p/v8/issues/detail?id=1858 dan http://jsperf.com / performance-frozen-object
sumber
Secara teknis,
const
ini bukan bagian dari spesifikasi ECMAScript. Juga, menggunakan pola "Modul CommonJS" yang telah Anda catat, Anda dapat mengubah nilai "konstan" itu karena sekarang hanya properti objek. (tidak yakin apakah itu akan menyebabkan perubahan pada skrip lain yang memerlukan modul yang sama, tetapi itu mungkin)Untuk mendapatkan konstan nyata bahwa Anda juga dapat berbagi, memeriksa
Object.create
,Object.defineProperty
danObject.defineProperties
. Jika Anda menetapkanwritable: false
, maka nilai dalam "konstan" Anda tidak dapat dimodifikasi. :)Ini sedikit bertele-tele, (tetapi bahkan itu dapat diubah dengan sedikit JS) tetapi Anda hanya perlu melakukannya sekali untuk modul konstanta Anda. Dengan menggunakan metode ini, atribut apa pun yang Anda biarkan default
false
. (sebagai lawan mendefinisikan properti melalui penugasan, yang default semua atribut untuktrue
)Jadi, secara hipotesis, Anda bisa mengatur
value
danenumerable
, meninggalkanwritable
danconfigurable
karena mereka akan defaultfalse
, saya baru saja memasukkan mereka untuk kejelasan.Perbarui - Saya telah membuat modul baru ( konstanta-simpul ) dengan fungsi pembantu untuk kasus penggunaan yang sangat ini.
constants.js - Bagus
constants.js - Lebih baik
script.js
sumber
Object.defineProperty()
. Semua properti yang tidak ditentukan diasumsikanfalse
dalam konteks ini.Cara ES6.
ekspor dalam foo.js
impor di bar.js
sumber
const
inbar.js
yang memberlakukan immutabilitas variabel yang dirusak, bukanconst
infoo.js
. Artinya, satu dapat menggunakanlet {FOO} =
dibar.js
dan bermutasi "konstan" variabel. AFAIK, untuk menegakkan imutabilitas ekspor, kita masih membutuhkan modul ES atauObject.freeze
.FOO
di dalamfoo.js
.Saya menemukan solusi yang disarankan Dominic untuk menjadi yang terbaik, tetapi masih melewatkan satu fitur dari deklarasi "const". Ketika Anda mendeklarasikan konstanta di JS dengan kata kunci "const", keberadaan konstanta diperiksa pada waktu parse, bukan pada saat runtime. Jadi jika Anda salah mengeja nama konstanta di suatu tempat nanti dalam kode Anda, Anda akan mendapatkan kesalahan ketika Anda mencoba memulai program node.js Anda. Yang merupakan pemeriksaan kesalahan pengejaan yang jauh lebih baik.
Jika Anda mendefinisikan konstanta dengan fungsi define () seperti yang disarankan Dominic, Anda tidak akan mendapatkan kesalahan jika Anda salah mengeja konstanta, dan nilai konstanta salah eja akan tidak terdefinisi (yang dapat menyebabkan sakit kepala debugging).
Tapi saya kira ini adalah yang terbaik yang bisa kita dapatkan.
Selain itu, ini adalah semacam peningkatan fungsi Dominic, di constans.js:
Dengan cara ini Anda dapat menggunakan fungsi define () di modul lain, dan memungkinkan Anda untuk mendefinisikan konstanta di dalam module constants.js dan konstanta di dalam modul tempat Anda memanggil fungsi tersebut. Mendeklarasikan konstanta modul kemudian dapat dilakukan dengan dua cara (dalam script.js).
Pertama:
Kedua:
Juga, jika Anda ingin fungsi define () dipanggil hanya dari modul konstanta (bukan untuk mengasapi objek global), Anda mendefinisikannya seperti ini di constants.js:
dan gunakan seperti ini di script.js:
sumber
Dari pengalaman proyek sebelumnya, ini adalah cara yang baik:
Dalam constants.js:
Di main.js (atau app.js, dll.), Gunakan seperti di bawah ini:
sumber
Saya pikir itu
const
memecahkan masalah bagi kebanyakan orang yang mencari anwwer ini. Jika Anda benar-benar membutuhkan konstanta abadi, lihat jawaban yang lain. Agar semuanya teratur, saya menyimpan semua konstanta pada folder dan kemudian meminta seluruh folder.file src / main.js
src / consts_folder / index.js
Ps. di sini
deal
dannote
akan menjadi level pertama di main.jssrc / consts_folder / note.js
Ps.
obj
akan menjadi level kedua di main.jssrc / consts_folder / deal.js
Ps.
str
akan menjadi level kedua di main.jsHasil akhir pada file main.js:
console.log(constants.deal);
Ouput:console.log(constants.note);
Ouput:sumber
import
danexport
(mungkin perlu sesuatu seperti babel pada 2018 untuk menggunakan impor)types.js
myApp.js
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
sumber
Sebagai alternatif, Anda bisa mengelompokkan nilai "konstan" Anda di objek lokal, dan mengekspor fungsi yang mengembalikan klon dangkal objek ini.
Maka tidak masalah jika seseorang menetapkan ulang FOO karena hanya akan mempengaruhi salinan lokal mereka.
sumber
Karena Node.js menggunakan pola CommonJS, Anda hanya dapat berbagi variabel antara modul dengan
module.exports
atau dengan mengatur var global seperti yang Anda lakukan di browser, tetapi alih-alih menggunakan jendela yang Anda gunakanglobal.your_var = value;
.sumber
Saya akhirnya melakukan ini dengan mengekspor objek beku dengan fungsi pengambil anonim, daripada konstanta itu sendiri. Ini mengurangi risiko bug jahat yang diperkenalkan karena kesalahan ketik sederhana dari nama const, karena kesalahan runtime akan dilemparkan jika terjadi kesalahan ketik. Berikut adalah contoh lengkap yang juga menggunakan Simbol ES6 untuk konstanta, memastikan keunikan, dan fungsi panah ES6. Akan menghargai umpan balik jika ada sesuatu dalam pendekatan ini yang tampaknya bermasalah.
sumber
Saya sarankan melakukannya dengan webpack (menganggap Anda menggunakan webpack).
Menentukan konstanta sesederhana mengatur file konfigurasi webpack:
Dengan cara ini Anda mendefinisikannya di luar sumber Anda, dan mereka akan tersedia di semua file Anda.
sumber
Saya pikir ini bukan praktik yang baik untuk menyerbu ruang GLOBAL dari modul, tetapi dalam skenario di mana bisa sangat diperlukan untuk mengimplementasikannya:
Itu harus dipertimbangkan dampak dari sumber daya ini. Tanpa penamaan konstanta yang tepat, risiko OVERWRITTING sudah didefinisikan variabel global, adalah sesuatu yang nyata.
sumber