【公开课】coderwhy_Vue3+TypeScript.mp4
Vue3+TypeScript
王红元 coderwhy
ke.qq.com/course/3453141?tuin 1635c7de
《TypeScript数据结构与算法》《React技术栈权威指南》作者腾讯AI高校训练营多所985、211名牌大学特聘讲师。丰富的软件开发和教学经验,带领团队开发出众多公司大型项目和软件系统。
全面负责国内知名视频直播软件<新浪秀场>项目架构和各端的设计和开发。
澳大利亚《智慧养老系统》研发负责人、CTO。
口找后端的工作:优先推荐Java、其次推荐Go、再次推荐Node(JavaScript),可能不推荐PHP、C#;
口找前端的工作:优先推荐JavaScript(TypeScript)、其次Flutter、再次Android(Java、Kotlin)、iOS(OC、Swift);
也有很多的其他方向:游戏开发、人工智能、算法工程师等等;
带领团队开发欧洲社交软件得心App。
codenwhy Vue3带来的变化(源码)在2020年的9月19日,万众期待的Vue3终于发布了正式版,命名为“One Piece”。
口它也带来了很多新的特性:更好的性能、更小的包体积、更好的TypeScript集成、更优秀的API设计。
源码通过monorepo的形式来管理源代码:
□Mono:单个
Repo:repository仓库
主要是将许多项目的代码存储在同一个repository中;这样做的目的是多个包本身相互独立,可以有自己的功能逻辑、单元测试等,同时又在同一个仓库下方便管王而且模块划分的更加清晰,可维护性、可扩展性更强;源码使用TypeScript来进行重写:
口在Vue2.x的时候,Vue使用Flow来进行类型检测;口在Vue3.x的时候,Vue的源码全部使用TypeScript来进行重构,并且Vue本身对TypeScript支持也更好了;
coderwhy Vue3带来的变化(性能)使用Proxy进行数据劫持
口在Vue2.x的时候,Vue3是使用Object.defineProperty来劫持数据的getter和setter方法的;口这种方式一致存在一个缺陷就是当给对象添加或者删除属性时,是无法劫持和监听的;所以在Vue2.x的时候,不得不提供一些特殊的API,比如$set或$delete,事实上都是一些hack方法,也增加了开发者学习新的API的成本;而在Vue3.x开始,Vue使用Proxy来实现数据的劫持,这个API的用法和相关的原理我也会在后续讲到;删除了一些不必要的API:口移除了实例上的$on,$off 和$once;口移除了一些特性:如filter、内联模板等;
coderwhy Vue3带来的变化(新的API)由Options API到Composition API:口在Vue2.x的时候,我们会通过Options API来描述组件对象;Options API包括data、props、methods、computed、生命周期等等这些选项;存在比较大的问题是多个逻辑可能是在不同的地方:
比如created中会使用某一个method来修改data的数据,代码的内聚性非常差;Composition API可以将 相关联的代码 放到同一处进行处理,而不需要在多个Options之间寻找;Hooks函数增加代码的复用性:
口在Vue2.x的时候,我们通常通过mixins在多个组件之间共享逻辑;口但是有一个很大的缺陷就是mixins也是由一大堆的Options组成的,并且多个mixins会存在命名冲突的问题;口在Vue3.x中,我们可以通过Hook函数,来将一部分独立的逻辑抽取出去,并且它们还可以做到是响应式的;口具体的好处,会在后续的课程中演练和讲解(包括原理);
coderwhy JavaScript是一门优秀的语言吗?
JavaScript是一门优秀的编程语言吗?
口每个人可能观点并不完全一致,但是从很多角度来看,JavaScript是一门非常优秀的编程语言。
而且,可以说在很长一段时间内这个语言不会被代替,并且会在更多的领域被大家广泛使用。
著名的Atwood定律:
Stack Overflow的创立者之一的 Jeff Atwood 在2007年提出了著名的 Atwood定律。
any application that can be written in JavaScript,will eventually be written in JavaScript.
任何可以使用JavaScript来实现的应用都最终都会使用JavaScript实现。
口其实我们已经看到了,至少目前JavaScript在浏览器端依然无可替代,并且在服务端(Nodejs)也在备广泛的应用。
口甚至在桌面端(Electron)、移动端(React Native、Weex);所以,从很多的角度都能看出来JavaScript是一门非常优秀的编程语言。
coderwhy JavaScript存在缺陷吗?
优秀的JavaScript没有缺点吗?
口其实上由于各种历史因素,JavaScript语言本身存在很多的缺点;口比如ESS以及之前的使用的var关键字关于作用域的问题;口比如最初JavaScript设计的数组类型并不是连续的内存空间;比如直到今天JavaScript也没有加入类型检测这一机制;JavaScript正在慢慢变好
口不可否认的是,JavaScript正在慢慢变得越来越好,无论是从底层设计还是应用层面。
口ES6、7、8等的推出,每次都会让这门语言更加现代、更加安全、更加方便。
口但是知道今天,JavaScript在类型检测上依然是毫无进展(为什么类型检测如此重要,我后面会聊到)。
coderwhy前端开发人员的类型缺失?为什么一定要有类型检测呢?
口首先你需要知道,编程开发中我们有一个共识:错误出现的越早越好。
口能在写代码的时候发现错误,就不要在代码编译时再发现;能在代码编译期间发现错误,就不要在代码运行期间再发现;口能在开发阶段发现错误,就不要在测试期间发现错误,能在测试期间发现错误,就不要在上线后发现错误。
coderwhy TypeScript带来的类型思维
在之后的JavaScript社区中出现了一系列的类型约束方案:
12014年,Facebook推出了flow来对JavaScript进行类型检查;同年,Microsoft微软也推出了TypeScript1.0版本;他们都致力于为JavaScript提供类型检查;而在所有的方案中,无疑TypeScript是最优秀的,也是目前使用最广泛的:
Vue3.x已经全线转向TypeScript,几乎所有的代码都使用TypeScript进行了重构;而Angular在很早期就使用TypeScript进行了项目重构,并且项目也需要使用TypeScript来进行开发;包括React使用最多的组件库Ant Design也是全面使用的TypeScript;目前很多的公司项目都是使用Vue+TypeScript、React+TypeScript、Angular+TypeScript;包括最新的Vue3中也提供了更好的对TypeScript的支持;
Vue项目通常需要掌握哪些技术栈?
Vue3全家桶
1
Vue3核心语法
Vue-Router路由Vuex状态管理
4
TypeScript实际项目中使用TypeScript Vue3组件库
2
AntDesignVueElement-Plus
5其他技术栈
可视化库
Webpack,Vite Axios等网络请求库Less、Sass等CSS预处理器ECharts
3
Three.js G2、L7等
如何学习Vue3+TypeScript?
官方文档看书学习
如何抓住重点;如何进行实战练习;更多作为查阅的手册;书的质量必须很高;必须动手进行练习;遇到问题如何解决?
开源项目视频课程
非常好的学习手段;需要具备一定的学习能力,需要一定的基础;比较适合大多数人;讲课人本身的能力;视频质量要高、听得懂、学得会;
coderwhy课程的内容
课程核心内容:
Vue3核心知识深入解析;Vue-Router4.x、Vuex4.x、2.Composition API等详细解析;基于Webpack5、Vite2分别搭建Vue3项目;TypeScript基础、高级语法解析、应用、实战;Vue3、Vue-Router、Vuex、Hooks、Element-Plus、ECharts、TypeScript、Axios、Less的后台管理系统项目实战;项目实战中的高级组件拆分、封装,项目架构设计等;Vue3项目的打包、优化、自动化部署等;Vue3相关的原理、源码解读等;
----1一
1.邂逅Vue3和Vue3开发体验.mp4
و
coderwhy Vue3带来的变化(源码)源码通过monorepo的形式来管理源代码:Mono:单个
1Repo:repository仓库
口主要是将许多项目的代码存储在同一个repository中;口这样做的目的是多个包本身相互独立,可以有自己的功能逻辑、单元测试等,同时又在同一个仓库下方便管理;而且模块划分的更加清晰,可维护性、可扩展性更强;源码使用TypeScript来进行重写:
口在Vue2.x的时候,Vue使用Flow来进行类型检测;口在Vue3.x的时候,Vue的源码全部使用TypeScript来进行重构,并且Vue本身对TypeScript支持也更好了;
coderwhy方式一:CDN引入
什么是CDN呢?CDN称之为内容分发网络(Content Delivery Network或Content Distribution Network,缩写:CDN)
口它是指通过 相互连接的网络系统,利用最靠近每个用户的服务器;口更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户;口来提供高性能、可扩展性及低成本的网络内容传递给用户;
oderwhy声明式和命令式
原生开发和Vue开发的模式和特点,我们会发现是完全不同的,这里其实涉及到两种不同的编程范式:
口命令式编程和声明式编程;口命令式编程关注的是"how to do",声明式编程关注的是"what to do",由框架(机器)完成"how"的过程;
coderwhy MVVM模型
MVC和MVVM都是一种软件的体系结构
口MVC是Model-Vue-Controller的简称,是在前期被使用非常框架的架构模式,比如iOS、前端;OMVVM是Model-View-ViewModel的简称,是目前非常流行的架构模式;d
通常情况下,我们也经常称Vue是一个MVVM的框架。
aVue官方其实有说明,Vue虽然并没有完全遵守MVVM的模型,但是整个设计是受到它的启发的。
coderwhy data属性
data属性是传入一个函数,并且该函数需要返回一个对象:
在Vue2.x的时候,也可以传入一个对象(虽然官方推荐是一个函数);在Vue3.x的时候,比如传入一个函数,否则就会直接在浏览器中报错;data中返回的对象会被Vue的响应式系统劫持,之后对该对象的修改或者访问都会在劫持中被处理:
口所以我们在template中通过{(counter)}访问counter,可以从对象中获取到数据;口所以我们修改counter的值时,template中的{{counter))也会发生改变;
coderwhy methods属性
methods属性是一个对象,通常我们会在这个对象中定义很多的方法:
口这些方法可以被绑定到 template 模板中;口在该方法中,我们可以使用this关键字来直接访问到data中返回的对象的属性;对于有经验的同学,在这里我提一个问题,官方文档有这么一段描述:
对于有经验的同学,在这里我提一个问题,官方文档有这么一段描述:口问题一:为什么不能使用箭头函数(官方文档有给出解释)?
口问题二:不使用箭头函数的情况下,this到底指向的是什么?(可以作为一道面试题)
注意
注意,不应该使用箭头函数来定义 method 函数(例如 plus:()→ this.a++)。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向组件实例,this.a 将是undefined。
coderwhy其他属性
当然,这里还可以定义很多其他的属性,我们会在后续进行讲解:口比如props,computed、watch,emits,setup等等;口也包括很多的生命周期函数;不用着急,我们会一个个学习它们的。
vuejs / vue-next
v3.0.11
https://github.com/vuejs/core/tree/v3.0.11
2.Vue3基础语法(⼀).mp4
Vue基础-模板语法
mp.weixin.qq.com/s/hYm0JgBI25grNG_2sCRITA
definpro bindvalue
vue-template-compiler
snippet-generator.app
coderwhy模板语法
1503 × 728
React的开发模式:
React使用的jsx,所以对应的代码都是编写的类似于js的一种语法;之后通过Babel将jsx编译成 React.createElement 函数调用;Vue也支持jsx的开发模式(后续有时间也会讲到):
口但是大多数情况下,使用基于HTML的模板语法;在模板中,允许开发者以声明式的方式将DOM和底层组件实例的数据绑定在一起;在底层的实现中,Vue将模板编译成虚拟DOM渲染函数,这个我会在后续给大家讲到;所以,对于学习Vue来说,学习模板语法是非常重要的。
coderwhy v-bind的绑定属性
前端讲的一系列指令,主要是将值插入到模板内容中。
但是,除了内容需要动态来决定外,某些属性我们也希望动态来绑定。
比如动态绑定a元素的href属性;口比如动态绑定img元素的src属性;绑定属性我们使用v-bind:口缩写::
口预期:any(with argument)| Object(without argument)
口参数:attrOrProp(optional)
修饰符:
.camel-将kebab-case attribute名转换为camelCase用法:动态地绑定一个或多个 attribute,或一个组件 prop 到表达式。
coderwhy绑定style介绍
我们可以利用v-bind:style来绑定一些CSS内联样式:
口这次因为某些样式我们需要根据数据动态来决定;比如某段文字的颜色,大小等等;CSS property 名可以用驼峰式(camelCase)或短横线分隔(kebab-case,记得用引号括起来)来命名;绑定class有两种方式:
口对象语法口数组语法
LE coderwhyv-on绑定事件
前面我们绑定了元素的内容和属性,在前端开发中另外一个非常重要的特性就是交互。
在前端开发中,我们需要经常和用户进行各种各样的交互:
口这个时候,我们就必须监听用户发生的事件,比如点击、拖拽、键盘事件等等口在Vue中如何监听事件呢?使用v-on指令。
" v-on="{click: btn1Click, mousemove: mouseMove}"> @
PLO PowerPoint片政-10ve3生新-病有招LE coderwhyv-on的修饰符
1188 × 751
v-on支持修饰符,修饰符相当于对事件进行了一些特殊的处理:.stop-调用event.stopPropagation prevent-调用 event.preventDefault().
capture-添加事件侦听器时使用capture模式。
self-只当事件是从侦听器绑定的元素本身触发时才触发回调。{keyAlias)-仅当事件是从特定键触发时才触发回调。
.once-只触发一次回调。
left-只当点击鼠标左键时触发。
right-只当点击鼠标右键时触发。.middle-只当点击鼠标中键时触发。
passive-{passive:true}模i添加侦听器
3.Vue3基础语法(⼆).mp4
coderwhy没有key的过程如下
我们会发现上面的diff算法效率并不高:口c和d来说它们事实上并不需要有任何的改动;口但是因为我们的c被f所使用了,所有后续所有的内容都要一次进行改动,并且最后进行新增
カ00倍
Vue源码对于key的判断
coderwhy条件渲染
在某些情况下,我们需要根据当前的条件决定某些元素或组件是否渲染,这个时候我们就需要进行条件判断了。
Vue提供了下面的指令来进行条件判断:
v-if v-else v-else-if v-show
v-if的渲染原理:
Ov-if是惰性的;口当条件为false时,其判断的内容完全不会被渲染或者会被销毁掉;口当条件为true时,才会真正渲染条件块中的内容;
coderwhy template元素
因为v-if是一个指令,所以必须将其添加到一个元素上:
口但是如果我们希望切换的是多个元素呢?
口此时我们渲染div,但是我们并不希望div这种元素被渲染;口这个时候,我们可以选择使用template;template元素可以当做不可见的包裹元素,并且在v-if上使用,但是最终template不会被渲染出来:
口有点类似于小程序中的block
coderwhy v-show和v-if的区别
首先,在用法上的区别:
v-show是不支持template;v-show不可以和v-else一起使用;其次,本质的区别:
1v-show元素无论是否需要显示到浏览器上,它的DOM实际都是有渲染的,只是通过CSS的display属性来进行切换;v-if当条件为false时,其对应的元素压根不会被渲染到DOM中;开发中如何进行选择呢?
口如果我们的元素需要在显示和隐藏之间频繁的切换,那么使用v-show;口如果不会频繁的发生切换,那么使用v-if;
coderwhy v-for基本使用
v-for的基本格式是"item in数组":口数组通常是来自data或者prop,也可以是其他方式;口item是我们给每项元素起的一个别名,这个别名可以自定来定义;
coderwhy数组更新检测
Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
coderwhy v-for中的key是什么作用?
在使用v-for进行列表渲染时,我们通常会给元素或者组件绑定一个key属性。
这个key属性有什么作用呢?我们先来看一下官方的解释:
口key属性主要用在Vue的虚拟DOM算法,在新旧nodes对比时辨识VNodes;如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算口而使用key时,它会基于key的变化重新排列元素顺序,并且会移除/销毁key不存在的元素;官方的解释对于初学者来说并不好理解,比如下面的问题:
ロ什么是新旧nodes,什么是VNode?口没有key的时候,如何尝试修改和复用的?口有key的时候,如何基于key重新排列的?
我们先来解释一下VNode的概念:
口因为目前我们还没有比较完整的学习组件的概念,所以目前我们先理解HTML元素创建出来的VNode;OVNode的全称是Virtual Node,也就是虚拟节点;
-HU口事实上,无论是组件还是元素,它们最终在Vue中表示出来的都是一个个VNode;DVNode的本质是一个JavaScript的对象;
vdom virutal dom多个vnode形成的树结构
你也可以用 of替代in作为分隔符,因为它更接近JavaScript迭代器的语法:
1
diff算法
coderwhy有key的diff算法如下(二)第三步是如果旧节点遍历完毕,但是依然有新的节点,那么就新增节点:BVNode列表
abCd made by coderwhy patchpatch新增
patchpatch新VNode列表
abd第四步是如果新的节点遍历完毕,但是依然有旧的节点,那么就移除旧节点:
IBVNode列表
abd patchpatch移除c patch新VNode列表
abd made by coderwhy
coderwhy没有key的过程如下
我们会发现上面的diff算法效率并不高:
口c和d来说它们事实上并不需要有任何的改动;
<template
-
口但是因为我们的c被f所使用了,所有后续所有的内容都要一次进行改动,并且最后进行
-
4.Vue3基础语法(三).mp4
coderwhy复杂data的处理方式
我们知道,在模板中可以直接通过插值语法显示一些data中的数据。
但是在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示;口比如我们需要对多个data数据进行运算、三元运算符来决定结果、数据进行某种转化后显示;在模板中使用表达式,可以非常方便的实现,但是设计它们的初衷是用于简单的运算;在模板中放入太多的逻辑会让模板过重和难以维护;口并且如果多个地方都使用到,那么会有大量重复的代码;PowerPoint 幻灯片放映-[04_Vue3的 Options-API]
coderwhy认识计算属性computed什么是计算属性呢?
官方并没有给出直接的概念解释;而是说:对于任何包含响应式数据的复杂逻辑,你都应该使用计算属性;口计算属性将被混入到组件实例中。所有 getter 和 setter 的 this 上下文自动地绑定为组件实例计算属性的用法:
口选项:computed口类型:{[key:string]:Function |{get:Function,set:Function}}coderwhy实现思路一:模板语法
思路一的实现:模板语法
口缺点一:模板中存在大量的复杂逻辑,不便于维护(模板中表达式的初衷是用于简单的计算);口缺点二:当有多次一样的逻辑时,存在重复的代码;口缺点三:多次使用的时候,很多运算也需要多次执行,没有缓存;coderwhy计算属性 vs methods在上面的实现思路中,我们会发现计算属性和methods的实现看起来是差别是不大的,而且我们多次提到计算属性有缓存的。
watch支持异步...
腾
coderwhy认识侦听器watch什么是侦听器呢?
口开发中我们在data返回的对象中定义了数据,这个数据通过插值语法等方式绑定到template中;当数据变化时,template会自动进行更新来显示最新的数据;口但是在某些情况下,我们希望在代码逻辑中监听某个数据的变化,这个时候就需要用侦听器watch来完成了;
1119 x302侦听器的用法如下:口选项:watch口类型:{[key:string]:string Function Object Array)
questioncoderwhy侦听器watch的其他方式(二)
另外一个是Vue3文档中没有提到的,但是Vue2文档中有提到的是侦听对象的属性:obj.name
5.Vue3组件化开发(⼀).mp4
git init git commit 监听....
Vue3的表单和开发模式
王红元 coderwhy
V-model
注册组件
webpack全局监听...
coderwhy v-model的基本使用
表单提交是开发中非常常见的功能,也是和用户交互的重要手段:
口比如用户在登录、注册时需要提交账号密码;口比如用户在检索、创建、更新信息时,需要提交一些数据;这些都要求我们可以在代码逻辑中获取到用户提交的数据,我们通常会使用v-model指令来完成:
口v-model指令可以在表单input,textarea以及select元素上创建双向数据绑定;口它会根据控件类型自动选取正确的方法来更新元素;口尽管有些神奇,但v-model本质上不过是语法糖,它负责监听用户的输入事件来更新数据,并在某种极端场景下进行一些特殊处理;coderwhy v-model的原理 官方有说到,v-model的原理其实是背后有两个操作:v-bind绑定value属性的值;v-on绑定input事件监听到函数中,函数会获取最新的值赋值到绑定的属性中;html <input v-model="searchText" 等价于:html 1 <input:value="searchText"@input="searchText = Sevent.target.value"/>
not deep copy
coderwhy v-model的值绑定
目前我们在前面的案例中大部分的值都是在template中固定好的:比如gender的两个输入框值male,female;比如hobbies的三个输入框值basketball,football,tennis;在真实开发中,我们的数据可能是来自服务器的,那么我们就可以先将值请求下来,绑定到data返回的对象中,再通过v-bind来进行值的绑定,这个过程就是值绑定。
口这里不再给出具体的做法,因为还是v-bind的使用过程。coderwhy v-model修饰符-trim如果要自动过滤用户输入的首尾空白字符,可以给v-model添加trim修饰符:
coderwhy人处理问题的方式
人面对复杂问题的处理方式:
任何一个人处理信息的逻辑能力都是有限的
所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大堆的内容。
但是,我们人有一种天生的能力,就是将问题进行拆解。
如果将一个复杂的问题,拆分成很多个可以处理的小问题,再将其放在整体当中,你会发现大的问题也会迎刃而解。
这是你搞得定的
一堆小东西
这是你搞不定的
一大堆东西
和你能搞得定的
一个关系网
知乎@coderwhycoderwhy认识组件化开发
1264 x 695组件化也是类似的思想:
口如果我们将一个页面中所有的处理逻辑全部放在一起 处理起来就会变得非常复杂,而且不利于后续的管理以及扩展;口但如果,我们讲一个页面拆分成一个个小的功能块,每个功能块完成属于自己这部分独立的功能,那么之后整个页面的管理和维护就变得非常容易了;口如果我们将一个个功能块拆分后,就可以像搭建积木一下来搭建我们的项目1;coderwhy Vue的组件化
组件化是Vue、React、Angular的核心思想,也是我们后续课程的重点(包括以后实战项目):
口前面我们的createApp函数传入了一个对象App,这个对象其实本质上就是一个组件,也是我们应用程序的根组件;口组件化提供了一种抽象,让我们可以开发出一个个独立可复用的小组件来构造我们的应用;口任何用都会被抽象成一颗组件树;coderwhy组件的名称
শ
今天讲
半
喝口水
在通过app.component注册一个组件的时候,第一个参数是组件的名称,定义组件名的方式有两种:
热
好的老
方式一:使用kebab-case(短横线分割符)当使用 kebab-case(短横线分隔命名)定义一个组件时,你也必须在引用这个自定义元素时使用 ke例如;Yo白建时
app.component('my-component-name',f em两个水
方式二:使用PascalCase(驼峰标识符)口当使用PascalCase(首字母大写命名)定义一个组件时,你在引用这个自定义元素时两种命名法都可就是说和 都是可接受的; XPL PowerPoint 幻灯片放映-[05_Vue3-41LE coderwhy单文件的特点
在这个组件中我们可以获得非常多的特性:
代码的高亮;ES6、CommonJS的模块化能力;组件作用域的CSS;可以使用预处理器来构建更加丰富的组件,比如TypeScript、Babel、Less、Sass等;coderwhy如何支持SFC如果我们想要使用这一的SFC的.vue文件,比较常见的是两种方式:
口方式一:使用Vue CLI来创建项目,项目会默认帮助我们配置好所有的配置选项,可以在其中直接使用.vue文件;口方式二:自己使用webpack或rollup或vite这类打包工具,对其进行打包处理;我们最终,无论是后期我们做项目,还是在公司进行开发,通常都会采用Vue CLI的方式来完成。
但是在学习阶段,为了让大家理解Vue CLI打包项目的过程,我会接下来穿插讲解一部分webpack的知识,帮助大家更好的理解Vue CLI的原理以及其打包的过程。coderwhy Webpack的使用前提
webpack的官方文档是https://webpack.js.org/
webpack的中文官方文档是https://webpack.docschina.org/
DOCUMENTATION:文档详情,也是我们最关注的
Webpack的运行是依赖Node环境的,所以我们电脑上必须有Node环境口所以我们需要先安装Node.js,并且同时会安装npm;口我当前电脑上的node版本是v14.15.5,npm版本是6.14.11(你也可以使用nvm或者n来管理Node版本);口Node官方网站:https://nodejs.org/6.Vue3组件化开发(⼆).mp4
coderwhy认识webpack事实上随着前端的快速发展,目前前端的开发已经变的越来越复杂了:口比如开发过程中我们需要通过模块化的方式来开发;比如也会使用一些高级的特性来加快我们的开发效率或者安全性,比如通过ES6+、TypeScript开发脚本逻辑,通过sass,less等方式来编写css样式代码;口比如开发过程中,我们还希望实时的监听文件的变化来并且反映到浏览器上,提高开发的效率;口等等…...
比如开发完成后我们还需要将代码进行压缩、合并以及其他相关的优化;但是对于很多的前端开发者来说,并不需要思考这些问题,日常的开发中根本就没有面临这些问题:
口这是因为目前前端开发我们通常都会直接使用三大框架来开发:Vue,React,Angular;口但是事实上,这三大框架的创建过程我们都是借助于脚手架(CLI)的;口事实上Vue-CLI、create-react-app、Angular-CLI都是基于webpack来帮助我们支持模块化、less TypeScript、打包优化等的;coderwhy Webpack到底是什么呢?我们先来看一下官方的解释:
webpack is a static module bundler for modern JavaScript applications.
webpack是一个静态的模块化打包工具,为现代的JavaScript应用程序;我们来对上面的解释进行拆解:
打包bundler:webpack可以将帮助我们进行打包,所以它是一个打包工具1静态的static:这样表述的原因是我们最终可以将代码打包成最终的静态资源(部署到静态服务器);模块化module:webpack默认支持各种模块化开发,ES Module、CommonJS、AMD等;现代的modern:我们前端说过,正是因为现代前端开发面临各种各样的问题,才催生了webpack的出现和发展;lerwhy Vue项目加载的文件有哪些呢?
JavaScript的包:将ES6转换成ES5的语法;TypeScript的处理,将其转换成JavaScript;Css的处理:
□CSS文件模块的加载、提取;Less、Sass等预处理器的处理;资源文件img,font:口图片img文件的加载;字体font文件的加载;HTML资源的处理:
口打包HTML资源文件;coderwhy Webpack的使用前提
webpack的官方文档是https://webpack.js.org/
webpack的中文官方文档是https://webpack.docschina.org/
DOCUMENTATION:文档详情,也是我们最关注的
Webpack的运行是依赖Node环境的,所以我们电脑上必须有Node环境所以我们需要先安装Node.js,并且同时会安装npm;口我当前电脑上的node版本是v14.15.5,npm版本是6.14.11(你也可以使用nvm或者n来管理Node版本);口Node官方网站:https://nodejs.org/coderwhy Webpack的安装
webpack的安装目前分为两个:webpack,webpack-cli那么它们是什么关系呢?
执行webpack命令,会执行node_modules下的.bin目录下的webpack;webpack在执行时是依赖webpack-cli的,如果没有安装就会报错;而webpack-cli中代码执行时,才是真正利用webpack进行编译和打包的过程;所以在安装webpack时,我们需要同时安装webpack-cli(第三方的脚手架事实上是没有使用webpack-cli的,而是类似于自己的vue-service-cli的东西)npx webpack --entry ./src/main.js --output-path ./build
coderwhy Webpack的依赖图
webpack到底是如何对我们的项目进行打包的呢?
口事实上webpack在处理应用程序时,它会根据命令或者配置文件找到入口文件;从入口开始,会生成一个依赖关系图,这个依赖关系图会包含应用程序中所需的所有模块(比如js文件、css文件、图片、体等);math.jš
然后遍历图结构,打包一个个模块(根据文件的不同使用不同的loader来解析);coderwhy css-loader的使用
上面的错误信息告诉我们需要一个loader来加载这个css文件,但是loader是什么呢?
口loader 可以用于对模块的源代码进行转换;口我们可以将css文件也看成是一个模块,我们是通过import来加载这个模块的;口在加载这个模块时,webpack其实并不知道如何对其进行加载,我们必须制定对应的loader来完成这个功能;oderwhy认识style-loader我们已经可以通过css-loader来加载css文件了
口但是你会发现这个css在我们的代码中并没有生效(页面没有效果)。
这是为什么呢?
口因为css-loader只是负责将.css文件进行解析,并不会将解析之后的css插入到页面中;口如果我们希望再完成插入style的操作,那么我们还需要另外一个loader,就是style-loader;coderwhy认识PostCSS工具
什么是PostCSS呢?
口PostCSS是一个通过JavaScript来转换样式的工具;口这个工具可以帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀、css样式的重置;口但是实现这些功能,我们需要借助于PostCSS对应的插件;如何使用PostCSS呢?主要就是两个步骤:
口第一步:查找PostCSS在构建工具中的扩展,比如webpack中的postcss-loader;口第二步:选择可以添加你需要的PostCSS相关的插件;coderwhy插件autoprefixer因为我们需要添加前缀,所以要安装autoprefixer:npm install autoprefixer-D直接使用使用postcss工具,并且制定使用autoprefixer npx postcss--use autoprefixer-o end.css./src/css/style.css
7.Webpack5搭建Vue环境.mp4
Webpack打包其他资源
:"file-loader"
coderwhy文件的命名规则
有时候我们处理后的文件名称按照一定的规则进行显示:
比如保留原来的文件名、扩展名,同时为了防止重复,包含一个hash值等;这个时候我们可以使用PlaceHolders来完成,webpack给我们提供了大量的PlaceHolders来显示不同的内容:https://webpack.js.org/loaders/file-loader/#placeholders我们可以在文档中查阅自己需要的placeholder;我们这里介绍几个最常用的placeholder:
[ext]:处理文件的扩展名;[name]:处理文件的名称;
[hash]:文件的内容,使用MD4的散列函数处理,生成的一个128位的hash值(32个十六进制);
[contentHash]:在file-loader中和[hash]结果是一致的(在webpack的一些其他地方不一样,后面会讲到);
[hash:]:截图hash的长度,默认32个字符太长了;
[path]:文件相对于webpack配置文件的路径;oderwhy url-loader
1url-loader和file-loader的工作方式是相似的,但是可以将较小的文件,转成base64的URI。1511 × 538
oderwhy认识asset module type我们当前使用的webpack版本是webpack5:在webpack5之前,加载这些资源我们需要使用一些loader,比如raw-loader、url-loader、file-loader在webpack5开始,我们可以直接使用资源模块类型(asset module type),来替代上面的这些loader;webpack5 不yao一些loader
type: "asset/resource"
type: "asset" 分类分+
require("clean-webpack-plugin");
8.Vite2搭建Vue环境.mp4
Babel和devServer
coderwhy为什么需要babel?
事实上,在开发中我们很少直接去接触babel,但是babel对于前端开发来说,目前是不可缺少的一部分:
口开发中,我们想要使用ES6+的语法,想要使用TypeScript,开发React项目,它们都是离不开Babel的;口所以,学习Babel对于我们理解代码从编写到线上的转变过程至关重要;那么,Babel到底是什么呢?
Babel是一个工具链,主要用于旧浏览器或者环境中将ECMAScript 2015+代码转换为向后兼容版本的JavaScript;口包括:语法转换、源代码转换等;coderwhy Babel命令行使用
babel本身可以作为一个独立的工具(和postcss一样),不和webpack等构建工具配置来单独使用。
如果我们希望在命令行尝试使用babel,需要安装如下库:口@babel/core:babel的核心代码,必须安装;
@babel/cli:可以让我们在命令行使用babel;coderwhy Babel的预设preset但是如果要转换的内容过多,一个个设置是比较麻烦的,我们可以使用预设(preset):口后面我们再具体来讲预设代表的含义;安装@babel/preset-env预设:
coderwhy Babel的底层原理
babel是如何做到将我们的一段代码(ES6、TypeScript,React)转成另外一段代码(ES5)的呢?
从一种源代码(原生语言)转换成另一种源代码(目标语言),这是什么的工作呢?
就是编译器,事实上我们可以将babel看成就是一个编译器。
Babel编译器的作用就是将我们的源代码,转换成浏览器可以直接识别的另外一段源代码;Babel也拥有编译器的工作流程:
口解析阶段(Parsing)转换阶段(Transformation)口生成阶段(Code Generation)https://github.com/jamiebuilds/the-super-tiny-compiler
oderwhy Babel的配置文件
像之前一样,我们可以将babel的配置信息放到一个独立的文件中,babel给我们提供了两种配置文件的编写:babel.config.json(或者.js,.cjs,.mjs)文件;
.babelrcjson(或者.babelrc,js,.cjs,.mjs)文件;rc-> runtime compiler它们两个有什么区别呢?目前很多的项目都采用了多包管理的方式(babel本身、element-plus、umi等);口.babelrc.json:早期使用较多的配置方式,但是对于配置Monorepos项目是比较麻烦的;口babel.config.json(babel7):可以直接作用于Monorepos项目的子包,更加推荐;
coderwhy Vue打包后不同版本解析
vue(.runtime).global(.prod).js:通过浏览器中的