先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
}
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 重新赋值
- 使用字符串直接量
- require 的参数值 必须 是字符串直接量
Tips: 把 `require` 看做是语法关键字就好啦
模块标识
总结
阿里十分注重你对源码的理解,对你所学,所用东西的理解,对项目的理解。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 使用字符串直接量
- require 的参数值 必须 是字符串直接量
Tips: 把 `require` 看做是语法关键字就好啦
模块标识
总结
阿里十分注重你对源码的理解,对你所学,所用东西的理解,对项目的理解。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-3tvF7Hfe-1713707237146)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!