前端模块化

前端模块化

把复杂的代码按照功能的不同划分成不同的模块单独维护,提高开发效率,方便后期维护。
服务端规范主要是 CommonJS,例如 nodejs。
客户端主要有 AMD(异步模块定义,推崇依赖前置 requirejs)、CMD(通用模块定义,推崇依赖就近,seajs),但是随着 ES6 的普及,前端的这些第三方的模块化实现已经在渐渐的淘汰

模块化的演进:

  1. 基于文件划分模块的方式
  2. 每个模块暴露一个全局对象,所有模块成员都挂载在这个对象中,例如 jQuery 库把它的 api 都放在了 window.$下面,但zepto也是在window.$下容易命名冲突
  3. 使用 IIFE 为模块提供私有空间
  4. 利用 IIFE 的参数作为依赖声明使用
  5. 模块化规范(AMD、CMD、CommonJS、ESM 等)

CommonJS 解析

CommonJS 的核心思想是通过 require 方法来同步加载依赖的其他模块,通过 module.export 来导出需要暴露的接口

require 内部逻辑:
例如:require(X)

  1. 如果 X 是内置模块(比如 require(‘http’))
    a. 返回该模块
    b. 不再继续执行
  2. 如果 X 以 ‘./‘或者 ‘../‘开头
    a. 根据 X 所在父模块,确定 X 的绝对路径
    b. 将 X 当作文件,依次查找以下文件(.x |.x.js | .x.json | .x.node),只要一个存在就返回该文件,不再继续执行
    c. 把 X 当作目录,依次查找以下文件(.x/package.json | .x/index.js | .x/index.json | .x/index.node),只要一个存在就返回并不再执行
  3. 如果 X 不带路径
    a. 根据 X 所在父模块,确定 X 可能的安装目录,依次往上级目录查找,把 X 当成文件名或目录名加载
  4. 找不到抛错’not found’

评论