一、全局對象
常用的全局對象 __dirname , __filename
__dirname 當前模塊的目錄名,等同於path.dirname(__filename)
__filename 當前模塊的文件名,這是絕對路徑。
二、模塊講解
1、OS模塊
var os = require("os"); console.log("platform:", os.platform()); console.log("release:", os.release()); console.log("type:", os.type()); console.log("arch:", os.arch());
2. Process模塊
Process對象是一個global全局對象,控制着當前NodeJS進程。由於它對於Node來說是始終可用的,因此可以省掉 require()
// process 是全局變量 // 當前進程的路徑 console.log(process.cwd()); console.log(process.chdir("./filepath")); process.stdout.write("hello world"); process.stderr.write("error"); // process.on() 監聽事件 process.on("exit", function(code){ console.log(code); }); process.on("uncaughtException", function(err){ console.log(err); }); process.exit();
標准輸入輸出流
process.stdin 可讀流
process.stdout 可寫流
process.stderr
process.stdin.resume(); process.stdin.setEncoding("utf-8"); process.stdin.on("data", function(text){ process.stdout.write(text.toUpperCase()); });
通過process對象來獲取平台信息
process.arch 返回一個標識處理器架構的字符串 'arm' , 'ia32', 'x64'
process.memoryUsage() 返回一個描述當前進程中內存使用情況的對象,具有4個屬性: rss, heapTotal, heapUsed, external
process.exit() 通過code狀態碼來決定程序是正常退出還是錯誤退出,當程序運行結束后,可以在終端中通過 echo $? 或者是 echo %errorlevel% 來獲取狀態碼
process.pid 屬性,返回進程的ID號
process對象實現了EventEmitter事件接口,所以可以對它添加監聽器。
process.nextTick() 方法允許你將回調方法放在下一次的事件輪詢隊列的第一個。也就是說你可以將這個回調方法進行略微的延遲,這會比setTimeout()設定 0 毫秒的延遲要更有效率
3. console對象
格式占位符
%s %d %j
字符串 數字 JSON
打印對象時,如果沒有使用%j, 那么系統會默認調用util.inspect方法進行對象格式化。
其實console.log console.error console.info console.warn這四個方法內部都是使用的process提供的stdin , stdout , stderr這三個對象來實現的。
可以在控制台通過 2> [fileName] 的方式將程序運行中的錯誤信息重定向到文件中,而不是在控制台中打印。這是因為在操作系統內部一共有三個標准流 stdin, stdout, stderr. 分別對應數字0, 1, 2
var name = 'joyjoe'; var user = {name: 'joyjoe'}; console.log('Hello: ' , name); console.log('Hello: %s' , name); console.log('Hello: %j' , user); console.err('Error, bad User: ' , user);
node console.js 2>error.log
console.trace()
通過console.time() 和 console.timeEnd() 兩個方法來實現時間基准測試
4. Url模塊
var url = require("url"); var baseURL = 'http://nodejs.cn/api/stream.html#stream_readable_setencoding_encoding"; url.parse(baseURL); var queryURL = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=node%20url&rsv_pq=c64714e100067de8&rsv_t=90619GdyWxr98m%2BjT1vFFgIj5qlVJWCLw215zhVVtnESrJE%2Fic4nboA4h%2Fo&rqlang=cn&rsv_enter=1&rsv_sug3=14&rsv_sug1=11&rsv_sug7=100"; url.parse(queryURL); url.parse(queryURL, true); var json = { protocol: 'https:', slashes: true, auth: null, host: 'www.baidu.com', port: null, hostname: 'www.baidu.com', hash: null, search: '?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu', query: 'ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu', pathname: '/a/b/s', path: '/a/b/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu', href: 'https://www.baidu.com/a/b/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu' }; url.format(json);
5. Path模塊
path.join()使用平台特定的分隔符把全部給定的path片段拼接起來並規范化生成的路徑
path.dirname()返回一個path路徑的目錄名稱
path.basename()返回一個path路徑的最后一部分
path.extname()返回一個path路徑的擴展名(從最后一個.號開始)
6. Timer模塊
Timer模塊暴露了全局API,用來在某個時間段調用調度函數。
Timeout類,內部創建,從setTimeout() 和 setInterval() 返回。可以傳給 clearTimeout() 和 clearInterval() 來取消預定操作
當你預定一個Timeout定時器類時,只要定時器處於活動狀態,NodeJS的事件循環機制就會繼續運行。同時可以通過ref() 和 unref() 函數來控制定時器的默認行為。
timeout.ref() 調用時,只要定時器處於活動狀態,就要求事件循環不要退出。默認情況下所有定時器都是活動狀態。
timeout.unref() 調用時,處於活動狀態的定時器,要求退出事件循環。也就是說當所有的定時器運行完畢(此時程序中已經沒有處於活動狀態的定時器類)后就會退出進程。
setImmediate(callback, ...args) 預定立即執行的callback 這些回調函數會在IO事件的回調函數執行完畢后立即執行。也就是說immediate 函數會在 interval 函數之前調用。
多次調用該方法,多個回調函數會按照它們被創建的順序依次執行。每次事件循環迭代時都會處理整個回調隊列。如果一個立即執行定時器創建后是被當前正在執行的回調給排入隊列的,那么這個定時器會在下一次的事件循環迭代時才會被觸發。 而 process.nextTick() 方法指定的回調函數,前面說, 回調方法放在下一次的事件輪詢隊列的第一個。 也可以理解為 在當前事件輪詢結束后執行。