前端模块化

118 阅读2分钟

模块化的优势

在以前没有模块化时,通常在编写代码时写在一个文件里, 或者通过script标签来划分模块, 但是当项目足够庞大时,项目会变得越来越难以管理, 所以我们需要一种方式帮助我们进行模块化。

  • 减少全局变量的污染
  • 增强可读性、复用性和可维护性
  • 减少代码冗余

模块化的分类

commonJS

概念

  • 每一个文件都是单独的模块
  • 核心变量 export 、module.export、require;
  • export 、module.export导出内容

简单使用

var a = 1;
module.exports.a = a

const aa = require('./a.js');
console.log(aa.a); // 1

特点

  • 运行时加载,模块 = 对象,运行时才会把模块挂载在export上
  • 同步加载模块(适用于服务端)
  • 导出的数据是值的拷贝

ES Module

概念

  • 静态化,编译时就能确定依赖关系以及输出的变量
  • 核心变量 export import

简单使用

var a = 1

export a

import aa from './a.js'

console.log(aa) // 1

特点

  • 静态语法,导入和导出都是静态的
  • 提前加载, 在编译时执行模块文件
  • import 命令会有提升效果,会提升到代码头部优先执行
  • 导出的数据是值得引用

AMD

概念

  • requireJS
  • 非同步加载模块,允许指定构造函数(浏览器环境下,要从服务端获取模块,就需要采用异步的方式)
  • 使用define来定义模块

简单使用

// 定义无依赖的模块
define(function(){
        console.log('111')
})

// 定义有依赖的模块
define(['xxx'], function(xxx){
    console.log(xxx)
})

// 调用模块
require(['xxxx'],function(xxxx){
    console.log(xxxx)
})

特点

  • 非同步加载方式(适用于浏览器)
  • 前置依赖,提前加载
  • 可以并行加载多个模块

CMD

概念

  • seaJS
  • define来定义模块 require加载模块
  • 非同步加载方式
  • 按需加载

简单使用

//定义模块
define(function(a, b, c){
    // 加载模块
    var a = require('xxx');
})
// 使用模块
seajs.use(['xxx'],function(aaa){
    console.log(aaa)
})

特点

  • 依赖就近,延迟加载

UMD

UMD是一种通用模块定义规范,可以在浏览器环境中使用,也可以在服务器环境中使用

规定如下

  • 优先判断是否存在exports方法,如果存在,则采用CommonJS方式记载模块
  • 其次判断是否存在define方法, 如果存在,则采用AMD方式加载模块;