commonjs

  • commonJS概述
1.文件即为模块

每个文件都是一个作用域,文件里面定义的变量\函数都是私有的,

对其他模块都是不可见的;

2.使用module.exports (exports) 暴露对外的接口.

module变量代表当前模块,module是一个对象,使用这个对象属性exports 暴露对外的接口;

3.使用require 同步加载依赖模块

4.模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。

5.模块加载的顺序,按照其在代码中出现的顺序

6.每个模块内部,都有一个module对象,代表当前模块。它有以下属性。

7.module.exports属性

  module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。

8.exports变量

  为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令:

  var exports = module.exports;(commonJS隐式做了这个赋值)

  这样做的好处是,在对外输出模块接口时,可以向exports对象添加方法暴露出去。

 

 

  • 示例

util.js

module.exports = function say() {
    console.log('hello world');
    console.log(module.id) //模块的识别符,通常是带有绝对路径的模块文件名。
    console.log(module.loaded) //返回一个布尔值,表示模块是否已经完成加载。
    console.log(module.children) //返回一个数组,表示该模块要用到的其他模块。
    console.log(module.exports) //表示模块对外输出的值。
}

main.js

var say = require("./util");
say();

 

也可以这样写:

util.js

function say(){
    console.log('hello world');
    console.log(module.id) //模块的识别符,通常是带有绝对路径的模块文件名。
    console.log(module.loaded) //返回一个布尔值,表示模块是否已经完成加载。
    console.log(module.children) //返回一个数组,表示该模块要用到的其他模块。
    console.log(module.exports) //表示模块对外输出的值。
}


module.exports ={
    sayfunc:say,
}

main.js

var util = require("./util");
util.sayfunc();

前者一个模块只输出一个function,后者输出一个对象,里面可以扩展多个方法、属性等

比如:

function say(){
    console.log('hello world');
    console.log(module.id) //模块的识别符,通常是带有绝对路径的模块文件名。
    console.log(module.loaded) //返回一个布尔值,表示模块是否已经完成加载。
    console.log(module.children) //返回一个数组,表示该模块要用到的其他模块。
    console.log(module.exports) //表示模块对外输出的值。
}

function test(){
    console.log('test');
}


module.exports ={
    sayfunc:say,
    testfunc:test
}

也可以使用exports:

exports.sayfunc = function say(){
    console.log('hello world');
    console.log(module.id) //模块的识别符,通常是带有绝对路径的模块文件名。
    console.log(module.loaded) //返回一个布尔值,表示模块是否已经完成加载。
    console.log(module.children) //返回一个数组,表示该模块要用到的其他模块。
    console.log(module.exports) //表示模块对外输出的值。
}

exports.testfunc = function test(){
    console.log('test');
}

 

  • module.export与exports区别

// dep.js
exports.A = function() {}
// app.js
var dep = require('dep');
dep.A()

  这其中exports.A = function() {}也可以写成module.exports.A = function() {}



  
// dep.js
module.exports = function () {}
// app.js
var dep = require('dep');
dep();

 注意这里只能用module.exports

   如果写成 

  exports = function () {}

    会让exports跟module.exports的隐式赋值断开,相当于给exports重新赋值

    而最终导出的是module.exports

    而且之后再怎么向exports上挂变量 (如exports.A = 1) 都不会被导出了

    

 

posted @ 2019-03-27 11:24  手指乐  阅读(405)  评论(0编辑  收藏  举报