Modularity(模块化-CommonJS规范)

第二阶段: CommonJS规范

 

CommonJS就是一个JavaScript模块化的规范,该规范最初是用在服务器端的node的,前端的webpack也是对CommonJS原生支持的。

  • 根据这个规范,每一个文件就是一个模块,其内部定义的变量是属于这个模块的,不会对外暴露,也就是说不会污染全局变量。

  • CommonJS的核心思想就是通过 require 方法来同步加载所要依赖的其他模块,然后通过 exports 或者 module.exports 来导出需要暴露的接口。

 

优点:

  • CommonJS规范在服务器端率先完成了JavaScript的模块化,解决了依赖、全局变量污染的问题,这也是js运行在服务器端的必要条件。

 

缺点:

  • 由于 CommonJS 是同步加载模块的,在服务器端,文件都是保存在硬盘上,所以同步加载没有问题,但是对于浏览器端,需要将文件从服务器端请求过来,那么同步加载就不适用了,所以,CommonJS是不适用于浏览器端的。

 

特点

  • 以文件为一个单元模块,代码运行在模块作用域内,不会污染全局变量

  • 同步加载模块,在服务端直接读取本地磁盘没问题,不太适用于浏览器

  • 模块可以加载多次,但是只会在第一次加载时运行,然后在加载,就是读取的缓存文件。需清理缓存后才可再次读取文件内容

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

  • 导出的是值的拷贝,这一点和 ES6 有着很大的不同

在浏览器中使用 CommonJS

 

由于浏览器不支持 CommonJS 规范,因为其根本没有 module、exports、require 等变量,

如果要使用,则必须转换格式。

Browserify是目前最常用的CommonJS格式转换的工具,

我们可以通过安装browserify来对其进行转换.

但是我们仍然需要注意,由于 CommonJS 的规范是阻塞式加载,并且模块文件存放在服务器端,可能会出现假死的等待状态(浏览器在一直下载文件)

 

  • npm i browserify -g

 

编译

  • browserify main.js -o js/bundle/main.js

 

或者引入

 

node中的CommonJS

// 示例一

//    文件名: foo.js
var $ = require('jquery');
var _ = require('underscore');

//  methods
function a(){};    //    私有方法,因为它没在module.exports中 (见下面)
function b(){};    //    公共方法,因为它在module.exports中定义了
function c(){};    //    公共方法,因为它在module.exports中定义了

//    暴露公共方法
module.exports = {
    b: b,
    c: c
};
// 示例二

// 模块定义 
// CommonJS 的规范说明,一个单独的文件就是一个模块,也就是一个单独的作用域。并且模块只有一个出口,module.exports/exports.xxx

// lib/math.js
const NAME='Nealayng';
module.exports.author = NAME;
module.exports.add = (a,b)=> a+b;



// 加载模块  
// 加载模块使用 require 方法,该方法读取文件并且执行,返回文件中 module.exports 对象

// main.js
const mathLib = require('./lib/math');
console.log(mathLib.author);//Nealyang
console.log(mathLib.add(1,2));// 3

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值