JS模块化

99 阅读2分钟

JS模块化

理解

《领导力21法则》思维导图.png

1. 什么是模块/模块化?

  • 将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起
  • 块的内部数据/实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信
  • 模块化的进化史

2. 为什么要模块化?

3. 模块化的好处

  • 避免命名冲突(减少命名空间污染)
  • 更好的分离, 按需加载
  • 更高复用性
  • 高可维护性

4. 页面引入加载script

  • 问题

    • 请求过多
    • 依赖模糊
    • 难以维护

模块化规范

CommonJS

  • 规范

    • 说明

      • wiki.commonjs.org/wiki/Module…
      • 每个文件都可当作一个模块
      • 在服务器端: 模块的加载是运行时同步加载的
      • 在浏览器端: 模块需要提前编译打包处理
    • 基本语法

      • 暴露模块

        • module.exports = value
        • exports.xxx = value
        • 问题: 暴露的模块到底是什么?
      • 引入模块

        • require(xxx)

          • 第三方模块:xxx为模块名
          • 自定义模块: xxx为模块文件路径
  • 实现

    • 服务器端实现

    • 浏览器端实现

      • Browserify
      • browserify.org/
      • 也称为CommonJS的浏览器端的打包工具
    • 区别Node与Browserify

      • Node.js运行时动态加载模块(同步)
      • Browserify是在转译(编译)时就会加载打包(合并)require的模块

AMD

  • 规范

    • 说明

      • Asynchronous Module Definition(异步模块定义)
      • github.com/amdjs/amdjs…
      • 专门用于浏览器端, 模块的加载是异步的
    • 基本语法

      • 定义暴露模块

        • //定义没有依赖的模块 define(function(){ return 模块 })
        • //定义有依赖的模块 define(['module1', 'module2'], function(m1, m2){ return 模块 })
      • 引入使用模块

        • require(['module1', 'module2'], function(m1, m2){ 使用m1/m2 })
  • 实现(浏览器端)

CMD

  • 规范

    • 说明

      • Common Module Definition(通用模块定义)
      • github.com/seajs/seajs…
      • 专门用于浏览器端, 模块的加载是异步的
      • 模块使用时才会加载执行
    • 基本语法

      • 定义暴露模块

        • //定义没有依赖的模块 define(function(require, exports, module){ exports.xxx = value module.exports = value })
        • //定义有依赖的模块 define(function(require, exports, module){ //引入依赖模块(同步) var module2 = require('./module2') //引入依赖模块(异步) require.async('./module3', function (m3) {

    }) //暴露模块 exports.xxx = value })

      - 引入使用模块
    
      	- define(function (require) {
    

    var m1 = require('./module1') var m4 = require('./module4') m1.show() m4.show() })

  • 实现(浏览器端)

ES6

  • 规范

    • 说明

    • 语法

      **导出模块:

      1. 分多次导出模块的多个部分

        export class Emp{ }

        export function fun(){ }

        export var person = {};

      2. 一次导出模块的多个部分

        class Emp{ }

        function fun(){ }

        var person = {};

        export {Emp, fun, person}

      3. default导出(只能有一个)

        export default {}

      **导入模块

      import defaultModule from './myModule'; //导入默认的

      import {Emp} from './myModule'; //导入指定的一个

      import {Emp, person} from './myModule'; //导入指定的多个

      import * as allFromModule from './myModule'; //导入所有

      • 导出模块: export
      • 引入模块: import
  • 实现(浏览器端)

    • 使用Babel将ES6编译为ES5代码
    • 使用Browserify编译打包js

扩展阅读

github.com/seajs/seajs…

zccst.iteye.com/blog/221531…

www.zhihu.com/question/20… 的区别)

www.ruanyifeng.com/blog/2012/1…