模块化编程的好处 讲解编程入门基础知识

背景随着前端功能越来越复杂,前端代码日益膨胀,为了减少维护成本,提高代码的可复用性,前端模块化势在必行。所有js文件都在一个html中引入,造成以下不良影响:请求过多。首先我们要依赖多个模块,那样就会发送多个请求,导致请求过多依赖模糊。我们不知道他们的具体依赖关...

背景

随着前端功能越来越复杂,前端代码日益膨胀,为了减少维护成本,提高代码的可复用性,前端模块化势在必行。

所有js文件都在一个html中引入,造成以下不良影响:

请求过多

。首先我们要依赖多个模块,那样就会发送多个请求,导致请求过多

依赖模糊

。我们不知道他们的具体依赖关系是什么,也就是说很容易因为不了解他们之间的依赖关系导致加载先后顺序出错。

难以维护

。以上两种原因就导致了很难维护,很可能出现牵一发而动全身的情况导致项目出现严重的问题。

模块的概念

webpack中是这样定义的:

模块应该是职责单一、相互独立、低耦合的、高度内聚且可替换的离散功能块。

模块化的概念

模块化是一种分治的思想,通过分解复杂系统为独立的模块实现细粒度的精细控制,对于复杂系统的维护和管理十分有益。模块化也是组件化的基石,是构成现在色彩斑斓的前端世界的前提条件。

为什么需要模块化

前端开发和其他开发工作的主要区别,首先是前端是基于多语言多层次的编码和组织工作,其次前端产品的交付是基于浏览器,这些资源是通过增量加载的方式运行到浏览器端,如何在开发环境组织好这些碎片化的代码和资源,并且保证他们在浏览器端快速、优雅的加载和更新,就需要一个模块化系统。

模块化的好处

可维护性。

因为模块是独立的,一个设计良好的模块会让外面的代码对自己的依赖越少越好,这样自己就可以独立去更新和改进。

命名空间。

在 JavaScript 里面,如果一个变量在最顶级的函数之外声明,它就直接变成全局可用。因此,常常不小心出现命名冲突的情况。使用模块化开发来封装变量,可以避免污染全局环境。

重用代码。

我们有时候会喜欢从之前写过的项目中拷贝代码到新的项目,这没有问题,但是更好的方法是,通过模块引用的方式,来避免重复的代码库。我们可以在更新了模块之后,让引用了该模块的所有项目都同步更新,还能指定版本号,避免 API 变更带来的麻烦。

模块化简史

1. 最简单粗暴的方式

通过 script 标签引入文件,调用相关的函数。这样需要手动去管理依赖顺序,容易造成命名冲突,污染全局,随着项目的复杂度增加维护成本也越来越高。

2. 用对象来模拟命名空间

这样可以解决上面的全局污染的问题,有那么点命名空间的意思,但是随着项目复杂度增加需要越来越多的这样的对象需要维护,不说别的,取名字都是个问题。最关键的还是内部的属性还是可以被直接访问和修改。

3. 闭包

这样就拥有独立的词法作用域,内存中只会存在一份 copy。这不仅避免了外界访问此 IIFE 中的变量,而且又不会污染全局作用域,通过 return 暴露出公共接口供外界调用。这其实就是现代模块化实现的基础。

4. 更多

还有基于闭包实现的松耦合拓展、紧耦合拓展、继承、子模块、跨文件共享私有对象、基于 new 构造的各种方式,这种方式在现在看来都不再优雅。

实现模块化的方案规范总览

历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。

在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。

目前实现模块化的规范主要有:

CommonJSCMDAMDES6模块

CommonJS()

CommonJS 是以在浏览器环境之外构建 JavaScript 生态系统为目标而产生的项目,比如在服务器和桌面环境中。

采用同步加载模块的方式,也就是说只有加载完成,才能执行后面的操作。CommonJS 代表:Node 应用中的模块,通俗的说就是你用 npm 安装的模块。

它使用 require 引用和加载模块,exports 定义和导出模块,module 标识模块。使用 require 时需要去读取并执行该文件,然后返回 exports 导出的内容。

CommonJS主要用于服务端的模块化,不适用于前端模块化的原因在于:

服务端加载一个模块,直接就从硬盘或者内存中读取了,消耗时间可以忽略不计浏览器需要从服务端下载这个文件,所以说如果用CommonJS的require方式加载模块,需要等代码模块下载完毕,并运行之后才能得到所需要的API。如果我们在某个代码模块里使用CommonJS的方法require了一个模块,而这个模块需要通过http请求从服务器去取,如果网速很慢,而CommonJS又是同步的,所以将阻塞后面代码的执行,从而阻塞浏览器渲染页面,使得页面出现假死状态。

CommonJS在浏览器端实现的步骤:

1. 创建项目结构

2. 下载browserify

全局: npm install browserify -g局部: npm install browserify –save-dev

3. 定义模块代码(同服务器端)

注意:index.html文件要运行在浏览器上,需要借助browserify将app.js文件打包编译,如果直接在index.html引入app.js就会报错!

4. 打包处理js

根目录下运行browserify js/src/app.js -o js/dist/bundle.js

5. 页面使用引入

在index.html文件中引入<script type=”text/javascript” src=”js/dist/bundle.js”></script>

AMD(Asynchronous Module Definition)

异步模块定义,所谓异步是指模块和模块的依赖可以被异步加载,他们的加载不会影响它后面语句的运行。有效避免了采用同步加载方式中导致的页面假死现象。AMD代表:RequireJS。

AMD一开始是CommonJS规范中的一个草案,全称是Asynchronous Module Definition,即异步模块加载机制。后来由该草案的作者以RequireJS实现了AMD规范,所以一般说AMD也是指RequireJS。

RequireJS是一个工具库,主要用于客户端的模块管理。它的模块管理遵守AMD规范,RequireJS的基本思想是,通过define方法,将代码定义为模块;通过require方法,实现代码的模块加载

它主要有两个接口:definerequire。define 是模块开发者关注的方法,而 require 则是模块使用者关注的方法。

define() 函数:

需要注意的是,dependencies有多少个元素,factory就有多少个传参,位置一一对应。使用栗子:

require() 函数

需要注意的是 ,module 有多少个元素,callback 就有多少个传参,位置一一对应。

AMD的优缺点

AMD 运行时核心思想是「Early Executing」,也就是提前执行依赖 AMD 的这个特性有好有坏:

首先,尽早执行依赖可以尽早发现错误。另外,尽早执行依赖通常可以带来更好的用户体验,也容易产生浪费。引用AMD的Javscript库: 目前,主要有两个Javascript库实现了AMD规范:require.js和curl.js在浏览器环境中异步加载模块;并行加载多个模块;开发成本高,代码的阅读和书写比较困难,模块定义方式的语义不顺畅;不符合通用的模块化思维方式,是一种妥协的实现。

AMD在浏览器端的实现步骤

1. 下载require.js, 并引入

官网: http://***.requirejs.cn/github : https://github.com/requirejs/requirejs

然后将require.js导入项目: js/libs/require.js

2. 创建项目结构

3. 定义require.js的模块代

4. 页面引入require.js模块:

在index.html引入 <script data-***in=”js/***in” src=”js/libs/require.js”></script>

此外在项目中如何引入第三方库?只需在上面代码的基础稍作修改:

上例是在alerter.js文件中引入jQuery第三方库,***in.js文件也要有相应的路径配置。小结:通过两者的比较,可以得出AMD模块定义的方法非常清晰,不会污染全局环境,能够清楚地显示依赖关系。AMD模式可以用于浏览器环境,并且允许非同步加载模块,也可以根据需要动态加载模块。

UMD规范

CMD(Common Module Definition)

CMD是SeaJS在推广过程中生产的对模块定义的规范,在Web浏览器端的模块加载器中,SeaJS与RequireJS并称,SeaJS作者为阿里的玉伯。

CMD规范专门用于浏览器端,模块的加载是异步的,模块使用时才会加载执行。CMD规范整合了CommonJS和AMD规范的特点。在 Sea.js 中,所有 JavaScript 模块都遵循 CMD模块定义规范。

CMD语法

定义暴露模块:

引入使用模块:

CMD的优缺点

优点:依赖就近,延迟执行 可以很容易在 Node.js 中运行;缺点:依赖 SPM 打包,模块的加载逻辑偏重;

sea.js使用步骤

1. 下载sea.js, 并引入

官网: seajs.org/github : github.com/seajs/seajs

然后将sea.js导入项目: js/libs/sea.js

2. 创建项目结构

3. 定义sea.js的模块代码

4. 在index.html中引入

ES6模块化(重点介绍)

ES6模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。所以说ES6是编译时加载,不同于CommonJS的运行时加载(实际加载的是一整个对象),ES6模块不是对象,而是通过export命令显式指定输出的代码,输入时也采用静态命令的形式。

ES6 的模块自动采用严格模式,不管你有没有在模块头部加上”use strict”;。

严格模式主要有以下限制。

变量必须声明后再使用函数的参数不能有同名属性,否则报错不能使用with语句不能对只读属性赋值,否则报错不能使用前缀 0 表示八进制数,否则报错不能删除不可删除的属性,否则报错不能删除变量delete prop,会报错,只能删除属性delete global[prop]eval不会在它的外层作用域引入变量eval和arguments不能被重新赋值arguments不会自动反映函数参数的变化不能使用arguments.callee不能使用arguments.caller禁止this指向全局对象不能使用fn.caller和fn.arguments获取函数调用的堆栈增加了保留字(比如protected、static和inte***ce)

上面这些限制,模块都必须遵守。由于严格模式是 ES5 引入的,不属于 ES6,所以请参阅相关 ES5 书籍,本书不再详细介绍了。

其中,尤其需要注意this的限制。ES6 模块之中,顶层的this指向undefined,即不应该在顶层代码使用this。

语法

模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

export

一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量。下面是一个 JS 文件,里面使用export命令输出变量。

import

使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。

ES6 模块与 CommonJS 模块的差异

它们有两个重大差异:

1. CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用

2. CommonJS 模块是运行时加载,ES6 模块是编译时输出接口

第二个差异是因为 CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。

下面重点解释第一个差异,我们还是举上面那个CommonJS模块的加载机制例子:

ES6 模块的运行机制与 CommonJS 不一样。ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块

本文来自挽梦忆笙歌投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/503755.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 04-14
下一篇 04-14

相关推荐

  • 初学c语言学习编程软件 常用的C语言编程代码

    常见的编程语言有哪些?想学计算机编程的同学看过来!PHP语言PHP是士兵在web app上发力的一组武器之一。你可以在使用的过程中完成工作,但是看起来很乱。在编程语言中,PHP是不断更新的。c编程语言换句话说,C语言是我在边肖接触到的第一种计算机语言,性能目前只能算一般。c

    2023-07-25 22:38:01
    610 0
  • 西瓜创客编程怎么样(西瓜创客编程怎么编写代码)

    最近身边很多家长开始讨论要不要给孩子报编程班。看到别人都报名了,不想自己的孩子掉队,但是对编程课一窍不通。我想知道他们为什么要学编程课?你希望你的孩子将来成为程序员吗?其实我和很多家长都有同样的疑惑。经过3个多月的研究分析和咨询相关专家,我得出了以下关于编

    2023-07-22 05:01:01
    174 0
  • 编程工具有哪些常用的 中国自己的编程软件

    机器视觉是一门综合技术,包括图像处理、机械工程技术、控制、电光源照明、光学成像、传感器、模拟和数字视频技术、计算机软硬件技术(图像增强和分析算法、图像卡、I/O卡等。).一个典型的机器视觉应用系统包括图像采集、光源系统、图像数字化模块、数字图像处理模块、智能判断

    2023-07-20 11:58:01
    509 0
  • java编程用什么软件 java常用的编程软件

    初学者只需要使用一些开发工具就可以学习了。新手一般从控制台应用开发入手,在cmd下调试,为你的电脑搭建一个良好的开发环境。你需要从网站上下载JDK。安装完成后,调试成功后就可以开始编写Java程序了。边肖编译了一些Java开发工具如下:1。想法Java编程软件行业最好的Java开

    2023-07-14 17:15:01
    601 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信