Node.jsはどうやって循環依存のファイルを探し出しますか?循環依存問題はどう解決しますか?

3638 ワード

本論文のポイントは です.この問題がどのように発生したかに関心を持っています.自分でGoogleができます.
この問題をどう再現しますか?
// a.js
const {sayB} = require('./b.js')

sayB()

function sayA () {
  console.log('say A')
}

module.exports = {
  sayA
}
// b.js
const {sayA} = require('./a.js')

sayA()

function sayB () {
  console.log('say B')
}

module.exports = {
  sayB
}
下記のコードを実行します.
➜  test git:(master) ✗ node a.js
/Users/dd/wj-gitlab/tools/test/b.js:3
sayA()
^

TypeError: sayA is not a function
    at Object. (/Users/dd/wj-gitlab/tools/test/b.js:3:1)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Module.require (module.js:579:17)
    at require (internal/module.js:11:18)
    at Object. (/Users/dd/wj-gitlab/tools/test/a.js:1:78)
    at Module._compile (module.js:635:30)
sayA is not a functionではsayAは何ですか?実はundefinedです.、そうでないと、問題を探すのは大変なことになります.
ループ依存のファイルを見つけるにはどうすればいいですか?
上記の例示的なコードは簡単で、2つのファイルは、循環依存性を容易に見つけることができる. , , 。以下ではファイル間の依存関係を可視化できるツールを紹介します.
注意下図1は、cli.jsを起点として、すべての矢印が右に展開されています.循環依存がないということです. , 。図2では、左矢印が出ています.ここでサイクルを切断することを示しています.
【図1】【図2】
サイクル依存を解決するにはどうすればいいですか?
ソリューション1:まず自身のモジュールをエクスポートします.
module.exportをファイルのヘッダに置いて、まず自身のモジュールをエクスポートして、他のモジュールを導入します.
来た:http://maples7.com/2016/08/17...
// a.js
module.exports = {
  sayA
}

const {sayB} = require('./b.js')

sayB()

function sayA () {
  console.log('say A')
}
// b.js
module.exports = {
  sayB
}

const {sayA} = require('./a.js')

console.log(typeof sayA)

sayA()

function sayB () {
  console.log('say A')
}
シナリオ2:間接呼び出し
一つのイベントのメッセージ伝達を導入することにより、複数のモジュールが間接的にメッセージを伝達することができ、複数のモジュール間でもメッセージを送ることによって相互に起動することができる.
// a.js
require('./b.js')
const bus = require('./bus.js')

bus.on('sayA', sayA)

setTimeout(() => {
  bus.emit('sayB')
}, 0)

function sayA () {
  console.log('say A')
}

module.exports = {
  sayA
}
// b.js
const bus = require('./bus.js')

bus.on('sayB', sayB)

setTimeout(() => {
  bus.emit('sayA')
}, 0)

function sayB () {
  console.log('say B')
}

module.exports = {
  sayB
}
// bus.js
const EventEmitter = require('events')

class MyEmitter extends EventEmitter {}

module.exports = new MyEmitter()
締め括りをつける
循環依存が現れ,しばしばコードの構造に問題が生じた.循環依存という問題は自発的に避けなければならないが、このような問題が発生し、避けられない時も循環依存による問題であることを認識し、解決策を探していくべきである.
最後に面白い問題を提供します.下のコードはnode a.jsを実行して何を出力しますか?どうしてですか?
// a.js

var moduleB = require('./b.js')

setInterval(() => {
  console.log('setInterval A')
}, 500)

setTimeout(() => {
  console.log('setTimeout moduleA')
  moduleB.sayB()
}, 2000)

function sayA () {
  console.log('say A')
}

module.exports = {
  sayA
}
// b.js
var moduleA = require('./a.js')

setInterval(() => {
  console.log('setInterval B')
}, 500)

setTimeout(() => {
  console.log('setTimeout moduleB')
  moduleA.sayA()
}, 2000)

function sayB () {
  console.log('say B')
}

module.exports = {
  sayB
}