Skip to content

模块

CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。

https://es6.ruanyifeng.com/#docs/module-loader#ES6-模块与-CommonJS-模块的差异

大家要理解这句话的含义,即:commonjs模块是会被模块加载器执行,并等待你往exports上面挂载这个导出。因此,这就是个js执行逻辑,因此你的value值类型的东西,往外面挂载,那肯定挂的是值拷贝。 所以这里特指值类型,你在导出后是无法再跟模块内部有关联的(但引用类型肯定可以)。

ES6 的import有点像 Unix 系统的“符号连接”,原始值变了,import加载的值也会跟着变。因此,ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。

要理解上面这句,即es6他其实就类似于c语言之类的。模块就是一个dll库,dll库加载到内存后,暴露某变量或接口的内存地址出来给到调用者,因此,dll库的变量或接口的地址是不变的,因此,调用者调用dll库的变量或接口时,其实调用的是dll库的变量或接口的内存地址,因此,dll库的变量或接口的值变了,调用者调用dll库的变量或接口时,得到的值也会跟着变。

但es6导出的这个“符号链接”,有个特点是外部无法修改。但是你可以通过模块暴露的修改函数来修改模块内部这个变量的值。