论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下将字符串当函数执行的方法
Jul 13 Javascript
Javascript实现简单的富文本编辑器附演示
Jun 16 Javascript
jQuery焦点图切换简易插件制作过程全纪录
Aug 27 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
Sep 04 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
Sep 20 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
Aug 23 Javascript
JS返回只包含数字类型的数组实例分析
Dec 16 Javascript
使用JS模拟锚点跳转的实例
Feb 01 Javascript
vue2.0的虚拟DOM渲染思路分析
Aug 09 Javascript
深入学习JavaScript中的bom
May 27 Javascript
JS模拟实现京东快递单号查询
Nov 30 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
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
CentOS安装php v8js教程
2015/02/26 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
python八皇后问题的解决方法
2018/09/27 Python
python 字典访问的三种方法小结
2019/12/05 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
CSS3实现多重边框的方法总结
2016/05/31 HTML / CSS
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
单位实习证明怎么写
2014/01/17 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
大国崛起日本观后感
2015/06/02 职场文书
辩论会主持词
2015/07/03 职场文书
创业计划书介绍
2019/04/24 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书