Node.jsはどうやって循環依存のファイルを探し出しますか?循環依存問題はどう解決しますか?
3638 ワード
本論文のポイントは
この問題をどう再現しますか?
ループ依存のファイルを見つけるにはどうすればいいですか?
上記の例示的なコードは簡単で、2つのファイルは、循環依存性を容易に見つけることができる.
注意下図1は、cli.jsを起点として、すべての矢印が右に展開されています.循環依存がないということです.
【図1】【図2】
サイクル依存を解決するにはどうすればいいですか?
ソリューション1:まず自身のモジュールをエクスポートします.
module.exportをファイルのヘッダに置いて、まず自身のモジュールをエクスポートして、他のモジュールを導入します.
来た:http://maples7.com/2016/08/17...
一つのイベントのメッセージ伝達を導入することにより、複数のモジュールが間接的にメッセージを伝達することができ、複数のモジュール間でもメッセージを送ることによって相互に起動することができる.
循環依存が現れ,しばしばコードの構造に問題が生じた.循環依存という問題は自発的に避けなければならないが、このような問題が発生し、避けられない時も循環依存による問題であることを認識し、解決策を探していくべきである.
最後に面白い問題を提供します.下のコードは
です.この問題がどのように発生したかに関心を持っています.自分で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
}