论JavaScript模块化编程


Posted in Javascript onMarch 07, 2016

JavaScript模块化编程的重要性

JavaScript的原型是java,它也是一种面向对象编程语言,属于一种弱类型语言,它具有更大的灵活性。以往在编写javascript代码时,都是直接编写一个个.js文件,然后用script标签在html页面中引用,这样就会带来几方面的问题:

1、出现大量的全局变量
js在每个地方都可以定义一个全局变量,编写不符合规范将导致大量全局变量的出现,最终程序将难以维护。
2、js加载顺序要按照代码的依赖顺序
最简单的,例如a.js依赖于b.js文件,那么在html中引入脚本时,b.js必须要在a.js前面引入,否则将会报错。如果一个项目分工编写了几十个js文件,如果不按照一定的规范,将会出现大量的全局变量(也可能有重复的存在);其依赖关系也将难以维护
3、html一次性加载过多js脚本页面出现假死
初始化时一次性加载过多js脚本,很有可能会导致页面出现假死状态
使用RequireJS实现js模块化编程

  • RequireJS的目标是鼓励代码的模块化,它使用了不同于传统script标签的脚本加载步骤。可以用它来加速、优化代码,但其主要目的还是为了代码的模块化。它鼓励在使用脚本时以module ID替代URL地址。 —— [ RequireJS官网 ]

关于RequireJS的使用不过多阐述,详细请自行搜索或者在官网学习。这里记录下自己使用RequireJS模块化编程的一些心得。

应用场景是你的项目中使用了第三方开源库,但是呢,很多非GIS专业的IT选手对一些基本的概念可能会看不懂,这时候能可能就需要对第三方库进行更上一层的包装,这样接口就会更加容易理解一些,并且也可以做到分工协作,每个人都按照RequireJS的规范编写代码,只需要编写好自己的模块,预留好接口就可以了。下面是我封装的一个小例子,封装的还不是很彻底,目前仅处于学习js模块化阶段,后面无论大小都按照这种规范来写,相信一定会受益匪浅。

这里我采用的leaflet,一个轻量级开源地图库。需求是编写一个绘制图形类,实现点、线、面的绘制。直接给出代码了:

define(['leaflet'], function(){
  /**
   * 绘制多段线
   * @param options
   * @returns {*}
   * @private
   */
  var _drawLine = function(latlngs, options){
    return L.polyline(latlngs, options);
  };

  /**
   * 绘制多边形
   * @param options
   * @private
   */
  var _drawPolygon = function(latlngs, options){
    var polygon;
    if(latlngs.length < 3){
      console.log("点数少于3,无法绘制多边形!");
    } else {
      var firstPt = latlngs[0];
      var lastPt = latlngs[latlngs.length - 1];
      if(firstPt.equals(lastPt)){
        latlngs.pop();//移除与起点相同的终点
      }
      polygon = L.polygon(latlngs, options);
      return polygon;
    }
  };
  /**
   * 绘制矩形
   * @param bounds
   * @param options
   * @returns {*}
   * @private
   */
  var _drawRect = function(bounds, options){
    return L.rectangle(bounds, options);
  };
  /**
   * 绘制圆形
   * @param center
   * @param radius
   * @param options
   * @returns {*}
   * @private
   */
  var _drawCircle = function(center, radius, options){
    return L.circle(center, radius);
  };

  /**
   *封装,暴露公共方法
   */
  return {
    drawLine : _drawLine,
    drawPolygon : _drawPolygon,
    drawRect : _drawRect,
    drawCircle : _drawCircle
  }
})

调用时代码:

require(['drawHelper'], function(drawHelper){

 function drawLine(){
  var latlngs = new Array();
  for(var i = 20; i < 30; i++){
   for(var j = 100; j < 110; j++){
    latlngs.push(new L.latLng(i, j));
   }
  }
  var polylineOpt = {
   color : 'blue',
   weight : '2',
   opacity : 0.8,
   smoothFactor : 2.0
  };
  var polyline = drawHelper.drawLine(latlngs, polylineOpt);
  polyline.addTo(mainmap);
 };

 function drawPolygon(){
  var latlngs = new Array();
  latlngs.push(L.latLng(31, 110), L.latLng(31, 111), L.latLng(32, 111), L.latLng(32, 110), L.latLng(32, 109));
  var Opt = {
   stroke : true,
   color : 'blue',
   weight : '2',
   opacity : 0.8,
   fill : true,
   fillColor : 'red',
   fillOpacity : 0.6
  };
  var polygon = drawHelper.drawPolygon(latlngs, Opt);
  polygon.addTo(mainmap);
 }

 function drawRect(){
  var bounds = [[33, 110], [36, 113]];
  var Opt = {
   stroke : true,
   color : 'blue',
   weight : '2',
   opacity : 0.8,
   fill : true,
   fillColor : 'yellow',
   fillOpacity : 0.6
  };
  drawHelper.drawRect(bounds, Opt).addTo(mainmap);
 }

 function drawCircle(){
  var center = L.latLng(32, 116);
  var Opt = {
   stroke : true,
   color : 'red',
   weight : '2',
   opacity : 0.8,
   fill : true,
   fillColor : 'green',
   fillOpacity : 0.6
  };
  drawHelper.drawCircle(center, 200000, Opt).addTo(mainmap);
 }

 drawLine();
 drawPolygon();
 drawRect();
 drawCircle();
})

实现效果如下。这里我封装的还不彻底,但是已经够用了。像基础的地图操作,图层控制都可以写一个mapcontrol进行统一的管理

论JavaScript模块化编程

以上就是关于JavaScript模块化编程的论述,希望对大家的学习有所帮助。

Javascript 相关文章推荐
解析使用JS 清空File控件的路径值
Jul 08 Javascript
javascript组合使用构造函数模式和原型模式实例
Jun 04 Javascript
JavaScript中的anchor()方法使用详解
Jun 08 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
Jan 28 Javascript
js提交form表单,并传递参数的实现方法
May 25 Javascript
checkbox批量选中,获取选中项的值的简单实例
Jun 28 Javascript
JQuery控制DIV的选取实现方法
Sep 18 Javascript
AngularJS之自定义服务详解(factory、service、provider)
Apr 14 Javascript
vue.js实现插入数值与表达式的方法分析
Jul 06 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
Jan 04 Javascript
关于layui flow loading占位图的实现方法
Sep 21 Javascript
JavaScript实现班级抽签小程序
May 19 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
Mar 07 #Javascript
不定义JQuery插件 不要说会JQuery
Mar 07 #Javascript
javascript数组去重小结
Mar 07 #Javascript
详解JS正则replace的使用方法
Mar 06 #Javascript
浅谈javascript中的call、apply、bind
Mar 06 #Javascript
一波JavaScript日期判断脚本分享
Mar 06 #Javascript
Node.js程序中的本地文件操作用法小结
Mar 06 #Javascript
You might like
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
php语法检查的方法总结
2019/01/21 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
python调用Delphi写的Dll代码示例
2017/12/05 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
Python实现GIF图倒放
2020/07/16 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
竞争性谈判邀请书
2014/02/06 职场文书
爱护公共设施标语
2014/06/24 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
大学生自荐信范文
2015/03/05 职场文书
golang slice元素去重操作
2021/04/30 Golang
使用CSS实现音波加载效果
2023/05/07 HTML / CSS