宽放大模式——一种前端模块化的方式探讨

一、所需储备的知识点

要理解宽放大模式,需要先储备两个知识点。

1、匿名函数和闭包

匿名函数就不说了,闭包我的理解是在内部作用域返回一个包含内部作用域引用的对象给外部作用域,这样的话,就能保证内部作用域中的引用不会被垃圾回收器回收的一种机制。

由此发展出来的一种类的构建方式如下

var object=function(){
      var field1;
      var method1=function(){  

      };
      return{
             field1:field1,
             method1:method1
      }
}();

    这样可以很好的保护私有成员变量和方法。

2、全局变量注入

对于全局变量,可以通过以下方式注入

var model=(function(mod){
    ...
})(window.model)

    这个时候mod其实就是全局的model

二、宽放大模式

有了这两个知识点,就可以引出今天的主角,宽放大模式。它是这个样子的

var module = ( function (mod){
    ...
    return mod;
})(window.module || {});

     由于加入了和空对象或的操作,可以不用考虑js加载顺序对模块的影响。

三、模块化实现

利用以上知识来实现模块化。以easyui来举例。

我们有一个用户管理的页面,我们把它分成两个层controller和service

controller层:该层用来构建easyui的组件,比如datagrid,searchForm分别对应datagrid.js和searchForm.js两个js文件。它是DOM和业务逻辑的(service层)的桥梁

service层:主要由controller层进行调用,通过ajax调用webserver实现业务逻辑

比如:controller层的datagrid.js可以这样写

nameSpace.ns("ZVideo.user");  

ZVideo.user=(function(user){  

    user.createDatagrid=function(config){
         user.datagrid=$(‘#‘+config.datagridId).datagrid({
              ...
              toolbar : [{
                          text:‘分配角色‘,
                          iconCls:‘icon-edit‘,
                          handler:Base.bindArguments(this,function(){
                                  var row=$(‘#‘+this.config.datagridId).datagrid(‘getSelected‘);
                                  this.addRole(row);
                          })
             }],
             ...
         });  

    };  

    return user;  

}(ZVideo.user || {}));

  注意,这里的this.addRole则是服务层的方法,并不在该文件中定义

我们看一下服务层的userService.js的写法

nameSpace.ns("ZVideo.user");  

ZVideo.user=(function(service){  

   service.addRole=function(row){
        if(!row){
            $.messager.show({
                msg:‘请选择一项进行角色分配!‘,
                title:‘错误‘
            });
            return;
        }
        //分配角色的业务逻辑实现
        ...
   }  

   return service;  

}(ZVideo.user || {}));

  可以看到,通过这种方式,很顺利地把应用拆分成了controller层和service层。

时间: 2024-10-10 22:45:45

宽放大模式——一种前端模块化的方式探讨的相关文章

前端模块化杂谈

Teambition是一家追求卓越技术的公司,我们工程师都很Geek,我们使用了很多新潮的,开源的技术.同时我们也贡献了很多开源的项目.我们希望能够把一些技术经验分享给大家.于是有了这个「创作随笔」.废话休说,「创作随笔」第一弹,来自我们的前端工程师寸志,谈一谈他在前端模块化开发方面的一些感想. 在模块化方面,Node.js就显得游刃有余. 作为用户,我们把代码放到一个个JavaScript文件中,然后Node.js就有一套规则帮我们把这些代码组织起来,Node.js还有包的概 念,于是我们就可

前端模块化开发的价值

本文发表在<程序员>杂志 2013 年 3 月刊,推荐购买. 前端模块化开发的价值 随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做项目时,常常会将一些通用的.底层的功能抽象出来,独立成一个个函数,比如 function each(arr) { // 实现代码 } function log(str) { // 实现代码 } 并像模像样地把这些函

前端模块化发展简史

前端发展日新月异,短短不过 10 年已经从原始走向现代,甚至引领潮流.网站逐渐变成了互联网应用程序,代码量飞速增长,为了支撑这种需求和变化,同时兼顾代码质量.降低开发成本,接入模块化势在必行.伴随这一变化的是相对应的构建工具的快速成长,或是为了优化.或是为了转义,都离不开这类工具. 所谓温故而知新,本篇回顾总结下前端模块化的发展历程及辅助工具.在回顾中可以更清晰的看到当前我们用的方案所处的位置,为什么会发展到这一步,目前模块化方案带来的优势等. 1. 没有模块化的日子 最开始 JavaScrip

前端模块化开发的价值(seaJs)

随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做项目时,常常会将一些通用的.底层的功能抽象出来,独立成一个个函数,比如 function each(arr) { // 实现代码 } function log(str) { // 实现代码 } 并像模像样地把这些函数统一放在 util.js 里.需要用到时,引入该文件就行.这一切工作得很好,同事也很

【转】前端模块化开发的价值 #547

前端模块化开发的价值 随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做项目时,常常会将一些通用的.底层的功能抽象出来,独立成一个个函数,比如 function each(arr) { // 实现代码 } function log(str) { // 实现代码 } 并像模像样地把这些函数统一放在 util.js 里.需要用到时,引入该文件就行.这一

前端模块化开发解决方案详解

一.模块化开发方案 前端发展到今天,已经有不少模块化的方案,比如 CommonJS(常用在服务器端,同步的,如nodejs) AMD(常用在浏览器端,异步的,如requirejs)(Asynchronous Module Definition) CMD(常用在浏览器端,异步的,如seajs) UMD(AMD&& CommonJS) 这些模块化规范的核心价值都是让 JavaScript 的模块化开发变得简单和自然. 服务器端模块 在服务器端,所有的模块都存放在本地硬盘,可以同步加载完成,等待

前端模块化

前端模块化 前端模块化 在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可:如今CPU.浏览器性能得到了极大的提升,很多页面逻辑迁移到了客 户端(表单验证等),随着web2.0时代的到来,Ajax技术得到广泛应用,jQuery等前端库层出不穷,前端代码日益膨胀 这时候JavaScript作为嵌入式的脚本语言的定位动摇了,JavaScript却没有为组织代码提供任何明显帮助,甚至没有类的概念,更不用说模块(module)了,JavaScript极其简单的代码组织规范不足以驾

前端模块化(CommonJs,AMD和CMD)

前端模块规范有三种:CommonJs,AMD和CMD. CommonJs用在服务器端,AMD和CMD用在浏览器环境AMD 是 RequireJS 在推广过程中对模块定义的规范化产出.CMD 是 SeaJS 在推广过程中对模块定义的规范化产出.AMD:提前执行(异步加载:依赖先执行)+延迟执行CMD:延迟执行(运行到需加载,根据顺序执行) 模块 函数写法 function f1(){ //... } function f2(){ //... } 模块就是实现特定功能的文件,把几个函数放在一个文件里

前端模块化方案:CommonJS/AMD/CMD/ES6规范

模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块系统.前端模块化的演进过程可以看看阮一峰老师的文章.本文主要介绍各规范下的模块化实现方式. 一.CommonJS Node.js是commonJS规范的主要实践者,它有四个重要的环境变量为模块化的实现提供支持:module.exports.require.global.实际使用时,用module.e