vue3与vue2的区别

先来说说当下市场开发使用的问题,目前2021年使用vue3开发的企业还是少,基本上都还是以vue2的形式进行开发,vue3的开发模式跟react很像,这时候有人就会想那我学vue3有用么,淦,他喵的,先别激动,冷静听我说说,vue3对于现在企业来说都在慢慢的把一些vue2的东西进行升级,这个非常关键,因为vue2中可以使用vue3的方法,vue3不能使用vue2,你连vue2都没有搞定,还拿个锤子去搞vue3,我们先来看看vue3和vue2的一些区别
请添加图片描述

1.webpack和vite

① vue2使用的是webpack形式去构建项目
webpack是一开始是入口文件,然后分析路由,然后模块,最后进行打包,然后告诉你,服务器准备好了可以开始干了
②vue3使用vite构建项目
先告诉你服务器准备完成,然后等你发送HTTP请求,然后是入口文件,Dynamic import(动态导入)code split point(代码分割)

最大的好处和区别就是为了让项目中一些代码文件多了以后去保存更新数据时更快能够看到实际效果,也就是所谓的(热更新)

2.main.js文件

vue2中我们可以使用pototype(原型)的形式去进行操作,引入的是构造函数
vue3中需要使用结构的形式进行操作,引入的是工厂函数
vue3中app组件中可以没有根标签

3.setup函数

setup函数必须要return 返回出去

<script>export default {name: 'appName',setup(){//变量let name = '打工仔'let age = 18//方法function say(){console.log(`我只是一个${name},今年${age}岁`)}//返回一个对象return {name,age,say}}}
</script>

你会发现当前的${name}中name不需要使用this去进行操作,this的作用只不过是取到某个作用域中变量而已,而setup函数提供了当前只在这个作用域中

这时候就很不爽了,那岂不是每次我定义的变量和方法都需要return,vue3中给我们提供了
在script标签上添加setup 如:<script setup></script>,相当在编译运行时放到了setup中
注:setup比beforeCreate、created生命周期更早,也就是说在当前直接用this去获取data中的数据打出来的还是undefined
setup语法中课接收2个参数setup(props,context)
都知vue2中this.$attrs,this.$slots,this.$emit等同context中attrs,slots,emit
注:当我们只接受一个参数时,页面会提示警告,但是不影响使用

4.指令与插槽

  • vue2中使用slot可以直接使用slot,而vue3中必须使用v-slot的形式
  • v-for与v-if在vue2中优先级高的是v-for指令,而且不建议一起使用
  • vue3中v-for与v-if,只会把当前v-if当做v-for中的一个判断语句,不会相互冲突
  • vue3中移除keyCode作为v-on的修饰符,当然也不支持config.keyCodes
  • vue3中移除v-on.native修饰符
  • vue3中移除过滤器filter

5.ref与reactive

ref
把数据变为响应式数据,ref把它们变成了对象,如果我们直接去操作代码是修改不了的,你会发现当前name和age还是通过get和set修改页面,这时你需要使用.value,并且ref还是Refimpl

<template><div class="home"><h1>姓名:{{name}}</h1><h1>年龄:{{age}}</h1><button @click="say">修改</button></div>
</template><script>
import {ref} from 'vue'
export default {name: 'Home',setup(){let name = ref('中介')let age = ref(18)console.log(name)console.log(age)//方法function say(){name='波妞'age=18}return {name,age,say}}
}
</script>

这样的话那我们在页面上不是得{{name.value}}来做显示,实际不用这样的,在我们vue3中会检测到你的ref是对象,自动会给你加上.value,如果我们自己定义的ref对象,实例会变为refimpl,这个时候用XX.value.XX进行修改

<template><div class="home"><h1>姓名:{{name}}</h1><h1>年龄:{{age}}</h1><h2>职业:{{job.occupation}}</h2><h2>薪资:{{job.salary}}</h2><button @click="say">修改</button></div>
</template><script>
import {ref} from 'vue'
export default {name: 'Home',setup(){let name = ref('中介')let age = ref(18)let job=ref({occupation:'程序员',salary:'10k'})console.log(name)console.log(age)//方法function say(){job.value.salary='12k'}return {name,age,job,say}}
}
</script>

这时我们打印obj.value,他已经不再是refimpl对象,变成了proxy对象,因为vue3底层是proxy对象,基本数据类型都是按Object.defineProperty里面get和set进行数据劫持,vue3已经把reactive封装进去了,相当于我们在调用ref时,会自动调用reactive

reactive
上面我们说ref里面的对象会调用reactive,把Object转换为Proxy,现在我们直接通过reactive变成Proxy,它进行了一个深层次的响应式

<template><div class="home"><h1>姓名:{{name}}</h1><h1>年龄:{{age}}</h1><h2>职业:{{job.occupation}}<br>薪资:{{job.salary}}</h2><h3>爱好:{{hobby[0]}},{{hobby[1]}},{{ hobby[2] }}</h3><button @click="say">修改</button></div>
</template><script>
import {ref,reactive} from 'vue'
export default {name: 'Home',setup(){let name = ref('波妞')let age = ref(18)let job=reactive({occupation:'程序员',salary:'10k'})let hobby=reactive(['吃饭','睡觉','打豆豆'])console.log(name)console.log(age)//方法function say(){job.salary='12k'hobby[0]='学习'}return {name,age,job,say,hobby}}
}
</script>

这时你肯定会觉得方法太多了,还不如使用ref提供的.value,是不是感觉爽爽爽,但是有一个问题,如果有一堆数据那不是要一直去.value,点到冒烟,这个时候你可以用模拟vue2中data的形式,就会感觉更香

<template><div class="home"><h1>姓名:{{data.name}}</h1><h1>年龄:{{data.age}}</h1><h2>职业:{{data.job.occupation}}<br>薪资:{{data.job.salary}}</h2><h3>爱好:{{data.hobby[0]}},{{data.hobby[1]}},{{ data.hobby[2] }}</h3><button @click="say">修改</button></div>
</template><script>
import {reactive} from 'vue'
export default {name: 'Home',setup(){let data=reactive({name:'波妞',age:18,job:{occupation:'程序员',salary:'10k'},hobby:['吃饭','睡觉','打豆豆']})//方法function say(){data.job.salary='12k'data.hobby[0]='学习'}return {data,say,}}
}
</script>

ref与reactive区别

  1. ref定义的是基本数据类型
  2. ref通过Object.defineProperty()的get和set实现数据劫持
  3. ref操作数据.value,读取时不需要.value
  4. reactive定义对象或数组数据类型
  5. reactive通过Proxy实现数据劫持
  6. reactive操作和读取数据不需要.value

6.vue3的响应式原理

vue2的响应式原理用Object.defineProperty的get和set进行数据劫持,从而实现响应式

  • vue2中只有get和set方法去进行属性的读取和修改操作,当我们进行新增,删除时,页面不会实时更新
  • 直接通过下标改数组,页面也不会实时更新

vue3中响应式原理使用Proxy进行代理,使用window内置对象Reflect反射,学了Es6的语法的就知道我们在使用Proxy进行代理,好比甲方公司给出需要什么技术的前端攻城狮,让乙方去干招聘、面试等环节

  • Proxy可以拦截对象中任意的属性变化,当然包括读写,添加,删除等
  • Reflect对源对象属性进行操作
const p=new Proxy(data, {
// 读取属性时调用get (target, propName) {return Reflect.get(target, propName)},
//修改属性或添加属性时调用set (target, propName, value) {return Reflect.set(target, propName, value)},
//删除属性时调用deleteProperty (target, propName) {return Reflect.deleteProperty(target, propName)}
}) 

7.computed和watch与watchEffct区别

computed
vue2中computed方法直接去写上当前方法去进行调用完事

computed:{  //计算属性_suming(){return parseInt(this.one)+parseInt(this.two)},dataTimeing(){console.log("计算属性方法");// return "计算属性方法"+new Date()return "普通方法"+this.time}},

vue3中computed变为组合式Api,那么意味着需要引入,当前如果需要去修改,就需要去终结computed

<template><div class="home">姓:<input type="text" v-model="names.familyName"><br>名:<input type="text" v-model="names.lastName"><br>姓名:{{fullName}}<br></div>
</template><script>
import {reactive,computed} from 'vue'
export default {name: 'Home',setup(){let names=reactive({familyName:'波',lastName:'妞'})fullName=computed(()=>{return names.familyName+'.'+names.lastName})//修改写法names.fullName=computed({get(){return	names.familyName+'.'+names.lastName},set(value){let  nameList=value.split('.')names.familyName=nameList[0]names.lastName=nameList[1]}})return {names,fullName}}
}
</script>

watch
vue2中watch通过对象的形式去直接监听

watch: {userName: {handler(val,res){console.log(val);console.log(res);},immediate:true,deep:true},}

vue3中watch是不是跟computed都是组合APi呢?它就是

<template><div class="home"><h1>当前数字为:{{num}}</h1><button @click="num++">点击数字加一</button></div>
</template><script>
import {ref,watch} from 'vue'
export default {name: 'Home',setup(){let num=ref('0')//监听单个watch(num,(newValue,oldValue)=>{console.log(`当前数字增加了,${newValue},${oldValue}`)})//监听多个响应数据//watch([num,msg],(newValue,oldValue)=>{// console.log('当前改变了',newValue,oldValue)//})return {num}}
}
</script>

为什么newValue与oldValue一样呢,就很尴尬,都是新的数据,就算你使用ref来定义,还是没有办法监听到oldValue(他喵的,都给你说了ref定义的对象会自动调用reactive),所以在监视reactive定义的响应式数据时,oldValue无法正确获取,并且你会发现,它是强制开启深度监视(deep:true),并且无法关闭。

reactive监听的是响应式数据只是监听其中一个,我们都知道vue3会监听reactive或者ref定义,并不能监听,那需要监听多个属性怎么办呢,可以只能是写成下面这种

watch([()=>names.age,()=>names.familyName],(newValue,oldValue)=>{console.log('names改变了',newValue,oldValue)
})

如果需要监听深度属性怎么办呢,我们都知道reactive是响应式数据属性,如果这个属性是对象,那么我们就可以开启深度监听

//第一种
watch(()=> names.job.salary,(newValue,oldValue)=>{console.log('names改变了',newValue,oldValue)
})
//第二种
watch(()=> names.job,(newValue,oldValue)=>{console.log('names改变了',newValue,oldValue)
},{deep:true})

watchEffect
watchEffect是vue3中新增的函数,看字面意思就知道他也有watch,实际上他跟watch功能一样

优势

  • 默认开启 immediate:true
  • 需要用哪个就监听哪个
  • 值发生改变就调用一次,且不需要返回值
watchEffect(()=>{const one = num.valueconst tow = person.ageconsole.log('watchEffect执行了')
})

8.生命周期

vue2中我们是通过new Vue(),在执行beforeCreate与created接着问你有没有vm.$mount(el)
请添加图片描述
vue3中是先准备好所有后再执行
请添加图片描述
区别:beforeCreate与created并没有组合式API中,setup就相当于这两个生命周期函数

setup中

  • beforeCreate===>Not needed*
  • created=======>Not needed*
  • beforeMount ===>onBeforeMount
  • mounted=======>onMounted
  • beforeUpdate===>onBeforeUpdate
  • updated =======>onUpdatedupdated
  • beforeUnmount ==>onBeforeUnmount
  • unmounted =====>onUnmounted

9.hooks函数

//一般都是建一个hooks文件夹,都写在里面
import {reactive,onMounted,onBeforeUnmount} from 'vue'
export default function (){//鼠标点击坐标let point = reactive({x:0,y:0})//实现鼠标点击获取坐标的方法function savePoint(event){point.x = event.pageXpoint.y = event.pageYconsole.log(event.pageX,event.pageY)}//实现鼠标点击获取坐标的方法的生命周期钩子onMounted(()=>{window.addEventListener('click',savePoint)})onBeforeUnmount(()=>{window.removeEventListener('click',savePoint)})return point
}
//在其他地方调用
import useMousePosition from './hooks/useMousePosition'
let point = useMousePosition()

10.toRef与toRefs

toRef相当于ref类型数据

<template><div class="home"><h1>当前姓名:{{names.name}}</h1><h1>当前年龄:{{names.age}}</h1><h1>当前薪水:{{names.job.salary}}K</h1><button @click="names.name+='!'">点击加!</button><button @click="names.age++">点击加一</button><button @click="names.job.salary++">点击薪水加一</button></div>
</template><script>
import {reactive} from 'vue'
export default {name: 'Home',setup(){let names=reactive({name:'老谭',age:23,job:{salary:10}})return {names}}
}
</script>

这时我们只是操作变量,如果我们需要去操作页面字符串可以达到响应式吗?这个时候我们需要把name.XX变为toRef去进行操作name中的数据,
那这时你肯定会去想说句妈卖批,我为何不使用ref去改变呢,ref也能达到响应式数据效果,当前的names里面的数据并不是源数据,而是新定义出的数据,自然操作修改的也不是源数据的names

return {name:names.name,age:names.age,salary:names.job.salary
}return {name:toRef(names,'name'),age:toRef(names,'age'),salary:toRef(names.job,'salary')
}return {name:ref(names.name),age:ref(names.age),salary:ref(names.job.salary),
}

toRefs
toRefs与toRef有什么不同呢,字面意思也能看出来s肯定是更多的意思,(这时你又在猜想,是这样的)自信一些,特喵的,当前...是结构了一次,不懂的可以去看看Es6,这就不过多的谈

 <h1>当前姓名:{{name}}</h1><h1>当前薪水:{{job.salary}}K</h1>
return {...toRefs(names)
}

11.router

vue2中还是使用this. r o u t e r . p u s h 来 进 行 路 由 跳 转 , 在 v u e 3 中 没 有 这 些 , 而 是 定 义 了 一 个 v u e − r o u t e r , 直 接 引 入 u s e R o u t e , u s e R o u t e r , 相 当 于 v u e 2 中 提 供 的 ‘ t h i s . router.push来进行路由跳转,在vue3中没有这些,而是定义了一个vue-router,直接引入useRoute,useRouter,相当于vue2中提供的`this. router.pushvue3vuerouter,useRoute,useRoutervue2this.route,this. r o u t e r ‘ , 别 问 这 ‘ t h i s . router`,别问这`this. router,this.route,this.$router`有什么区别,这都没看过我建议你去先看看vue2

import {useRouter,useRoute} from "vue-router";
setup(){const router= useRouter()const route= useRoute()function fn(){this.$route.push('/about')}onMounted(()=>{console.log(route.query.code)})return{fn}
}

12.全局Api的转移(很重要)

2.x 全局 API( Vue)3.x 实例 API(app)
Vue.config.xxxxapp.config.xxxx
Vue.config.productionTip移除
Vue.componentapp.component
Vue.directiveapp.directive
Vue.mixinapp.mixin
Vue.useapp.use
Vue.prototypeapp.config.globalProperties

vue2中可以通过Vue.prototype去操作原型,在vue3中只能通过app.config.globalProperties,当时玩的时候还以为自己写错了,修改的这些你会发现改动的东西挺多

其他APi(了解)

13.shallowReactive与shallowRef

shallowReactive浅层次的响应式,它就是只把第一层的数据变为响应式,深层的数据不会变为响应式,shallowRef如果定义的是基本类型的数据,那么它和ref是一样的不会有什么改变,但是要是定义的是对象类型的数据,那么它就不会进行响应式,之前我们说过如果ref定义的是对象,那么它会自动调用reactive变为Proxy,但是要是用到的是shallowRef那么就不会调用reactive去进行响应式。

  • shallowReactive:只处理对象最外层属性的响应式(浅响应式)。
  • shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理
let person = shallowReactive({name:'大理段氏',age:10,job:{salary:20}
})
let x = shallowRef({y:0
})

14.readonly与shallowReadonly

  • readonly是接收了一个响应式数据然后重新赋值,返回的数据就不允许修改(深层只读)
  • shallowReadonly却只是浅层只读(第一层只读,其余层可以进行修改)
names=readonly(names)
names=shallowReadonly(names)

15.toRaw与markRaw

toRaw其实就是将一个由reactive生成的响应式对象转为普通对象。如果是ref定义的话,是没有效果的(包括ref定义的对象)如果在后续操作中对数据进行了添加的话,添加的数据为响应式数据,当然要是将数据进行markRaw操作后就不会变为响应式,可能大家会说,不就是和readonly一样吗?那肯定不一样咯,readonly是根本没办法改,但markRaw是不转化为响应式,但是数据还会发生改变

<template><div class="home"><h1>当前姓名:{{names.name}}</h1><h1>当前年龄:{{names.age}}</h1><h1>当前薪水:{{names.job.salary}}K</h1><h1 v-if="names.girlFriend">女朋友:{{names.girlFriend}}</h1><button @click="names.name+='!'">点击加!</button><button @click="addAges">点击加一</button><button @click="addSalary">点击薪水加一</button><button @click="add">添加女朋友</button><button @click="addAge">添加女朋友年龄</button></div>
</template><script>
import {reactive,toRaw,markRaw} from 'vue'
export default {name: 'Home',setup(){let names=reactive({name:'老伍',age:23,job:{salary:10}})function addAges(){names.age++console.log(names)}function addSalary(){let fullName=toRaw(names)fullName.job.salary++console.log(fullName)}function add(){let girlFriend={sex:'女',age:40}names.girlFriend=markRaw(girlFriend)}function addAge(){names.girlFriend.age++console.log(names.girlFriend.age)}return {names,add,addAge,addAges,addSalary}}
}
</script>

16.customRef

customRef创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制
可以使用其特性做防抖节流,原生的方法就不具体写,说一下概念,后续出一个节流防抖,递归,深浅拷贝等

  • 防抖:规定时间内触发同一时间,只执行一次(执行的这一次可以在最开始也可以在最后)
  • 节流:在规定一定间隔时间内触发同一事件,在当前时间内只执行一次,下一个时间内也只执行一次(当前执行的可以在最开始也可以最后)
<template><input type="text" v-model="keyWord"><h3>{{keyWord}}</h3>
</template><script>
import {customRef} from 'vue'
export default {name: 'App',setup() {//自定义一个ref——名为:myReffunction myRef(value,times){let timereturn customRef((track,trigger)=>{return {get(){console.log(`有人从myRef中读取数据了,我把${value}给他了`)track() //通知Vue追踪value的变化(必须要有,并且必须要在return之前)return value},set(newValue){console.log(`有人把myRef中数据改为了:${newValue}`)clearTimeout(time)time = setTimeout(()=>{value = newValuetrigger() //通知Vue去重新解析模板(必须要有)},times)},}})}let keyWord = myRef('HelloWorld',1000) //使用自定义的refreturn {keyWord}}
}
</script>

17.provide与inject

都知道组件传值吧,在vue2中,如果要在后代组件中使用父组件的数据,那么要一层一层的父子组件传值或者用到vuex,但是现在,无论组件层次结构有多深,父组件都可以作为其所有子组件的依赖提供者。这个特性有两个部分:父组件有一个 provide 选项来提供数据,子组件有一个 inject 选项来开始使用这些数据

//父
import { provide } from 'vue'
setup(){let fullname = reactive({name:'阿月',salary:'15k'})provide('fullname',fullname) //给自己的后代组件传递数据return {...toRefs(fullname)}
}
//后代
import {inject} from 'vue'
setup(){let fullname = inject('fullname')return {fullname}
}

18.响应式判断

  1. isRef: 检查值是否为一个 ref 对象。
  2. isReactive:检查对象是否是由 reactive 创建的响应式代理。
  3. isReadonly: 检查对象是否是由 readonly 创建的只读代理。
  4. isProxy:检查对象是否是由 reactive 或 readonly 创建的 proxy。
import {ref, reactive,readonly,isRef,isReactive,isReadonly,isProxy } from 'vue'
export default {name:'App',setup(){let fullName = reactive({name:'小唐',price:'20k'})let num = ref(0)let fullNames = readonly(fullName)console.log(isRef(num))console.log(isReactive(fullName))console.log(isReadonly(fullNames))console.log(isProxy(fullName))console.log(isProxy(fullNames))console.log(isProxy(num))return {}}
}


---------------------
作者:BiKABi
来源:CSDN
原文:https://blog.csdn.net/weixin_43932097/article/details/121512132
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Data REST API集成Springfox、Swagger

原文: Documenting a Spring Data REST API with Springfox and Swagger 使用Spring Date REST&#xff0c;你可以迅速为Spring Date repositories的创建REST API&#xff0c;并提供CRUD和更多功能。然而&#xff0c;在严谨的API开发过成功&#xff0c;您还希望拥有自动生成的最…

【系统设计】S3 对象存储

在本文中&#xff0c;我们设计了一个类似于 Amazon Simple Storage Service (S3) 的对象存储服务。S3 是 Amazon Web Services (AWS) 提供的一项服务&#xff0c; 它通过基于 RESTful API 的接口提供对象存储。根据亚马逊的报告&#xff0c;到 2021 年&#xff0c;有超过 100 万…

转: telnet命令学习

1.每天一个linux命令&#xff08;58&#xff09;&#xff1a;telnet命令 转自&#xff1a; http://www.cnblogs.com/peida/archive/2013/03/13/2956992.html telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员&a…

禅道、码云、coding、redmine、jira、teambition几大敏捷开发项目管理系统试用对比体验

作为一个软件公司的管理人员&#xff0c;在项目和人员多起来后&#xff0c;就需要通过系统来对项目和人员进行管理。 我们是典型的软件外包公司&#xff0c;专为客户定制软件&#xff0c;所以我们的业务都是项目型的。因此&#xff0c;在管理模式上&#xff0c;我们就要用所谓…

Dubbo中的SPI机制

Dubbo中的SPI机制 概述 Service Provider Interface 即 SPI&#xff0c;是JDK内置的一种服务提供发现机制&#xff0c;可以用来启用框架扩展和替换组件。可以让不同的厂商针对统一接口编写不同的实现 SPI实际上是“接口策略模式配置文件”实现的动态加载机制。在系统设计中&…

JWT:拥有我,即拥有权力

Hi&#xff0c;这里是桑小榆。上篇文章中&#xff0c;我们一起探讨了 OAuth 协议的原理以及授权认证流程&#xff0c;本次我们一起探讨 jwt 令牌作为授权协议的传输介质。OAuth协议规范了几个参与角色的授权标准&#xff0c;安全可控的授予第三方应用&#xff0c;第三方应用获取…

双十一到来之前,阿里AI设计师“鲁班”1天能做4000万张海报

相比较去年&#xff0c;“鲁班”的设计技艺有所提升。 人工智能很大程度上便利了我们的生活&#xff0c;现在他们甚至还能取代了一些设计师的工作&#xff0c;在双十一正式到来之前&#xff0c;淘宝的宣传已经铺天盖地&#xff0c;然而很多人都没想到&#xff0c;我们打开淘宝…

Appium移动自动化测试之获取appPackage和appActivity

方法一&#xff1a;直接打开Appium,点击左上角机器人图标 选择apk所在位置&#xff0c;如图所示&#xff0c;这里以ContactManager.apk为例 方法二&#xff1a;利用dex2jar和jd-gui这两个工具反编译apk文件 这里仍以ContactManager.apk为例 (1)重命名ContactManager.apk为Conta…

CAD转WPF: 关于CAD图纸文件转换为WPF矢量代码文件(xaml文件)的技巧

前言&#xff1a;下面的文章&#xff0c;我将会以几个很简单的步骤&#xff0c;来演示一下通过CAD图纸转换为XAML代码文件的方法&#xff0c;供大佬们参考。一、为了演示一个简单的操作&#xff0c;我此处先打开一个空白的CAD&#xff0c;等下用来进行绘制点内容使用。二、自定…

python之新式类与经典类

经典类与新式类经典类:P 或 P()--深度查找&#xff0c;向上查父节点新式类 :P(object)---广度查找&#xff0c;继承object&#xff0c;新式类的方法较多转载于:https://www.cnblogs.com/zyy98877/p/8574983.html

Flowportal-BPM——环境配置

环境配置&#xff1a; 一、控制面板→程序和功能→打开或不关闭Window功能→选择选项 二、控制面板→管理工具→Internet信息服务&#xff08;IIS&#xff09;管理器→左侧第一个→ISAPI和CGI限制→全部选为【允许】 三、控制面板→管理工具→Internet信息服务&#xff08;IIS&…

一篇文章带你搞懂什么是DevOps?

DevOps DevOps 它的英文发音是 /de’vɒps/&#xff0c;类似于“迪沃普斯”&#xff0c;一词本身是对于 development 以及 operation 两个词的混合&#xff0c;其目的在于缩短系统开发的生命周期&#xff0c;在这过程中发布特性、修复bug以及更新均被紧密的结合。 简化的含义为…

微服务架构下分布式事务解决方案 —— 阿里GTS

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务&#xff0c;这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇&#xff0c;很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。Hailo有160个不同服务构成&…

重要消息丨.NET Core 3.1 将于今年12月13日结束支持

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;5分钟).NET Core 3.1 将于 2022 年 12 月 13 日结束支持。此后&#xff0c;Microsoft 将不再为 .NET Core 3.1 提供服务更新或技术支持。我们建议尽快迁移到 .NET 6。如果您在支持日期结束后仍在使用 .NET Core 3.1&a…

产品设计的三大原则

1.它有用吗? 如果我们必须从这三个特性中选择一个作为最重要的&#xff0c;那就是有用性。 首要的是&#xff0c;一个产品必须有用。如果它无用&#xff0c;其它任何东西都是不相关的&#xff0c;因为没有人会需要它。很明显&#xff0c;有用性和可享用性看上去一样重要&#…

常用的17个运维监控系统

1. Zabbix Zabbix 作为企业级的网络监控工具&#xff0c;通过从服务器&#xff0c;虚拟机和网络设备收集的数据提供实时监控&#xff0c;自动发现&#xff0c;映射和可扩展等功能。 Zabbix的企业级监控软件为用户提供内置的Java应用服务器监控&#xff0c;硬件监控&#xff0c…

关于html-三角的制作

因为最近看到别人写的不错的样式&#xff0c;所以就想自己实现&#xff0c;但是呢用到了一个三角形&#xff0c;所以稍微研究一下。效果是这样的&#xff1a;注意是下边那个浅色三角&#xff0c;感觉书签的效果有木有。看着很有层次感。接下来就是实现了&#xff0c;利用border…

ABP中的数据过滤器

本文首先介绍了ABP内置的软删除过滤器(ISoftDelete)和多租户过滤器(IMultiTenant)&#xff0c;然后介绍了如何实现一个自定义过滤器&#xff0c;最后介绍了在软件开发过程中遇到的实际问题&#xff0c;同时给出了解决问题的一个未必最优的思路。一.预定义过滤器ABP中的数据过滤…

ActiveMQ与spring整合

2019独角兽企业重金招聘Python工程师标准>>> 1 生产者 第一步&#xff1a;引用相关的jar包。 <dependency> <groupId>org.springframework</groupId><artifactId>spring-jms</artifactId> </dependency> <dependency><…

最新远程部署运维工具汇总

一&#xff0e;Puppet 转载https://baike.baidu.com/item/puppet/5109503?fraladdin puppet是一种Linux、Unix、windows平台的集中配置管理系统&#xff0c;使用自有的puppet描述语言&#xff0c;可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体…