Variabel global node js. Dasar-dasar Nodejs. Susunan modul: urutan modul ditemukan di nodejs




Dalam sebuah node, Anda dapat mengatur variabel global melalui objek "global" atau "GLOBAL":

GLOBAL._ = memerlukan("garis bawah"); // tapi kamu "tidak boleh" melakukan ini! (lihat catatan di bawah)

atau lebih bermanfaat...

GLOBAL.jendela = GLOBAL; // seperti di browser

Dari sumber node Anda dapat melihat bahwa mereka adalah alias satu sama lain:

Node-v0.6.6/src/node.js:28:global = ini; 128: global.GLOBAL = global;

Pada kode di atas, "ini" adalah konteks global. Dengan modul commonJS (yang digunakan node), "objek" di dalam modul ini (yaitu "kode Anda") BUKAN konteks global. Sebagai buktinya, lihat di bawah ini di mana saya memuntahkan objek "ini" dan kemudian objek "GLOBAL" raksasa.

Console.log("\nINI:"); konsol.log(ini); console.log("\nGLOBAL:"); konsol.log(global); /* keluaran ... INI: {} GLOBAL: ( ArrayBuffer: , Int8Array: ( BYTES_PER_ELEMENT: 1 ), Uint8Array: ( BYTES_PER_ELEMENT: 1 ), Int16Array: ( BYTES_PER_ELEMENT: 2 ), Uint16Array: ( BYTES_PER_ELEMENT: 2 ), Int32Array: ( BYTES_PER_ELEMENT: 4 ), Uint32Array: ( BYTES_ PER_ELEMENT: 4 ), Float32Array: ( BYTES_PER_ELEMENT: 4 ), Float64Array: ( BYTES_PER_ELEMENT: 8 ), DataView: , global: , proses: ( EventEmitter: , judul: "node", tegaskan: , versi: "v0.6.5", _tickCallback: , moduleLoadList: [ "Binding evals", "Binding natives", "NativeModule events", "NativeModule buffer", "Binding buffer", "NativeModule menegaskan", "NativeModule util", "NativeModule path", "NativeModule module", " NativeModule fs", "Binding fs", "Konstanta pengikatan", "Aliran NativeModule", "Konsol NativeModule", "Binding tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule timer", "Binding timer_wrap", " NativeModule _linklist" ], versi: ( node: "0.6.5", v8: "3.6.6.11", ares: "1.7.5-DEV", uv: "0.6", openssl: "0.9.8n" ), nextTick : , stdout: , arch: "x64", stderr: , platform: "darwin", argv: [ "node", "/workspace/zd/zgap/darwin-js/index.js" ], stdin: , env: ( TERM_PROGRAM: "iTerm.app", "COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET": "/tmp/launch-nNl1vo/ServiceProcessSocket", JANGKA: "xterm", SHELL: "/bin/bash" , TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", PENGGUNA: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/ peluncuran -sD905b/Listeners", __CF_USER_TEXT_ENCODING: "0x12D732E7:0:0", PATH: "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/ X11 /bin", PWD: "/workspace/zd/zgap/darwin-js", LANG: "en_US.UTF-8", ITERM_PROFILE: "Default", SHLVL: "1", COLORFGBG: "7;0", BERANDA : "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", LOGNAME: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin- js /eksternal", _: "./index.js"), openStdin: , keluar: , pid: 10321, fitur: ( debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls : benar), bunuh:, execPath: "/usr/local/bin/node", addListener:, _needTickCallback:, pada:, hapusListener:, benar-benarKeluar:, chdir:, debug:, kesalahan:, cwd:, watchFile:, umask : , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , mewarisi: , _kill: , _byteLength: , mainModule: ( id: ". ", ekspor: (), induk: null, nama file:"/workspace/zd/zgap/darwin-js/index.js", dimuat: false, keluar: false, anak-anak:, jalur: ), _debugProcess: , dlopen: , uptime: , memoryUsage: , uvCounters: , binding: ), GLOBAL: , root: , Buffer: ( poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8 ), setTimeout: , setInterval: , clearTimeout: , clearInterval: , konsol: , jendela: , navigator: () ) */

**Catatan: Mengenai pengaturan "GLOBAL._", secara umum Anda sebaiknya melakukan var _ = require("underscore"); . Ya, Anda melakukan ini di setiap file yang menggunakan garis bawah, seperti di Java Anda melakukan import com.foo.bar; . Hal ini mempermudah untuk menentukan apa yang dilakukan kode Anda karena tautan antar file bersifat "eksplisit". Agak mengganggu, tapi bagus. .... Ini adalah khotbah.

Ada pengecualian untuk setiap aturan. Saya memiliki satu contoh di mana saya perlu menyetel "GLOBAL._". Saya sedang membuat sistem untuk mendefinisikan file "config" yang sebagian besar berupa JSON, tetapi "ditulis dalam JS" untuk menambah sedikit fleksibilitas. Tidak ada pernyataan "wajib" dalam file konfigurasi tersebut, tetapi saya ingin mereka memiliki akses ke garis bawah (seluruh sistem didasarkan pada pola garis bawah dan garis bawah), jadi saya akan menetapkan "GLOBAL._" sebelum mengevaluasi "config". Jadi ya, untuk setiap aturan ada pengecualian di suatu tempat. Tapi Anda punya alasan bagus, bukan hanya "Saya lelah mengetik 'wajib' jadi saya ingin melanggar konvensi."

NODE.JS– alat perangkat lunak untuk mengeksekusi js.

Nodejs = V8 + I/O + perpustakaan

V8: cepat, modern, ekonomis

Keuntungan

  • skrip java
  • Kode umum pada klien dan server
  • Tugas web dasar
  • Banyak koneksi dan tugas pada saat bersamaan
  • Mudah untuk membuat prototipe yang berfungsi
  • Manajer paket npm yang nyaman
  • Masyarakat

Instalasi

Saat menginstal, nodejs menulis sendiri ke variabel PATH (+ npm), [administrasi - variabel lingkungan]; dapat diperiksa pada baris perintah:
atur JALUR

Sebagai aturan, file diluncurkan di bawah nodejs: mari kita menulis skrip sederhana dan menjalankannya melalui baris perintah:


Skrip akan dieksekusi dan hasilnya akan ditampilkan pada baris perintah.

Dokumentasi Nodejs

modul nodejs

Untuk memahami cara kerja modul nodejs bawaan, Anda perlu mengunduh arsip kode sumber dari situs web nodejs (kode sumber). Dan pergi ke direktori lib. (perintah dir - dapatkan daftar file melalui baris perintah; Jika Anda perlu membuat daftar file di semua subfolder, alih-alih "dir" gunakan "dir /s"). Jika Anda menginstal nodejs dari sebuah paket, Anda tidak akan menemukan file apa pun di folder lib.

Nodejs memiliki modul dengan derajat yang berbeda-beda stabilitas. (misalnya, 0 – tidak boleh digunakan; 1, 2 – dapat digunakan tetapi API modul dapat berubah).

Fungsinya berkembang (proyek berkembang) dan seiring waktu kita perlu memindahkan fungsi konstruktor USER ke file terpisah. Di sinilah modul berperan.

Modul adalah sejenis cara yang ditawarkan nodejs untuk mengatur sebuah proyek.

Proyek cenderung berkembang, yang mengarah pada keinginan untuk membagi proyek menjadi beberapa file - di sinilah modul berperan.

memerlukan

Untuk halaman HTML, tag skrip digunakan untuk memasukkan skrip. Nodejs memiliki perintah khusus yang memerlukan.

Var pengguna = memerlukan("./pengguna");

Dalam contoh kita, kita mengakses file (user.js) di direktori yang sama (ekstensi (.js) bersifat opsional).

//membutuhkan("./pengguna"); // .js tidak perlu ditentukan // dalam hal ini file akan dieksekusi, tetapi tidak akan ada variabel USER // ini adalah perbedaan utama dari tag skrip dari nodejs // Di node.js, fungsi dan variabel setiap modul bersifat global // untuk file ini (modul itu sendiri) dan tidak secara otomatis // tersedia saat terhubung (memerlukan("./pengguna")) // Namun bagaimana cara mendapatkan akses? // Setiap modul memiliki variabel khusus ekspor - ini adalah sebuah objek dan apa // yang saya taruh di sana akan dikembalikan sebagai hasilnya require var user = require("./user.js"); // hasil: pengguna = ( Pengguna: fungsi )

Perbedaan pertama antara sistem modular nodejs dan skrip browser: jika ada dua tag skrip di browser, maka fungsi yang didefinisikan pada tingkat global di salah satunya tersedia di tag lainnya, tetapi tidak di nodejs. Di nodejs, fungsi dan variabel bersifat global untuk file tertentu (tidak tersedia saat diperlukan). Dengan demikian, nodejs memungkinkan Anda menulis modul yang benar-benar independen. Tapi agar modulnya tersedia, sudah digunakan sistem ekspor. Setiap modul memiliki variabel ekspor khusus.

Direktori modul DIR/index

Kami menghubungkan folder secara langsung var user = require("./user"); , yang berisi index.js yang sesuai.

Misalnya

Fungsi Pengguna(nama)( ini.nama = nama; ) Pengguna.prototipe.hello = fungsi(siapa)( console.log(phrases.Halo + ", " + siapa.nama); ); ekspor.Pengguna = Pengguna;

Kami menghubungkan dan menggunakan konstruktor Pengguna di file ./server.js

//server.js var pengguna = memerlukan("./pengguna"); var vasya = pengguna baru.Pengguna("Vasya");

"./" - relatif terhadap folder saat ini

ekspor adalah sebuah objek dan apa yang dimasukkan ke sana akan dikembalikan sebagai hasil dari kebutuhan (ekspor.jpg). Dengan cara ini modul dapat mendeklarasikan variabel/fungsi privatnya dan mengekspor hanya yang diperlukan.


Untuk variabel global, dll. ada objek global

Global.Pengguna = Pengguna;

Intinya

  • Diperlukan koneksi
  • Variabel: var (pribadi untuk modul), ekspor, global (jarang digunakan)
  • Jenis modul: js, node (dengan ekstensi .node), json (dengan ekstensi .json). Modul JSON digunakan ketika Anda perlu menyimpan beberapa informasi sederhana pada sebuah file.
  • Direktori modul DIR/index

objek modul

  • objek modul
  • Modul-fungsi module.exports = fungsi
  • Modul caching (modul tidak pernah dibaca lagi)
  • Susunan modul: urutan pencarian
  • Parameter yang lewat: modul-pabrik

Objek modul (objek dasar untuk modul) adalah variabel yang ada di setiap modul (file, Anda dapat menampilkan console.log(module;);). . Isi: properti id – biasanya jalur ke file,
parent – ​​​​link ke modul induk (module.parent – ​​​​link ke modul induk yang memerlukan ini),
anak-anak (module.children - modul-modul yang terhubung melalui kebutuhan),
mengekspor properti dan lain-lain.

Modul atau aplikasi? modul.orang tua

Modul dapat diluncurkan secara langsung, tetapi jika tidak, jika fungsionalitas tersebut terhubung ke modul lain, biarkan modul mengekspor fungsionalitas tersebut. Kedua kasus ini dapat dipisahkan dengan memeriksa:

If(modul.parent) ( ekspor.jalankan = jalankan; ) lain ( jalankan(); )


ps: seperti yang mereka katakan di stackoverflow.com Induk adalah modul yang memanggil skrip untuk interpretasi

// $ node foo.js console.log(modul.parent); // null // memerlukan("./foo") console.log(modul.parent); // ( ... )

Penggunaan module.exports dengan benar

Dalam konteks modul:

module.exports = ekspor = ini (konstruksi ini setara)

Jika Anda ingin meneruskan suatu fungsi bukan pada objek, tetapi secara langsung, gunakan sintaks berikut:

Module.exports = Pengguna;


Modul Caching

Ketika Nodejs memuat sebuah modul, ia sepenuhnya membuat objek modul yang sesuai (dengan mempertimbangkan induk, ekspor, dan properti serupa lainnya) dan mengingatnya sendiri (module.id (jalur lengkap ke file) berfungsi sebagai pengidentifikasi untuk cache internal ) dan saat berikutnya kita mengakses kembali (menghubungkan) ke modul (file) apa pun, nodejs mengambil objek yang sama dari cache. Artinya, misalnya, cukup menginisialisasi modul satu kali dalam sebuah file; di masa mendatang Anda cukup menggunakannya.

Dalam kasus kami, for var db = require("../db");
dan untuk var db = require("./db"); objek yang sama diambil. Oleh karena itu, prinsipnya adalah sebagai berikut: pertama kali sebuah modul digunakan, modul tersebut diinisialisasi dan selanjutnya kita hanya menghubungkannya dan menggunakannya (artinya, dalam kasus kita, kita tidak perlu menggunakan db.connect() dua kali, yaitu, dalam file yang berbeda).


Susunan modul: urutan modul ditemukan di nodejs

Cara membuat db selalu terhubung tanpa menentukan jalur tertentu:

Var db = memerlukan("../db"); //atau var db = memerlukan("./db");

dan seperti ini:

Var db = memerlukan("db");

terlepas dari file tempat db terhubung.

Untuk melakukan ini, Anda perlu memahami urutan pencarian modul di nodejs (apa yang terjadi ketika require dipanggil). Ada banyak modul bawaan di nodejs, misalnya require("fs"); , yang akan terhubung tanpa masalah. Jika Anda menentukan jalur tertentu di require, misalnya require("../db"); , maka pencarian akan didasarkan pada jalur yang diberikan dan file akan ditemukan, atau nodejs akan mencoba mendapatkan file ini sebagai direktori (dan akan mencari index.js di dalam kategori).

Jika Anda menentukan require("db"); dan modul tersebut tidak built-in, maka direktori node_modules akan dicari relatif terhadap posisi saat ini (jika ditemukan, ia akan mencoba mengambil modul darinya). Jika direktori node_modules tidak ada, maka direktori node_modules akan dicari di atas, dan seterusnya.

Selain menentukan jalur spesifik untuk sebuah modul, nodejs dapat mencari modul seperti ini:

Pengenalan npm - manajer paket untuk Node.JS

  1. buat file deskripsi paket (package.json) yang berisi informasi tentang modul (nama, versi, dll.). Baik secara manual atau melalui perintah
    npm init
    (akan menanyakan informasi yang diperlukan)
  2. Untuk menerbitkan modul, Anda perlu:
    1. Tambahkan pengguna menggunakan perintah npm adduser (Anda harus memasukkan Nama Pengguna dan Kata Sandi). Sekarang semua pekerjaan dengan npm akan dilakukan atas nama pengguna ini. Pengguna dapat masuk ke https://www.npmjs.com/~name_user dan memantau modul mereka.
    2. Penerbitan: npm terbitkan
  3. Kemudian seseorang dapat menggunakan modul Anda yang ditambahkan ke database, dan pengguna sendiri dapat membuat perubahan.
  4. Dapatkan semua perintah npm menggunakan perintah bantuan npm
  5. Cari modul di database: kata kunci npm s atau kata kunci pencarian npm (misalnya, modul super npm s)
  6. Instal modul: npm install name_module atau npm i name_module
  7. Saat memasang modul, nodejs pertama-tama mencari folder node_modules di direktori saat ini (lalu lebih tinggi dan lebih tinggi, dll.), atau (jika node_modules tidak ada) mencari package.json (juga naik; package.json biasanya menunjukkan akar dari proyek) dan, oleh karena itu, jika ia menemukan package.json, ia akan membuat folder node_modules di direktori yang sesuai; jika kedua opsi gagal, maka nodejs membuat folder node_modules di direktori saat ini. Jika Anda ingin menempatkan modul di direktori tertentu, maka Anda perlu membuat folder node_modules di direktori tersebut.
  8. modul pembaruan npm up (akan memeriksa modul pembaruan yang ada di folder node_modules)
  9. npm hapus module_name (hapus modul)

Keluaran dari npm:

npm init
nmp pengguna tambahan
npm terbitkan
kata kunci pencarian npm
modul instalasi npm
modul pembaruan npm
npm menghapus modul
perintah bantuan npm

Struktur Paket NPM

Menginstal versi yang diperlukan, misalnya: npm i [dilindungi email]

Modul versi terbaru dapat diperoleh jika modul dikembangkan menggunakan sistem versi git, misalnya di github. Cukup dengan mendapatkan Git Read-Only (url): https://github.com/strongloop/express.git dan di konsol:

npm di https://github.com/strongloop/express.git

dependensi di package.json

dependensi menunjuk ke modul-modul yang menjadi sandaran modul ini.

ketergantungan dev

Modul yang terdaftar di devDependencies tidak diinstal jika modul ditarik sebagai dependensi. Mereka diinstal hanya untuk pengembangan dan dapat diinstal jika, misalnya, Anda membuka modul di folder node_modules dan memasukkan npm i (atau dengan menyetel flag konfigurasi npm).

bidang utama menentukan titik masuk ke dalam paket

Modul global

Modul apa pun dapat diinstal secara global jika Anda menyetel flag -g: modul npm -g

Global berarti ke direktori sistem.

Direktori modul global untuk windows:

C:\pengguna\Nama_Pengguna\AppData\Roaming\npm

Modul global ditempatkan di direktori sistem standar. Biner-biner yang ada di package.json akan diinstal pada jalur sistem (ini adalah kegunaan utama modul global), yang nantinya dapat dipanggil melalui konsol.

Berdasarkan materi mata kuliah I. Kantor

Di node Anda dapat mengatur variabel global melalui objek "global" atau "GLOBAL":

GLOBAL._ = memerlukan("garis bawah"); // tapi kamu "tidak boleh" melakukan ini! (lihat catatan di bawah)

atau lebih bermanfaat...

GLOBAL.jendela = GLOBAL; // seperti di browser

Dari sumber node Anda dapat melihat bahwa mereka adalah alias satu sama lain:

Node-v0.6.6/src/node.js:28:global = ini; 128: global.GLOBAL = global;

Pada kode di atas, "ini" menggunakan konteks global. Dalam sistem modular commonJS (yang digunakan node), objek "ini" di dalam modul (yaitu "Kode Anda") BUKAN konteks global. Sebagai buktinya, lihat di bawah di mana saya membalikkan objek "ini" dan kemudian objek "GLOBAL" raksasa.

Console.log("\nINI:"); konsol.log(ini); console.log("\nGLOBAL:"); konsol.log(global); /* keluaran ... INI: {} GLOBAL: ( ArrayBuffer: , Int8Array: ( BYTES_PER_ELEMENT: 1 ), Uint8Array: ( BYTES_PER_ELEMENT: 1 ), Int16Array: ( BYTES_PER_ELEMENT: 2 ), Uint16Array: ( BYTES_PER_ELEMENT: 2 ), Int32Array: ( BYTES_PER_ELEMENT: 4 ), Uint32Array: ( BYTES_ PER_ELEMENT: 4 ), Float32Array: ( BYTES_PER_ELEMENT: 4 ), Float64Array: ( BYTES_PER_ELEMENT: 8 ), DataView: , global: , proses: ( EventEmitter: , judul: "node", tegaskan: , versi: "v0.6.5", _tickCallback: , moduleLoadList: [ "Binding evals", "Binding natives", "NativeModule events", "NativeModule buffer", "Binding buffer", "NativeModule menegaskan", "NativeModule util", "NativeModule path", "NativeModule module", " NativeModule fs", "Binding fs", "Konstanta pengikatan", "Aliran NativeModule", "Konsol NativeModule", "Binding tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule timer", "Binding timer_wrap", " NativeModule _linklist" ], versi: ( node: "0.6.5", v8: "3.6.6.11", ares: "1.7.5-DEV", uv: "0.6", openssl: "0.9.8n" ), nextTick : , stdout: , arch: "x64", stderr: , platform: "darwin", argv: [ "node", "/workspace/zd/zgap/darwin-js/index.js" ], stdin: , env: ( TERM_PROGRAM: "iTerm.app", "COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET": "/tmp/launch-nNl1vo/ServiceProcessSocket", JANGKA: "xterm", SHELL: "/bin/bash" , TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", PENGGUNA: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/ peluncuran -sD905b/Listeners", __CF_USER_TEXT_ENCODING: "0x12D732E7:0:0", PATH: "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/ X11 /bin", PWD: "/workspace/zd/zgap/darwin-js", LANG: "en_US.UTF-8", ITERM_PROFILE: "Default", SHLVL: "1", COLORFGBG: "7;0", BERANDA : "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", LOGNAME: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin- js /eksternal", _: "./index.js"), openStdin: , keluar: , pid: 10321, fitur: ( debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls : benar), bunuh:, execPath: "/usr/local/bin/node", addListener:, _needTickCallback:, pada:, hapusListener:, benar-benarKeluar:, chdir:, debug:, kesalahan:, cwd:, watchFile:, umask : , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , mewarisi: , _kill: , _byteLength: , mainModule: ( id: ". ", ekspor: (), induk: null, nama file:"/workspace/zd/zgap/darwin-js/index.js", dimuat: false, keluar: false, anak-anak:, jalur: ), _debugProcess: , dlopen: , uptime: , memoryUsage: , uvCounters: , binding: ), GLOBAL: , root: , Buffer: ( poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8 ), setTimeout: , setInterval: , clearTimeout: , clearInterval: , konsol: , jendela: , navigator: () ) */

**Catatan: Mengenai pengaturan "GLOBAL._" , secara umum Anda sebaiknya melakukan var _ = require("underscore"); . Ya, Anda melakukan ini di setiap file yang menggunakan garis bawah, seperti di Java Anda melakukan import com.foo.bar; . Hal ini mempermudah untuk menentukan apa yang dilakukan kode Anda karena tautan antar file bersifat "eksplisit". Agak menjengkelkan, tapi bagus..... Itu berkhotbah.

Ada pengecualian untuk setiap aturan. Saya memiliki satu contoh di mana saya perlu menyetel "GLOBAL._" . Saya sedang membuat sistem untuk mendefinisikan file "config" yang sebagian besar berupa JSON, tetapi "ditulis dalam JS" untuk menambah sedikit fleksibilitas. Tidak ada pernyataan "wajib" dalam file konfigurasi tersebut, tetapi saya ingin mereka memiliki akses ke garis bawah (seluruh sistem didasarkan pada pola garis bawah dan garis bawah), jadi saya akan menetapkan "GLOBAL._" sebelum mengevaluasi "config". Jadi ya, untuk setiap aturan ada pengecualian di suatu tempat. Tapi Anda punya alasan yang bagus, bukan sekadar "Saya capek mengetik 'persyaratan' jadi ingin mengingkari perjanjian."

Halo semua! Pada artikel ini kami akan terus memahami platform NodeJS dan bicarakan objek global.

Anda pasti sudah familiar dengan konsep ini. Saat kita menulis javascript kode di browser, lalu kita menggunakan objek global jendela. DI DALAM NodeJS ada juga objek global dan disebut secara sederhana Global.

Sebaik jendela, Global memungkinkan kita untuk menggunakan beberapa properti dan metode bawaan dari mana saja dalam kode. Mari kita lihat contohnya.

Mungkin salah satu metode paling terkenal, yang juga ada di objek global browser jendela- Ini konsol.log(). Anda dapat menulisnya seperti ini:

Dan kode tersebut akan menampilkan teks yang ditulis dalam tanda kurung ke konsol Anda.

Metode terkenal lainnya yang memungkinkan Anda melakukan beberapa tindakan setelah waktu tertentu:

// Jalankan kode dalam 7 detik (7000 milidetik)
setTimeout(fungsi() (
console.log("Halo, dunia!");
}, 7000);

Saya rasa tidak sulit untuk menebaknya jika ada setWaktu habis(), maka pasti ada setInterval().

// Akan menampilkan "Halo, dunia" setiap detik
setInterval(fungsi() (
console.log("Halo, dunia!");
}, 1000);

NodeJS memungkinkan Anda menerima beberapa informasi berguna dari sistem. Misalnya, Anda dapat mengetahui path lengkap ke folder tempat Anda berada saat ini menggunakan properti objek global __namadir.

Console.log(__dirname);

Jika Anda juga ingin mendapatkan nama file tempat kode dijalankan, Anda dapat menulis yang berikut ini.

Dalam sebuah node, Anda dapat mengatur variabel global melalui objek "global" atau "GLOBAL":

GLOBAL._ = memerlukan("garis bawah"); // tapi kamu "tidak boleh" melakukan ini! (lihat catatan di bawah)

atau lebih bermanfaat...

GLOBAL.jendela = GLOBAL; // seperti di browser

Dari sumber node Anda dapat melihat bahwa mereka adalah alias satu sama lain:

Node-v0.6.6/src/node.js:28:global = ini; 128: global.GLOBAL = global;

Dalam kode di atas, "ini" adalah konteks global. Dengan modul commonJS (yang digunakan node), "objek" di dalam modul ini (yaitu "kode Anda") BUKAN konteks global. Sebagai buktinya, lihat di bawah ini di mana saya memuntahkan objek "ini" dan kemudian objek "GLOBAL" raksasa.

Console.log("\nINI:"); konsol.log(ini); console.log("\nGLOBAL:"); konsol.log(global); /* keluaran ... INI: {} GLOBAL: ( ArrayBuffer: , Int8Array: ( BYTES_PER_ELEMENT: 1 ), Uint8Array: ( BYTES_PER_ELEMENT: 1 ), Int16Array: ( BYTES_PER_ELEMENT: 2 ), Uint16Array: ( BYTES_PER_ELEMENT: 2 ), Int32Array: ( BYTES_PER_ELEMENT: 4 ), Uint32Array: ( BYTES_ PER_ELEMENT: 4 ), Float32Array: ( BYTES_PER_ELEMENT: 4 ), Float64Array: ( BYTES_PER_ELEMENT: 8 ), DataView: , global: , proses: ( EventEmitter: , judul: "node", tegaskan: , versi: "v0.6.5", _tickCallback: , moduleLoadList: [ "Binding evals", "Binding natives", "NativeModule events", "NativeModule buffer", "Binding buffer", "NativeModule menegaskan", "NativeModule util", "NativeModule path", "NativeModule module", " NativeModule fs", "Binding fs", "Konstanta pengikatan", "Aliran NativeModule", "Konsol NativeModule", "Binding tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule timer", "Binding timer_wrap", " NativeModule _linklist" ], versi: ( node: "0.6.5", v8: "3.6.6.11", ares: "1.7.5-DEV", uv: "0.6", openssl: "0.9.8n" ), nextTick : , stdout: , arch: "x64", stderr: , platform: "darwin", argv: [ "node", "/workspace/zd/zgap/darwin-js/index.js" ], stdin: , env: ( TERM_PROGRAM: "iTerm.app", "COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET": "/tmp/launch-nNl1vo/ServiceProcessSocket", JANGKA: "xterm", SHELL: "/bin/bash" , TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", PENGGUNA: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/ peluncuran -sD905b/Listeners", __CF_USER_TEXT_ENCODING: "0x12D732E7:0:0", PATH: "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/ X11 /bin", PWD: "/workspace/zd/zgap/darwin-js", LANG: "en_US.UTF-8", ITERM_PROFILE: "Default", SHLVL: "1", COLORFGBG: "7;0", BERANDA : "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", LOGNAME: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin- js /eksternal", _: "./index.js"), openStdin: , keluar: , pid: 10321, fitur: ( debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls : benar), bunuh:, execPath: "/usr/local/bin/node", addListener:, _needTickCallback:, pada:, hapusListener:, benar-benarKeluar:, chdir:, debug:, kesalahan:, cwd:, watchFile:, umask : , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , mewarisi: , _kill: , _byteLength: , mainModule: ( id: ". ", ekspor: (), induk: null, nama file:"/workspace/zd/zgap/darwin-js/index.js", dimuat: false, keluar: false, anak-anak:, jalur: ), _debugProcess: , dlopen: , uptime: , memoryUsage: , uvCounters: , binding: ), GLOBAL: , root: , Buffer: ( poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8 ), setTimeout: , setInterval: , clearTimeout: , clearInterval: , konsol: , jendela: , navigator: () ) */

**Catatan: Mengenai pengaturan "GLOBAL._", secara umum Anda sebaiknya melakukan var _ = require("underscore"); Ya, Anda melakukan ini di setiap file yang menggunakan garis bawah, seperti di Java Anda mengimpor com.foo.bar; Hal ini mempermudah untuk menentukan apa yang dilakukan kode Anda karena tautan antar file bersifat "eksplisit". Agak mengganggu, tapi bagus. Ini adalah khotbah.

Ada pengecualian untuk setiap aturan. Saya memiliki satu contoh di mana saya perlu menyetel "GLOBAL._". Saya sedang membuat sistem untuk mendefinisikan file "config" yang sebagian besar berupa JSON, tetapi "ditulis dalam JS" untuk menambah sedikit fleksibilitas. Tidak ada pernyataan "wajib" dalam file konfigurasi tersebut, tetapi saya ingin mereka memiliki akses ke garis bawah (seluruh sistem didasarkan pada pola garis bawah dan garis bawah), jadi saya akan menetapkan "GLOBAL._" sebelum mengevaluasi "config". Jadi ya, untuk setiap aturan ada pengecualian di suatu tempat. Tapi kamu punya alasan yang bagus, bukan sekedar "Aku capek mengetik" jadi aku ingin mengingkari perjanjian."