对模块化不是很了解,回答问题也是一知半解,这次把模块化的知识漏洞一起补掉

什么是模块化

顾名思义,把一个整体拆分成若干模块,并能提供模块控制的方案就是模块化。很形象的例子就是积木,每一块积木就是一个模块,搭积木的过程就是模块化的过程。在js中,相应的就是js根据某些功能特性,编写成模块,然后应用控制模块的过程就是js的模块化。

为什么需要模块化

在没有模块化的时代

  1. 所有的js文件都挂载在全局作用域中,容易造成全局污染,需要考虑命名重复的问题
  2. 如果不同的js文件存在依赖关系,需要按照顺序排列js文件,管理起来费劲,不方便维护

Javascript模块化方案

js主要有5种模块化方案

  1. CommonJS
  2. AMD
  3. CMD
  4. UMD
  5. ES6 Module

CommonJS

node的模块系统采用的是CommonJS规范,每个模块都是一个独立的作用域,内部的变量,函数等都是私有的。module代表当前模块,外部访问内部的变量需要通过exports接口来完成。在外部通过require加载导出的模块。

//cal.js
function calculator(type, x, y) {
    return types[type](x, y);
}

module.exports = {
    calculator,
};

//index.js
const { calculator } = require('./js/cal.js');
console.log(`${a}+${b}=${calculator('add',a, b)}`);

缓存

模块在以一次加载后会被缓存,后续的调用,将返回缓存后的结果。需要注意的一个地方是,在一些一些不区分大小写的文件系统或者操作系统上,不同的解析文件名,对于node来讲就是不同的文件,所以,foo.js 与 FOO.js 即便他们是指向同一个文件,但是依然会被缓存两次。

循环引用