nodejs(3) 模块化

参考: 为什么要进行模块化开发

(读完你要会知道命名空间是什么)

模块化

  1. 为什么要有模块化:为了解决文件之间的依赖关系

  2. 注意:模块化是一种开发思想;具体开发中需要定制符合实际需求的模块化规范

  3. 减少不必要的沟通成本

// 1、module 就代表了当前这个模块
// console.log(module)
// 2、每个模块中,都应该有 exports, 作用,是把 当前模块中的成员暴露出去,给别人使用;
// console.log(exports)

// 3、module.require 是用来导入其它模块的;
// console.log(module.require)

// 总结:在Node中,每一个JS文件,大家都可以把它认为是一个模块

global全局作用域 和模块作用域

在Node.js中有两个作用域,分别是 全局作用域 和 模块作用域;

  1. 全局作用域使用 global 来访问,类似于浏览器中的window

  2. 每个 Javascript 文件,都是一个单独模块,每个模块都有自己独立的作用域,因此:模块中的成员,默认无法被其它模块访问。

global全局作用域:存在变量污染问题

06.js文件:
let a = 10
let b = 20
function show() {
  console.log('ok')
}
// 在 node 模块中,可以使用 exports 向外暴露成员
exports.a = a
exports.b = b
exports.show = show
console.log(exports)

07text.js文件:
const m06 = require('./06.js')
console.log(m06)

输出:
D:\ES6和node.js\02>node 07.test.js
{ a: 10, b: 20, show: [Function: show]}         
{ a: 10, b: 20, show: [Function: show]}

global共享成员——挂载

  1. 如果在某个模块内部,想为 全局的 global 作用域挂载一些属性,需要显示的调用global.***来挂载;

  2. 注意:在开发中,一般情况下,不推荐使用global全局作用域来共享成员,会存在全局变量污染问题;

CommonJS规范--node.js基于这个规范

特点:同步的模块规范,不适合在浏览器端使用

模块作用域共享成员

  1. module(模块标识)

    module 属性是 Common JS 规范中定义的,它是一个对象,表示当前这个具体的 js 模块

  2. require(引用模块)

    每一个实现了 CommonJS 规范的模块,必须定义一个 require() 函数,使用这个 require 函数,就能够 很方便的导入其它 模块中的成员,供自己使用;

  3. exports(暴露模块成员)

    每一个模块中,如果想要把自己的一些私有成员,暴露给别人使用,那么,必须实现一个 exports 对象,通过exports对象,可以方便的把模块内私有的成员,暴露给外界使用;

module.exports 和 exports 的关系

  1. module.exportsexports 默认引用了同一个空对象;

  2. module.exportsexports 作用一致,都可以向外暴露成员;

  3. 一个模块作用域中,向外暴露私有成员时,永远以 module.exports 为准;

module.exports.a = 10
module.exports.b = 20
exports.c = 30

// ------------ exports 和 module.exports 之间的关系 ---------------------
console.log(module.exports) // { a: 10, b: 20, c: 30 }
console.log(exports) // { a: 10, b: 20, c: 30 }
console.log(module.exports === exports) //true 

// 既然每个模块,向外暴露成员的时候,永远都以 module.exports 为准,那么,推荐使用 module.exports

猜你喜欢

转载自www.cnblogs.com/houfee/p/10282357.html