nodeJS学习笔记——JavaScript模块开发(1),前端View绘制流程讲解

  • cal + substract + multiply + divide 四个全局函数组成了一个计算器模块

  • 污染了全局变量

  • 从代码解析角度来看模块成员之间看不出直接关系

*/

function add(x, y) {

return parseFloat(x) + parseFloat(y)

}

function substract(x, y) {

return parseFloat(x) - parseFloat(y)

}

function multiply(x, y) {

return parseFloat(x) * parseFloat(y)

}

function divide(x, y) {

return parseFloat(x) / parseFloat(y)

}

2、命名空间

/**

  • 命名空间

  • 采用命名空间的方式:理论意义上减少了全局变量污染

  • 缺点:暴露了所有的模块成员,内部状态可以被外部改写,不安全

  •   命名空间前缀会越来越长,对于开发人员使用不友好
    

*/

var calculator = {}

// calculator._foo = ‘bar’

calculator.add = function (x, y) {

return parseFloat(x) + parseFloat(y)

}

calculator.substract = function (x, y) {

return parseFloat(x) - parseFloat(y)

}

calculator.multiply = function (x, y) {

return parseFloat(x) * parseFloat(y)

}

calculator.divide = function (x, y) {

return parseFloat(x) / parseFloat(y)

}

3、私有空间

/**

  • 划分私有空间

  • 公有私有分离

*/

;

(function(cal) {

// var calculator = {}

// 私有模块成员,外部拿不到

// 加下划线的目的是给开发人员看的

var _foo = ‘bar’

// calculator._foo = ‘bar’

cal.add = function(x, y) {

return parseFloat(x) + parseFloat(y)

}

cal.substract = function(x, y) {

return parseFloat(x) - parseFloat(y)

}

cal.multiply = function(x, y) {

return parseFloat(x) * parseFloat(y)

}

cal.divide = function(x, y) {

return parseFloat(x) / parseFloat(y)

}

// 当这个匿名自执行函数执行完毕之后,就会在全局挂载一个变量:calculator

window.calculator = cal

})(window.calculator || {})

4、模块的维护和扩展

/**

  • 模块的维护和扩展

  • 加载的时候不需要考虑顺序的问题了

  • 对于模块的维护和扩展,最好本着开闭原则,对于扩展开放,对于修改封闭

  • 最好不要去修改原始的模块文件,可能会造成原有模块功能发生错误

  • 这样做的话,如果 当前扩展的模块出了问题,可以移除当前模块,而不影响原有的模块功能

*/

;

(function(cal) {

// else 中的 声明语句造成了变量提升,所以找不到全局中的 calculator

// var calculator

// if (typeof calculator === ‘object’) {

// alert(‘123’)

// calculator.mod = function(x, y) {

// return x % y

// }

// } else {

// var calculator = {}

// calculator.mod = function(x, y) {

// return x % y

// }

// window.calculator = calculator

// }

cal.mod = function (x, y) {

return x % y

}

// 如果全局没有 calculator,所以再次暴露一下

window.calculator = cal

// 通过传递参数的方式

// 先看一下全局中有没有,如果有就使用全局中的,如果没有就给一个默认的

})(window.calculator || {})

5、模块的第三方依赖

/**

  • 模块的第三方依赖

  • 不要在模块中直接使用第三方提供的接口对象或者函数(看不出直接的依赖关系)

  • 所以一定最好把依赖项以参数的形式传递进来,这样的话依赖关系就更加明确

*/

;

(function(cal, $) {

$(function () {

})

cal.mod = function (x, y) {

return x % y

}

window.calculator = cal

})(window.calculator || {}, window.jQuery)

以后如果不适用第三方规范的情况下,

如果写模块可以采用下面这种方式

格式:

```js

;

(function (形参模块名, 依赖项, 依赖项) {

/ 通过 形参模块名 修改模块

window.模块名 = 形参模块名

})(window.模块名 || {}, 依赖项, 依赖项)

下面是一个关于模块化的面试题,一起观察和分析这段代码的作用:

```js

/**

  • 模块的第三方依赖

  • 不要在模块中直接使用第三方提供的接口对象或者函数(看不出直接的依赖关系)

  • 所以一定最好把依赖项以参数的形式传递进来,这样的话依赖关系就更加明确

*/

;

(function(cal, $) {

$(function () {

})

cal.mod = function (x, y) {

return x % y

}

window.calculator = cal

})(window.calculator || {}, window.jQuery)

模块化规范


> 了解常见的 JavaScript 模块化规范

CommonJS

CommonJS 是一套适用于 JavaScript 服务器环境的一个模块定义规范

一般是在 Node 中使用 CommonJS 规范构建模块系统

在 Node 中,CommonJS 只是规范,Node 天生就已经根据 CommonJS 实现了自己的一套模块系统API

AMD

AMD 是 RequireJS 在推广的过程中形成的一套前端模块化规范

CMD

[Common Module Definition]( )

SeaJS 在推广的过程中形成了一套前端模块化规范

ECMAScript 6 Module

015 年 ECMAScript 官方发布了最新的 JavaScript 标准规范,其中就包含了 模块系统规范

import 用来加载模块

export 用来暴露接口

UMD

Universal Module Definition

使用 UMD 规范定义的模块,其实就是兼容了 CommonJS + AMD + CMD 这些常见的模块定义规范

有这么多模块定义规范的原因就在于 JavaScript 的历史原因,天生就没有模块化规范概念。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SeaJS

> A Module Loader for the Web, Enjoy the fun of programming.

- 关于 SeaJS

  • SeaJS 是一个适用于浏览器环境的模块加载器

  • SeaJS 的作者是阿里巴巴支付宝前端架构师,花名:玉伯

  • 官网:http://seajs.org/

  • github:https://github.com/seajs/seajs/

- 为什么学习和使用 SeaJS ?

  • **简单友好的模块定义规范**:SeaJS 遵循 CMD 规范,可以像 Node 一样书写模块代码

  • **自然直观的代码组织方式**:依赖的自动加载、配置简洁清晰,可以让我们更多的享受编码的乐趣

  • SeaJS兼容性非常好,几乎可以运行在任何浏览器引擎上

  • 注1:SeaJS 只是实现模块化开发的一种方式或者说一种工具而已,重在模块化思想的理解

  • 注2:因为 SeaJS 采用的 CMD 模块规范和 Node 中的 CommonJS 模块规范非常一致,所以有利于我们学习 Node 中的模块化编程

- 谁在用?

  • 淘宝网、支付宝、京东、爱奇艺。。。

RequireJS

RequireJS 是一个类似于 SeaJS 的一个模块加载器,API也非常的相似。

RequireJS is a JavaScript file and module loader.

RequireJS 和 SeaJS 在使用方式上差别不大

## RequireJS 和 SeaJS 的差异

相同点:都是模块加载器

不同点:

规范定义角度:

SeaJS 采用的是 CMD 模块定义规范,RequireJS 采用的是 AMD 模块定义规范

代码加载执行角度:

从文件模块的加载角度来说,两者都是预加载:在代码开始执行的时候,就通过异步并行的方式把所有的 js 脚本文件下载到了本地

SeaJS 是在预加载、懒执行

RequireJS 是预加载、预执行

RequireJS 是预先加载所有的文件,执行的时候,是从最后的一个依赖的模块开始执行,

往前倒序执行,这种代码执行顺序不适合程序员的顺序编程思维。

## 使用 gulp 对 SeaJS 模块进行打包

### 快速上手

0. 下载 sea.js 库

1. 在页面中引入 sea.js

2. 使用 `define` 函数定义模块

3. 使用 `require` 函数加载模块

4. 使用 `module.exports` 对外暴露接口对象

5. 使用 `seajs.use` 函数启动模块系统

### API 详解

#### `seajs.use`

加载模块,启动模块系统。

- 加载一个模块 `seajs.use(‘id’)`

- 加载一个模块,在加载完成时,执行回调 `seajs.use(‘id’, callback)`

- 加载多个模块,加载完成时,执行回调 `seajs.use([‘id1’,‘id2’,…],callback)`

- 注意:

  • 在调用 seajs.use 之前,需要先引入 sea.js 文件

  • seajs.use 与 `DOM ready` 事件没有任何关系。如果某些操作要确保在 `DOM ready` 后执行,需要使用 jquery 等类库来保证

  • seajs.use 理论上只用于加载启动,不应该出现在 `define` 中的模块代码里

#### `define(factory)`

`define` 是一个全局函数,用来定义模块。

`define` 接受 `factory` 参数,`factory` 可以是一个函数,也可以是一个对象或字符串。

`factory` 为对象、字符串时,表示模块的接口就是该对象、字符串。

- factory 是一个对象时

- factory 是一个字符串时

- factory 是一个函数时

#### require

require 用来获取指定模块的接口对象 `module.exports`。

使用注意:

- 正确拼写

  • 模块 factory 构造方法的第一个参数 `必须` 命名为 require

- 不要修改

  • 不要重命名 require 函数,或在任何作用域中给 require 重新赋值

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

文末

如果30岁以前,可以还不知道自己想去做什么的话,那30岁之后,真的觉得时间非常的宝贵,不能再浪费时间在一些碎片化的事情上,比如说看综艺,电视剧。一个人的黄金时间也就二,三十年,不能过得浑浑噩噩。所以花了基本上休息的时间,去不断的完善自己的知识体系,希望可以成为一个领域内的TOP。

同样是干到30岁,普通人写业务代码划水,榜样们深度学习拓宽视野晋升管理。

这也是为什么大家都说30岁是程序员的门槛,很多人迈不过去,其实各行各业都是这样都会有个坎,公司永远都缺的高级人才,只用这样才能在大风大浪过后,依然闪耀不被公司淘汰不被社会淘汰。

269页《前端大厂面试宝典》

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

前端面试题汇总

JavaScript

面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-ocPbcVcm-1711950075045)]

文末

如果30岁以前,可以还不知道自己想去做什么的话,那30岁之后,真的觉得时间非常的宝贵,不能再浪费时间在一些碎片化的事情上,比如说看综艺,电视剧。一个人的黄金时间也就二,三十年,不能过得浑浑噩噩。所以花了基本上休息的时间,去不断的完善自己的知识体系,希望可以成为一个领域内的TOP。

同样是干到30岁,普通人写业务代码划水,榜样们深度学习拓宽视野晋升管理。

这也是为什么大家都说30岁是程序员的门槛,很多人迈不过去,其实各行各业都是这样都会有个坎,公司永远都缺的高级人才,只用这样才能在大风大浪过后,依然闪耀不被公司淘汰不被社会淘汰。

269页《前端大厂面试宝典》

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

前端面试题汇总

JavaScript

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值