论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 相关文章推荐
对于Form表单reset方法的新认识
Mar 05 Javascript
jquery实现的缩略图预览滑块实例
Jun 25 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
RequireJS使用注意细节
May 15 Javascript
微信小程序 实战程序简易新闻的制作
Jan 09 Javascript
基于BootStrap实现简洁注册界面
Jul 20 Javascript
JS实现中文汉字按拼音排序的方法
Oct 09 Javascript
谈谈JavaScript中super(props)的重要性
Feb 12 Javascript
javascript实现前端input密码输入强度验证
Jun 24 Javascript
Vue实现穿梭框效果
Sep 30 Javascript
ant design vue导航菜单与路由配置操作
Oct 28 Javascript
详解JS ES6编码规范
May 07 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
PHPMailer 中文使用说明小结
2010/01/22 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
js 验证密码强弱的小例子
2013/03/21 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
python函数参数*args**kwargs用法实例
2013/12/04 Python
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
Python3爬虫学习入门教程
2018/12/11 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
Python request中文乱码问题解决方案
2020/09/17 Python
电子商务应届生自我鉴定
2014/01/13 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
总结表彰大会主持词
2014/03/26 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
个人买房协议书范本
2014/10/06 职场文书
代理词怎么写
2015/05/25 职场文书
小学班主任教育随笔
2015/08/15 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android