java有类文件、Python有import关键词、Ruby有require关键词、C#有using关键词、PHP有include和require、CSS有@import关键词,但是对ES5版本的javascript来说,javascript通过script标签引入代码的方式显得杂乱无章,语言自身毫无组织和约束能力,人们不得不用命令空间等方式人为地约束代码,以求达到安全和易用的目的。本文将详细介绍javascript中的模块组织

反模式

  反模式(Anti-Pattern)指没有使用任何模块系统

  简单地,把不同的函数(以及记录状态的变量)放在一起,就算是一个模块

  function m1(){//...}function m2(){//...}

  上面的函数m1()和m2(),组成一个模块。使用的时候,直接调用就行了。

  这种做法的缺点很明显:"污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系

字面量

  为了解决上面的缺点,可以把模块写成一个字面量,所有的模块成员都放到这个对象里面

  var module1 = new Object({_count : 0,m1 : function (){//...},m2 : function (){//...}});

  上面的函数m1()和m2(),都封装在module1对象里。使用的时候,就是调用这个对象的属性

module1.m1();

  但这种写法会暴露所有模块成员,内部状态可被外部改写。比如,外部代码可以直接改变内部计数器的值

module1._count = 5;

IIFE

  使用"立即执行函数"(Immediately-Invoked Function Expression,IIFE)可以达到不暴露私有成员的目的

  var module1 = (function(){var _count = 0;var m1 = function(){//...};var m2 = function(){//...};return {m1 : m1,m2 : m2};})();

  使用上面的写法,外部代码无法读取内部的_count变量

console.info(module1._count); //undefined

IIFE传参

  如果一个模块需要继承另一个模块,则需要IIFE传参

  var module1 = ( function (mod){mod.m3 = function () {//...};return mod;})(window.module1 || {});

命名空间

  如果采用IIFE的方法,随着模块的增多,仍然污染了全局环境。

  而命名空间(Namespace)可以通过只暴露类似于一个'namespace'的全局变量,来实现所有模块的声明,进而解决全局环境的污染问题

//math.js
namespace('math', [], function(){function add(a, b) { return a + b; }function sub(a, b) { return a - b; }return {add: add,sub: sub}
})//calculator.js
namespace('calculator', ['math'], function(m){var action = 'add';function compute(a,b) {return m[action](a, b);}return {compute: compute}
})

var namespace = (function(){//缓存所有模块var cache = {};function createModule(name/*模块名*/,deps/*依赖列表*/,definition/*定义*/){//如果只有模块名,则直接输出if(arguments.length === 1){return cache[name];}//取得所有模块的依赖deps = deps.map(function(depName){return namespace(depName); })//初始化模块并返回cache[name] = definition.apply(null,deps);return cache[name];}return createModule;
})()

最后

  虽然,使用命名空间可以解决全局环境污染的问题,但是却无法解决模块依赖管理的问题

  如下图所示,module2依赖于module1和module3,则代码如下

<script src="module1.js"></script>
<script src="module3.js"></script>
<script src="module2.js"></script>

  但,如果模块组织如下所示

  甚至,如下所示

  这时,手动地处理模块之间的依赖关系就不现实了,需要使用AMD、CMD、ES6 MODULE等来处理

转载于:https://www.cnblogs.com/xuzhudong/p/8946993.html

[转]js模块化(一)相关推荐

  1. 从头开始写框架(一):浅谈JS模块化发展

    博客申请下来已经过去一个月了,一直不知道写点什么,毕竟我的文笔不是很好orz. 不过既然申请下来了,不写点什么总是觉得很可惜.正好最近在自己写框架,就把自己的进程和一些心得体会分享出来吧. 写在前面: ...

  2. Atitit.js模块化 atiImport 的新特性javascript import

    Atitit.js模块化 atiImport 的新特性javascript import 1. 常见的js import规范amd ,cmd ,umd1 1.1. Require更多流行3 2. at ...

  3. 关于 JS 模块化的最佳实践总结

    模块化开发是 JS 项目开发中的必备技能,它如同面向对象.设计模式一样,可以兼顾提升软件项目的可维护性和开发效率. 模块之间通常以全局对象维系通讯.在小游戏中,GameGlobal 是全局对象.在小程 ...

  4. js模块化:默认导出 export default

    前言 接 js模块化:require.import和export 研究一下默认导出 默认导出形式1:export { xx as default } 默认导出形式2:export default { ...

  5. js define函数_聊聊JS模块化发展历程

    1 引言 如今,Javascript 模块化规范非常方便.自然,但这个新规范仅执行了2年,就在 4 年前,js 的模块化还停留在运行时支持,10 年前,通过后端模版定义.注释定义模块依赖.对经历过来的 ...

  6. js模块化编程之彻底弄懂CommonJS和AMD/CMD!

    为什么80%的码农都做不了架构师?>>>    先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前 ...

  7. [Node.js] 模块化 -- path路径模块

    路径问题 nodejs中相对路径,相对的是运行这个node文件的小黑框的路径而言的. 相关变量 __dirname 获取的是当前这个文件所在的这个文件夹的绝对路径 __filename 拿到的是当前这 ...

  8. 浅谈js模块化:commons、AMD、CMD、ES6几种模块化的用法及各自的特点

    文章目录 一个页面需要引入多个js文件引发的问题: 模块化的好处: 几种常用的模块化规范 1. commonJs 2. AMD 3. ES6 4.CMD 总结 js模块化是现在比较流行的一种用法,它能 ...

  9. js模块化编程之彻底弄懂CommonJS和AMD/CMD

    转载地址:http://www.cnblogs.com/chenguangliang/p/5856701.html 先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想 ...

  10. Js模块化开发的理解

    Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...

最新文章

  1. [力扣] 501. 二叉搜索树中的众数
  2. 解题:HEOI 2016 求和
  3. mysql 5.7.20主从配置_mysql-5.7.20源码安装 + 多实例 + 主从复制
  4. git错误fatal: remote origin already exists.
  5. ----uni-app之用canvas同时画多张海报实现分享----
  6. Android之error: void value not ignored as it ought to be(In function ‘callMethod2‘)解决办法
  7. 计算机数据库管理基本知识,2015年计算机四级考试《数据库技术》基础知识:概念篇...
  8. 帝国cms纯php调用,帝国CMS模板中:使用php调用最新文章的代码(非灵动和万能标签)...
  9. PX4代码解析(4)
  10. chrome 不记录填写值_使用 chrome-devtools Memory 面板
  11. SAP License:成本要素的拉入拉出
  12. 数据库迁移登录名_如何将数据库的登录名迁移到其他服务器
  13. Hbase 操作命令
  14. 《Recurrent Chunking Mechanisms for Long-Text Machine Reading Comprehension》ACL2020论文阅读
  15. WFP 样式(复习用)
  16. 天梭手表Tissot手表更换电池的方法
  17. kfc扫描点餐系统java_Java实现KFC点餐系统过程解析
  18. 打开ArcMap、ArcCatalog、ArcScene、ArcGlobe、ArcEngine出现All ArcGIS for Desktop Advanced licenses are in use
  19. 33家国内外知名的手机广告平台的SDK名单汇总,吐血推荐
  20. 《凸优化》7 学习笔记

热门文章

  1. 【渝粤教育】电大中专药剂学基础知识作业 题库
  2. 【Python实例第20讲】手写数字识别问题的K-Means聚类
  3. 【Python实例第2讲】特征提取集成方法
  4. Lecture 3:动态规划
  5. mysql int类型 int(11) 和int(2)区别
  6. [转]——软件开发人员如何成长
  7. FHQ Treap摘要
  8. 安卓快速排序与冒泡排序
  9. web基础知识梳理(笔记)
  10. sql CAST用法