Node
查找模塊的順序簡單來講,若是是
require('x')
這樣開頭不是相對or絕對地址符號,尾巴也沒說是.js或者.json的,就當作模塊來找。先找是否是core modul
e,而後一級一級向上看node_modules
文件夾,每一級的node_modules
先看裏面是否有basename爲所找的文件,再看是否有模塊名文件夾下package.json
的main標明的文件,而後不死心地看看模塊名文件夾下有沒有index.js
和index.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
process
是Node.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代碼既能在瀏覽器中執行,也能在Node環境執行,但有些時候,程序自己須要判斷本身究竟是在什麼環境下執行的,經常使用的方式就是根據瀏覽器和Node環境提供的全局變量名稱來判斷:
if (typeof(window) === 'undefined') { console.log('node.js'); } else { console.log('browser'); }