ÔçÆÚѧϰ Node.js µÄʱºò (2011-2012)£¬ÓÐͦ¶àÊÇ´Ó
PHP ת¹ýÀ´µÄ£¬µ±Ê±Óв¿·ÖÈ˶ÔÓÚ Node.js ±à¼Íê´úÂëÐèÒªÖØÆôһϱíʾÂé·³£¨PHP²»ÐèÒªÕâ¸ö¹ý³Ì£©£¬ÓÚÊÇÉçÇøÀïµÄÅóÓѾͿªÊ¼ÌᳫʹÓÃ
node-supervisor Õâ¸öÄ£¿éÀ´Æô¶¯ÏîÄ¿£¬¿ÉÒÔ±à¼Íê´úÂëÖ®ºó×Ô¶¯ÖØÆô¡£²»¹ýÏà¶ÔÓÚ PHP ¶øÑÔÒÀ¾É²»¹»·½±ã£¬ÒòΪ
Node.js ÔÚÖØÆôÒÔºó£¬Ö®Ç°µÄÉÏÏÂÎͼ¶ªÊ§ÁË¡£
ËäÈ»¿ÉÒÔͨ¹ý½« session Êý¾Ý±£´æÔÚÊý¾Ý¿â»òÕß»º´æÖÐÀ´¼õÉÙÖØÆô¹ý³ÌÖеÄÊý¾Ý¶ªÊ§£¬²»¹ýÈç¹ûÊÇÔÚÉú²úµÄÇé¿öÏ£¬¸üдúÂëµÄÖØÆô¼ä϶ÊÇû·¨´¦ÀíÇëÇóµÄ£¨PHP¿ÉÒÔ£¬ÁíÍâÄǸöʱºò
Node.js »¹Ã»ÓÐ cluster£©¡£ÓÉÓÚÕâ·½ÃæµÄÎÊÌ⣬¼ÓÉϱ¾ÈËÊÇ´Ó PHP תµ½ Node.js
µÄ£¬ÓÚÊÇ´ÓÄÇʱ¿ªÊ¼Ë¼¿¼£¬ÓÐûÓа취¿ÉÒÔÔÚ²»ÖØÆôµÄÇé¿öÏÂÈȸüРNode.js µÄ´úÂë¡£
×ʼ°ÑÄ¿¹âÃéÏòÁË require Õâ¸öÄ£¿é¡£Ïë·¨ºÜ¼òµ¥£¬ÒòΪ Node.js ÖÐÒýÈëÒ»¸öÄ£¿é¶¼ÊÇͨ¹ý
require Õâ¸ö·½·¨¼ÓÔØµÄ¡£ÓÚÊǾͿªÊ¼Ë¼¿¼ require Äܲ»ÄÜÔÚ¸üдúÂëÖ®ºóÔÙ´Î require
һϡ£³¢ÊÔÈçÏ£º
a.js
var express = require('express');var b = require('./b.js');
var app = express();
app.get('/', function (req, res) {
b = require('./b.js');
res.send(b.num);
});
app.listen(3000); |
b.js
Á½¸ö JS ÎļþдºÃÖ®ºó£¬´Ó a.js Æô¶¯£¬Ë¢ÐÂÒ³Ãæ»áÊä³ö b.js ÖÐµÄ 1024£¬È»ºóÐÞ¸Ä b.js
ÎļþÖе¼³öµÄÖµ£¬ÀýÈçÐÞ¸ÄΪ 2048¡£ÔÙ´ÎË¢ÐÂÒ³ÃæÒÀ¾ÉÊÇÔ±¾µÄ 1024¡£
ÔÙ´ÎÖ´ÐÐÒ»´Î require ²¢Ã»ÓÐˢдúÂë¡£require ÔÚÖ´ÐеĹý³ÌÖмÓÔØÍê´úÂëÖ®ºó»á°ÑÄ£¿éµ¼³öµÄÊý¾Ý·ÅÔÚ
require.cache ÖС£require.cache ÊÇÒ»¸ö { } ¶ÔÏó£¬ÒÔÄ£¿éµÄ¾ø¶Ô·¾¶Îª key£¬¸ÃÄ£¿éµÄÏêϸÊý¾ÝΪ
value¡£ÓÚÊDZ㿪ʼ×öÈçϳ¢ÊÔ£º
a.js
var path = require('path');var express = require('express'); var b = require('./b.js');
var app = express();
app.get('/', function (req, res) {
if (true) { // ¼ì²éÎļþÊÇ·ñÐÞ¸Ä
flush();
}
res.send(b.num);
});
function flush() {
delete require.cache[path.join(__dirname, './b.js')];
b = require('./b.js');
}
app.listen(3000); |
ÔÙ´Î require ֮ǰ£¬½« require Ö®ÉϹØÓÚ¸ÃÄ£¿éµÄ cache ÇåÀíµôºó£¬ÓÃ֮ǰµÄ·½·¨ÔٴβâÊÔ¡£½á¹û·¢ÏÖ£¬¿ÉÒԳɹ¦µÄË¢ÐÂ
b.js µÄ´úÂ룬Êä³öÐÂÐ޸ĵÄÖµ¡£
Á˽⵽Õâ¸öµãºó£¬¾ÍÏëͨ¹ý¸ÃÔÀíʵÏÖÒ»¸öÎÞÖØÆôÈȸüа汾µÄ node-supervisor¡£ÔÚ·â×°Ä£¿éµÄ¹ý³ÌÖУ¬³öÓÚÇ黳µÄÔÒò£¬¿¼ÂÇÌṩһ¸öÀàËÆ
PHP ÖÐ include µÄº¯ÊýÀ´´úÌæ require È¥ÒýÈëÒ»¸öÄ£¿é¡£Êµ¼ÊÄÚ²¿ÒÀ¾ÉÊÇʹÓà require
È¥¼ÓÔØ¡£ÒÔb.jsΪÀý£¬Ô±¾µÄд·¨¸ÄΪ var b = include(¡®./b¡¯)£¬ÔÚÎļþ b.js
¸üÐÂÖ®ºó include ÄÚ²¿¿ÉÒÔ×Ô¶¯Ë¢Ð£¬ÈÃÍâÃæÄõ½×îеĴúÂë¡£
µ«ÊÇʵ¼ÊµÄ¿ª·¢¹ý³ÌÖУ¬ÕâÑùºÜ¿ì¾ÍÅöµ½ÁËÎÊÌâ¡£ÎÒÃÇÏ£ÍûµÄ´úÂë¿ÉÄÜÊÇÕâÑù£º
web.js
var include = require('./include');var express = require('express'); var b = include('./b.js'); var app = express();
app.get('/', function (req, res) {
res.send(b.num);
});
app.listen(3000); |
µ«°´ÕÕÕâ¸öÄ¿±ê·â×°includeµÄʱºò£¬ÎÒÃÇ·¢ÏÖÁËÎÊÌâ¡£ÎÞÂÛÎÒÃÇÔÚinclude.jsÄÚ²¿ÖÐÈçºÎʵÏÖ£¬¶¼²»ÄÜÏñ¿ªÊ¼ÄÇÑùÄõ½ÐµÄ
b.num¡£
¶Ô±È¿ªÊ¼µÄ´úÂ룬ÎÒÃÇ·¢ÏÖÎÊÌâ³öÔÚÉÙÁË b = xx¡£Ò²¾ÍÊÇ˵ÕâÑùд²Å¿ÉÒÔ£º
web.js
var include = require('./include');var express = require('express'); var app = express();
app.get('/', function (req, res) {
var b = include('./b.js');
res.send(b.num);
});
app.listen(3000); |
Ð޸ijÉÕâÑù£¬¾Í¿ÉÒÔ±£Ö¤Ã¿´ÎÄÜ¿ÉÒÔÕýÈ·µÄˢе½×îеĴúÂ룬²¢ÇÒ²»ÓÃÖØÆôʵÀýÁË¡£¶ÁÕßÓÐÐËȤµÄ¿ÉÒÔÑо¿Õâ¸öincludeÊÇÔõôʵÏֵ쬱¾ÎľͲ»ÉîÈëÌÖÂÛÁË£¬ÒòΪÕâ¸ö¼¼ÇÉʹÓöȲ»¸ß£¬Ð´ÆðÆðÀ´²»ÊǺÜÓÅÑÅ[1]£¬·´¶øÕâÆäÖÐÓÐÒ»¸ö¸üÖØÒªµÄÎÊÌ⡪¡ªJavaScriptµÄÒýÓá£
JavaScript µÄÒýÓÃÓ봫ͳÒýÓõÄÇø±ð
ÒªÌÖÂÛÕâ¸öÎÊÌ⣬ÎÒÃÇÊ×ÏÈÒªÁ˽â JavaScript µÄÒýÓÃÓÚÆäËûÓïÑÔÖеÄÒ»¸öÇø±ð£¬ÔÚ C++ ÖÐÒýÓÿÉÒÔÖ±½ÓÐÞ¸ÄÍⲿµÄÖµ£º
#include <iostream>
using namespace std;
void test(int &p) // ÒýÓô«µÝ {
p = 2048;
}
int main() {
int a = 1024;
int &p = a; // ÉèÖÃÒýÓÃpÖ¸Ïòa
test(p); // µ÷Óú¯Êý
cout << "p: " << p <<
endl; // 2048
cout << "a: " << a <<
endl; // 2048
return 0;
} |
¶øÔÚ JavaScript ÖУº
var obj = { name: 'Alan' };
function test1(obj) {
obj = { hello: 'world' }; // ÊÔͼÐÞ¸ÄÍⲿobj
}
test1(obj);
console.log(obj); // { name: 'Alan' } // ²¢Ã»ÓÐÐ޸ĢÙ
function test2(obj) {
obj.name = 'world'; // ¸ù¾Ý¸Ã¶ÔÏóÐÞ¸ÄÆäÉϵÄÊôÐÔ
}
test2(obj);
console.log(obj); // { name: 'world' } // Ð޸ijɹ¦¢Ú |
ÎÒÃÇ·¢ÏÖÓë C++ ²»Í¬£¬¸ù¾ÝÉÏÃæ´úÂë ¢Ù ¿ÉÖª JavaScript Öв¢Ã»Óд«µÝÒ»¸öÒýÓ㬶øÊÇ¿½±´ÁËÒ»¸öеıäÁ¿£¬¼´Öµ´«µÝ¡£¸ù¾Ý
¢Ú ¿ÉÖª¿½±´µÄÕâ¸ö±äÁ¿ÊÇÒ»¸ö¿ÉÒÔ·ÃÎʵ½¶ÔÏóÊôÐԵġ°ÒýÓá±£¨Ó봫ͳµÄ C++ µÄÒýÓò»Í¬£¬ÏÂÎÄÖÐÌáµ½µÄ JavaScript
µÄÒýÓö¼ÊÇÕâÖÖÌØ±ðµÄÒýÓã©¡£ÕâÀïÐèÒª×ܽáÒ»¸öÈÆ¿ÚµÄ½áÂÛ£ºJavascript ÖоùÊÇÖµ´«µÝ£¬¶ÔÏóÔÚ´«µÝµÄ¹ý³ÌÖÐÊÇ¿½±´ÁËÒ»·ÝеÄÒýÓá£
ΪÁËÀí½âÕâ¸ö±È½ÏÞֿڵĽáÂÛ£¬ÈÃÎÒÃÇÀ´¿´Ò»¶Î´úÂ룺
var obj = { data: {} };
// data Ö¸Ïò obj.data
var data = obj.data;
console.log(data === obj.data); // true-->dataËù²Ù×÷µÄ¾ÍÊÇobj.data
data.name = 'Alan';
data.test = function () {
console.log('hi')
};
// ͨ¹ýdata¿ÉÒÔÖ±½ÓÐ޸ĵ½dataµÄÖµ
console.log(obj) // { data: { name: 'Alan', test:
[Function] } }
data = {
name: 'Bob',
add: function (a, b) {
return a + b;
}
};
// dataÊÇÒ»¸öÒýÓã¬Ö±½Ó¸³Öµ¸øËü£¬Ö»ÊÇÈÃÕâ¸ö±äÁ¿µÈÓÚÁíÍâÒ»¸öÒýÓ㬲¢²»»áÐ޸ĵ½obj±¾Éí
console.log(data); // { name: 'Bob', add: [Function]
}
console.log(obj); // { data: { name: 'Alan', test:
[Function] } }
obj.data = {
name: 'Bob',
add: function (a, b) {
return a + b;
}
};
// ¶øÍ¨¹ýobj.data²ÅÄÜÕæÕýÐ޸ĵ½data±¾Éí
console.log(obj); // { data: { name: 'Bob', add:
[Function] } } |
ͨ¹ýÕâ¸öÀý×ÓÎÒÃÇ¿ÉÒÔ¿´µ½£¬data ËäÈ»ÏñÒ»¸öÒýÓÃÒ»ÑùÖ¸ÏòÁË obj.data£¬²¢ÇÒͨ¹ý data ¿ÉÒÔ·ÃÎʵ½
obj.data ÉϵÄÊôÐÔ¡£µ«ÊÇÓÉÓÚ JavaScript Öµ´«µÝµÄÌØÐÔÖ±½ÓÐÞ¸Ä data = xxx
²¢²»»áʹµÃ obj.data = xxx¡£
´ò¸ö±È·½×î³õÉèÖà var data = obj.data µÄʱºò£¬ÄÚ´æÖеÄÇé¿ö´ó¸ÅÊÇ£º
| Addr | ÄÚÈÝ | |----------|-------- | obj.data | ÄÚ´æ1 || data | ÄÚ´æ1 | |
ËùÒÔͨ¹ý data.xx ¿ÉÒÔÐÞ¸Ä obj.data µÄÄÚ´æ1¡£
È»ºóÉèÖà data = xxx£¬ÓÉÓÚ data ÊÇ¿½±´µÄÒ»¸öеÄÖµ£¬Ö»ÊÇÕâ¸öÖµÊÇÒ»¸öÒýÓã¨Ö¸ÏòÄÚ´æ1£©°ÕÁË¡£ÈÃËüµÈÓÚÁíÍâÒ»¸ö¶ÔÏó¾ÍºÃ±È£º
| Addr | ÄÚÈÝ | |----------|-------- | obj.data | ÄÚ´æ1 || data | ÄÚ´æ2 | |
Èà data Ö¸ÏòÁËеÄÒ»¿éÄÚ´æ2¡£
Èç¹ûÊÇ´«Í³µÄÒýÓã¨ÈçÉÏÎÄÖÐÌáµ½µÄ C++ µÄÒýÓã©£¬ÄÇô obj.data ±¾Éí»á±ä³ÉеÄÄÚ´æ2£¬µ« JavaScript
ÖоùÊÇÖµ´«µÝ£¬¶ÔÏóÔÚ´«µÝµÄ¹ý³ÌÖп½±´ÁËÒ»·ÝеÄÒýÓá£ËùÒÔÕâ¸öп½±´µÄ±äÁ¿±»¸Ä±ä²¢²»Ó°ÏìÔ±¾µÄ¶ÔÏó¡£
Node.js ÖÐµÄ module.exports Óë exports
ÉÏÊöÀý×ÓÖÐµÄ obj.data Óë data µÄ¹ØÏµ£¬¾ÍÊÇ Node.js ÖÐµÄ module.exports
Óë exports Ö®¼äµÄ¹ØÏµ¡£ÈÃÎÒÃÇÀ´¿´¿´ Node.js ÖÐ require Ò»¸öÎļþʱµÄʵ¼Ê½á¹¹£º
function require(...) { var module = { exports: {} }; ((module, exports) => { // Node.js ÖÐÎļþÍⲿÆäʵ±»°üÁËÒ»²ã×ÔÖ´Ðеĺ¯Êý // ÕâÖмäÊÇÄãÄ£¿éÄÚ²¿µÄ´úÂë. function some_func() {}; exports = some_func; // ÕâÑù¸³Öµ,exports±ã²»ÔÙÖ¸Ïòmodule.exports // ¶ømodule.exportsÒÀ¾ÉÊÇ{}
module.exports = some_func;
// ÕâÑùÉèÖòÅÄÜÐ޸ĵ½Ô±¾µÄexports
})(module, module.exports);
return module.exports;
} |
ËùÒÔºÜ×ÔÈ»µÄ£º
console.log(module.exports === exports); // true// ËùÒÔ exports Ëù²Ù×÷µÄ¾ÍÊÇ module.exports |
Node.js ÖÐµÄ exports ¾ÍÊÇ¿½±´µÄÒ»·Ý module.exports µÄÒýÓá£Í¨¹ý exports
¿ÉÒÔÐÞ¸ÄNode.js µ±Ç°Îļþµ¼³öµÄÊôÐÔ£¬µ«ÊDz»ÄÜÐ޸ĵ±Ç°Ä£¿é±¾Éí¡£Í¨¹ý module.exports
²Å¿ÉÒÔÐ޸ĵ½Æä±¾Éí¡£±íÏÖÉÏÀ´Ëµ£º
exports = 1; // ÎÞЧmodule.exports = 1; // ÓÐЧ |
ÕâÊǶþÕß±íÏÖÉϵÄÇø±ð£¬ÆäËû·½ÃæÓÃÆðÀ´¶¼Ã»Óвî±ð¡£ËùÒÔÄãÏÖÔÚÓ¦¸ÃÖªµÀдmodule.exports.xx
= xxx; µÄÈËÆäʵÊǶàдÁËÒ»¸ömodule.¡£
¸ü¸´ÔÓµÄÀý×Ó
ΪÁËÔÙÁ·Ï°Ò»Ï£¬ÎÒÃÇÔÚÀ´¿´Ò»¸ö±È½Ï¸´ÔÓµÄÀý×Ó£º
var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b.x); |
°´ÕÕ¿ªÊ¼µÄ½áÂÛÎÒÃÇ¿ÉÒÔÒ»²½²½µÄÀ´¿´Õâ¸öÎÊÌ⣺
var a = {n: 1}; // ÒýÓÃaÖ¸ÏòÄÚ´æ1{n:1}var b = a; // ÒýÓÃb => a => { n:1 } |
ÄÚ²¿½á¹¹:
| Addr | ÄÚÈÝ | |---------|-------------|| a | ÄÚ´æ1 {n:1} | | b | ÄÚ´æ1 | |
¼ÌÐøÍùÏ¿´:
a.x = a = {n: 2}; // (ÄÚ´æ1 ¶ø²»ÊÇ a ).x = ÒýÓà a = ÄÚ´æ2 {n:2} |
a ËäÈ»ÊÇÒýÓ㬵«ÊÇ JavaScript ÊÇÖµ´«µÄÕâ¸öÒýÓã¬ËùÒÔ±»Ð޸IJ»Ó°ÏìÔ±¾µÄµØ·½¡£
| Addr | ÄÚÈÝ | |-----------|-----------------------|| 1) a | ÄÚ´æ2({n:2}) | | 2) ÄÚ´æ1.x | ÄÚ´æ2({n:2}) | | 3) b | ÄÚ´æ1({n:1, x:ÄÚ´æ2}) | |
ËùÒÔ×îºóµÄ½á¹û
a.x ¼´(ÄÚ´æ2).x ==> {n: 2}.x ==> undefinedb.x ¼´(ÄÚ´æ1).x ==> ÄÚ´æ2 ==> {n: 2} |
×ܽá
JavaScrip tÖÐûÓÐÒýÓô«µÝ£¬Ö»ÓÐÖµ´«µÝ¡£¶ÔÏó£¨ÒýÓÃÀàÐÍ£©µÄ´«µÝÖ»ÊÇ¿½±´Ò»¸öеÄÒýÓã¬Õâ¸öеÄÒýÓÿÉÒÔ·ÃÎÊÔ±¾¶ÔÏóÉϵÄÊôÐÔ£¬µ«ÊÇÕâ¸öеÄÒýÓñ¾ÉíÊÇ·ÅÔÚÁíÍâÒ»¸ö¸ñ×ÓÉϵÄÖµ£¬Ö±½ÓÍùÕâ¸ö¸ñ×Ó¸³ÐµÄÖµ£¬²¢²»»áÓ°ÏìÔ±¾µÄ¶ÔÏó¡£±¾ÎÄ¿ªÍ·ËùÌÖÂÛµÄ
Node.js ÈȸüÐÂʱÅöµ½µÄÒ²ÊÇÕâ¸öÎÊÌâ£¬Çø±ðÊǶÔÏó±¾Éí¸Ä±äÁË£¬¶øÔ±¾¿½±´³öÀ´µÄÒýÓû¹Ö¸Ïò¾ÉµÄÄڴ棬ËùÒÔͨ¹ý¾ÉµÄÒýÓõ÷Óò»µ½Ðµķ½·¨¡£
Node.js ²¢Ã»ÓÐ¶Ô JavaScript Ê©¼ÓºÚħ·¨£¬ÆäÖеÄÒýÓÃÎÊÌâÒÀ¾ÉÊÇ
JavaScript µÄÄÚÈÝ¡£Èç module.exports Óë exports ÕâÑùÒþ²ØÁËһЩϸ½ÚÈÝÒ×ʹÈËÎó»á£¬±¾ÖÊ»¹ÊÇ
JavaScript µÄÎÊÌâ¡£
×¢[1]£º
ÀÏʵ˵£¬Ä£¿éÔÚº¯ÊýÄÚÉùÃ÷ÓеãÌ·ºÆÇ¿µÄ¸Ð¾õ¡£
°Ñ b = include(xxx) дÔÚµ÷ÓÃÄÚ²¿£¬»¹¿ÉÒÔͨ¹ýÉèÖóÉÖмä¼þ°ó¶¨ÔÚ¹«¹²µØ·½À´Ð´¡£
³ýÁËдÔÚµ÷ÓÃÄÚ²¿£¬Ò²¿ÉÒÔµ¼³öÒ»¸ö¹¤³§º¯Êý£¬Ã¿´ÎʹÓÃʱ b().num һϵ÷ÓÃÒ²¿ÉÒÔ¡£
»¹¿ÉÒÔͨ¹ýÖмä¼þµÄÐÎʽ°ó¶¨ÔÚ¿ò¼ÜµÄ¹«ÓöÔÏóÉÏ£¨È磺ctx.b = include(xxx)£©¡£
ҪʵÏÖÕâÑùµÄÈȸüбØÐëÔڼܹ¹ÉϾÍÒªÑϸñ±ÜÃâ¾É´úÂë±»ÒýÓõĿÉÄÜÐÔ£¬·ñÔòºÜÈÝÒ×д³öÄÚ´æÐ¹Â©µÄ´úÂë¡£
|