前端实现以及个人理解

前言

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

水够字数了,将从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等等,后面再扩充或者另起文章讲吧。

相关推荐
桂月二二4 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
hunter2062065 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb5 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角5 小时前
CSS 颜色
前端·css
浪浪山小白兔7 小时前
HTML5 新表单属性详解
前端·html·html5
lee5767 小时前
npm run dev 时直接打开Chrome浏览器
前端·chrome·npm
2401_897579657 小时前
AI赋能Flutter开发:ScriptEcho助你高效构建跨端应用
前端·人工智能·flutter
limit for me8 小时前
react上增加错误边界 当存在错误时 不会显示白屏
前端·react.js·前端框架
浏览器爱好者8 小时前
如何构建一个简单的React应用?
前端·react.js·前端框架
qq_392794488 小时前
前端缓存策略:强缓存与协商缓存深度剖析
前端·缓存