2011-02-13 77 views

回答

285

The docs描述另一種方式來做到這一點,其可以是優選的方法:

當一個文件被從節點直接運行,require.main被設置爲它的模塊。

爲了充分利用這一點,檢查該模塊是主模塊,如果是這樣,請與主代碼:

var fnName = function(){ 
    // main code 
} 

if (require.main === module) { 
    fnName(); 
} 

編輯:如果您在瀏覽器中使用此代碼,你會因爲「require」沒有被定義,所以得到一個「引用錯誤」。爲防止出現這種情況,請使用:

if (typeof require != 'undefined' && require.main==module) { 
    fnName(); 
} 
+17

你總是必須檢查require.main ===模塊**不管你的函數名稱如何。 要清楚上述代碼應被修改爲: '變種fnName =函數(){// 代碼 } 如果(require.main ===模塊){ fnName(); }' –

+0

我會用try ... catch來包裝它以獲得瀏覽器兼容性 –

+3

@OhadCohen「try ... catch」也可能會發現真正的錯誤。我認爲最好檢查一下typeof是否需要!='undefined'。 –

58
if (!module.parent) { 
    // this is the main module 
} else { 
    // we were require()d from somewhere else 
} 

編輯:如果您在瀏覽器中使用此代碼,您將收到「引用錯誤」,因爲「模塊」未定義。爲了防止這種情況,可使用:

if (typeof module != 'undefined' && !module.parent) { 
    // this is the main module 
} else { 
    // we were require()d from somewhere else or from a browser 
} 
+0

這是否記錄在某處? – intuited

+11

不是,但它在[node.js的測試]之一中使用(https://github.com/joyent/node/blob/master/test/simple/test-cli-eval.js) – nornagon

+1

對我來說這樣會更好而不是接受的答案,並具有不需要模塊的「名稱」的好處 – blented

相關問題