Globalne spremenljivke Node js. NodeJS. Globalni objekt. Branje in pisanje datotek

V vozlišču lahko nastavite globalne spremenljivke z uporabo predmeta "global" ali "GLOBAL":

GLOBAL._ = zahtevaj ("podčrtaj"); // vendar tega "ne bi smeli" narediti! (glejte opombo spodaj)

ali bolj uporabno...

GLOBALNO.okno = GLOBALNO; // kot v brskalniku

Iz vozlišča lahko vidite, da sta sešita skupaj:

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

V zgornji kodi je "to" globalni kontekst. Pri modulu commonJS (ki ga uporablja vozlišče) ta "objekt" znotraj modula (tj. "vaša koda") NI globalni kontekst. Za dokaz tega si oglejte spodaj, kje izbruham "ta" predmet in nato velikanski "GLOBALNI" predmet.

Console.log("\nTO:"); console.log(to); console.log("\nGLOBALNO:"); console.log(globalno); /* izhodi ... TO: {} GLOBALNO: ( 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 ), Uint 32Matrika: ( BYTES_PER _ELEMENT: 4 ), Float32Array: ( BYTES_PER_ELEMENT: 4 ), Float64Array: ( BYTES_PER_ELEMENT: 8), DataView: , globalno: , proces: ( EventEmitter: , naslov: "node", assert: , različica: "v0.6.5", _tickCallback: , moduleLoadList: [ "Binding evals", "Binding natives", "NativeModule dogodki", "NativeModule buffer", "Binding buffer", "NativeModule assert", "NativeModule util", "NativeModule path", "NativeModule module", " NativeModule fs", "Binding fs", "Binding konstante", "NativeModule stream", "NativeModule console", "Binding tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule timers", "Binding timer_wrap", " NativeModule _linklist" ], različice: ( vozlišče: "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: , platforma: "darwin", argv: [ "vozlišče", "/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", TERM: "xterm", SHELL: "/bin/bash" , TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", USER: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/ zagon -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: "Privzeto", SHLVL: "1", COLORFGBG: "7;0", HOME : "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", LOGNAME: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin- js /external", _: "./index.js"), openStdin: , exit: , pid: 10321, funkcije: ( debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls : true ), kill: , execPath: "/usr/local/bin/node", addListener: , _needTickCallback: , on: , removeListener: , reallyExit: , chdir: , debug: , error: , cwd: , watchFile: , umask : , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , podeduje: , _kill: , _byteLength: , mainModule: ( id: ". ", izvozi: (), nadrejeni: null, ime datoteke: "/workspace/zd/zgap/darwin-js/index.js", naloženo: false, izhod: false, otroci: , poti: ), _debugProcess: , dlopen: , uptime: , memoryUsage: , uvCounters: , binding: ), GLOBAL: , root: , Buffer: ( poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8), setTimeout: , setInterval: , clearTimeout: , clearInterval: , konzola: , okno: , navigator: () ) */

**Opomba: kar zadeva nastavitev "GLOBAL._", bi morali na splošno samo narediti var _ = require("podčrtaj"); . Da, to storite v vsaki datoteki, ki uporablja podčrtaj, tako kot v Javi uvozite com.foo.bar; . Tako je lažje ugotoviti, kaj počne vaša koda, ker so povezave med datotekami "eksplicitne". Rahlo nadležno, a dobro. To je pridiga.

Pri vsakem pravilu obstaja izjema. Imel sem točno en primer, ko sem moral nastaviti "GLOBAL._". Ustvarjal sem sistem za definiranje datotek "config", ki so bile večinoma JSON, vendar so bile "napisane v JS", da bi dodal malo več prilagodljivosti. V takšnih konfiguracijskih datotekah ni bilo stavkov "require", vendar sem želel, da imajo dostop do podčrtaja (CELOTEN sistem je temeljil na vzorcih podčrtaja in podčrtaja), zato bi nastavil "GLOBAL._", preden bi ocenil "config". Tako da ja, za vsako pravilo je nekje izjema. Ampak imaš dober razlog, ne samo "utrujen sem od tipkanja", zato želim prekiniti dogovor."

JavaScript ima poseben objekt, imenovan Global Object, do njega in vseh njegovih atributov je mogoče dostopati kjer koli v programu, globalna spremenljivka.

Brskalnik JavaScript je običajno globalni objekt okna, globalni objekt Node.js je globalni objekt, vse globalne spremenljivke (razen globalnega sebe) so v lasti globalnega objekta.

V Node.js imamo neposreden dostop do globalnih lastnosti, ne da bi jih morali vključiti v aplikacijo.

Globalni objekti in globalne spremenljivke

Najbolj temeljna globalna vloga je spremenljivka globalnega gostitelja. Po definiciji ECMAScript so naslednji pogoji globalne spremenljivke:

  • Spremenljivka External je definirana;
  • Lastnosti globalnih objektov;
  • Spremenljivka je implicitno definirana (neposredna dodelitev nedefiniranim spremenljivkam).

Ko definirate globalno spremenljivko, bo spremenljivka postala tudi last globalnega objekta in obratno. Upoštevajte, da v Node.js ne morete definirati spremenljivk v zunanjem kontekstu, ker je vsa uporabniška koda del trenutnega modula, sam modul pa ni zunanji kontekst.

Opomba: vedno uporabite var za definiranje spremenljivk, da se izognete uvedbi globalne spremenljivke, saj bodo globalne spremenljivke onesnažile imenski prostor in povečale tveganje komunikacijske kode.

__Ime datoteke

__filename podaja ime datoteke skripta, ki se trenutno izvaja. Absolutna pot do lokacije, kjer bo izhodna datoteka, vendar možnost ukazne vrstice in podajanje imena datoteke nista nujno enaki. Če je v modulu, je vrnjena vrednost pot do datoteke modula.

primeri

// 输出全局变量 __ime datoteke 的值 console.log(__ime datoteke);

$ vozlišče main.js /web/com/w3big/nodejs/main.js

__dirname

__dirname predstavlja imenik skriptov, ki se trenutno nahaja.

primeri

Ustvarite datoteko main.js, kodirajte takole:

// 输出全局变量 __dirname 的值 console.log(__dirname);

Izvršljiva datoteka main.js, koda je videti takole:

$ node main.js /web/com/w3big/nodejs

setTimeout(CB, ms)

setTimeout(C - Bi, ms): Funkcija SetTimeout() je navedena samo enkrat.

Vrne vrednost ročaja, ki predstavlja časovnik.

primeri

Ustvarite datoteko main.js, kodirajte takole:

Funkcija printHello())( console.log("Hello, World!"); ) // setTimeout(printHello, 2000);

Izvršljiva datoteka main.js, koda je videti takole:

$ node main.js Pozdravljen, svet!

clearTimeout(t)

clearTimeout(t) se uporablja za zaustavitev globalne funkcije, preden posredujete setTimeout() za ustvarjanje časovnika. Parameter T funkcija setTimeout() za ustvarjanje kalkulatorja.

primeri

Ustvarite datoteko main.js, kodirajte takole:

Funkcija printHello())( console.log("Hello, World!"); ) // var t = setTimeout(printHello, 2000); // 清除定时器 clearTimeout(t);

Izvršljiva datoteka main.js, koda je videti takole:

$nodemain.js

setInterval(CB, ms)

setInterval(C - Bi, ms) Globalna funkcija izvede določeno funkcijo po določenem številu milisekund (ms) Število (CB).

Vrne vrednost ročaja, ki predstavlja časovnik. Uporabite lahko funkcijo clearInterval(T), da počistite časovnik.

Metoda setInterval() bo še naprej klicala funkcijo, dokler ne pokličete clearInterval() ali zaprete okno.

primeri

Ustvarite datoteko main.js, kodirajte takole:

Funkcija printHello())( console.log("Pozdravljen, svet!"); ) // setInterval(printHello, 2000);

Izvršljiva datoteka main.js, koda je videti takole:

$ node main.js Pozdravljen, svet! Pozdravljen, svet! Pozdravljen, svet! Pozdravljen, svet! Pozdravljen, svet! ......

Zgornji program bo izdal "Hello, World!" enkrat vsaki dve sekundi in se bo neprekinjeno izvajal, dokler ne pritisnete gumba CTRL + C.

konzola

Konzola Konzola za zagotavljanje standardnega izpisa, ki je pripomoček za odpravljanje napak, ki ga zagotavlja mehanizem JScript v Internet Explorerju in je kasneje postal de facto standard brskalnika.

Node.js sledi temu standardu in zagotavlja dosledno vedenje in navade predmeta konzole, ki se uporablja v izhodnih znakih standardnega izhodnega toka (STDOUT) ali standardnega toka napak (STDERR).

konzolna metoda

Spodaj je predmet konzole:

št.Metoda in opis
1 console.log([podatki] [, ... ])
Za standardne natisljive znake izhodnega toka in konec z znakom za novo vrstico. Ta metoda sprejme več parametrov, če obstaja samo en parameter, potem je izhod niz tega parametra. Če obstaja več argumentov, mesta, kot je izhodna oblika ukaza v C E().
2 console.info([podatki] [, ... ])
P vloga ukaza vrne informativno sporočilo, ukaz console.log ne naredi velike razlike, poleg chrome bo izpisano samo besedilo, ostalo bo pokazalo modri klicaj.
3 console.error([podatki] [, ... ])
Izhodno sporočilo o napaki. Konzola bo prikazana rdeče, ko pride do napake vilic.
4 console.warn([podatki] [, ... ])
Prikaže se opozorilno sporočilo. Konzola se prikaže z rumenim klicajem.
5 console.dir(OBJ[, možnosti])
Predmet, ki se uporablja za inšpekcijo (pregled) in lahko berljive oblike prikaza in tiskanja.
6 console.time (bližnjica)
Čas izhoda, začetni čas.
7 console.timeEnd(bližnjica)
Končni čas, ki označuje konec časa.
8 console.trace(sporočilo [, ...])
Koda trenutno izvaja klicno pot na skladu, zagon te preskusne funkcije je koristen, samo želite preizkusiti funkcijo, ki ji je v vrstici pridružil console.trace.
9 console.assert(vrednost[, sporočilo][, ...])
Da bi ugotovili, ali je spremenljivka ali izraz resničen, sta bila potrebna dva parametra, prvi parameter je izraz, drugi argument pa niz. Samo če je prvi argument napačen, bo rezultat drugi argument; ne bo imel rezultatov.
console.log(): Natisni v standardni izhod in končaj z novo vrstico.

console.log sprejme več parametrov, če obstaja samo en parameter, izhodni niz tega parametra. Če obstaja več argumentov, mesta, kot je izhodna oblika ukaza v C E().

Prvi parameter je niz, brez parametrov, samo natisnite znak za novo vrstico.

Console.log("Pozdravljen svet"); console.log("byvoid%diovyb"); console.log("byvoid%diovyb", 1991);

Pozdravljen svet byvoid%diovyb byvoid1991iovyb

  • console.error(): s console.log() naredi isto, vendar prikaže standardno napako.
  • console.trace(): pretok napak v standardni izhod trenutnega sklada klicev.
console.trace();

Rezultati poslovanja so naslednji:

Trace: na Objektu. (/home/byvoid/consoletrace.js:1:71) na Module._compile (module.js:441:26) na Object..js (module.js:459:10) na Module.load (module.js: 348:31) pri Function._load (module.js:308:12) pri Array.0 (module.js:479:10) pri EventEmitter._tickCallback (node.js:192:40)

primeri

Ustvarite datoteko main.js, kodirajte takole:

Console.info("程序开始执行:"); spremenljiv števec = 10; console.log("Prikaz: %d", števec); console.time("获取数据"); // // 执行一些代码 // console.timeEnd("获取数据"); console.info("程序执行完毕。")

Izvršljiva datoteka main.js, koda je videti takole:

$ vozlišče main.js 程序开始执行: 计数: 10 获取数据: 0ms 程序执行完毕

postopek

Proces je globalna spremenljivka, atribut je globalni objekt.

Uporablja se za opis trenutnega stanja procesa predmeta Node.js in zagotavlja preprost vmesnik za operacijski sistem. Običajno sami pišete programe ukazne vrstice in se na koncu ukvarjate z njimi. Spodaj bomo predstavili nekatere najpogosteje uporabljene metode postopka ugovora s strani članov.

št.Dogodki in opis
1 izhod
Sproži se, ko je proces pripravljen na zaključek.
2 predIzhodom
Ta dogodek se sproži, ko ima vozlišče prazno zanko dogodkov in ni izvedeno nobeno drugo dejanje. Na splošno ni postopka za organizacijo izhodnega vozlišča, vendar lahko poslušalce "beforeExit" pokličete asinhrono, tako da se bo vozlišče nadaljevalo.
3 spregledana izjema
Ko se izjema vrne nazaj v zanko dogodkov, dvignite ta dogodek. Če v izjemo dodate monitor, se privzeto dejanje (tiskanje sklada in izhod) ne bo zgodilo.
4 Signal se sproži, ko
dogodek ko proces prejme signal.
Preglejte seznam standardnih imen signalov POSIX, kot so SIGINT, SIGUSR1 itd.

primeri

Ustvarite datoteko main.js, kodirajte takole:

Process.on("izhod", funkcija(koda) ( // setTimeout(funkcija() ( console.log("该代码不会执行"); 0); console.log("退出码为:", koda) ;)); console.log("程序执行结束");

Izvršljiva datoteka main.js, koda je videti takole:

$ node main.js 程序执行结束退出码为: 0

Izhodne statusne kode

Kode statusa izhoda so naslednje:

Statusna kodaNaslov in opis
1 Neulovljena usodna izjema
Obstaja neujeta izjema in ni bila obravnavana ali domena obdelovalca uncaughtException.
2 neuporabljeno
zadrževanje
3 Analiza notranje napake JavaScript
Izvorna koda za razčlenjevanje napak JavaScript se pokliče, ko se zažene proces Node. Zelo redko, samo ko Node.
4 Ocena notranje napake JavaScript
Postopek JavaScript, ki izvaja izvorno vozlišče, vrne napako pri ocenjevanju funkcije. Zelo redko, samo ko Node.
5 Usodna napaka
V8 v nepopravljivi napaki s smrtnim izidom. Običajno natisni Stderr, vsebina: usodna napaka
6 Notranji upravljalnik izjem, ki ni v funkciji
Neulovljena izjema, notranji obravnavalec izjem je nekako nastavljen na funkcijo in ga tudi ni mogoče poklicati.
7 Napaka izjeme notranjega upravljalnika izvajalnega časa
Neulovljena izjema in upravljalnik izjeme za obravnavo lastne vrže izjemo. Na primer, če process.on("uncaughtException") ali domain.on("error") povzroči izjemo.
8 neuporabljeno
zadrževanje
9 Neveljaven argument
Morda gre za neznane parametre ali parameter za vrednost.
10 Notranji izvajalni čas JavaScripta ni uspel
Izvorna koda JavaScript se generira, ko se v procesu Node sprožijo napake, zelo redko, samo ko poteka razvoj Node.
12 Neveljaven argument za odpravljanje napak
--debug nastavljena možnost in/ali --debug-BRK, vendar so bila izbrana napačna vrata.
> 128 Signalni izhodi
Če vozlišče prejme usodni signal, kot je SIGKILL ali SIGHUP, je povratna koda 128 plus signalna koda. To je standardna praksa Unixa, visoka koda na izhodnih signalih.

atributi procesa

Proces zagotavlja številne uporabne lastnosti, enostavnost interakcije, da lahko bolje nadzorujemo sistem:

KoličinaLastnina in opis
1 STDOUT
Standardni izhodni tok.
2 STDERR
Standardni tok napak.
3 STDIN
Standardni vhodni tok.
4 ARGV
Lastnost ARGV vrne niz različnih možnosti za izvajanje skripta ukazne vrstice med sestavljanjem. Njegovi prvi člani so vedno vozlišče, njegov drugi član je ime skriptne datoteke, preostali člani pa so parametri skriptne datoteke.
5 execPath
Vrne absolutno pot binarnega vozlišča trenutnega izvajanja skripta.
6 execArgv
Vrne člana matrike, ki se nahaja pod skriptom ukazne vrstice, ki se izvede med vozliščem izvedljivih parametrov ukazne vrstice datoteke skripta.
7 ENV
Vrne objekt, člane trenutne spremenljivke okolja lupine
8 Izhodna koda
Izhodna koda za proces, če je proces predstavljen z izhodom process.exit() brez podajanja izhodne kode.
9 različica
različico vozlišča, kot je v0.10.18.
10 različice
Lastnost, ki vsebuje različice vozlišč in odvisnosti.
11 konfiguracija
Objekt, ki vsebuje trenutno vozlišče, se uporablja za prevajanje izvedljive konfiguracijske datoteke možnosti javascript. To je isti skript run./configure, ustvarjen z datoteko "config.gypi".
12 PID - regulator
Trenutna številka postopka.
13 Ime
Ime procesa, privzeto "vozlišče", vrednost lahko prilagodite.
14 arh
Trenutna arhitektura CPU: "arm", "ia32" ali "64".
15 platforma
Zaženite program, kjer je platforma "Darwin", "FreeBSD", "Linux", "SunOS" ali "win32"
16 glavniModul
require.main alternativne metode. Različne točke, če se glavni modul spremeni med izvajanjem, se lahko require.main vedno znova vrne na stari modul. Za oba velja, da pripadata istemu modulu.

primeri

Ustvarite datoteko main.js, kodirajte takole:

// 输出到终端 process.stdout.write("Pozdravljen svet!" + "\n"); // 通过参数读取 process.argv.forEach(function(val, index, array) ( console.log(index + ": " + val); )); // 获取执行路局 console.log(process.execPath); // 平台信息 console.log(process.platform);

Izvršljiva datoteka main.js, koda je videti takole:

$ node main.js Pozdravljen svet! 0: vozlišče 1: /web/www/node/main.js /usr/local/node/0.10.36/bin/node darwin

Referenčni vodnik za metode

Postopek ponuja številne uporabne metode za omogočanje učinkovitejšega nadzora našega interaktivnega sistema:

št.Metoda in opis
1 prekiniti ()
To bo sprožilo dogodek prekinitvenega vozlišča. To bo povzročilo izhod vozlišča in ustvarjanje datoteke izpisa.
2 ChDir (imenik)
Spremenite trenutni delovni imenik procesa, če operacije ni mogoče zapreti.
3 UHO ()
Vrne delovni imenik trenutnega procesa
4 izhod ([koda])
Konča postopek z navedeno kodo. Če ta parameter izpustite, bo uporabljena koda 0.
5 getgid()
Pridobite identifikacijo skupine procesov (glejte getgid(2)). Ko je skupina kupila digitalni ID namesto imena.
6 setgid(ID)
Nastavitev postopka identifikacije skupine (glejte setgid (2)). ID ima lahko številsko ime ali ime skupine. Če določite ime skupine, bo blokiranje dovoljeno čakati na digitalni ID.
Opomba: To funkcijo je mogoče uporabljati samo (npr. ne-Windows in Android) na platformah POSIX.
7 getuid()
Pridobite postopek identifikacije uporabnika (glejte getuid(2)). To je številčni ID uporabnika in ne uporabniško ime.
Opomba: To funkcijo je mogoče uporabljati samo (npr. ne-Windows in Android) na platformah POSIX.
8 UIP (ID)
ID uporabnika za nastavitev procesa (glejte UIP (2)). Pridobivanje digitalnega identifikatorja ali niza imena. Če določite ime skupine, bo blokiranje dovoljeno čakati na digitalni ID.
Opomba: To funkcijo je mogoče uporabljati samo (npr. ne-Windows in Android) na platformah POSIX.
9 getgroups()
Postopek vračanja matrike ID-jev skupine. Sistem POSIX ne zagotavlja, da je, vendar Node.js zagotovo obstaja.
Opomba: To funkcijo je mogoče uporabljati samo (npr. ne-Windows in Android) na platformah POSIX.
10 setgroups
Nastavite ID skupine procesov. Primeren je za delovanje, vse kar potrebujete je, da imate privilegije superuporabnika ali možnost CAP_SETGID.
Opomba: To funkcijo je mogoče uporabljati samo (npr. ne-Windows in Android) na platformah POSIX.
11 initgroups(uporabnik, extra_group)
Branje / itd. /group in inicializira seznam dostopa do skupine, locirani so vsi člani skupine. Primeren je za delovanje, vse kar potrebujete je, da imate privilegije superuporabnika ali možnost CAP_SETGID.
Opomba: To funkcijo je mogoče uporabljati samo (npr. ne-Windows in Android) na platformah POSIX.
12 ubiti (IDP [signal])
Pošlje signal procesu. ID je identifikator procesa, signal pa je niz, ki označuje signal, ki se prenaša. Imena signalov so nizi, kot sta "SIGINT" ali "" SIGHUP. Če ta parameter izpustite, bo signal "SIGTERM".
13 MemoryUsage()
Vrne objekt, ki opisuje postopek, ki ga uporabljajo bajti stanja pomnilnika vozlišča.
14 nextTick (povratni klic)
Ko se trenutna zanka povratnega klica funkcije konča.
15 Umask ([maska])
Nastavite ali preberite datoteko maske procesa. Podrejeni procesi podedujejo to masko od nadrejenega procesa. Če je argument maske resničen, potem vrne staro masko. V nasprotnem primeru vrne trenutno masko.
16 Porabljen()
Vrne število sekund, ko se je vozlišče že začelo.
17 hrtime()
Časovna ločljivost trenutnega procesa, določena kot [sekunde] niz nanosekund. To je relativno glede na kateri koli pretekli dogodek. Ta vrednost nima nobene zveze z datumom, zato ne vpliva na premik ure. Glavni namen je v natančnem časovnem obdobju izmeriti uspešnost programa.
Preden se lahko rezultat posreduje trenutnemu procesu.hrtime(), vrne časovno razliko med njima za referenčno merjenje in merjenje časovnega intervala.

primeri

Ustvarite datoteko main.js, kodirajte takole:

// 输出当前目录 console.log("International 目录: " + process.cwd()); // 输出当前版本 console.log("当前版本: " + process.version); // 输出内存使用情况 console.log(process.memoryUsage());

NODE.JS– programsko orodje za izvajanje js.

Nodejs = V8 + I/O + knjižnice

V8: hiter, moderen, varčen

Prednosti

  • Javascript
  • Skupna koda na odjemalcu in strežniku
  • Osnovna spletna opravila
  • Veliko povezav in nalog hkrati
  • Enostavno ustvariti delujoč prototip
  • Priročen upravitelj paketov npm
  • Skupnost

Namestitev

Pri namestitvi se nodejs zapiše v spremenljivko PATH (+ npm), [administration - spremenljivke okolja]; lahko preverite v ukazni vrstici:
nastavite PATH

Praviloma se datoteke zaženejo pod nodejs: napišimo preprost skript in ga zaženimo prek ukazne vrstice:


Skript se bo izvedel in rezultat bo prikazan v ukazni vrstici.

Dokumentacija Nodejs

moduli nodejs

Če želite razumeti, kako delujejo vgrajeni moduli nodejs, morate prenesti arhiv izvorne kode s spletnega mesta nodejs (izvorna koda). In pojdite v imenik lib. (ukaz dir - pridobite seznam datotek prek ukazne vrstice; če morate prikazati seznam datotek v vseh podmapah, potem namesto "dir" uporabite "dir /s"). Če ste namestili nodejs iz paketa, v mapi lib ne boste našli nobene datoteke.

Nodejs ima module z različnimi stopnjami stabilnost. (na primer 0 – se ne sme uporabiti; 1, 2 – lahko se uporabi, vendar se API modula lahko spremeni).

Funkcije rastejo (projekt se razvija) in čez čas bomo morali funkcijo konstruktorja USER premakniti v ločeno datoteko. Tu pridejo v poštev moduli.

Moduli so neke vrste način, ki ga nodejs ponuja za organizacijo projekta.

Projekti se nagibajo k rasti, kar vodi v željo po razdelitvi projekta na več datotek – tu pridejo v poštev moduli.

zahtevati

Za strani HTML se oznake skriptov uporabljajo za vključitev skriptov. Nodejs ima poseben zahtevani ukaz.

Var user = require("./user");

V našem primeru dostopamo do datoteke (user.js) v istem imeniku (pripona (.js) ni obvezna).

//require("./user"); // .js ni treba podati // v tem primeru se bo datoteka izvedla, vendar ne bo spremenljivke USER // to je glavna razlika od oznak skripta iz nodejs // V node.js so funkcije in spremenljivke vsakega modula so globalni // za to datoteko (sam modul) in ne postanejo samodejno // na voljo, ko so povezani (require("./user")) // Toda kako pridobiti dostop? // Vsak modul ima posebno spremenljivko exports - to je predmet in tisto, // kar vstavim tja, se bo vrnilo kot rezultat require var user = require("./user.js"); // rezultat: uporabnik = ( Uporabnik: funkcija )

Prva razlika med modularnim sistemom nodejs in skripti brskalnika: če sta v brskalniku dve oznaki skripta, potem je funkcija, ki je definirana na globalni ravni v enem od njiju, na voljo v drugem, ne pa tudi v nodejs. V nodejs so funkcije in spremenljivke globalne za dano datoteko (niso na voljo, ko je to potrebno). Tako vam nodejs omogoča pisanje resnično neodvisnih modulov. Da pa je modul na voljo, se uporablja izvozni sistem. Vsak modul ima posebno izvozno spremenljivko.

Imenik modulov DIR/indeks

Mapo povežemo neposredno var user = require("./user"); , ki vsebuje ustrezen index.js .

Na primer

Function User(name)( this.name = name; ) User.prototype.hello = function(who)( console.log(phrases.Hello + ", " + who.name); ); exports.User = Uporabnik;

Povezujemo in uporabljamo User konstruktor v datoteki ./server.js

//server.js var user = require("./user"); var vasya = nov uporabnik. Uporabnik ("Vasya");

"./" - glede na trenutno mapo

exports je objekt in tisto, kar je tam, bo vrnjeno kot rezultat require (exports.jpg). Na ta način lahko modul deklarira svoje zasebne spremenljivke/funkcije in izvozi samo tisto, kar je potrebno.


Za globalne spremenljivke itd. obstaja globalni objekt

Global.User = Uporabnik;

Spodnja črta

  • Zahtevana povezava
  • Spremenljivke: var (zasebno za module), izvozi, globalno (redko uporabljeno)
  • Vrste modulov: js, node (s končnico .node), json (s končnico .json). Moduli Json se uporabljajo, ko morate v datoteko shraniti nekaj preprostih informacij.
  • Imenik modulov DIR/indeks

predmet modula

  • predmet modula
  • Modul-funkcija module.exports = funkcija
  • Predpomnjenje modulov (modul se nikoli več ne prebere)
  • Ureditev modula: vrstni red iskanja
  • Podajanje parametrov: modul-tovarna

Objekt modula (temeljni objekt za module) je spremenljivka, ki obstaja v vsakem modulu (datoteka, izpišete lahko console.log(module;);). . Vsebina: lastnost id – običajno pot do datoteke,
parent – ​​povezava do nadrejenega modula (module.parent – ​​povezava do nadrejenega modula, ki to zahteva),
otroci (modul.children - tisti moduli, ki so povezani preko zahteva),
izvaža premoženje in drugo.

Modul ali aplikacija? modul.parent

Modul je mogoče zagnati neposredno, če pa ne, če je funkcionalnost povezana z drugim modulom, naj izvozi to funkcionalnost. Ta dva primera je mogoče ločiti s preverjanjem:

If(module.parent) ( exports.run = run; ) else ( run(); )


ps: kot pravijo na stackoverflow.com Nadrejeni je modul, ki je poklical skript za interpretacijo

// $ vozlišče foo.js console.log(module.parent); // nič // zahtevaj("./foo") console.log(module.parent); // ( ... )

Pravilna uporaba modula.exports

V okviru modula:

module.exports = exports = this (ti konstrukti so enakovredni)

Če želite posredovati funkcijo ne v objektu, ampak neposredno, uporabite naslednjo sintakso:

Module.exports = Uporabnik;


Predpomnjenje modula

Ko Nodejs naloži modul, v celoti ustvari ustrezen objekt modula (ob upoštevanju nadrejenih, izvozov in drugih podobnih lastnosti) in si ga zapomni sam (module.id (celotna pot do datoteke) služi kot identifikator za notranji predpomnilnik ) in naslednjič, ko ponovno dostopamo (se povežemo) s katerim koli modulom (datoteko), nodejs vzame isti objekt iz predpomnilnika. To pomeni, da je na primer dovolj, da modul enkrat inicializirate v datoteki; v prihodnosti ga lahko preprosto uporabite.

V našem primeru za var db = require("../db");
in za var db = require("./db"); vzame se isti predmet. Načelo je torej naslednje: ob prvi uporabi se modul inicializira in v prihodnje ga samo povežemo in uporabljamo (torej, v našem primeru nam db.connect() ni treba uporabiti dvakrat, to je v različnih datotekah).


Razporeditev modulov: vrstni red, v katerem so moduli najdeni v vozliščih

Kako narediti, da se db vedno poveže, ne da bi določili določeno pot:

Var db = require("../db"); //ali var db = require("./db");

in takole:

Var db = require("db");

ne glede na datoteko, v kateri je db povezan.

Če želite to narediti, morate razumeti vrstni red iskanja modulov v nodejs (kaj se zgodi, ko se zahteva zahteva). V nodejs je veliko vgrajenih modulov, na primer require("fs"); , ki bo povezan brez težav. Če podate določeno pot v zahtevi, na primer require("../db"); , potem bo iskanje temeljilo na podani poti in datoteka bo najdena ali pa bo nodejs poskušal pridobiti to datoteko kot imenik (in iskal index.js znotraj kategorije).

Če podate require("db"); in modul ni vgrajen, bo imenik node_modules preiskan glede na trenutno pozicijo (če najde, bo poskušal vzeti modul iz njega). Če imenik node_modules manjka, se bo zgoraj iskal imenik node_modules itd.

Poleg določanja določene poti za modul lahko nodejs išče module, kot je ta:

Uvod v npm – upravitelj paketov za Node.JS

  1. ustvarite datoteko z opisom paketa (package.json), ki vsebuje informacije o modulu (ime, različica itd.). Ročno ali preko ukaza
    npm init
    (prosil bo za potrebne informacije)
  2. Za objavo modula morate:
    1. Dodajte uporabnika z ukazom npm adduser (vnesti morate uporabniško ime in geslo). Zdaj bo vse delo z npm opravljeno v imenu tega uporabnika. Uporabnik se lahko prijavi na https://www.npmjs.com/~name_user in spremlja svoje module.
    2. Založništvo: npm publish
  3. Nato lahko nekdo uporabi vaš modul, dodan v bazo podatkov, uporabnik pa lahko sam spreminja.
  4. Pridobite vse ukaze npm z ukazom za pomoč npm
  5. Poiščite modul v zbirki podatkov: ključne besede npm s ali ključne besede iskanja npm (na primer super modul npm s)
  6. Namestite modul: npm install name_module ali npm i name_module
  7. Pri nameščanju modulov nodejs najprej poišče mapo node_modules v trenutnem imeniku (nato višje in višje itd.) ali (če node_modules manjka) poišče package.json (prav tako gre gor; package.json običajno označuje koren datoteke projekt) in v skladu s tem, če najde package.json, ustvari mapo node_modules v ustreznem imeniku; če obe možnosti ne uspeta, nodejs ustvari mapo node_modules v trenutnem imeniku. Če želite modul postaviti v določen imenik, morate v tem imeniku ustvariti mapo node_modules.
  8. npm up modul za posodobitev (preveril bo module za posodobitev, ki so v mapi node_modules)
  9. npm odstrani ime modula (odstrani modul)

Izhod iz npm:

npm init
nmp adduser
npm objavi
ključne besede iskanja npm
namestitveni modul npm
modul za posodobitev npm
npm odstrani modul
ukaz za pomoč npm

Struktura paketa NPM

Namestitev zahtevane različice, na primer: npm i [e-pošta zaščitena]

Najnovejšo različico modula je mogoče dobiti, če je modul razvit s sistemom za ustvarjanje različic git, na primer na githubu. Dovolj je, da dobite Git Read-Only (url): https://github.com/strongloop/express.git in v konzoli:

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

odvisnosti v package.json

odvisnosti kaže na tiste module, od katerih je ta odvisen.

devDependencies

Moduli, registrirani v devDependencies, niso nameščeni, če je modul potegnjen kot odvisnost. Nameščeni so samo za razvoj in jih je mogoče namestiti, če na primer odprete modul v mapi node_modules in vnesete npm i (ali z nastavitvijo zastavice npm config).

glavno polje določa vstopno točko v paket

Globalni moduli

Vsak modul je mogoče namestiti globalno, če nastavite zastavico -g: npm -g module

Globalno pomeni sistemski imenik.

Imenik globalnih modulov za Windows:

C:\users\Uporabniško_ime\AppData\Roaming\npm

Globalni moduli so postavljeni v standardni sistemski imenik. Tiste binarne datoteke, ki so v package.json, bodo nameščene na sistemski poti (to je glavna uporaba globalnih modulov), to pomeni, da jih bo v prihodnosti mogoče poklicati prek konzole.

Na podlagi gradiva tečajev I. Kantorja

V vozlišču lahko nastavite globalne spremenljivke prek predmeta "global" ali "GLOBAL":

GLOBAL._ = zahtevaj ("podčrtaj"); // vendar tega "ne bi smeli" narediti! (glejte opombo spodaj)

ali bolj uporabno...

GLOBALNO.okno = GLOBALNO; // kot v brskalniku

Iz vira vozlišča lahko vidite, da sta drug drugemu vzdevka:

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

V zgornji kodi je "to" globalni kontekst. Pri modulu commonJS (ki ga uporablja vozlišče) ta "objekt" znotraj modula (tj. "vaša koda") NI globalni kontekst. Za dokaz tega si oglejte spodaj, kje izbruham "ta" predmet in nato velikanski "GLOBALNI" predmet.

Console.log("\nTO:"); console.log(to); console.log("\nGLOBALNO:"); console.log(globalno); /* izhodi ... TO: {} GLOBALNO: ( 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 ), Uint 32Matrika: ( BYTES_PER _ELEMENT: 4 ), Float32Array: ( BYTES_PER_ELEMENT: 4 ), Float64Array: ( BYTES_PER_ELEMENT: 8), DataView: , globalno: , proces: ( EventEmitter: , naslov: "node", assert: , različica: "v0.6.5", _tickCallback: , moduleLoadList: [ "Binding evals", "Binding natives", "NativeModule dogodki", "NativeModule buffer", "Binding buffer", "NativeModule assert", "NativeModule util", "NativeModule path", "NativeModule module", " NativeModule fs", "Binding fs", "Binding konstante", "NativeModule stream", "NativeModule console", "Binding tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule timers", "Binding timer_wrap", " NativeModule _linklist" ], različice: ( vozlišče: "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: , platforma: "darwin", argv: [ "vozlišče", "/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", TERM: "xterm", SHELL: "/bin/bash" , TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", USER: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/ zagon -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: "Privzeto", SHLVL: "1", COLORFGBG: "7;0", HOME : "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", LOGNAME: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin- js /external", _: "./index.js"), openStdin: , exit: , pid: 10321, funkcije: ( debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls : true ), kill: , execPath: "/usr/local/bin/node", addListener: , _needTickCallback: , on: , removeListener: , reallyExit: , chdir: , debug: , error: , cwd: , watchFile: , umask : , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , podeduje: , _kill: , _byteLength: , mainModule: ( id: ". ", izvozi: (), nadrejeni: null, ime datoteke: "/workspace/zd/zgap/darwin-js/index.js", naloženo: false, izhod: false, otroci: , poti: ), _debugProcess: , dlopen: , uptime: , memoryUsage: , uvCounters: , binding: ), GLOBAL: , root: , Buffer: ( poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8), setTimeout: , setInterval: , clearTimeout: , clearInterval: , konzola: , okno: , navigator: () ) */

**Opomba: kar zadeva nastavitev "GLOBAL._", bi morali na splošno samo narediti var _ = require("podčrtaj"); Da, to storite v vsaki datoteki, ki uporablja podčrtaj, tako kot v Javi uvozite com.foo.bar; Tako je lažje ugotoviti, kaj počne vaša koda, ker so povezave med datotekami "eksplicitne". Rahlo nadležno, a dobro. To je pridiga.

Pri vsakem pravilu obstaja izjema. Imel sem točno en primer, ko sem moral nastaviti "GLOBAL._". Ustvarjal sem sistem za definiranje datotek "config", ki so bile večinoma JSON, vendar so bile "napisane v JS", da bi dodal malo več prilagodljivosti. V takšnih konfiguracijskih datotekah ni bilo stavkov "require", vendar sem želel, da imajo dostop do podčrtaja (CELOTEN sistem je temeljil na vzorcih podčrtaja in podčrtaja), zato bi nastavil "GLOBAL._", preden bi ocenil "config". Tako da ja, za vsako pravilo je nekje izjema. Ampak imaš dober razlog, ne samo "utrujen sem od tipkanja", zato želim prekiniti dogovor."

in rečeno mi je bilo, da lahko spremenljivke nastavim na globalni obseg, pri čemer pustim var.

To mi ne gre.

Zahtevaj ("podčrtaj");

Ne naredi _ na voljo za zahtevane datoteke. Lahko namestim app.set in ga uporabim drugje.

Lahko kdo potrdi, da bi to moralo delovati? Hvala vam.

V vozlišču lahko nastavite globalne spremenljivke prek predmeta "global" ali "GLOBAL":

GLOBAL._ = zahtevaj ("podčrtaj"); // vendar tega "ne bi smeli" narediti! (glejte opombo spodaj)

ali bolj uporabno...

GLOBALNO.okno = GLOBALNO; // kot v brskalniku

Iz vira vozlišča lahko vidite, da sta drug drugemu vzdevka:

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

V zgornji kodi "to" uporablja globalni kontekst. V modularnem sistemu commonJS (ki ga vozlišče uporablja) objekt »ta« znotraj modula (tj. »vaša koda«) NI globalni kontekst. Za dokaz tega si oglejte spodaj, kjer obrnem "ta" objekt in nato velikanski "GLOBALNI" objekt.

Console.log("\nTO:"); console.log(to); console.log("\nGLOBALNO:"); console.log(globalno); /* izhodi ... TO: {} GLOBALNO: ( 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 ), Uint 32Matrika: ( BYTES_PER _ELEMENT: 4 ), Float32Array: ( BYTES_PER_ELEMENT: 4 ), Float64Array: ( BYTES_PER_ELEMENT: 8), DataView: , globalno: , proces: ( EventEmitter: , naslov: "node", assert: , različica: "v0.6.5", _tickCallback: , moduleLoadList: [ "Binding evals", "Binding natives", "NativeModule dogodki", "NativeModule buffer", "Binding buffer", "NativeModule assert", "NativeModule util", "NativeModule path", "NativeModule module", " NativeModule fs", "Binding fs", "Binding konstante", "NativeModule stream", "NativeModule console", "Binding tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule timers", "Binding timer_wrap", " NativeModule _linklist" ], različice: ( vozlišče: "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: , platforma: "darwin", argv: [ "vozlišče", "/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", TERM: "xterm", SHELL: "/bin/bash" , TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", USER: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/ zagon -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: "Privzeto", SHLVL: "1", COLORFGBG: "7;0", HOME : "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", LOGNAME: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin- js /external", _: "./index.js"), openStdin: , exit: , pid: 10321, funkcije: ( debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls : true ), kill: , execPath: "/usr/local/bin/node", addListener: , _needTickCallback: , on: , removeListener: , reallyExit: , chdir: , debug: , error: , cwd: , watchFile: , umask : , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , podeduje: , _kill: , _byteLength: , mainModule: ( id: ". ", izvozi: (), nadrejeni: null, ime datoteke: "/workspace/zd/zgap/darwin-js/index.js", naloženo: false, izhod: false, otroci: , poti: ), _debugProcess: , dlopen: , uptime: , memoryUsage: , uvCounters: , binding: ), GLOBAL: , root: , Buffer: ( poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8), setTimeout: , setInterval: , clearTimeout: , clearInterval: , konzola: , okno: , navigator: () ) */

**Opomba: kar zadeva nastavitev "GLOBAL._" , bi morali na splošno samo narediti var _ = require("podčrtaj"); . Da, to storite v vsaki datoteki, ki uporablja podčrtaj, tako kot v Javi uvozite com.foo.bar; . Tako je lažje ugotoviti, kaj počne vaša koda, ker so povezave med datotekami "eksplicitne". Rahlo nadležno, a dobro..... Pridigarsko je.

Pri vsakem pravilu obstaja izjema. Imel sem točno en primer, ko sem moral nastaviti "GLOBAL._". Ustvarjal sem sistem za definiranje datotek "config", ki so bile večinoma JSON, vendar so bile "napisane v JS", da bi dodal malo več prilagodljivosti. V takšnih konfiguracijskih datotekah ni bilo stavkov "require", vendar sem želel, da imajo dostop do podčrtaja (CELOTEN sistem je temeljil na vzorcih podčrtaja in podčrtaja), zato bi nastavil "GLOBAL._", preden bi ocenil "config". Tako da ja, za vsako pravilo je nekje izjema. Vendar imate dober razlog, ne samo "Utrujen sem od tipkanja 'zahtevam', zato želim prekiniti dogovor."