nodejs 循環(huán)依賴及引用中無法使用對象方法或?qū)傩?/h2>

相信很多使用 nodejs 有朋友都會遇到了循環(huán)依賴的問題,它的原理是什么?我們怎樣在日常開發(fā)中規(guī)避掉這樣的問題?

場景重現(xiàn)

one.js

console.log('one init');
const two = require('./two');
var exp = module.exports = {};
console.log('one exports');
function start() {
    console.log('one start');
    two.start();
}
function load() {
    console.log('one load');
}
exp.start = start;
exp.load = load;

two.js

console.log('two init');
const one = require('./one');
var exp = module.exports = {};

function start() {
    console.log('two start');
    one.load();
}

exp.start = start;

main.js

const one = require('./one')

one.start();

輸出結(jié)果

$ node main.js
one init
two init
one {}
one exports
one start
two start
E:\source\nodejs\test\loop_require\two.js:8
    one.load();
        ^

TypeError: one.load is not a function
    at Object.start (E:\source\nodejs\test\loop_require\two.js:8:9)
    at Object.start (E:\source\nodejs\test\loop_require\one.js:7:9)
    at Object.<anonymous> (E:\source\nodejs\test\loop_require\main.js:3:5)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:394:7)

上面的場景其實有一個循環(huán)依賴和 module.exports 的問題,首先我們肯定下造成上面的遠行異常本身不是循環(huán)依賴造成的,而是我們代碼中對 exports 使用異常造成的

module.exports 是什么?

相信細心的朋友應(yīng)該知道,如果你直接 require 一個空的模塊的話,它是一個空對象,上面的場景中 two.js 引用 one.js 此時的對象為 {}one.js 中對 exports 對象進行了重新指向,此時 two.js 中引用到的對象和 one.js 后續(xù)重新生成的 exports 對象已經(jīng)不是一個對象了,所以在 two.js 中使用 one.start() 中的方法時提示 TypeError: one.load is not a function

官方文檔中對 exports 的描述

如何解決

1. 把模塊的方法直接綁定到 module.exports 對象上(如果出現(xiàn)重復(fù)依賴時尤其要這樣做)

module.exports.start = function() {
    // do something
}

exports.run = function() {
    // do something
}

2. 在方法使用時再引用(不建議這樣使用)

上面場景中的 two.js 可以有如下寫法:

console.log('two init');
const one = require('./one');
var exp = module.exports = {};

function start() {
    console.log('two start');
    require('./one').load();
}

exp.start = start;

nodejs 本身對循環(huán)依賴的處理是很合理的,出現(xiàn)問題也都是我們邏輯處理上的問題,希望上面的分析和解決方案可以幫助到還被困擾中的你。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Node.js是目前非?;馃岬募夹g(shù),但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設(shè)計出JavaScri...
    w_zhuan閱讀 3,732評論 2 41
  • 模塊 Node 有簡單的模塊加載系統(tǒng)。在 Node 里,文件和模塊是一一對應(yīng)的。下面例子里,foo.js加載同一個...
    保川閱讀 687評論 0 0
  • 原文鏈接:https://auth0.com/blog/javascript-module-systems-sho...
    自度君閱讀 1,023評論 0 2
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,241評論 0 1
  • Node.js是目前非常火熱的技術(shù),但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設(shè)計出JavaScri...
    Myselfyan閱讀 4,203評論 2 58

友情鏈接更多精彩內(nèi)容