第五篇,理解JS模块化编程思想
模块化编程
·模块化编程是一种处理复杂系统分解成更好的可管理模块的方式,它可以把系统代码划分为职责单一高度解耦切可替代的模块。
·系统中某一部分的变化将如何影响其他部分就会变得显而易见,系统的可维护性更加简单易得。
引入模块化就是为了降低系统的可维护性,把成本降低,把一个复杂的项目解耦成为一个细小单一的模块,这样好维护好开发出现问题也可以快速的锁定。
模块化发展历史
1. 早期函数封装
function foo() { //... }
好处:可以把复杂的应用进行解耦
缺点:污染全局命名空间
2.nameEspace
var obj = {
count: 1,
foo: function() { //... }
}
好处:解决污染全局命名空间
缺点:私有成员暴露,内部状态可被外部改写
3.立即执行函数
(function(root) {
//...
})(this)
好处:避免上面两个问题
缺点:提供逻辑划分,不解决代码本身问题
不使用模块化开发之前我们需要考虑的问题。
1.可维护成本。
2.命名空间。
3.依赖管理。
Commonjs
CommonJS 规范加载模块是同步的,也就是说,加载完成才执行后面的操作,Node.js主要用于服务器编程模块都是存在本地硬盘中加载比较快,所以Node.js采用CommonJS规范。
CommonJS规范分为三部分:module(模块标识)require(模块引用)exports(模块定义)
module 变量在每个模块内部,就代表当前模块;
exports 属性是对外的接口,用于导出当前模块的方法或变量;
require() 用来加载外部模块,读取并执行js文件,返回该模块的exports对象;
Commonjs里的规范每一个文件就是一个模块,它们都会有自己的作用域。,以文件做为一个作用域。但是有一个问题commonjs它这种规范只适用于服务端。因为在服务端它是具有同步去加载模块的条件的,如果换作是在浏览器客户端使用commonjs 这个规范,我们知道在浏览器客户端使用的是ECMA规范,JS天生异步,所以不能去同步加载模块,比如说前面加载的模块造成了阻塞,后面的东西就显示不出来了。所以在客户端这个先天条件下是不适用的。
AMD(require.js)
AMD 也就是异步模块定义。它采用异步的方式去加载模块。通过define方法去定义模块。requrie方法去加载模块。
AMD模块定义
如果这个模块还需要依赖其他模块,那么define函数的第一个参数,必须是一个数组,指名该模块的依赖。
define([tools],function() { //... });
AMD模块的加载
require([module], callback);
第一个参数[module],是一个数组里面的成员就是需要加载的模块;第二个参数callback,则是加载成功之后的回调函数。例如加载math.js。
require([math], function(math) { //... });
require()异步加载math,浏览器不会失去响应;它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。
AMD有一个不足就是依赖前置,如果用不到的模块这样就带来了不必要的性能消耗。
依赖前置? "懒加载的书写方式 用到了谁就加载谁" 异步加载
ES6 module
第五篇,理解JS模块化编程思想的更多相关文章
- 初步理解require.js模块化编程
初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员R ...
- [转]js模块化编程之彻底弄懂CommonJS和AMD/CMD!
原文: https://www.cnblogs.com/chenguangliang/p/5856701.html ------------------------------------------ ...
- require.js实现js模块化编程(二):RequireJS Optimizer
require.js实现js模块化编程(二):RequireJS Optimizer 这一节,我们主要学习一下require.js所提供的一个优化工具r.js的用法. 1.认识RequireJS Op ...
- 爬虫逆向基础,理解 JavaScript 模块化编程 webpack
关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 简介 在分析一些站点的 JavaScript 代码时,比较简单的代码,函数通常都是一个一个的,例 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- require.js实现js模块化编程(一)
1.认识require.js: 官方文档:http://requirejs.org/RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的Requ ...
- js模块化编程之彻底弄懂CommonJS和AMD/CMD!
先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写 ...
- 好文推荐系列-------(5)js模块化编程
本文主要来源于阮一峰的<Javascript模块化编程>系列文章整合,原文地址:http://www.ruanyifeng.com/blog/2012/10/javascript_modu ...
- js 模块化编程
Javascript模块化编程(一):模块的写法 作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞 ...
随机推荐
- PHP中根据二维数组中某个字段实现排序
想要实现二维数组中根据某个字段排序,一般可以通过数组循环对比的方式实现.这里介绍一种更简单的方法,直接通过PHP函数实现.array_multisort() :可以用来一次对多个数组进行排序,或者根据 ...
- Wannafly挑战赛13 zzf的好矩阵 题解 答案解释
Wannafly挑战赛13 zzf的好矩阵 题解 文章目录 Wannafly挑战赛13 zzf的好矩阵 题解 分析 结论1 结论2 结论3 C数组对应带子说明 空白长度论述 后续黑色长度论述 能&qu ...
- JS:JS中常见的 “函数名 is not a function” 错误
js中常见的错误,例如Uncaught TypeError: x is not a function 其原因除了函数本身有错之外,还有一种很奇怪的情况:函数本身没有错,但是运行时就是不能正常运行.这种 ...
- gulp常用插件之gulp-uglify使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-uglify这是一款使用UglifyJS缩小js文件. 更多使用文档请点击访问gulp-uglify工具官网. 安装 一键安装不多解释 ...
- 双 leave 栈迁移的坑
目录 简介 问题 解决办法 简介 之前在复现自己做出来的题时,一样的思路发现拿不了 shell 了,后来发现是栈迁移的坑. 问题 假设 32 位系统中,漏洞函数可以任意写入 0x0000000 ...
- xampp安装配置比较容易卡住的地方
xampp作为一款集成建站软件,方便了不少初学的开发者,但是虽然是集成和傻瓜式的安装,还是会遇到一些容易卡壳的地方,这里记录自己觉得一些比较重要的东西. 1.端口问题 如图是我改之后的端口,原来端口为 ...
- Runtime.addShutdownHook用法
一.什么是ShutdownHook? 在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源.平滑退出的功能. 使用Runtime.addShutdownHook(Thread hook)方法 ...
- 接口测试(http 和 rpc)
接口测试主要分HTTP和RPC两类,RPC类型里面以Dubbo较为知名.互联网微服务架构,两种接口都需要做接口测试的,不管是业务测试还是回归测试: Dubbo:Java栈的互联网公司比如阿里.美团.5 ...
- C#调用C++类库例子
一.新建一个解决方案,并在解决方案下添加一个.netframework的项目,命名为FrameworkConsoleTest.再添加一个C++的动态链接库DLL项目,命名为EncryptBase. 二 ...
- linux学习之编译-链接
在Windows下使用习惯了IDE,导致我们对程序的编译链接没有一个清晰的认识,甚至混淆了编辑器和编译器的概念.在学习Linux时,这些问题就暴露出来了. 实际上,我们应该严格区分一个程序从产生到执行 ...