node學習系列之基礎

Node查找模塊的順序

簡單來講,若是是require('x')這樣開頭不是相對or絕對地址符號,尾巴也沒說是.js或者.json的,就當作模塊來找。先找是否是core module,而後一級一級向上看node_modules文件夾,每一級的node_modules先看裏面是否有basename爲所找的文件,再看是否有模塊名文件夾下package.json的main標明的文件,而後不死心地看看模塊名文件夾下有沒有index.jsindex.node。最後找不到的話,還要搜一遍全局環境,好比$HOME/.node_modules/什麼的。html

關於node.js的模塊查找順序require.resolve()node

module.exports vs exports

用法

function hello() {
    console.log('Hello, world!');
}

function greet(name) {
    console.log('Hello, ' + name + '!');
}
module.exports = {
    hello: hello,
    greet: greet
};
exports.hello = hello;
exports.greet = greet;

可是你不能夠直接對exports賦值:json

// 代碼能夠執行,可是模塊並無輸出任何變量:
exports = {
    hello: hello,
    greet: greet
};

區別

  • module.exports 初始值爲一個空對象 {}數組

  • exports 是指向的 module.exports 的引用瀏覽器

  • require() 返回的是 module.exports 而不是 exports函數

聯繫

exports是引用 module.exports的值。module.exports 被改變的時候,exports不會被改變,而模塊導出的時候,真正導出的執行是module.exports,而不是exports
foo.jsui

exports.a = function(){
  console.log('a')
 }

 module.exports = {a: 2}
 exports.a = 1

test.jsprototype

var x = require('./foo');
 console.log(x.a)    //2

注意

module.exports不能導出prototype建立的私有方法
foo.js線程

function View(){

 }

 View.prototype.test = function(){
  console.log('test')
 }

 View.test1 = function() {
  console.log('test1')
 }

 module.exports = View;

test.jscode

var x = require('./foo');

 console.log(x) //{ [Function: View] test1: [Function] }
 console.log(x.test) //undefined
 console.log(x.test1) //[Function]
 x.test1() //test1

result

{ [Function: View] test1: [Function] }
undefined
[Function]
test1

結論

若是要輸出一個鍵值對象{},能夠利用exports這個已存在的空對象{},並繼續在上面添加新的鍵值;
若是要輸出一個函數或數組,必須直接對module.exports對象賦值。
因此咱們能夠得出結論:直接對module.exports賦值,能夠應對任何狀況

exports 和 module.exports 的區別
module.exports與exports??關於exports的總結

基本模塊

process

processNode.js提供的一個對象,它表明當前Node.js進程
JavaScript程序是由事件驅動執行的單線程模型,Node.js也不例外。Node.js不斷執行響應事件的JavaScript函數,直到沒有任何響應事件的函數能夠執行時,Node.js就退出了。

若是咱們想要在下一次事件響應中執行代碼,能夠調用process.nextTick()

// test.js
// process.nextTick()將在下一輪事件循環中調用:
process.nextTick(function () {
    console.log('nextTick callback!');
});
console.log('nextTick was set!');

Node執行上面的代碼node test.js,你會看到,打印輸出是:

nextTick was set!
nextTick callback!

這說明傳入process.nextTick()的函數不是馬上執行,而是要等到下一次事件循環。

Node.js進程自己的事件就由process對象來處理。若是咱們響應exit事件,就能夠在程序即將退出時執行某個回調函數:

// 程序即將退出時的回調函數:
process.on('exit', function (code) {
    console.log('about to exit with code: ' + code);
});

判斷JavaScript執行環境

有不少JavaScript代碼既能在瀏覽器中執行,也能在Node環境執行,但有些時候,程序自己須要判斷本身究竟是在什麼環境下執行的,經常使用的方式就是根據瀏覽器和Node環境提供的全局變量名稱來判斷:

if (typeof(window) === 'undefined') {
    console.log('node.js');
} else {
    console.log('browser');
}
相關文章
相關標籤/搜索