Skip to content

commonjs 循环 import #17

@clumsyme

Description

@clumsyme

commonjs 在 require 时会先执行引入的模块,所以循环引用时:被引入文件再引入原文件的时候,只引入了 require 语句之前那部分。

// a.js
let { b } = require('./b')

let a = 'a'
exports.a = a

console.log('in a:', a, b)
setTimeout(() => {
    console.log('in a timeout:', a, b)
})

//b.js
let { a } = require('./a')

let b = 'b'
exports.b = b

console.log('in b:', a, b)
setTimeout(() => {
    console.log('in b timeout:', a, b)
})
node a

输出:

in b: undefined b
in a: a b
in b timeout: undefined b
in a timeout: a b

直接 require 变量,在该模块内,该变量不会变,类似闭包。

但是 require 整个包的话,包可以作为引用:

// a.js
let moduleB = require('./b')

let a = 'a'
exports.a = a

console.log('in a:', a, moduleB.b)
setTimeout(() => {
    console.log('in a timeout:', a, moduleB.b)
})

// b.js 
let moduleA = require('./a')

let b = 'b'
exports.b = b

console.log('in b:', moduleA.a, b)
setTimeout(() => {
    console.log('in b timeout:', moduleA.a, b)
})

node a 输出:

in b: undefined b
in a: a b
- in b timeout: undefined b
+ in b timeout: a b
in a timeout: a b

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions