前端模块化总结

js模块化的发展:最早js是没有模块化概念的,为了防止命名空间被污染,采用的是命名空间的方式,随着前端的发展,commonJs在后端的实践思想被应用在前端,再往后就出现各种模块化标准例如:AMD/CMD/UMD,到如今出现的新标准es6 modulejs模块化不断演变,不断由复杂变的更好用。如下简单总结一个各个模块的特点。

1.命名空间(nameSpace)

在没有模块化思想的时候,都是通过命名空间防止对象被污染,通常格式类似这样库名.类别名.方法名,如代码所示

var nameSpace = {}
nameSpace.method = nameSpace.method || {}
nameSpace.method.init = function(){
//do somethings
}
nameSpace.method.done = function(){
//do somethings
}

nameSpace对象上如果有method对象就使用nameSpace.method对象,没有就新建一个空对象用来防止命名冲突或者被覆盖的问题。这种方式的弊端就是如果命名空间被覆盖了,也是没办法检测到的,而且在使用的时候要记住完整的对象方法名,在团队开发的时候大家要提前约定好各自要使用的方法名,类名来避免冲突,很不方便

2.commonJS

是一种服务端的模块化规范,规定一个文件为一个模块,模块内的变量,方法外界是无法访问的,通过module.exports暴露模块接口,然后通过require的方式来引入使用模块接口。commonJs是运行在nodeJS服务端的,通过require进来模块接口都是同步执行的,因为对服务端来说,这种require方式都是本地加载。
如下代码:

//news.js
const Controller = require('egg').Controller;
class NewsController extends Controller {
    async list() {
        const dataList = await this.other();
        this.ctx.body = {
            code:0,
            masg:'news list success',
            data:dataList
        };
    }
    async other() {
        return {
            list: [
                { id: 1, title: 'this is news 1', url: '/news/1' },
                { id: 2, title: 'this is news 2', url: '/news/2' }
            ]
        }
    }
}
module.exports = NewsController;

3.AMD规范(Async Module Definition 异步的模块定义)

用于浏览器端的js加载,使用define定义模块,使用require加载模块,代表库是RequireJS,这个库的特点就是所有的依赖都会被前置,提前执行,代码格式如下:

define(
  //模块名
  "alpha", 
   //依赖模块
  ["require", "exports", "beta"], 
    //导出模块
  function (require, exports, beta) {
       exports.verb = function() {
           return beta.verb();
           //Or:
           return require("beta").verb();
       }
   }
);

4.CMD规范(Common Module Definition 通用模块定义)

cmd也是遵循一个文件为一个模块,也是通过define来定义模块,通过require加载模块,代表库是seaJS。
与AMD的区别就是执行方式不一样,CMD是尽可能的懒执行,模块会被下载下来,直到使用的时候才会执行。
代码如下所示:

// 所有模块都通过 define 来定义
define(function(require, exports, module) {

  // 通过 require 引入依赖
  var $ = require('jquery');
  var Spinning = require('./spinning');

  // 通过 exports 对外提供接口
  exports.doSomething = ...

  // 或者通过 module.exports 提供整个接口
  module.exports = ...

});

5.UMD(Universal Module Definition )通用解决方案

提供前后端统一的解决方案,实现大一统,支持AMD,CMD两种规范,基本原理就是:判断是否支持AMD,判断是否支持CommonJS,如果都不支持,就定义成全局变量,挂在到window上。

//代码体是个自执行函数
(function (root, factory){
    if (typeof define === 'function' && define.amd){
        define([], factory);
    } else if (typeof exports === 'object') {
         module.exports = factory();
    } else {
          //需要被暴露出去的对象eventUtil
          root.eventUtil= factory();
    }
}(this, function () {
    return {};
}));

6.es6 module (EcmaScript Module)

es6 module也是一个文件就是一个模块,通过export暴露一个接口,通过import引入模块。模块打包现在最好用的就是webpack了。

//定义模块
//requistApi.js
export const getListUrl = 'news/list';
export const getListRequest = (url,params = {}) => {
     const promise = new Promise((resolve,reject) => {
           $.ajax({
               type: "GET",
               url: url,
               data: params,
               dataType: "json",
               success: function(data){
                   resolve(data);
                },
                error:function(){
                   reject();    
                }
            });
      });
      return promise;
}
//引入模块
//list.js
import { getListUrl, getListRequest } from 'requistApi.js'
.....
.....
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 前端模块化开发简介 历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖...
    荣儿飞阅读 4,235评论 0 6
  • 转载于作者:linwalker via:http://www.jianshu.com/p/d67bc79976e6...
    猩崽大叔阅读 665评论 0 0
  • 在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升...
    简不简单_都好阅读 217评论 0 0
  • 在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升...
    mhy_web阅读 220评论 0 0
  • 2017年9月9日,原本是我们结婚一周年的纪念日,但是我却没有机会去过了。曾经像很多女生一样,无数次想象过要如何浪...
    pleaseforgetall阅读 518评论 1 0