CommonJS规范,以及exports、module.exports和export、export default区别

1.CommonJS规范

为了写可维护的代码,常把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。
在 Node 环境中,一个.js文件就称之为一个模块(module),每个文件就是一个模块,有自己的作用域,在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见,而 Node 应用由模块组成,采用 CommonJS 模块规范

CommonJS 定义的模块分为: 模块标识(module)、模块定义(exports) 、模块引用(require)

创建预引入文件 module.js

'use strict';

var x = 5;
function addx (value){
    console.log( x + value );
}
module.exports.addx = addx;

创建加载文件 main.js

'use strict'

var example = require('./foo.js');
example.addx(10);
//输出:11 
module.exports.$ = example;

以上就是一个简单的CommonJS规范实例,CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。

CommonJS 模块特点:
1、所有代码都运行在模块作用域,不会污染全局作用域
2、模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存
3、模块加载的顺序,按照其在代码中出现的顺序

注: 浏览器不兼容CommonJS的根本原因,正是在于缺少四个Node.js环境的变量:module,require,exports,global

1.1 module对象

module对象,代表当前模块。它有以下属性:

 - module.id 模块的识别符,通常是带有绝对路径的模块文件名
 - module.filename 模块的文件名,带有绝对路径
 - module.loaded 返回一个布尔值,表示模块是否已经完成加载
 - 	module.parent 返回一个对象,表示调用该模块的模块
 - module.children 返回一个数组,表示该模块要用到的其他模块
 - 	module.exports 表示模块对外输出的值

如在main.js文件中,最后添加console.log(module)命令就可以看出以下输出结果:

Module {
  id: '.',//这里是相对路径
  exports: { '$': { addx: [Function: addx], x: 1 } },
  parent: null,
  filename: 'E:\\html&css\\test2.js',//这里是绝对路径
  loaded: false,
  children: 
   [ Module {
       id:  'D:\\node_modules',
       exports: [Object],
       parent: [Circular],
       filename:  'D:\\node_modules',
       loaded: true,
       children: [],
       paths: [Object] } ],
  paths: [ 'D:\\node_modules', 'D:\\node_modules' ] 

1.2 module.exports属性与exports变量

module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports。
而为了方便,Node为每个模块提供一个exports变量,指向module.exports,正因为如此不能直接对exports变量赋值,因为这样会等于切断了exports与module.exports的联系。

1.3 require方法

require 方法其实不是一个全局命令,而是指向当前模块的module.require命令。

1.3.1 加载规则

require 命令用于加载文件,后缀名默认为.js,但如果没能查找,Node会尝试为文件名添加.js、.json、.node后,再去搜索。
如果参数字符串不以./或/开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。

1.3.2 加载机制

CommonJS模块的加载机制是,输入的是被输出的值的拷贝,即一旦输出一个值,模块内部的变化就影响不到这个值,例如:

// module.js
var counter = 3;
function incCounter() {
  counter++;
}
module.exports = {
  counter: counter,
  incCounter: incCounter,
};

// main.js
var counter = require('./lib').counter;
var incCounter = require('./lib').incCounter;
console.log(counter);  // 3
incCounter();
console.log(counter); // 3

1.3.3 模块的缓存

第一次加载某个模块时,Node会缓存该模块。所有缓存的模块保存在require.cache之中,如果想删除模块的缓存,可以这样写:

// 删除指定模块的缓存
delete require.cache[moduleName];
// 删除所有模块的缓存
Object.keys(require.cache).forEach(function(key) {
  delete require.cache[key];
})

2 ES6 中的模块导出导入

ES6 的模块导出导入主要理解以下几个点:

export 和 export default
import a from .. 和 import {a} from ..

2.1 export 和 export default区别

export 与 export default 均可用于导出常量、函数、文件、模块等
在一个文件或模块中,export、import可以有多个,export default 仅有一个
通过 export 方式导出,在导入时要加 { } , export default 则不需要
export 能直接导出变量表达式, export default 不行。
'use strict'
//导出变量
export const a = '100';  

 //导出方法
export const dogSay = function(){ 
    console.log('wang wang');
}

 //导出方法第二种
function catSay(){
   console.log('miao miao'); 
}
export { catSay };

//export default导出
const m = 100;
export default m; 
//export defult const m = 100;// 这里不能写这种格式。
//index.js
'use strict'
var express = require('express');
var router = express.Router();

import { dogSay, catSay } from './testEs6Export'; //导出了 export 方法 
import m from './testEs6Export';  //导出了 export default 

import * as testModule from './testEs6Export'; //as 集合成对象导出



/* GET home page. */
router.get('/', function(req, res, next) {
  dogSay();
  catSay();
  console.log(m);
  testModule.dogSay();
  console.log(testModule.m); // undefined , 因为  as 导出是 把 零散的 export 聚集在一起作为一个对象,而export default 是导出为 default属性。
  console.log(testModule.default); // 100
  res.send('恭喜你,成功验证');
});

module.exports = router;
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这些关键字都是用于在 JavaScript 中导出模块的方式。 1. `module.exports` 是 CommonJS 规范中用于导出模块的方式。在 Node.js 中,`module.exports` 是一个指向当前模块导出对象的引用。可以通过给 `module.exports` 赋值来导出一个对象或函数。 例如: ``` // 导出一个函数 function add(a, b) { return a + b; } module.exports = add; ``` 2. `exports` 是 `module.exports` 的一个辅助对象,可以通过给 `exports` 对象的属性赋值来导出模块。 例如: ``` // 导出一个对象 exports.name = 'Tom'; exports.age = 18; ``` 这个模块实际上等价于: ``` module.exports = { name: 'Tom', age: 18 }; ``` 3. `export` 是 ES6 中用于导出模块的关键字。可以通过 `export` 关键字导出一个变量、函数或对象。 例如: ``` // 导出一个变量 export const name = 'Tom'; // 导出一个函数 export function add(a, b) { return a + b; } // 导出一个对象 export default { name: 'Tom', age: 18 }; ``` 4. `export default` 也是 ES6 中用于导出模块的关键字,但是它只能导出一个默认值。 例如: ``` // 导出一个默认值 export default function add(a, b) { return a + b; } // 导出一个默认对象 export default { name: 'Tom', age: 18 }; ``` 在导入模块时,可以使用 `import` 关键字来引入模块。例如: ``` // 导入 CommonJS 模块 const add = require('./add'); // 导入 ES6 模块 import { name, add } from './module'; import person from './person'; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值