前端实现以及个人理解

前言

这回从前端文本基础实现讲解开始,到前端本人使用过的一些框架进行简单说明,技术方面不会深讲,工作经验没多少,主要还不是固定一个方向深耕,本人一直觉得很慌,虽说领导给定的方向是全栈,但还是担心是饼,但有个方向总比没有好,工作内方向又不是自己能决定的,难啊!

水够字数了,将从HTML页面的基础要素讲起,本人接触过的框架thymeleaf,vue2,angular,react,vue3会多少讲一点,后面用到了更深层次,或者更好用的技术,再更新吧。

HTML页面要素

打开F12,浏览器自带的开发者工具,点击元素,我们会看到html下有主要有三部分,(1)、<head></head>标签下代表的引用文件样式(.css或者样式预处理文件.scss)<style>直接写在标签内亦可,页面可声明元信息<meta>,<title>标题<link>连接文件等

(2)、页面要素标签集合,<body></body>主体,<div></div>分区,<menu></menu>菜单,<hi></hi>标题,<img>图片,<table></table>表格,<button></button>按钮,<pagination></pagination>分页栏,<footer></footer>页脚等等,不详细介绍了,开发者工具右边样式栏里有标签对应各种显示属性,详细看教程,百度菜鸟教程自己看

(3)、引用的JavaScript(.js文件)或者Typecript(.ts)功能实现文本<script>,typescript对变量,功能等有类型定义,注重类型安全,js中var和let几乎能定义完,但出问题调试很困难,在源代码处找对应文件,对应行单击即可打上断点,鼠标停留在上面即可看运行到断点处的变量或者结构详细,确实比后端调试方便。

框架

这里先说明一下,thymeleaf和angularjs仍旧是多页面式的框架,使用多个HTML页面,但vue和react是单页面响应式框架,只有一个根页面App.vue或者index.html作为根页面,然后定义路由组件包含所有页面,响应速度十分快。

此外,react是讲HTML页面标签元素视为为一个函数返回值,代码更加容易得到复用,能够很好的应用在大项目的开发中,vue是另外定义了<template></template>标签存放html页面标签元素,下方<script></script>标签存放功能,<style><style>存样式响应更快。

另外两个的使用场景呢?thymeleaf是springboot自带的用来替代JSP的模板引擎,非分离式开发,存放在resource的template下,数据量大的情况下,比单个页面全部请求快很多,后端有大批量数据需要展示的情况下使用它;AngualarJs是一个类 MVC 类结构的 JavaScript 单页面应用框架,建议构建 CRUD 类型应用的时候使用它,而对于那些图形编辑、游戏开发等应用,使用 Angular 就不如调用其它 JavaScript 类库方便,如 jQuery,Vue 不包含路由器,HTTP 请求服务等。开发者必须安装所需的"插件",angular却有,有助于节省编码时间。

ThymeLeaf

说真的,感觉没多少好讲的,数据绑定方式是属性后@{}绑定方法,*{}绑定对象,${}绑定值,嫌麻烦queryselector()直接绑定就行,没多少自带文件结构,在resource下定义首页,直接加标签就行;主要是UI库,根据UI库官网给的组件,直接往上套就行,我用的是layUI,同时甚至支持其他框架。

vue

文件结构:

1、build:构建脚本目录

2、config:项目配置

3、node_modules:npm 加载的项目依赖模块

4、src:这里是我们要开发的目录,基本上要做的事情都在这个目录里。里面包含了几个目录及文件:

1)assets:资源目录,放置一些图片或者公共js、公共css。但是因为它们属于代码目录下,所以可以用 webpack 来操作和处理。意思就是你可以使用一些预处理比如 Sass/SCSS 或者 Stylus。

2)components:用来存放自定义组件的目录,目前里面会有一个示例组件。

3)router:前端路由目录,我们需要配置的路由路径写在index.js里面;

4)App.vue:根组件;这是 Vue 应用的根节点组件,往下看可以了解更多关注 Vue 组件的信息。

5)main.js:应用的入口文件。主要是引入vue框架,根组件及路由设置,并且定义vue实例,即初始化 Vue 应用并且制定将应用挂载到index.html 文件中的哪个 HTML 元素上。通常还会做一些注册全局组件或者添额外的 Vue 库的操作。 6)store:存储文件,将全局变量、异步变量、状态管理之类的存放

5、static:静态资源目录,如图片、字体等。不会被webpack构建

6、index.html:首页入口文件,可以添加一些 meta 信息等。 这是应用的模板文件,Vue 应用会通过这个 HTML 页面来运行,也可以通过 lodash 这种模板语法在这个文件里插值。 注意:这个不是负责管理页面最终展示的模板,而是管理 Vue 应用之外的静态 HTML 文件,一般只有在用到一些高级功能的时候才会修改这个文件。

7、package.json:npm包配置文件,定义了项目的npm脚本,依赖包等信息

8、README.md:项目的说明文档,markdown 格式

vue2和vue3有些区别:

|------------|-------------------------------|-----------------------------|
| | vue2 | vue3 |
| 双向数据绑定实现原理 | APIobject.defineProprty()挟持数据 | API代理 |
| 碎片(多个根节点) | 不支持 | 支持,login->loginForm |
| API类型 | 选项类型data,components,methods | 合成类型components,setup() |
| 数据变量和方法定义 | data{},methods{},computed{} | reactive()响应数据,setup()返回数据 |
| 生命周期函数 | create() | 替代为setup() |
| 父传子值 | 父props传子用this.$emit | 父传子setup()参数列表里content参数 |
| 指令和插槽 | slot直接用,v-for级别最高,v-if不建议一起使用 | v-slot,命令间不起冲突,无v-on,filter |
| main.js | 可用protype,引入构造函数 | 引入工厂函数,无跟标签 |

编写.vue文件要注意以上这些

生命周期函数说明:

创建期间的生命周期函数:

beforeCreate:实例初始化后调用,此时实例刚在内存中创建出来,data和methods还没初始化好。

created:在实例创建完成后被立即同步调用,实例已在内存中创建好,data和methods已初始化好,此时还没开始编译模板。

beforeMount:在挂载开始之前被调用,已完成模板编译,还没挂载到页面上。

mounted:实例被挂载后调用,已将编译好的模板挂载到页面指定的容器中显示。

运行期间的生命周期函数:

beforeUpdate:状态更新前调用,此时data中的值是最新的,但界面上数据还是旧的,还没开始重新渲染DOM节点。

updated:实例更新完调用,此时data中的值和界面显示的数据都已更新完成,界面已被重新渲染完成。

销毁期间的生命周期函数:

beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。

destroyed:实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。

都是在<script>里methods:接口里定义行为。

具体实现参考UI库,我用的是elementUI,router安装后,可调用路由服务,在router文件夹下import就是了,然后属性指定,子组件component直接指定路径下对应文件,访问认证记得写在这里。

优化点是lazyload()延时加载长,因为是单页面吗,预加载的话时间太长,半天进不去体验就很差,可在main.js里指定对应参数,亦可在指定标签用v-lazy指令,component可用箭头函数import,后端在application.properties里调用gzip压缩指定文件,效果最明显

  1. gzip on; # 开启Gzip

  2. gzip_static on; # 开启静态文件压缩

  3. gzip_min_length 1k; # 不压缩临界值,大于1K的才压缩

  4. gzip_buffers 4 16k;

  5. gzip_http_version 1.1;

  6. gzip_comp_level 2;

  7. gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; # 进行压缩的文件类型

  8. gzip_vary on;

  9. gzip_proxied expired no-cache no-store private auth;

  10. gzip_disable "MSIE [1-6]\.";

最后,在config.js里做proxy代理到后端就行

AngualrJs

文件结构:

  1. app/

  2. -----config/

  3. ----- controllers/

  4. ---------- mainController.js

  5. ---------- otherController.js

  6. ----- directives/

  7. ---------- mainDirective.js

  8. ---------- otherDirective.js

  9. ----- services/

  10. ---------- userService.js

  11. ---------- itemService.js

  12. ----- js/

  13. ---------- bootstrap.js

  14. ---------- jquery.js

  15. ----- app.js

  16. views/

  17. ----- mainView.html

  18. ----- otherView.html

  19. ----- index.html

说实话,这个玩意儿是我接触最少的,就做了一个页面和一个页面的优化,唯一有点印象的就是他的MVC模式,v就是view,视图这个不用多说,把html文件放进去views就行,指令绑定,ng-;c就是控制器,把实现的js文件放进去controllers,调度定义在service指定后端服务,有点印象的是它有作用域的概念,rootscope,定义获取全页面变量,scope只定义获取当前页面变量,然后.moudule绑定到指定模块,.controller绑定到自定义的controller,config里.state指定模块,属性url和views指定视图,resolve指定控制器文件

react

这个框架与vue结构基本一致:

项目目录:

├─node_modules //第三方依赖

├─public //静态资源(不参与打包)

└─src

├─assets //静态资源

├─components //组件

├─config //配置

├─http //请求方法封装

├─layout //页面布局

├─pages //页面

├─routes //路由

├─service //请求

├─redux //状态管理

└─util //通用方法

└─App.css

└─App.tsx

└─index.css

└─main.tsx

└─vite-env.d.ts

├─.eslinttrc.cjs

├─.gitignore

├─index.html //项目页面总入口

├─package.json

├─tsconfig.json //ts配置文件

├─tsconfig.node.json

├─vite.config.ts //vite配置文件

主要是用了TypeScript实现,typeScript建议看教程学,菜鸟教程搜就是,redux代替了store来存全局变量、异步变量、状态管理之类的数据,UI用的是TinyUI,练习用antd吧,毕竟那个官网要在华为内网内才能看。

react关键点在useState()和useEffect():

let [count,setCount] = useState(10) 定义变量和自带的修改方法,

useEffect():

第一种情况:只有一个回调函数参数相当于didMount+didUpdate,并且可以有返回值的;

return 返回是一个钩子函数相当于 willUnmount卸载钩子;

第二种请求 参数1是箭头回调函数,参数2是空数组,相当于didMount 但是只初始化执行一次;

第三种情况 参数1是箭头回调函数 参数2是数组的元素是状态,在初始化走一次,监听第二个参数中的发生变化时候走一次;

// 只有参数1箭头函数回调

useEffect(()=>{

console.log("1-didMount+didUpdate")

// 可以在此处发请求和获取DOM ,但是数据更新的话会再次执行

ref1.style.color="red" //成功更改颜色

return ()=>{

// 可以清除定时器等

console.log("相当于 willUnmount卸载钩子")

}

})

// 参数2为空数组,只会在第一次绑定dom元素执行一次,相当于didMount

useEffect(()=>{

console.log("2-didMount")

// 可以在此处发请求和获取DOM

},[])

// 参数2数组不为空,数组元素的是一个状态,类似于watch监听到count变化的时候调用

// 初始化也会走一次,目的为了指定监听谁的

// 监听属性发生变化的时候, 也会触发改钩子

useEffect(()=>{

console.log("3---监听第二个数组中的状态")

},[count])

return(

<div>

<h3 ref={el=>ref1=el}>{count}</h3>

<button onClick={()=>{

setCount(999999)

}}

>修改count</button>

<h3>{person.name}</h3>

<button onClick={()=>{

setPerson({

name:"zs"

})

}}

>修改Person</button>

</div>

)

生命周期:

  • Mounting(挂载):已插入真实 DOM
  • Updating(更新):正在被重新渲染
  • Unmounting(卸载):已移出真实 DOM

后端代理在vite.config.ts里。

后言

看完还是觉得捞的不行,没项目干说太蛋疼,更像是个人感悟,谁不想直接跟着项目走一遍加深印象和理解呢,我就搬下大佬们的文章吧,react ,vue,angularJs,至于你问我为啥没有thymeleaf。只能说太旧了,我接手时领导找了两老员工都半天解决不了问题,只能期望于你别接手相关项目,现在前后端不分离的web项目太少见了,还不如祈求后端优化少传点数据。后端以后再说吧,感觉完全是另一个思路,毕竟抛异常,调试定位就有的头疼了,更别说各种技术,我以后看看能不能就一个框架springboot,毕竟也只接触过这一个,加上一些技术说明,前端其实好多也没说到,例如请求axios,navigate等等,后面再扩充或者另起文章讲吧。

相关推荐
sunshine64119 分钟前
【CSS】实现tag选中对钩样式
前端·css·css3
真滴book理喻42 分钟前
Vue(四)
前端·javascript·vue.js
蜜獾云44 分钟前
npm淘宝镜像
前端·npm·node.js
dz88i81 小时前
修改npm镜像源
前端·npm·node.js
Jiaberrr1 小时前
解锁 GitBook 的奥秘:从入门到精通之旅
前端·gitbook
顾平安2 小时前
Promise/A+ 规范 - 中文版本
前端
聚名网2 小时前
域名和服务器是什么?域名和服务器是什么关系?
服务器·前端
桃园码工2 小时前
4-Gin HTML 模板渲染 --[Gin 框架入门精讲与实战案例]
前端·html·gin·模板渲染
不是鱼2 小时前
构建React基础及理解与Vue的区别
前端·vue.js·react.js
沈剑心2 小时前
如何在鸿蒙系统上实现「沉浸式」页面?
前端·harmonyos