1.å¦ä½ç¨Pythonåç¬è«ï¼
2.想成为Java工程师有什么要求?
3.nestjsåeggjsåªä¸ªå¥½ï¼
å¦ä½ç¨Pythonåç¬è«ï¼
å¨æ们æ¥å¸¸ä¸ç½æµè§ç½é¡µçæ¶åï¼ç»å¸¸ä¼çå°ä¸äºå¥½ççå¾çï¼æ们就å¸ææè¿äºå¾çä¿åä¸è½½ï¼æè ç¨æ·ç¨æ¥åæ¡é¢å£çº¸ï¼æè ç¨æ¥å设计çç´ æãæ们æ常è§çåæ³å°±æ¯éè¿é¼ æ å³é®ï¼éæ©å¦å为ãä½æäºå¾çé¼ æ å³é®çæ¶å并没æå¦å为é项ï¼è¿æåæ³å°±éè¿å°±æ¯éè¿æªå¾å·¥å ·æªåä¸æ¥ï¼ä½è¿æ ·å°±éä½å¾ççæ¸ æ°åº¦ã好å§å ¶å®ä½ å¾å害çï¼å³é®æ¥ç页é¢æºä»£ç ã
æ们å¯ä»¥éè¿python æ¥å®ç°è¿æ ·ä¸ä¸ªç®åçç¬è«åè½ï¼ææ们æ³è¦ç代ç ç¬åå°æ¬å°ãä¸é¢å°±ççå¦ä½ä½¿ç¨pythonæ¥å®ç°è¿æ ·ä¸ä¸ªåè½ã
å ·ä½æ¥éª¤
è·åæ´ä¸ªé¡µé¢æ°æ®é¦å æ们å¯ä»¥å è·åè¦ä¸è½½å¾ççæ´ä¸ªé¡µé¢ä¿¡æ¯ã
getjpg.py
#coding=utf-8import urllibdef getHtml(url):
page = urllib.urlopen(url)
html = page.read() return html
html = getHtml("blogs.com/fnng/archive////.html
åå¦æ们ç¾åº¦è´´å§æ¾å°äºå å¼ æ¼äº®çå£çº¸ï¼éè¿å°å段æ¥çå·¥å ·ãæ¾å°äºå¾ççå°åï¼å¦ï¼src=â/forum......jpgâpic_ext=âjpegâ
ä¿®æ¹ä»£ç å¦ä¸ï¼
import reimport urllibdef getHtml(url):
page = urllib.urlopen(url)
html = page.read() return htmldef getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html) return imglist
html = getHtml("/p/")print getImg(html)
æ们åå建äºgetImg()å½æ°ï¼ç¨äºå¨è·åçæ´ä¸ªé¡µé¢ä¸çééè¦çå¾çè¿æ¥ãre模å主è¦å å«äºæ£å表达å¼ï¼
re.compile() å¯ä»¥ææ£å表达å¼ç¼è¯æä¸ä¸ªæ£å表达å¼å¯¹è±¡.
re.findall() æ¹æ³è¯»åhtml ä¸å å« imgreï¼æ£å表达å¼ï¼çæ°æ®ã
è¿è¡èæ¬å°å¾å°æ´ä¸ªé¡µé¢ä¸å å«å¾ççURLå°åã
3.å°é¡µé¢çéçæ°æ®ä¿åå°æ¬å°
æçéçå¾çå°åéè¿for循ç¯éå并ä¿åå°æ¬å°ï¼ä»£ç å¦ä¸ï¼
#coding=utf-8import urllibimport redef getHtml(url):
page = urllib.urlopen(url)
html = page.read() return htmldef getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
x = 0 for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' % x)
x+=1html = getHtml("/p/")print getImg(html)
è¿éçæ ¸å¿æ¯ç¨å°äºurllib.urlretrieve()æ¹æ³ï¼ç´æ¥å°è¿ç¨æ°æ®ä¸è½½å°æ¬å°ã
éè¿ä¸ä¸ªfor循ç¯å¯¹è·åçå¾çè¿æ¥è¿è¡éåï¼ä¸ºäºä½¿å¾ççæ件åçä¸å»æ´è§èï¼å¯¹å ¶è¿è¡éå½åï¼å½åè§åéè¿xåéå 1ãä¿åçä½ç½®é»è®¤ä¸ºç¨åºçåæ¾ç®å½ã
ç¨åºè¿è¡å®æï¼å°å¨ç®å½ä¸çå°ä¸è½½å°æ¬å°çæ件ã
想成为Java工程师有什么要求?
首先,你学得知识不一定就是你用的全部知识,我们除了要学习基本的知识之外,也需要去了解一下其他的知识,而这些知识就是从你所做的每一个小项目来的,当你需要使用这个知识点的易源码密码破译时候自然的就会去学习你不会的知识总之就是一句话,要想学好Java,你付出多少努力就能够得到多少回报
然后是你的一个学习问题,自己在做的时候做不出来,那就是一个问题,在做题目的时候不去思考,自己的动手敲代码的时间也是非常的少
想要改变你的现状就得先解决这些困难,每天学习的%时间必须拿来敲代码,这样你才会拿到一个题目的时候有自己的思路,通过自己的思考然后把思路转为代码去实现,这才是学习Java的正确姿势
学习Java不要把自己的思维关在一个笼子里面,有时候多跟一起学习的人或者前辈多多交流,多去吸取他们学习的方法以及在处理错误的时候思维
在Java的学习过程中,出现异常和bug是难免的,这些虽然是你在学习道路上的绊脚石,但是这些绊脚石能够加快你的成长,让你的经验暴增
阶段1 java语言基础
1-1-Java基础语法
1、第1节 java运行环境 提取码:8ax6
2、第2节 HelloWorld案例 提取码:us3j
3、第3节 关键字&标识符 提取码:dl
4、第4节 常量&变量 提取码:
5、第5节 数据类型转换 提取码:9glo
6、第6节 运算符 提取码:ys2n
7、第7节 方法入门 提取码:b1ib
8、怎么编译c 源码第8节 JDK9新特性-Jshell 提取码:ounw
9、第9节 选择结构-if语句-switch语句 提取码:0d
、第节 循环结构-for-while-do..while 提取码:k2ig
、第节 开发工具-IDEA 提取码:i
、第节 方法复习 提取码:ulku
、第节 方法重载 提取码:wfkr
、第节 数组 提取码:p8ml
小总结:
这个阶段我花了半个月的时间去学习,也就是个小时的时间,其中有个小时是我用来看理论的知识,另外的个小时是我用来给自己练手的,每一个知识点我都要做很多的题目,直到自己拿到题目的时候,能够把自己的思路转为代码实现
毫无疑问,这个阶段最耗时的自然是循环结构、选择结构,因为这两个知识点对于一个初学者来说很不友好,不仅代码量增加了,逻辑思维也是很绕的,如果不保持自己的思路清晰,你就理解不了他每一步的结果
然后就是数组,这一个阶段可以说是全新的阶段,我们可以把我们需要的数据都保存在数组里面,在这个知识点结束之后我还做了一个数组版的学生管理系统
1-2 -面向对象和封装
1、1_2_1__面向对象思想的概述 提取码:q
2、1_2_1__面向对象思想的举例 提取码:lv2s
3、1_2_1__类和对象的关系 提取码:7rs3
4、1_2_1__类的定义 提取码:xvhx
5、1_2_1__对象的源码的加法运算创建及其使用 提取码:xsal
6、1_2_1__手机类练习 提取码:lnho
7、1_2_1__一个对象的内存图 提取码:wnaz
8、1_2_1__两个对象使用同一个方法的内存 提取码:thet
9、1_2_1__两个引用指向同一个对象的 提取码:3he6
、1_2_1__使用对象类型作为方法的参 提取码:w4
、1_2_1__使用对象类型作为方法的返 提取码:gjmn
、1_2_1__成员变量和局部变量的区别 提取码:eqep
、1_2_1__面向对象三大特征之封装性 提取码:zlcz
、1_2_1__private关键字的作用及使用 提取码:4i
、1_2_1__练习使用private关键字定义 提取码:dctu
、1_2_1__this关键字的作用 提取码:xz
、1_2_1__构造方法 提取码:8xkz
、1_2_1__定义一个标准的类 提取码:opmf
小总结:
这一个阶段花的时间足足有一个月,时间的分配也是按照%的时间去看理论,%的时间去动手敲代码
我觉得这个阶段每一个知识点都是特别的重要,在这个阶段我学会了什么是对象,学会了如何面向对象编程,也学会了如何使用对象编程去偷懒,把重复的事情都封装成了一个对象,交给这个对象去帮我做
1-3-Java语言高级
1、-常用API_1 提取码:alfe
2、-继承与多态 提取码:h5o7
3、-常用API第二部分 提取码:olnf
4、-集合 提取码:ca
5、-异常与多线程 提取码:mu
6、-File类与IO流 提取码:4bpt
7、-网络编程 提取码:s5ks
8、-JDK8新特性 提取码:jnbj
9、vf 证书打印源码-基础加强 提取码:1ngz
、-MySQL 提取码:y4
、 -JDBC 提取码:q7
小总结:
是的,这个阶段我花了两个月,一个月学完JavaSE,然后一个月学完了MySQL跟JDBC,话说这个阶段是最难的,也是最重要的,这个阶段的东西你学不懂就代表你后面的知识都处于一个危机边缘
在这个阶段我做了四个小项目,和一些零零碎碎的练习题,代码加起来应该有三四万行了吧;其中有三个项目是学生管理系统,我从数组版把它改为了集合版,然后又改为了IO版,最后改为了MySQL版;然后还做了一个ATM小型的桌面程序
然后个人感觉我在这个阶段学得是比较扎实的,期间还去看了许多的集合的源码,虽然有的看不懂,但是对于我一个初学者来说已经很了不起了
阶段2 JavaWeb+旅游网
小总结:
这个阶段的知识非常多,我不仅学习了前端三剑客,还学了JavaWEB、JSP、JSTL、EL,然后为了做一个项目去练手,还学习了Redis和Maven
这个阶段我花了两个月的时间,包括跟着做好这个项目,因为我前面的基础部分学得比较扎实吧,所以感觉这部分比较简单,难点就是文库下载网站源码JavaWEB的过滤器,这个知识点我花的时间比较多
然后就是大概的从面向对象编程转为了面向接口编程了
HTML和CSS
1、第1节 概念介绍 提取码:dal6
2、第2节 基本标签 提取码:4uyq
3、第3节 表单标签 提取码:h1ok
4、第4节 CSS概述 提取码:ubyx
5、第5节 CSS_选择器 提取码:zep7
6、第6节 CSS属性 提取码:9l4h
7、第7节 CSS_案例-注册页面 提取码:onc6
JavaScript
1、 JavaScript_简介 提取码:2efk
2、 JavaScript基础语法 提取码:bl
3、 JavaScript运算符 提取码:v9sh
4、 JavaScript特殊语法 提取码:yj6p
5、 JavaScript_语法_流程控制语 提取码:tx9j
6、 JavaScript_对象 提取码:df4q
7、 DOM和事件的简单学习 提取码:ljt5
8、 BOM对象 提取码:jwwy
9、 DOM对象 提取码:ukah
、JavaScirpt中的事件 提取码:ab1w
BootStrap
1、 快速入门 提取码:5jhm
2、Bootstrap_栅格系统 提取码:1xuu
3、Bootstrap_全局CSS样式 提取码:fjka
4、Bootstrap_组件和插件 提取码:g5wp
5、案例_旅游网 提取码:jxy3
XML
1、 xml基础 提取码:jose
2、 xml_约束 提取码:q0xr
3、 xml_解析 提取码:bbsn
Tomcat
1、web相关概念 提取码:p2az
2、 tomcat基本操作 提取码:zqqx
3、 tomcat_部署项目 提取码:i4a2
-Servlet和HTTP请求协议
1、Servlet_快速入门 提取码:ah8k
2、Servlet_生命周期方法 提取码:w7t9
3、Servlet_3.0注解配置 提取码:d8zy
4、 IDEA与tomcat相关配置 提取码:5rvl
5、 Servlet_体系结构与urlpartten配置 提取码:qf3i
6、 HTTP请求协议 提取码:5f7v
-Request和Respons
1、 Request原理和继承体系 提取码:3hxr
2、 Request_获取请求数据 提取码:oxl7
3、 请求转发和request共享数据 提取码:9xbq
4、 Request_获取ServletContext 提取码:yfaz
5、 request登录案例 提取码:owgj
6、 HTTP响应协议 提取码:xs8k
7、 response之重定向 提取码:i8de
8、 response之相对路径和绝对路径 提取码:6p8q
9、 response之输出数据 提取码:fe
、 response之验证码 提取码:uy
、 ServletContext对象 提取码:yopc
、 文件下载 提取码:szv9
-Cookie和Session
1、第1节 Cookie快速入门 提取码:ncss
2、第2节 Cookie_细节 提取码:la7v
3、第3节 Cookie案例 提取码:mamn
4、第4节 JSP改造Cookie案例 提取码:fpkd
5、第5节 Session快速入门 提取码:0tyf
6、第6节 Session细节 提取码:obu1
7、第7节 Session之验证码案例 提取码:fxtt
-JSP,EL和JSTL
1、第1节 JSP基础语法 提取码:7rvw
2、第2节 MVC 提取码:ywmz
3、第3节 EL介绍和运算符 提取码:5gxf
4、第4节 EL获取域中存储的数据 提取码:yha0
5、第5节 JSTL常用标签 提取码:mr
-综合案例(用户信息)
1、第1节 登录功能 提取码:d7v4
2、第2节 添加删除修改功能 提取码:df
3、第3节 删除选中功能 提取码:jhlx
4、第4节 分页查询功能 提取码:8mxb
5、第5节 复杂条件查询功能 提取码:qj8m
-Filter和Listener
1、第1节 Filter快速入门 提取码:7qrm
2、第2节 Filter细节 提取码:s2w9
3、第3节 Filter案例 提取码:fs
4、第4节 监听器 提取码:kjwy
-Jquery
1、第1节 JQuery基础 提取码:0uj1
2、第2节 JQuery选择器 提取码:ow
3、第3节 Jquery基础案例 提取码:5u3t
4、第4节 JQuery动画和遍历 提取码:ut
5、第5节 JQuery事件绑定和切换 提取码:e5sv
6、第6节 Jquery高级案例 提取码:ytj4
-Ajax和JSON
1、第1节 原生JS方式实现Ajax 提取码:xh
2、第2节 JQuery方式实现Ajax 提取码:woaa
3、第3节 JSON基础语法 提取码:pqhj
4、第4节 JSON_解析器 提取码:zbzx
-Redis
1、第1节 Redis环境搭建 提取码:poob
2、第2节 Redis命令操作 提取码:bq6d
3、第3节 Redis持久化 提取码:0x4x
4、第4节 Jedis代码操作 提取码:bon3
5、第5节 Jedis连接池 提取码:hu0n
6、第6节 redis案例 提取码:cosn
-Maven基础
1、第1节 基本概念 提取码:4fok
2、第2节 maven的安装和仓库种类 提取码:gw1r
3、第3节 maven标准目录结构和常用命令 提取码:3jn7
4、第4节 maven生命周期和概念模型图 提取码:oqrb
5、第5节 使用骨架创建maven的java工程 提取码:kp
6、第6节 maven工程servlet实例 提取码:xdmw
-旅游网
1、 准备工作 提取码:uprl
2、 注册功能 提取码:9pf5
3、 登陆和退出功能 提取码:0hkk
4、 BaseServlet抽取 提取码:qswt
5、 分类数据展示功能 提取码:n
6、 旅游线路分页展示分页展示 提取码:o6v6
7、 旅游线路查询 提取码:pzjb
8、 旅游线路详情 提取码:wtke
9、 旅游线路收藏 提取码:
阶段三:基本框架SSM
小总结:
这个阶段相对于JavaWEB来说还是比较简单的,少了很多的代码量,但是却多了很多的配置,稍微不注意就会把这些配置给搞错,期间出现了好几次注入bean失败的错误,这是我最不能够容忍的,同样的错误居然出现了好几次,而且都是没有给service加上@Service这个注解导致的;所以,在同一个地方跌倒多次是最不应该的,以后一定的加强注意了
在此期间,我还把JavaWEB做的那个项目改为了SSM版的,在改的过程中才体会到这些代码真的是很浪费,之前一个一个参数的接收,现在只需要一个对象就可以接收到了,而且更加的让我明白面向接口编程的含义了
阶段3 1.Mybatis
1、.Mybatis课程介绍及环境搭建 提取码:6zwc
2、.Mybatis入门案例 提取码:2aoi
3、.自定义Mybatis框架 提取码:r9wc
4、.自定义Mybatis框架基于注解开发 提取码:1jzg
5、.使用Mybatis完成CRUD 提取码:d4b7
6、.使用Mybatis完成DAO层的开发 提取码:dzvr
7、.Mybatis的连接池及事务 提取码:ij3e
8、.动态SQL 提取码:yiys
9、.Mybatis的多表操作 提取码:dt9w
、.JNDI扩展知识 提取码:u5fx
、.Mybatis的缓存 提取码:ng
、.Mybatis注解开发 提取码:yh6z
阶段3 2.Spring
1、.Spring框架简介 提取码:va1x
2、.程序间耦合 提取码:s8cg
3、.Spring的 IOC 和 DI 提取码:of
4、.Spring的常用注解 提取码:tfw5
5、.基于XML的IOC的案例1 提取码:1gf9
6、.Spring的新注解 提取码:pjzs
7、.银行转账案例 提取码:um2b
8、.面向切面编程 AOP 提取码:4tv2
9、.JdbcTemplate的基本使用 提取码:vjxx
、.Spring中事务控制 提取码:rx3v
阶段3 3.SpringMVC
1、.SpringMVC概述及入门案例 提取码:e2ty
2、.参数绑定及自定义类型转换 提取码:g
3、.SpringMVC常用注解 提取码:emrc
4、.SpringMVC返回值类型及响应数据类型 提取码:bd9t
5、.文件上传 提取码:pzy7
6、.异常处理及拦截器 提取码:7a2y
7、.SSM整合案例 提取码:lzzd
阶段四:高级框架
小总结:
这个阶段可不止Spring Boot,还有springcloud,springsecurity等等这些框架,就不一一列出来了,资料网上一大堆
学了Spring Boot之后你才会发现,SSM是多么的麻烦,Spring Boot为不仅为我们减少了代码量,还为我们减少了很多的配置,采用注解的方式
当然,这么智能的框架,我能不把做的项目改为Spring Boot版本吗?
阶段4 4.Spring Boot
1、.spring boot 介绍 提取码:fzi8
2、.spring boot 入门 提取码:bp
3、.spring boot 原理分析 提取码:8yer
4、.spring boot 配置文件 提取码:wvoc
5、.spring boot 集成 提取码:ywin
阶段4 5.Git
1、.Git简介及安装使用 提取码:a0kx
2、.连接远程仓库 提取码:kziq
3、.Git分支 提取码:5rm2
原文链接:网页链接
nestjsåeggjsåªä¸ªå¥½ï¼
nestjs为ä»ä¹ä¸ç«
å 为æä½ä¸ç®ä¾¿
Nest.jsæ¯ç¨äºæ建é«æä¸å¯ä¼¸ç¼©çæå¡ç«¯åºç¨ç¨åºçæ¸è¿å¼Node.jsæ¡æ¶ãæ¯æTypescriptãé¢åAOPç¼ç¨ãæ¯ætypeormãNode.jsççspringãæ建微æå¡åºç¨ã
Nest.jsæ¯ç¨äºæ建é«æä¸å¯ä¼¸ç¼©çæå¡ç«¯åºç¨ç¨åºçæ¸è¿å¼Node.jsæ¡æ¶ãæ¯æTypescriptãé¢åAOPç¼ç¨ãæ¯ætypeormãNode.jsççspringãæ建微æå¡åºç¨ã
å¹´å端æç«çææ¯æ¯ä»ä¹ï¼
æ认为çå¹´å端å¼åè æåºè¯¥ææ¡çä¸äºæ¯è¾ç«ççææ¯ä¸ç¥è¯ç¹ã
1ï¼å端æ¡æ¶åè¯è¨å±é¢
9æ份Vue3.0åå¸ï¼å£°ç§°å¯¹TypeScriptæçæ´å¥½çå¼åä½éªï¼éè¿ä»ä¸åæ¡æ¶çº§å«TSæ¯æä¸ï¼æ们å¯ä»¥çåºç¤¾åºçæ´ä¸ªé£åä»å¹´ç大家é½å»å¦ä¹ åºç¨TSï¼åæäºå¤§å®¶å¦ä½æTSç¨çæ´å¥½è¿ä¸ªæ¹åä¸æ¥äºã
æ以æ认为ä»å¹´TypeScriptçç«çç¨åº¦è¿æ¯åºè¯¥æåå¾é åçï¼æä»å¹´ä¹ä½¿ç¨TypeScriptéæäºDarukçæå¡æ¡æ¶æ¨åºäº2.0çæ¬ï¼è®©TSå¼åè æ¥ææ´å¥½çTSå¼åä½éªã
æ¥ä¸æ¥å°±æ¯ä¸¤å¤§éç£ æ¡æ¶çæ´æ°åç¨å¯¹æ¯ï¼Vue3åé¢è¯´äºä¸å¥ãèReactä¹å¨åæä¹åå¸äºReactçreleaseçæ¬ãè¿ä¸¤å¤§ä¸»æµæ¡æ¶çé¢ç¹æ´æ°ï¼ä¹è¯´æäºç¤¾åºåä½è é½å¨ä¸åæ¼åã
å¨Vue3ä¸é¤äºæ´å¥½çæ¯æTSå¤ï¼è¿æ´æ°äºCompositionAPIãèReact主è¦æ¯éä¸ç²¾åå¨å级ä½éªä¸ï¼è½ç¶æ²¡ææ°çFeatureä½æ¯æåäºå解å³äºå¾å¤ä¹åçæ¬æ½å¨çé®é¢ã
è¦è¯´åªä¸ªæç«è¿æ¯è¦ç个人å®é ç使ç¨åºæ¯åå好ï¼ä½æ¯å¹´æ¥çè¿æ²¡æå«çæ¡æ¶å¯ä»¥ä¸ä¹ä¸æã
2ï¼å¤§å端ç¸å ³ææ¯æ
ä»å¹´åºäºChromiumç微软edgeæµè§å¨ä¹å·²ç»æ¨åºãgoogleå¨web端çåå±äº§çäºå¯¹å¼åè æ·±å»çå½±åãChrome+ä¹å·²ç»åå¸å¤ä¸ªçæ¬ï¼æä¾äºä¸ç³»åçæ°ç¹æ§ï¼æ¯å¦CoreWebVitalsæ åï¼DesktopPWAçé½å¼å¾æ们å»å ³æ³¨ã
æ们说å®äºæµè§å¨ç¸å ³çé£ç¹ææ¯ä¹åï¼åèè大å端ç¸å ³çä¸äºææ¯å®è·µï¼æ¯å¦Flutterã
å¾å¤å端å¨ä»å¹´å·²ç»ä»webå¼å转å为Flutterå¼åï¼å¦ä¹ å使ç¨Dartææ¯æ¥æ建UIï¼è¿æ¯å¾å¤å¤§åçå端工ç¨å¸æ£å¨ç»åçäºæ ï¼å æ¬æçé¨é¨ä¹å¨å°è¯è¿ä¸ªäºæ ï¼ï¼è¿ä¸ªè¶å¿åºè¯¥å¨æªæ¥å å¹´è¿ä¼æç»ã
客æ·ç«¯electronå¨ä»å¹´ä¹æçé¿è¶³çè¿å±ï¼ä¸å¹´å å¤æ¬¡æ´æ°çæ¬ä¸è·¯å°äº.1.5ãéçç«æ å½±åï¼å½å å¨çº¿æè²çåä¸æ³¢å ´èµ·ãå¾å¤æ¡é¢è½¯ä»¶ï¼ç½è¯¾è½¯ä»¶é½å¨éç¨è¿ä¸ªææ¯æ¥è¿è¡å¼åï¼å¸åºä¸çå²ä½ä¹å¼å§åå¤ï¼electronææ¯å¯ä»¥è¯´å¨ä»å¹´ä¹æç«çè¶å¿ã
ç¶åæ们åççBFFå±ï¼nestjsä¾ç¶åæºï¼è¶æ¥è¶å¤ç人å¼å§è·³è¿å¦ä¹ expressåkoaå¼å§å¦ä¹ æ´ä¸°å¯çwebæ¡æ¶äºï¼æ¯å¦eggæè æçdarukï¼å¼åè å·²ç»å¨æ ¢æ ¢å½¢æå ±è¯ï¼å¨webframeworkçè·¯ä¸å¼å§è¶èµ°è¶è¿ï¼è£¸ånodejswebæå¡çæ¶ä»£å·²ç»å¼å§æ ¢æ ¢è¤ªå»ã
ä¸å¾ä¸æçè¿æserverlesså¨å端çæ®åï¼å¨å¹´å°è¾¾äºä¸ä¸ªæ°çé«æ½®ãé¿éäºï¼è ¾è®¯äºï¼å¤´æ¡äºççå½å çäºèç½ååä¹é½å¼å§å¤§ç©serverlessæ¦å¿µãä»å¯¹å æå¡å¼å§è½¬å对å¤æå¡ï¼æ®åçå¿å¤´å¾çï¼ä¹æè½å°çè¶å¿ååºæ¯ãä»å¹´çD2åæ ·ä¹æserverlessçä¸åºï¼å¯è§åéè§ç¨åº¦éæ¯å¯»å¸¸ã
3ï¼å·¥ç¨åææåä¸ªäººç´ è´¨æå
å离æ们è¿ä¸äºçæ¨å¨ç产åçææ¯ï¼æ¯å¦æ®ææç¥å¨ç¨CI/CDåpipeline管çä¸çº¿æµç¨çå ¬å¸è¶æ¥è¶å¤ï¼è¿ç§å»å¹´è¿å¯ä»¥åºå»å¹ä¸å¹çä¸è¥¿ï¼ä»å¹´ä¹éæ¥åæäºä¸çæ é åºç¡è½åï¼å¦æä¸ä¼çåå¦å¯è¦æç´§å¦ä¹ äºã
å¹´å大家é½ç¯çå槽é¢è¯å·mediumé¢ç®æ²¡ç¨ï¼èå¹´å大家å¼å§é»è®¤é¢è¯æäºå ¬å¸é½è³å°è¦å·å°mediumç¨åº¦çé¢ç®ãè¿å¯¹å¾å¤å端æ¥è¯´æ¯ä¸ä¸ªå¿æºåç´ è´¨çæåä¸è½¬åï¼å¤§å®¶å¨æ¥è§¦æ°ææ¯çåæ¶ï¼ä¹æ ¢æ ¢åç°ï¼å端æ´ä¸ªèä¸ç¯å¢çååï¼è¶æ¥è¶å¤çå ¬å¸å¯¹äººçæ´ä½ç»¼åç´ è´¨è¦æ±åé«äºã
eggjs为ä»ä¹å£ç¢ä¸å¥½è´¨éé®é¢ãeggjs为ä»ä¹å£ç¢ä¸å¥½çåå æ¯è´¨éé®é¢ï¼å 为eggjsè´¨éå·®ï¼å®ä»·é«ãå£ç¢ï¼æä¼äººå£å¤´çé¢æ¬ï¼æ³æä¼äººç议论ï¼ç¾¤ä¼çå£å¤´ä¼ 说ï¼ç¸å½äºä¸ç§å¤§ä¼å´è¾¹ç»å¸¸æèµ·çäºæ æç»ç»ã
NGå ¨å®¶æ¡¶å ¨æ 项ç®å®è·µæ»ç»Angularå¨å½å 使ç¨ç人并ä¸åå½å¤é£ä¹å¤ï¼åºæ¬é½æ¯å¤ä¼å¨ç¨ï¼ä½å ¶æ¡æ¶çææ³å´ä»å¯ä»¥ä¸ºæ们æåé´ï¼å¨æäºé®é¢æ²¡ææè·¯çæ¶åå¯ä»¥åèngç¸å ³çå¤çï¼ngå¤çæ¹å¼åæç»´ç¡®å®æ¯è¾è¶ åï¼ä½ä¹å æ¤èæ²é«å寡ãæ¬ææ¨å¨éè¿ngå ¨å®¶æ¡¶é¡¹ç®ï¼å端Angular+å端NestJS7ï¼çå®è·µæ¥æ»ç»å¯¹äºngæ¶æä¸ä¸äºäº®ç¹çå ³æ³¨ä¸æèï¼AngularåNestå¨åå端æ¡æ¶çå¤çä¸ååºä¸èï¼å¯¹æ¯èµ·æ¥æ´æåé´æä¹ã
[ç®å½ç»æ]
[ç®å½æè¿°]
æ´ä¸ªå端项ç®æ¯åºäºangularèææ¶çæçï¼å ¶åºæ¬ç®å½ç»ææ¯å¨srcçappä¸è¿è¡ç¸å ³ç»ä»¶å页é¢ç模åå¼åï¼main.tsåindex.htmlæ¯æ´ä¸ªå页åºç¨çä¸»å ¥å£ï¼æ ¹ç®å½ä¸angular.jsonç¨äºé ç½®ç¸å ³çæå ç¼è¯çç¯å¢é ç½®åæ°
[å®è·µå享]
[ç®å½ç»æ]
[ç®å½æè¿°]
å端项ç®æ¯åºäºnestjsæ¡æ¶ç大ååå°é¡¹ç®é ç½®ï¼api模å主è¦æ¯å¯¹å¤è¾åºçæ¥å£ï¼authãfiltersãguardãinterceptorsãmiddlewaresãpipesçæ¯å¯¹äºéè¦ç模åè¿è¡ç»ä¸çæ¶éå¤çï¼main.tsæ¯ä¸»å ¥å£æ件ï¼ç¨äºå¯å¨åç¸å ³é ç½®çï¼app.module.tsæ¯ç¨æ¥æ¶éææ模åçå¯¼å ¥ï¼ngåºäºæ¨¡åçæ¹å¼å¯ä»¥èµ·å°é常好çé离ææ
[å®è·µå享]
é¦å ï¼å¯¹äºæ²¡æç¨è¿ngçåå¦ç§æ®ä¸ä¸ï¼angularå ¶å®å为两个大çæ¬ï¼ä¸ä¸ªæ¯angular1.xçï¼ä¹å°±æ¯ng1ï¼ä¹å°±æ¯ç°å¨è¿æçangularjsï¼å¦ä¸ä¸ªçæ¬æ¯ng2以åççæ¬ï¼ng2ä¹å被谷ææ¶è´åï¼å®å ¨éåäºæ¡æ¶ï¼å¯ä¸å1.xç¸éç估计ä¹å°±å©é£å 个ææ³è¿å¨äºï¼æ¨¡ååãä¾èµæ³¨å ¥ãååç»å®ãMVCï¼å¯¹äº1.xæå ´è¶£çåå¦å¯ä»¥å»çVueç1.xççæ¬ï¼åºæ¬ç®æ¯ç®åççng1.xï¼Vue2ä¹åå°±ååæ¥çngåéæ¬é³äºï¼vue2主è¦æ¯ä»¥åå¸è®¢é æ¥æ¿ä»£ä¾èµæ³¨å ¥çæè·¯ï¼æ¯è¿äº...(ps:æ³çng1çæ¬çå¯ä»¥çè¿ä¸ªå°åï¼å± ç¶è¿ææ´æ°...angularjså®æ¹ä»åº)ï¼è¿éåæç主è¦æ¯Ngï¼ng8ä¹åé¤äºå¼å ¥Ivy(Ivyæ¶æå®æ¹ä»ç»)è¿ä¸ªç¼è¯æ¸²æå¨ä¹å¤ï¼å ¶å®æ¹å¨ä¸å¤§ï¼ä¸»è¦å°±æ¯å¨ä¼å以ååºé¤åæ°å»ºä¸äºapiççãNgçæºç å¾åºå¤§ï¼goggleèªç äºä¸ä¸ªbazelèªå¨åæå»ºå·¥å ·ï¼ngèªç¶ä¹æ¯é è¿ä¸ªæ建çï¼å¯¹bazelæå ´è¶£çåå¦ï¼å¯ä»¥çè¿ä¸ªGoogle软件æå»ºå·¥å ·Bazelåçå使ç¨æ¹æ³ä»ç»ï¼æè¿éå°±ä¸å±å¼ææçæºç ï¼æ´ä½çæ ¸å¿å¤§æ¡æ¶å¦ä¸ï¼
nestjsæ¯nodejsçwebåºç¨çä¸ä¸ªå¤§çéæï¼å®æåæ¯åºäºexpresså°è£ çä¸ä¸ªå端æ¡æ¶ï¼åæ¥å°æå¡ç«¯åç§ç念é½ä½¿ç¨jså®ç°äºä¸ä¸ï¼è½ç¶ä¸è½åæççæå¡ç«¯è¯è¨æ¡æ¶å¦javaçè¿è¡åª²ç¾ï¼ä½æ¯æå¡ç«¯æéè¦çä¸è¥¿åºæ¬é½å ·å¤äºï¼å¯¹äºæéæ±æ³è¦ä½¿ç¨jsæ¥å¼åå端çåå¦æ¯ä¸ªä¸éçéæ©ï¼ä¸ªäººè®¤ä¸ºç®åçbffï¼æ¯å¦æ³èªå·±æ¨¡æçå¼å个åå°æ¥æ¶è¯·æ±ï¼éæ©nodeç´æ¥åæè 使ç¨expressãkoaå°±å¯ä»¥ï¼å¯¹äºæä¸å®çä¸é´å±ç»å端å¤çï¼å¯ä»¥éç¨é¿éçeggï¼å¯¹äºå¦ä½åºäºeggæ建ä¸é´å±ï¼å¯ä»¥ççè¿ç¯æç« å¦ä½ä¸ºå¢éå®å¶èªå·±çNode.jsæ¡æ¶ï¼ï¼åºäºEggJSï¼ï¼å¯¹äºå¤§åçæå¡ç«¯ï¼å°¤å ¶æ¯å端æ¯ä»¥ng为主æ çï¼å¯ä»¥ä¼å èè使ç¨nestjsï¼å ¶æ¬¡å¯¹äºioè¾å¤è计ç®è¾å°çï¼jsæ¬èº«çç¹è´¨ï¼ï¼æè æå¡ç«¯éè¦ä¸c++é åçï¼å¤§åæå¡ç«¯åºç¨ä¹å¯ä»¥ä½¿ç¨nestãnesté»è®¤æ¯ä¸éç¨å¾®æå¡çå½¢å¼çï¼nestå°ä¸åçå¹³å°å°å¨äºä¸åçplatformä¸ï¼è¿éåªåææ®éç以express为platformçå½¢å¼ï¼å¯¹äºå欢微æå¡çåå¦ï¼å¯ä»¥å¯¹æ¯åjavaçspringcloudçåºå«ï¼è¿éå°±ä¸å表述äºï¼å ¶æ´ä½çæ ¸å¿ç»æ大è´å¦ä¸ï¼
è¿é主è¦å¨å¯¹ä¾èµæ³¨å ¥çå®ç°åä¸ä¸ªç®åçç解å享ï¼å ¶æè·¯æ¯ä¸èç¸æ¿çï¼å¯¹äºç解å端ç念çä¾èµæ³¨å ¥æå¾å¥½çç解ï¼è¿ä¹æ£æ¯å端å端åçä¸ä¸ªä½ç°ï¼ä¹æ¯ææ©çMVCæ¡æ¶ååæ¥çMVVMæ¡æ¶è¿åº¦çä¸ä¸ªåå²è¿ç¨ï¼ä¾èµæ³¨å ¥æ¹å¼å¯¹äºææ©çå端æ¡æ¶è¿æ¯æ纪念æä¹çï¼ä½æ¯å¯¹äºngå ¨å®¶æ¡¶æ¥è¯´ï¼è¿ç®æ¯å ¶åºæ¬å²å¦çä¸ä¸ªåºæ¬é¢
bAngular/b
å æ¥çä¸ä¸ngæ¯å¦ä½å®ç°injectorçï¼è¿ééç¹å¨äºä½¿ç¨äºæ½è±¡ç±»æ¥éè½½ä¸åå½æ°ç使ç¨ï¼å¯¹äºprovider循ç¯ä¾èµçå¤çï¼å©ç¨äºä¸ä¸ªMapæ°æ®ç»ææ¥åºåä¸åçProvider
bNest/b
åæ¥çä¸ä¸ï¼nestçå®ç°ï¼ä¸åäºngçå®ç°ï¼nestæ¯å©ç¨åæ°å继æ¿ç¶ç±»åæ°æ¥ç¡®å®æ´ä¸ªç循ç¯ä¾èµå ³ç³»çï¼å ¶æ²¡æ使ç¨éè½½æ¥å®ç°ï¼ä½é½å¯¹å¾ªç¯ä¾èµåäºå¤çï¼å ¶åºæ¬æè·¯æ¯ä¸è´çã
æ»ç»ï¼ä»nestång对injectorçå®ç°å¯ä»¥çåºï¼è½ç¶é½æ¯æ³¨å°å¨çå®ç°ï¼ä½æ¯ç±äºåç°æ¹å¼çä¸åï¼å èå¨å®ç°æ¹å¼ä¸ä¹ä¼ææä¸åï¼å¯¹äºtsèè¨ï¼éç¨interfaceè¿æ¯æ½è±¡ç±»ï¼ç¡®å®å¯ä»¥åé´javaç模å¼æè·¯ï¼å¯¹äºä¹ æ¯jsçæ们æ¥è¯´ï¼å¯¹äºæ´ä¸ªæ°æ®ç±»åçæ©å±ï¼å¦ï¼æ½è±¡ç±»ãæ¥å£ï¼çæ¯éè¦åå端åé´çãæ´ä½æ¥è¯´ï¼å¯¹äºä¾èµæ³¨å ¥çå®ç°æå ³é®çå°±æ¯å¨äºå¤çproviderçæ´ä¸ªä¾èµé®é¢ï¼è¿ä¸¤è é½æ¯éç¨tokençæ¹å¼æ¥åºåå¯¹å¾ å°åºæ¯å±äºåªä¸ä¸ªproviderï¼ç¶å对äºç¹æ®çç¸å ³ä¾èµå¾ªç¯çé®é¢å对åºçå¤ç
ngæ´ä¸ªçæä½ç³»å¨å½å åºç¨ç并ä¸å¹¿ï¼ä½å¹¶ä¸å¦¨ç¢å ¶ä½ä¸ºå端ç念çæ©å±å è¡è çè¿æ ·ä¸ä¸ªè§è²ï¼ä¸ªäººè®¤ä¸ºå ¶å¨é离æ§ä»¥åç³»ç»æ§æ¹é¢é½æ¯è¦ä¼äºvueåreactçï¼å è对äºç®åæ¯è¾æµè¡çå¾®å端æ¡æ¶(ps:对äºngçå¾®å端åºç¨ï¼å¯ä»¥åèè¿ç¯æç« ã第æã使ç¨Angularæé å¾®å端æ¶æçToBä¼ä¸çº§åºç¨)ï¼ä¸ªäººè§å¾å¨æ²ç®±é离çç³»ç»èåæ¹é¢ç¡®å®å¯ä»¥åé´ä¸ä¸ngçæäºæè·¯ï¼æ许æ£æ¯ç±äºè¿ä¸ªåå ï¼å®ææ¯ä¸å¤§æ¡æ¶ä¸æå ä¸tsçï¼ä¹æå¯è½æ´ä¸ªngçå¼åè æ´åæ¯ä¼ ç»ç软件工ç¨å¸ï¼å¯¹äºæ´ä¸ªå¼åè¦åå°å®ä¹æ°æ®ãå®ä¹æ¨¡åãç³»ç»è®¾è®¡ççï¼å¯¹äºå¤§å项ç®èè¨ï¼è¿æ ·ç¡®å®ä¼åå°å¾å¤å bugèéè¦éå¤ä¿®æ¹çæ¶é´ï¼ä½æ¯å¯¹äºå°å项ç®ï¼ä¸ªäººè®¤ä¸ºè¿æ¯vueæ´åéãè½ç¶å¯¹äºå½å ï¼ngåºæ¬å·²ç»å±äºææ¥é»è±äºï¼ä½æ¯å®çä¸äºç念å设计æ路确å®è¿æ¯å¼å¾åé´çï¼å¨è¿ä¸ªå å·çæ¶ä»£ï¼å大åºç¨é½å¨åçé«çº§åã大åååå±ï¼è¯´ä¸å®åªå¤©ngåå¨å½å éåå· å³°äºå¢ï¼è½ç¶å¾é¾~~åååï¼åä½å æ²¹ï¼
å大éé¸è®¾è®¡å¹è®ï¼nodeç¼ç¨å¼åææ¯çåå±è¶å¿ï¼nodeææ¯æ为webå端é¢åç主æµå¼åå·¥å ·å¯ä»¥è¯´æ¬èº«å°±æ¯ä¸ä¸ªç¾ä¸½ç误ä¼ï¼å½åè¿ä¸ªææ¯è¢«å¼ååºæ¥ä½¿ç¨çæ¶å主è¦æ¯ä¸ºäºè§£å³å端çé®é¢æåºç°çã
ä»å¤©ï¼æµåjava课ç¨å¹è®æºæå°±ä¸èµ·æ¥äºè§£ä¸ä¸nodeææ¯çåå±åç¨åæªæ¥çåå±è¶å¿ã
a)Node8è¿å ¥LTSæ¶ä»£Node.js大çååæ¯è¿å ¥Node8æ¶ä»£ï¼å®æ¯ä¸ä¸ªç¨³å®çé¿ææ¯æçæ¬(LTS)ï¼é¤äºæ§è½æåå¤ï¼è¿æ以ä¸å 个è¦ç¹ã
Async/Awaitæ¯æã
å ¶å®å¨Node.jsv7.6å°±å¯ä»¥éè¿flagæ¯æäºï¼å¨node8éç´æ¥è½å°ã
éè¿Asyncå½æ°å¯ä»¥æ´å¥½çè¿è¡å¼æ¥æµç¨æ§å¶ï¼è¿ç¦»CallbackHellã
å¨Asyncå½æ°éï¼ä½ å¯ä»¥éè¿awaitè°ç¨Promiseï¼ä»¥åéè¿coå 裹çgeneratorï¼å¯ä»¥è¯´ï¼ååæ¯å®ç¾çAsyncå½æ°ï¼ååä¹å®ç¾å ¼å®¹åç§éç代ç ï¼ç§°ä¸ºå¼æ¥ç»æ解å³æ¹æ¡ä¸ä¸ºè¿ã
ES6模åæ¯æã
éè¿vue/reactãwebpackãbabelåtypescriptçç«çåå±ï¼es6模åå¾å°äºå¹¿æ³æ®åååºç¨ï¼å¨Node.jsv8.5å¯ä»¥éè¿--experimental-modulesæ¥å¼å¯è¿ä¸ªä½éªçç¹æ§ã
å½ç¶ï¼ä½ æ³å¨Node.jsæ´æ©çæ¬é使ç¨ES6模åï¼å¯ä»¥éç¨@std/esm模åã
HTTP2æ¯æã
å¨Node.jsv8.8å°±å¼å§é»è®¤å¯ç¨äºï¼http2对æå¡å¨ç«¯æ¨éï¼å¤ééå¤ç¨çç¹æ§ï¼è½å¤æ´å¥½å°ä¸ºæµè§å¨ä¾¿å©ï¼æ¯æ§è½ä¼åçå©å¨ã
b)ä¼ä¸çº§Webå¼ååºç¡æ¡æ¶é¤äºåºç¨å¹¿æ³ç主æµWebæ¡æ¶Koaå¤ï¼Fastifyä¹æ¯ä¸ç´å²æï¼ä½è MatteoCollinaæ¯Node.jsæ ¸å¿å¼åï¼Streamæé¨ï¼æ§è½ä¼åä¸å®¶ã
FastifyåºäºSchemaä¼åï¼å¯¹æ§è½æåæå ¶ææ¾ã
ç¼å认为è¿æ¯ä¼ä¸çº§Webå¼åï¼ä»å¨è¿éç»æ们ä»ç»äº3个ç¥åæ¡æ¶ã
b1)Egg.jsé¿éå¼æºçä¼ä¸çº§Node.jsæ¡æ¶Eggåå¸2.0ï¼åºäºKoa2.xï¼å¼æ¥è§£å³æ¹æ¡ç´æ¥åºäºAsyncFunctionã
æ¡æ¶å±ä¼åä¸å«Node8带æ¥çæåå¤ï¼å¸¦æ¥%å·¦å³çæ§è½æåã
Eggéç¨çæ¯ãå¾®å æ ¸+æ件+ä¸å±æ¡æ¶ã模å¼ï¼å¯¹äºå®å¶ï¼çæï¼å¿«éå¼åæææ¾æåï¼å¦å¤å¼å¾å ³æ³¨çæ¯ç¨³å®æ§åå®å ¨ä¸ï¼ä¹æ¯æ为åºè²çã
b2)NestNestæ¯åºäºTypeScriptåExpressçä¼ä¸çº§Webæ¡æ¶ã
å¾å¤äººå¼ç©ç¬è¯´ï¼Nestæ¯åJavaå¼åæ¹å¼çï¼ç¡®å®ï¼Nestéç¨TypeScriptä½ä¸ºåºå±è¯è¨ï¼TypeScriptæ¯ES6è¶ éï¼å¯¹ç±»åæ¯æï¼é¢å对象ï¼Decorator(类似äºJavaé注解Annotation)çæ¯æã
å¨åæ³ä¸ï¼ä¿æJavaå¼åè çä¹ æ¯ï¼è½å¤å¸å¼æ´å¤äººå¿«éä¸æã
TypeScriptæ¯æå ä¹æ¯ç®åææNodeWebæ¡æ¶é½è¦åç头ç大äºï¼å¨å¹´Nestç®ä¸ªç¥å项ç®ï¼å¼å¾ä¸æã
b3)ThinkJSThinkJSæ¯ä¸æ¬¾æ¥æ±æªæ¥çNode.jsWebæ¡æ¶ï¼è´åäºéæ项ç®ä½³å®è·µï¼è§è项ç®è®©ä¼ä¸çº§å¢éå¼ååå¾æ´å ç®åï¼æ´å é«æã
ç§æ¿ç®æ´æç¨ç设计ååï¼å¨ä¿æåºè²çæ§è½åè³ç®ç代ç åæ¶ï¼æ³¨éå¼åä½éªåæç¨æ§ï¼ä¸ºWEBåºç¨å¼åæä¾å¼ºæåçæ¯æã
ThinkJSæ¯å½äº§èçWebæ¡æ¶ï¼å¨å¹´æåå¸v3çæ¬ï¼åºäºKoaå æ ¸ï¼å¨æ§è½åå¼åä½éªä¸ææ´å¥½çæåã
æ´ä½æ¥çï¼Node.jså¨ä¼ä¸Webå¼åé¢åæ¥æ¸æçï¼æ 论微æå¡ï¼è¿æ¯Apiä¸é´å±é½å¾å°äºé常好çè½å°ã
å¹´ï¼å¯ä¸éæ¾çæ¯Node.jså¨servlessä¸è¡¨ç°çä¸å¤ªå¥½ï¼ç¸å ³æ¡æ¶å®è·µåå°ã
c)ä¸å¯ä¸è§çApiä¸é´å±å端è¶æ¥è¶å¤æï¼å端æå¡åï¼ä»æ¥çå端è¦é¢ä¸´æ´å¤çææã
ä¸ä¸ªå ¸åçåºæ¯å°±æ¯å¨æå¡åæ¶æéï¼å端é¢ä¸´ç头ççé®é¢æ¯å¼æAPIï¼åå端èè°çæ¶åï¼å¤ä¸ªå端äºç¸æ¨è¯¿ï¼è¦ä¹ææ ¢ä¸çº¿è¿åº¦ï¼è¦ä¹è®©å端æ§è½åå¾æå ¶æ ¢ã
è¿åº¦æ ¢æ¾å端ï¼æ§è½å·®ä¹æ¾å端ï¼ä½è¿ä¸ªé çç该å端æ¥èä¹?Node.jsçApiä¸é´å±åºç¨å¾å¥½å°è§£å³äºè¿ä¸ªé®é¢ã
å端ä¸æ³æ¹çæ¶åï¼å®å¨ä¸è¡å°±å端èªå·±åï¼æ´çµæ´»ï¼æ´è½åºåã
éä¼ æ¥å£ï¼å¯¹äºå ç½æè éå®å ¨æ¥å£ï¼å¯ä»¥éç¨ä¸é´å±éä¼ ã
èåæ¥å£ï¼å¯¹å¼æAPIå¤çé常æ¹ä¾¿ï¼å¦æè½å¤æ¢³çmodelï¼åºåæ´å®¹æã
Mockæ¥å£ï¼éè¿Mockæ¥å£ï¼æä¾å端å¼åæçï¼å¯¹æµç¨ä¼åæææå ¶ææ¾ï¼æ¯å¦å»åªå¿å¼åçyapiå°±æ¯ä¸é¨è§£å³è¿ä¸ªé®é¢çã
é¤æ¤ä¹å¤ï¼å端å¦ææ³åä¸äºææ¯é©±å¨çäºå¿ï¼SSR(æå¡å¨ç«¯æ¸²æ)åPWA(æ¸è¿å¼Webåºç¨)ä¹æ¯é常ä¸éçéæ©ã
d)æ°é¢å(深度å¦ä¹ ãåºåé¾ç)