1. 程式人生 > >node.js (感覺很好,雖轉載一留後用)

node.js (感覺很好,雖轉載一留後用)

關於node.js

Node.js 是伺服器端的 JavaScript 執行環境,它具有無阻塞(non-blocking)和事件驅動(event-driven)等的特色,Node.js 採用V8引擎,同樣,Node.js實現了類似 Apache 和 nginx 的web服務,讓你可以通過它來搭建基於 JavaScript的Web App。
Node.js採用C++語言編寫而成,是一個跨平臺的Javascript的執行環境(直譯器),這意味著你可以編寫系統級或者伺服器端的Javascript程式碼,交給Node.js來解釋執行。node.js是對Google V8引擎的封裝和優化。V8引擎執行Javascript的速度非常快,效能非常好。同時還提供了很多系統級的API,如檔案操作、網路程式設計等。瀏覽器端的Javascript程式碼在執行時會受到各種安全性的限制,對客戶系統的操作有限。相比之下,Node.js則是一個全面的後臺執行時,為Javascript提供了其他語言能夠實現的許多功能。

node.js使得javascript擴充套件到伺服器端,統一了WEB開發前後端的語言。
Node.js採用事件驅動、非同步程式設計,為網路服務而設計。重要的優勢在於,充分利用了系統資源,執行程式碼無須阻塞等待某種操作完成,有限的資源可以用於其他的任務。此類設計非常適合於後端的網路服務程式設計。
node.js有大量的外掛,社群蓬勃,可以實現從web伺服器到文件伺服器到命令列工具等五花八門的功能,實為全能平臺。
缺陷:
node.js是為伺服器端響應大量使用者的併發請求設計的,對於單使用者/多工型應用不太理想。比如在提供圖形介面的同時進行某些計算。node.js適用於I/O密集型而不是計算你密集型應用。受制於它的單執行緒特點,對於計算密集型的應用,例如某個事件的回撥函式要進行復雜的計算,那麼事件迴圈中的所有請求都必須等待。另外,由於node.js的控制流不是線性的,它被一個個事件拆散,所以,在處理複雜的邏輯時會變得過於複雜。

綜上所述,node.js適用於邏輯簡單但訪問頻繁的任務:
(1)提供web server;
(2)訪問資料庫;
(3)訪問檔案系統(讀寫磁碟);
(4)與作業系統互動;
(5)執行C/C++擴充套件。
總之,就是後端I/O的部分。不是I/O的部分,包括業務邏輯的執行,應該交給前端MVC框架來完成。

學習node.js主要就是學習它的API。


node.js下的程式設計規範

1.兩格縮排:以應付過多的巢狀。
2.使用尾括號,如:
function func(boolVar) {
if (boolVar) {

console.log('True');
} else {
console.log('False');
}
};
3.行寬:為了保證在任何裝置上都可以方便地閱讀,建議把行寬限制為80個字元。
4.永遠使用var 定義變數。確保每個語句定義一個變數,不要使用逗號同時定義多個變數。
5.使用小駝峰法命名所有變數、函式和屬性。下橫線命名所有事件。但類的名字使用大駝峰法。
6.引號:建議需要使用引號的地方一律使用雙引號。因為JSON指定使用雙引號。
7.相等:在JS中使用===代表等號,在CS中使用==。
8.回撥函式:回撥函式的名字在CS中一律用cb代表。node的API和其他第三方模組大多約定回撥函式的第一個引數是err,因為錯誤肯定會被輸出,所以不用顯式地寫if(err)...語句了。除非你要顯示專門的出錯資訊。

9.所有程式碼都預先編譯為javascript再放到node.js下執行。

node.js的安裝

首先要選擇node.js的版本。node.gyp(編譯C/C++擴充套件的工具)對版本有一定要求(v0.8.9),但考慮到它只是在編譯擴充套件時採用,而且最好安裝在目標平臺上(Windows/Linux/MacOS)用。所以,平時就放心大膽地用node的最新版本好了(基本是在Ubuntu下開發)。
自動安裝:現代的ubuntu系統如12.0都可以通過軟體倉庫來自動安裝node.js.或用命令apt-get install nodejs
手動安裝:登陸官網http://nodejs.org, 下載最新安裝包。解壓到/software資料夾裡,執行標準編譯安裝命令:
$ ./configure
$ make
$ sudo make install
5分鐘左右就編譯安裝完了,已自帶npm。(也可以通過make uninstall 解除安裝)
前提是系統中有編譯器(如G++)、python(2.6+)等編譯環境。參見《nodeJS+開發指南》。
由於可編譯擴充套件的老版本,又需要功能最多的新版本,所以要在一個系統上保持多個node.js版。這時可使用多版本包管理器--n。官網https://github.com/visionmedia/n
如果你已經安裝好了 Node.js 和 npm 環境,就可以直接使用 npm install -g n 命令來安裝 n。
在終端中執行 n --help 即可看到它的使用說明。執行sudo n 顯示所有已安裝的node.js版本。在終端中執行 n 0.10.5 即可切換到node v0.10.5。
進入命令列模式: 直接輸入node回車即可。
執行檔案:輸入node 檔名即可。

在node.js中執行和組織coffeescript
利用coffeescript的監控工具實時把CS程式碼轉化為JS程式碼,在node.js中只用JS程式碼(因為要與其他第三方庫合作以及模組之間呼叫的問題)


node.js的程式設計要領

非同步式IO和事件驅動。
傳統伺服器端的問題:阻塞(blocking)
比如,在整個資料查詢的過程中,當前程式程序往往只是在等待結果的返回,這就造成了程序的阻塞。對於高並 發,I/O密集行的網路應用中,一方面程序很長時間處於等待狀態,另一方面為了應付新的請求不斷的增加新的程序。這樣的浪費會導致系統支援的使用者數遠遠小於後端資料服務能夠支撐的,成為了系統的瓶頸。而且這樣的系統也特別容易被慢連結攻擊(客戶端故意不接收或減緩接收資料,加長程序等待時間)。
Node.js 最大的特點就是非同步式 I/O(或者非阻塞 I/O)與事件緊密結合的程式設計模式。為了解決阻塞問題,Node.js引入事件處理機制解決這個問題。在查詢請求發起之前註冊資料載入事件的響應函式,請求發出之後立即將程序交出,而當資料返回後再觸發這個事件並在預定好的事件響應函式中繼續處理資料。 我們看到若按照這個思路解決阻塞問題,首先我們要提供一套高效的非同步事件排程機制。而主要用於處理瀏覽器端的各種互動事件的JavaScript,相對於其他語言,至少有兩個關鍵點特別適合完成這個任務:一是它是函式式語言,這個特性使得為事件指定回撥函式變得很容易。特別是JavaScript還支援匿名函式。二是它支援閉包,可在函式執行時保持上下文狀態。
實際上node.js的各種API都會發出各種事件,使我們指定的回撥函式在接收到事件時會被自動呼叫。而閉包可以讓回撥函式在執行時能夠訪問到主函式定義時的所處作用域內的所有變數。
我們看到node.js通過JavaScript函式式語言特性、匿名函式支援和閉包很漂亮的解決了同步程式設計到非同步程式設計轉化過程中遇到的一系列最重要的問題。但node.js是否就是最好的?非也,node.js的主要問題是:(1)閉包保持的變數耗費記憶體;(2)非同步程式設計在邏輯上不太好理解(這個問題後面還要說)。
非同步程式設計模式與傳統的同步式 I/O 線性的程式設計思路有很大的不同,因為控制流很大程度上要靠事件和回撥函式來組織,一個邏輯要拆分為若干個單元。Node.js 的非同步程式設計介面習慣是以函式的最後一個引數為回撥函式,通常一個函式只有一個回撥函式。回撥函式是實際引數中第一個是 err,其餘的引數是其他返回的內容。如果沒有發生錯誤,err 的值會是 null 或undefined。如果有錯誤發生,err 通常是 Error 物件的例項。


事件驅動 events

events 是 Node.js 最重要的模組,沒有“之一”,原因是 Node.js 本身架構就是事件式的,而它提供了唯一的介面,所以堪稱 Node.js 事件程式設計的基石。events 模組不僅用於使用者程式碼與 Node.js 下層事件迴圈的互動,還幾乎被所有的模組依賴。
事件發射器
events 模組只提供了一個物件: events.EventEmitter。EventEmitter 的核心就是事件發射與事件監聽器功能的封裝。
EventEmitter 的每個事件由一個事件名和若干個引數組成,事件名是一個字串,通常表達一定的語義。對於每個事件,EventEmitter 支援若干個事件監聽器。當事件發射時,註冊到這個事件的事件監聽器被依次呼叫,事件引數作為回撥函式引數傳遞。
讓我們以下面的例子解釋這個過程:
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener2', arg1, arg2);
});
emitter.emit('someEvent', 'byvoid', 1991);
執行的結果是:
listener1 byvoid 1991
listener2 byvoid 1991
以上例子中, emitter 為事件 someEvent 註冊了兩個事件監聽器,然後發射了
someEvent 事件。執行結果中可以看到兩個事件監聽器回撥函式被先後呼叫。
這就是EventEmitter最簡單的用法。接下來我們介紹一下EventEmitter常用的API。
 EventEmitter.on(event, listener) 為指定事件註冊一個監聽器,接受一個字
符串 event 和一個回撥函式 listener。
 EventEmitter.emit(event, [arg1], [arg2], [...]) 發射 event 事件,傳
遞若干可選引數到事件監聽器的引數表。
 EventEmitter.once(event, listener) 為指定事件註冊一個單次監聽器,即
監聽器最多隻會觸發一次,觸發後立刻解除該監聽器。
 EventEmitter.removeListener(event, listener) 移除指定事件的某個監聽
器,listener 必須是該事件已經註冊過的監聽器。
4.4 檔案系統 fs
65
 EventEmitter.removeAllListeners([event]) 移除所有事件的所有監聽器,
如果指定 event,則移除指定事件的所有監聽器。
大多數時候我們不會直接使用 EventEmitter,而是在物件中繼承它。包括 fs、net、http 在內的,只要是支援事件響應的核心模組都是 EventEmitter 的子類。
為什麼要這樣做呢?原因有兩點。首先,具有某個實體功能的物件實現事件符合語義,事件的監聽和發射應該是一個物件的方法。其次 JavaScript 的物件機制是基於原型的,支援部分多重繼承,繼承 EventEmitter 不會打亂物件原有的繼承關係。
EventEmitter 定義了一個特殊的事件 error,它包含了“錯誤”的語義,我們在遇到異常的時候通常會發射 error 事件。當 error 被髮射時,EventEmitter 規定如果沒有響應的監聽器,Node.js 會把它當作異常,退出程式並列印呼叫棧。
我們一般要為會發射 error事件的物件設定監聽器,避免遇到錯誤後整個程式崩潰。

非同步程式設計的問題

node.js的大量I/O操作是非同步的,非同步會帶來一個大問題:第一個操作還沒有執行完就先執行了第二個,如果第二個操作依賴於第一個操作的結果,或者在執行順序上有嚴格的要求,那就會產生錯誤。比如還沒有讀取完檔案內容就關閉了檔案。
解決方案是要麼採用同步版本(sync),要麼採用函式巢狀的形式。
下面採用巢狀的方式開啟一個檔案,獲取其檔案描述符,讀出其內容,再關閉之。
var fs = require('fs');


fs.open('file.txt', flages = 'r', function(err,fd) {
    if (err) throw error;
    else {
console.log("opened.");
var id = fd;
fs.readFile('file.txt', 'utf-8', function(err, data) {
   if (err) throw error;
   else {
console.log(data);
fs.close(id, function(err) {
           if (err) throw error;
           else {
       console.log("file closeed.");
                    }
                });
            }
});
    }
});
可見,fs.open中巢狀著fs.readFile,裡面又巢狀著fs.close。這只是個三層的巢狀。
當操作資料庫時,經常要執行更多的順序操作:開啟資料庫-開啟集合-查詢記錄-查詢另一條記錄-將兩條記錄的值進行某種運算-寫入資料庫-關閉資料庫。這如果用巢狀的寫法,會形成非常深的巢狀。如:
var p_client = new Db('integration_tests_20', new Server("127.0.0.1", 27017, {}), {'pk':CustomPKFactory});
p_client.open(function(err, p_client) {
  p_client.dropDatabase(function(err, done) {
    p_client.createCollection('test_custom_key', function(err, collection) {
      collection.insert({'a':1}, function(err, docs) {
        collection.find({'_id':new ObjectID("aaaaaaaaaaaa")}, function(err, cursor) {
          cursor.toArray(function(err, items) {
            test.assertEquals(1, items.length);
            p_client.close();
          });
        });
      });
    });
  });
});
除了深層巢狀不直觀外,這也不利於單元測試。還有迴圈陷阱的問題,即迴圈還沒有執行完,就跳到後面的程式碼去執行了。這個問題可以用加計數器來解決,如:
var fs = require('fs');


fs.readdir(".", function (err, files) {
  var count = files.length,
      results = {};
  files.forEach(function (filename) {
    fs.readFile(filename, function (data) {
      results[filename] = data;
      count--;
      if (count <= 0) {
        // Do something once we know all the files are read.
      }
    });
  });
});
利用計數器count確保所有的檔案都打開了才做something else。
但更嚴重的問題是在非同步程式設計下,傳統的順序執行邏輯被打散,程式的邏輯關係不太容易被看清。是否考慮使用Jscex這類類庫?參見http://www.infoq.com/cn/articles/jscex-javascript-asynchronous-programming
總結的技巧包括:
在非同步程式設計中,需要把依賴於非同步函式(需要其執行結果或者達到某種狀態)的程式碼放在對應的回撥函式中。
非同步函式後面的程式碼會立即執行,所以在程式設計時需要通盤考慮,以免出現意外之外的執行結果。
併發執行的相同非同步函式如果協作完成任務,需要新增程式碼判斷執行狀態,並且需要把所有非同步函式完成後執行的程式碼放在判斷條件的語句塊裡。
對於非同步函式的順序迴圈處理(目的是程式碼複用)可以通過定時器機制或者事件回撥函式等方法來實現,但不能採用傳統的迴圈語句模式。
“函式套函式”(通常是非同步函式)的方式需要開發人員對程式碼結構有清晰的理解,以免造成程式碼編寫錯誤,如在內部非同步函式中試圖影響外部函式的執行等問題。


node.js的API

最重要的就是學習API。在node.js官網上列舉了如下API:
Assertion Testing   用於單元測試
Buffer              用於操作二進位制流資料的快取
C/C++ Addons        C/C++擴充套件
Child Processes     建立子程序
Cluster             建立node程序簇(實現類似多程序的功能)
Crypto              用於建立證書(用於安全連線/加解密等)
Debugger            node的debug工具
DNS                 DNS解析工具
Domain              將不同的IO操作打包成一組
Events              事件工具
File System         對檔案系統的操作
Globals             全域性物件
HTTP                高效的web伺服器和客戶端,提供HTTP服務
HTTPS               安全HTTPS 
Modules             模組解決方案
Net                 非同步的操作網路埠的方案
OS                  提供作業系統資訊
Path                操作和轉換檔案路徑
Process             程序介面,可控制程序和了解程序的各種狀況
Punycode            用於處理punycode編碼。
Query Strings       用於操作字串查詢
Readline            用於逐行讀取流中的文字
REPL                可互動式執行javascript的工具(常用於除錯)
STDIO               標準輸出入(如列印到控制檯的console.log語句等)
Stream              用於操作流
String Decoder      將buffer中的內容解碼為string
Timers              定時器功能
TLS/SSL             使用openSSL提供傳輸層的安全
TTY                 控制檯操作
UDP/Datagram        用於操作UDP傳輸(使用datagram socket)
URL                 解析URL
Utilities           各種工具集
VM                  用於編譯和執行javascript
ZLIB                用於壓縮和解壓縮檔案(Gzip/Gunzip格式)


Global 全域性物件

JavaScript 中有一個特殊的物件,稱為全域性物件(Global Object)
,它及其所有屬性都可以在程式的任何地方訪問,即全域性變數。在瀏覽器 JavaScript 中,通常 window 是全域性物件,
而 Node.js 中的全域性物件是 global,所有全域性變數(除了 global 本身以外)都是 global物件的屬性。
我們在 Node.js 中能夠直接訪問到物件通常都是 global 的屬性, 如console、process、require等。


console 列印介面

最常用的輸出資訊的方法。
console.log 同 console.info   向標準輸出(stdout)輸出資訊
可以使用console.log('count: %d', count);這樣的形式輸出變數。

console.error 同 console.warn 向標準錯誤(stderr)輸出資訊

console.time(label)  和 console.timeEnd(label)
對一個事件啟動計時器,如下面的例子:
console.time('100-elements');
for (var i = 0; i < 100; i++) {
  console.log('count:%d', i);
}
console.timeEnd('100-elements');
對一個列印事件啟動計時器,最後統計出列印100次的事件是5ms。


OS 作業系統介面

提供了訪問作業系統的基本功能函式。
os.platform()  返回作業系統平臺的名字(如Linux, Windows)
os.type() 返回作業系統的名字
os.hostname() 返回主機名
os.arch() 返回體系架構(如ia32)
os.release() 返回作業系統核心版本號(如2.6.32)
os.cpus() 返回每核CPU的引數(型號/主頻/用於基礎程序的毫秒數等)
os.totalmem() 返回總記憶體數
os.freemem() 返回自由記憶體數
os.networkInterfaces() 返回網路介面(網絡卡的名稱/地址/IP等)
os.EOL 返回系統換行符(如 '\n')
os.tmpdir()返回系統臨時檔案的資料夾
os.endianness() 返回系統大小尾特徵(如'LE')


Porcess 程序介面

process.pid  返回程序的ID

process.version 返回當前node的版本

process.versions 返回當前node及其各個依賴項的版本
{ http_parser: '1.0',
  node: '0.10.4',
  v8: '3.14.5.8',
  ares: '1.9.0-DEV',
  uv: '0.10.3',
  zlib: '1.2.3',
  modules: '11',
  openssl: '1.0.1e' }


process.execPath 返回node.js的執行檔案的路徑
如:/usr/local/bin/node


process.cwd() 返回當前目錄
如:/home/swedepan/workspace/nodetest


process.config 返回當前編譯環境(即config.gypi設定的環境)


process.env 返回當前系統環境設定(很複雜)


process.memoryUsuage() 返回node對於記憶體的使用
如: rss: 4935680,
  heapTotal: 1826816,
  heapUsed: 650472 }
heapTotal 和 heapUsed 代表 V8 的記憶體使用。


process.setuid() 和process.getuid() 設定和返回程序的使用者ID(只對POSIX系統有效)
如:
if (process.getuid && process.setuid) {
  console.log('Current uid: ' + process.getuid());
  try {
    process.setuid(501);
    console.log('New uid: ' + process.getuid());
  }
  catch (err) {
    console.log('Failed to set uid: ' + err);
  }
}


process.exit(code) 退出程序,返回code。
如:process.exit(1); 將退出程序後返回1.


process.kill(pid,[signal]) 殺死某程序,返回一個訊號
如:
process.on('SIGHUP', function() {
  console.log('Got SIGHUP signal.');
});


setTimeout(function() {
  console.log('Exiting.');
  process.exit(0);
}, 100);


process.kill(process.pid, 'SIGHUP');


process.chdir(directory)切換當前目錄到指定目錄


process.stdin() 讀取標準輸入
process.stdout() 寫入標準輸出
如:
process.stdin.resume();  //必須現有這句開啟stdin
process.stdin.setEncoding('utf8');  //適合輸入中文
process.stdin.on('data', function(data) {
  process.stdout.write('read from console: ' + data.toString()); //把一切輸入轉化為字串
});


process.nextTick(callback) 為事件迴圈設定一項任務,Node.js 會在
下次事件迴圈調響應時呼叫 callback。
初學者很可能不理解這個函式的作用,有什麼任務不能在當下執行完,需要交給下次事件迴圈響應來做呢?我們討論過,Node.js 適合 I/O 密集型的應用,
而不是計算密集型的應用,因為一個 Node.js 程序只有一個執行緒,因此在任何時刻都只有一個事件在執行。如果這個事件佔用大量的 CPU 時間,執行事件迴圈中的下一個事件就需要等待很久,因此 Node.js 的一個程式設計原則就是儘量縮短每個事件的執行時間。process.nextTick() 提供了一個這樣的
工具,可以把複雜的工作拆散,變成一個個較小的事件。
function doFirst(args, callback) {
somethingComplicated(args);
callback();
}
doSecond(function onEnd() {
compute();
});

我們假設 compute() 和 somethingComplicated() 是兩個較為耗時的函式,以上
的程式在呼叫 doFirst() 時會先執行 somethingComplicated(),然後立即呼叫
回撥函式,在 onEnd() 中又會執行 compute()。下面用 process.nextTick() 改寫上
面的程式:
function doFirst(args, callback) {
somethingComplicated(args);
process.nextTick(callback);
}
doSecond(function onEnd() {
compute();
});
改寫後的程式會把上面耗時的操作拆分為兩個事件,減少每個事件的執行時間,提高事件響應速度。不要使用 setTimeout(fn,0)代替 process.nextTick(callback),
前者比後者效率要低得多。


File System 檔案系統

fs 模組是檔案操作的封裝,它提供了檔案的讀取、寫入、更名、刪除、遍歷目錄、連結等 POSIX 檔案系統操作。與其他模組不同的是,fs 模組中所有的操作都提供了非同步的和同 步 的 兩 個 版 本 , 例 如 讀 取 文 件 內 容 的 函 數 有 異 步 的 fs.readFile() 和 同 步 的fs.readFileSync()。我們以幾個函式為代表,介紹 fs 常用的功能,並列出 fs 所有函式的定義和功能。

讀取檔案 fs.read(fd,buffer,offset,length,position,[callback(err, bytesRead, buffer)]) 
        fs.readSync(fd, buffer, offset,length, position)

寫入檔案 fs.write(fd,buffer,offset,length,position, [callback(err, bytesWritten, buffer)])
        fs.writeSync(fd, buffer, offset, length, position)
                 
讀取檔案內容 fs.readFile(filename,[encoding],[callback(err, data)])
           fs.readFileSync(filename,[encoding])

相關推薦

node.js (感覺轉載)

關於node.js Node.js 是伺服器端的 JavaScript 執行環境,它具有無阻塞(non-blocking)和事件驅動(event-driven)等的特色,Node.js 採用V8引擎,同樣,Node.js實現了類似 Apache 和 nginx 的web服務,讓你可以通過它來搭

【hssdw25172008的專欄】工作以後發現平時總要解決很多經典的問題對於解決的方法總不知道儲存在哪兒;經常瀏覽別人的部落格,感覺很好,如果自己可以通過寫博既保證了學到了知識不被忘卻還能與更多的朋友交流學習!因此決定寫博

工作以後,發現平時總要解決很多經典的問題,對於解決的方法,總不知道儲存在哪兒好;經常瀏覽別人的部落格,感覺很好,如果自己可以通過寫博,既保證了學到了知識不被忘卻,還能與更多的朋友交流學習!因此,決定寫博...

資訊熵知乎解釋感覺幫助理解決策樹演算法

讓我們說人話!好的數學概念都應該是通俗易懂的。 資訊熵,資訊熵,怎麼看怎麼覺得這個“熵”字不順眼,那就先不看。我們起碼知道這個概念跟資訊有關係。而它又是個數學模型裡面的概念,一般而言是可以量化的。所以,第一個問題來了:資訊是不是可以量化? 起碼直覺上而言是可以的,不然怎麼可能我們覺得有些人說的廢話特別多,“

Java過濾器Filter使用詳解(轉載自別人的文章感覺不錯適合我這樣的小白)

Java過濾器Filter使用詳解    轉載請註明原文地址:http://www.cnblogs.com/ygj0930/p/6374212.html  在我的專案中有具體應用:https://github.com/ygj0930/CoupleSpace

”linux學習之路” (感覺寫的更像是網路程式設計學習路線圖)

很多同學接觸Linux不多,對Linux平臺的開發更是一無所知。 而現在的趨勢越來越表明,作為一個優秀的軟體開發人員,或計算機IT行業從業人員, 掌握Linux是一種很重要的謀生資源與手段。 下來我將會結合自己的幾年的個人開發經驗,及對 Linux,更是類UNIX系統,及

Vue.js 但會比 Angular 或 React 更嗎?

雙向資料繫結 React 這樣做: Vue 這樣做: Vue.js 中的雙向資料繫結在你使用了 v-model 時就會相當的簡單。而在 React 中, 過程就比較漫長了。 迭代 React 這樣做: Vue 這樣做: 在這裡 ,Vue 的優勢也是程式碼更少更簡單。 Reactjs

現在越來越喜歡ajax傳值了這樣能讓網站的體驗性今天就總結了一下常用的

click put nbsp index.php 常用 體驗 code size .get 這是不用循環的方法 就是傳過來的是一位數組 //編輯黨建分類 function gk_bj(id){ $.post("{:U(‘Luser/lei_edlt

深入淺出Node.js--數據通訊NET模塊運行機制

end lose exp 事件驅動 如何 方式 基本 html 定義 互聯網的運作,最根本的驅動就是信息的交互,NodeJS 在數據交互這一塊做的很帶感,異步編程讓人很愜意,關於 NodeJS 的數據通信,最基礎的兩個模塊是 NET 和 HTTP,前者是基於 TCP 的封裝

20162017你好嗎?

  2016,第一次坐灰機出差去深圳,感受了遠離霾堵的興奮,也飽嘗著對親人朋友的思念,忍受著咳嗽病魔的騷擾,也收穫了跟一群大牛們一起共事的機會,感受工作的快樂!這是我來了之後的第二個專案,從前期需求,概要設計,實體設計,編碼,我是被架構師罵的最慘的,但是我知道,成長最快的也應該是我。   

Node.js學習隨筆三事件event

Node.js 是單程序單執行緒應用程式,但是因為 V8 引擎提供的非同步執行回撥介面,通過這些介面可以處理大量的併發,所以效能非常高。 Node.js 幾乎每一個 API 都是支援回撥函式的。 Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。 Node.js 單執行緒類似進入一個w

名3年工作經驗的程式設計師應該具備的技能(寫得很好,果斷轉) 因為和同事有約定再加上LZ自己也喜歡做完件事之後進行總結因此有了這篇文章。這篇文章大部分內容都是面向整個程式設計師群體的當然因為LZ本身是做Java開發的因此有一部分內容也是專門面向咱們Java程式設計師的。

因為和同事有約定再加上LZ自己也喜歡做完一件事之後進行總結,因此有了這篇文章。這篇文章大部分內容都是面向整個程式設計師群體的,當然因為LZ本身是做Java開發的,因此有一部分內容也是專門面向咱們Java程式設計師的。 簡單先說一下,LZ座標杭州,13屆本科畢業,算上年前在阿

你不知道的Node.js性能優化讀了之後水平直線上升

fail 組類型 frame 繼續 同時 all dstream 引擎 perf 本文由雲+社區發表 “當我第一次知道要這篇文章的時候,其實我是拒絕的,因為我覺得,你不能叫我寫馬上就寫,我要有幹貨才行,寫一些老生常談的然後加上好多特技,那個 Node.js 性能啊好像 Du

02-node.js 單執行緒‘ 非同步’非阻塞io

1、基本概念     同步:多個任務順序執行     非同步:多個任務並排執行 2、node的併發實現原理     Node JS是單執行緒應用程式,但它通過事件和回撥概念,支援併發。 由於Node JS每一個API是非同步的,作為一個單獨的執行緒,它使用非同步函

node.js檔案的複製建立資料夾等相關操作

nodeJS對檔案的複製: 一般對於小型檔案的複製操作使用的是流的管道運輸操作, 首先需要載入引入的檔案:var fs = require('fs'); 1、同步建立資料夾 fs.mkdirSync(yourfileDirPath); 非同步建立資

劍指offer——字串的排列(擴充套件題也全排列的演算法)

題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述: 輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字

一個實用學習android xml佈局檔案

用了各種佈局組合成一個漂亮的見面。新手很實用的一個例子,大家學習一下。。。。。。分享 本例用到了(相對佈局,線性佈局的各種巢狀使用) 效果圖片: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout

SpringMVC和JSon結合實現jsp和服務端物件的相互傳遞(寫的有例項)

轉自:http://snowolf.iteye.com/blog/1628861SpringMVC層跟JSon結合,幾乎不需要做什麼配置,程式碼實現也相當簡潔。再也不用為了組裝協議而勞煩辛苦了!一、Spring註解@ResponseBody,@RequestBody和Htt

csdn的部落格不錯我又回來了

以前由於csdn的部落格登入速度慢,寫了一個文章可能沒有發表成功而使我的書寫白白作廢了,今天回來一看,喲呵,變了不少,而且速度也上來了,以後針對技術類的文章,我還是要發表在這裡了。在百度空間上的東西,都放一些與技術無關,

Node.js async特殊示例加深理解。

//mo.postRequest.js async function postRequest(x) { return new Promise(function (resolve, reject) { try{ if

Node.JS Express渲染HTML變成顯示原始碼 問題及解決

Node.JS渲染HTML變成顯示原始碼問題及解決 問題 當使用Node.JS Express伺服器渲染HTML頁面的時候,本應該渲染出HTML頁面,結果顯示出了HTML的原始碼: HTML EJS引擎渲染 在生成的express工程中,預設使用