理解模块化和依赖管理:

  • 应用一般都会依赖外部库(jQuery和AngularJs),这些库应该使用包管理器处理和更新,而不是手动下载。
  • 应用本身也可以分解成为多个相互交互的小部分,学习封装代码的技能,把代码视作自成一体的组件,学习如何设计优秀的接口,如何安排接口;学习如何隐藏数据,只开放用户需要的部分。
  • 如何解析依赖,避免手动维护一组有序的script标签。

封装代码

  封装是为了让功能自成一体,隐藏实现的细节。任何代码,不管是函数还是模块,都要有明确的职责;隐藏实现的细节,提供简明的API一满足使用的需求。功能自成一体的代码易于理解和修改。

1).理解单一职责原则

2).信息隐藏和接口

3).作用域和this关键字

  • js没有动态作用域,只有静态作用域[词法作用域]。
  • 理解作用域有助于理解模块模式,模块模式是一种将代码组件化的方式。
  • 函数是js的一等公民,处理方式和任何对象一样。
  • 严格模式下,this的默认值是undefined,禁止使用eval和arguments等关键字。

js模块

1).闭包和模块化

  • 函数也叫闭包,这是为了强调函数也会创建作用域.
  • 立即调用表达式
(function(){//新的作用域
})();

注意:这个函数放在了一堆括号中,不仅告诉了解释器我们声明了一个匿名的函数,还表明我们可以把它当作一个值使用。

  • 写法1:
var api = (function(){})();
api();
  • 写法2:
var api = (function(){window.api = {};  })();

2).原型的模块化

  • 很多对象共用一个原型,使用原型能提升性能。
  • 原型可以理解为js声明类的方式。
  • 原型只是链接,不能覆盖属性
  • 不能把原型当成类,否则会为代码的维护带来问题。

我们对作用域、作用域提升和闭包的工作方式深入了解后,引入模块之间的交互方式。

3).CommonJS模块

  • 能够使用合理的方式组织代码,又能处理依赖注入。
  • 是node采用的规范,用于编写模块化的js文件。
  • 一个文件就是一个模块,将之赋给module.exports,作为模块的公开接口。
  • 使用模块时,用require调用,参数是相对路径。

这种模块化的好处在于: 变量没有暴露在全局作用域中,也不用把代码放在闭包中。
浏览器原生并不支持CJS,使用browserify将模块编译成浏览器能够处理的形式。

使用CJS相对于原生的好处:

  • 没有全局变量,认知负荷少;
  • 开发API和使用模块变得简单;
  • 模拟依赖的功能让测试模块变得更容易;
  • 得益于browserify,能够使用npm中的包;
  • 便于测试的模块化;
  • 使用node时,便于客户端和服务器共享代码;

4).管理依赖

  • 控制反转(Ioc): 不使用对象实例化或引用依赖,而是通过构造方法或者公开的属性把依赖值赋给对象。
  • IOC框架用于解析依赖,解决处理依赖中的各种问题,这些框架的基本目的是避免使用new关键字,全部交给IOC容器处理。IOC容器知道如何实例化模块。
  • RequireJS:一个异步的模块加载器(AMD),用于定义模块,指定依赖。
require(['lib/text'],function(text){var result = text('foo bar');console.log(result);
});

说明:
  按约定,lib/text对应的文件路径为lib/text.js,这是相对于本文件的路径。这段代码会请求lib/text.js文件解释其中的代码。加载完所有依赖后,调用这个模块中的函数,通过参数把依赖传入到这个模块的函数中。
‘lib/text’模块的定义如下:

define([],function(){return function(input){return input.toUpperCase();}
});

说明:
  这个模块的定义使用了空数组,因为它没有依赖,返回的函数是模块的公共接口。
RequireJs的优点:

  • 自动解析依赖图,不用在花时间排序script标签。
  • 支持异步加载模块。
  • 在开发过程中无需编译。
  • 易于单元测试,只需加载需要测试的模块。
  • 强制使用闭包,因为模块定义在一个函数中。

RequireJs的缺点:

  • 如果打包代码,就无法使用异步加载功能。
  • 开发需要遵守AMD规范。
  • AMD的包装代码扰乱了代码。
  • 在生产环境中需要编译。
  • 发布环境的代码和本地环境的代码不一致。

发布优化的代码,使用gulp编译AMD模块,就不用异步获取这些模块了。

  • 好在requirejs有r.js来解决这个问题
  • var amdOptimize = require("amd-optimize"); //require优化

5).Browserify:在浏览器中使用CJS模块.

  • CJS作为AMD的替代方案而使用。
  • CJS相对于AMD,更简洁,不会扰乱代码,定义模版时也不需要样板代码。
  • npm中的所有包默认都支持CJS的定义的方式使用。
  • Browserify会递归分析应用中所有的require()调用,然后打包这些文件。在一个script标签中引入打包好的文件就能在浏览器中使用了。
  • 使用browserify编译CJS模块。

附加: 阮一峰的js模块编写

理解模块化和依赖管理(一)相关推荐

  1. Gradle 1.12用户指南翻译——第五十章. 依赖管理

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  2. Gradle系列教程之依赖管理

    这一章我将介绍Gradle对依赖管理的强大支持,学习依赖分组和定位不同类型仓库.依赖管理看起来很容易,但是当出现依赖解析冲突时就会很棘手,复杂的依赖关系可能导致构建中依赖一个库的多个版本.Gradle ...

  3. java maven 项目依赖管理 简介

    目录 一.简单的小问题? 二.maven到底是什么? 三.maven的安装 四.仓库的概念 五.使用命令行管理maven项目 六.使用Myeclipse创建maven自定义项目 七.pom.xml的依 ...

  4. Gradle for Android 第三篇( 依赖管理 )

    Gradle for Android 第三篇( 依赖管理 ) 依赖管理是Gradle最闪耀的地方,最好的情景是,你仅仅只需添加一行代码在你的build文件,Gradle会自动从远程仓库为你下载相关的j ...

  5. 配置所需要的依赖_Maven依赖管理之依赖传递

    1 传递依赖 2.1 什么是传递依赖 当A 依赖B.B依赖C,在A中导入B后会自动导入C,C是A的传递依赖,如果C依赖D则D也可能是A的传递依赖. 演示: web中添加struts-spring的ja ...

  6. 4.Maven概念模型,maven的生命周期,Maven坐标,依赖管理(依赖范围,依赖声明),仓库管理,私服概念

     1 maven概念模型 2 maven的生命周期,项目构建过程 Maven生命周期就是为了对所有的构建过程进行抽象和统一 包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤 Mave ...

  7. 90.bower解决js的依赖管理

    转自:https://blog.csdn.net/u011537073/article/details/52951122 前言 一个新的web项目开始,我们总是很自然地去下载需要用到的js类库文件,比 ...

  8. install npm 到某个文件下执行_你可能不知道的 npm 依赖管理那些事

    点击上方蓝字关注我们 npm 是 Node.js 默认的.以 JavaScript 编写的包管理工具,如今,它已经成为世界上最大的包管理工具,是每个前端开发者必备的工具.不知你是否遇到过下面问题: 哎 ...

  9. maven 公共模块依赖_「spring-boot 源码解析」spring-boot 依赖管理

    问题 maven 工程,依赖管理是非常基本又非常重要的功能,现在的工程越来越庞大,依赖越来越多,各种二方包.三方包太多太多,依赖冲突处理起来真是让人头疼,经常需要涉及到多个地方需要调整. 微信公众号: ...

最新文章

  1. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来
  2. 线性代数 第三章 矩阵的初等变换与线性方程组
  3. MySQL(二): 表的增删查改
  4. 2021牛客暑期多校训练营1 J-Journey among Railway Stations(线段树+思维转化)
  5. GCF(2)---GCF中LAUNCH BROWSER测项注意事项
  6. 使用cppcheck检测代码警告、错误
  7. vim 配置_一步步配置VIM(3)-与latex结合
  8. how to clear screen in python shell
  9. ActiveMQ学习笔记(1)----初识ActiveMQ
  10. FlexiGrid使用教程
  11. python 基础-----list查找重复值
  12. Knowledge evolution
  13. Unity UGUI坐标和世界坐标转化
  14. ckeditor java 使用教程_Java上CKEditor集成指南
  15. js用post传送数组给php格式转换
  16. ubuntu19.04下VirtualBox与虚拟机win7共享文件夹
  17. 解决“网易邮箱提醒:一次被阻止的收信行为”
  18. 2015(毕业)秋季校园招聘各种企业笔试面试心得
  19. 【C++/嵌入式笔试面试八股】大纲介绍
  20. mysqlbug日记

热门文章

  1. 【scapy】OSError: b‘Error opening adapter: \xcf\xb5\xcd\xb3\xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb
  2. 解决python UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\xb5‘ in position 255: illegal mult
  3. 手机屏幕常见故障_手机屏幕失灵怎么回事 手机屏幕失灵解决办法
  4. pc端不同浏览器兼容性问题及解决方案
  5. 【知识产权之专利权】论述题题库
  6. c# emgucv 切图_自己积累的一些Emgu CV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)...
  7. iPhone升级iOS 16后Siri无法正常工作怎么办?3种解决办法
  8. 《金融学》期末小题库
  9. open3d使用知识拾遗
  10. 中央财经大学C语言考研真题答案,2017年中央财经大学信息学院901C语言程序设计考研题库...