1.webpack分包具体怎么配置的?分包有什么好处?https://www.webpackjs.com/plugins/split-chunks-plugin/
SplitChunksPlugin插件,设置optimization.splitChunks里面的各种属性,比如chunks: all或者async,minSize等,一般的话都是使用默认配置
library对公共组件库进行提取
2.git中,某个迭代版本中有A,B两个人开发的代码,现在只需要A的代码,怎么将A的代码抽离出来?
3.页面一次性渲染10万条数据,怎么做的?我说的使用懒加载方式,对数据进行二次处理
提问:懒加载方式类似于分页,这个过程DOM节点会不断变多,最后会造成页面卡顿吗?
这种如果使用虚拟列表实现怎么实现?
4.代码质量检测怎么做的?eslint和prettier代码校验有冲突时是怎么解决的,以哪个为准,prettire校验时效是什么时候?
5.gzip压缩是具体是怎么做的?为什么使用gzip就能进行优化?性能能提升多少?
1.H5 crs系统,同时渲染很多个组件,怎么解决渲染效率问题?有没有对系统可用性和渲染效率进行监测?
组件懒加载+loading效果;css渲染;会通过keep-alive进行缓存处理。安全监测:sentry:可以对线上项目进行错误监控
2.说说前端开发安全性?
接口安全,注入安全
3.事件循环机制?
4.自定义组件使用v-model怎么实现?不用value而是使用其他值可以接受吗?
5.基本数据类型有哪些?基本数据类型和引用数据类型的区别?为什么会有BigInt?Number的取值范围是多少?Symbol是什么?
https://blog.csdn.net/qq_34569497/article/details/133886271
6.重排和重绘的理解?
7.虚拟DOM的理解?为什么虚拟DOM会快?
8.diff算法的实现?
9.vue3和vue2有什么不用?
荷叶健康:
1.小程序页面嵌入后的数据通信怎么做的?
web-view组件:src属性内嵌H5页面链接
bindmessage:网页向小程序 postMessage 时,会在以下特定时机触发并收到消息:小程序后退、组件销毁、分享、复制链接(2.31.1)。e.detail = { data },data是多次 postMessage 的参数组成的数组。
bindload:网页加载成功时候触发此事件。e.detail = { src }
wx.miniProgram.postMessage:向小程序发送消息,会在以下特定时机触发组件的message事件:小程序后退、组件销毁、分享、复制链接
2.神策埋点?
跟踪应用使用的情况,记录用户在系统中的操作行为轨迹,后续用来进一步优化产品或提供运营的数据支撑,包括访问数、访客数、停留时长、页面浏览数和跳出率。
埋点采集信息大致分为两大类:页面统计,操作行为统计。
https://blog.csdn.net/qq_34569497/article/details/135655805
3.重排和重绘有什么区别?
回流(重排):
添加或删除可见的DOM元素
元素的位置发生变化
元素的尺寸发生变化(包括外边距、内边框、边框大小、高度和宽度等)
内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代
页面一开始渲染的时候(这避免不了)
浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)
还有一些容易被忽略的操作:获取一些特定属性的值
offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight
这些属性有一个共性,就是需要通过即时计算得到。因此浏览器为了获取这些值,也会进行回流
除此还包括getComputedStyle方法,原理是一样的
触发回流一定会触发重绘
引起重绘的行为:
颜色的修改
文本方向的修改
阴影的修改
避免回流的经验:
如果想设定元素的样式,通过改变元素的 class 类名 (尽可能在 DOM 树的最里层)
避免设置多项内联样式
应用元素的动画,使用 position 属性的 fixed 值或 absolute 值(如前文示例所提)
避免使用 table 布局,table 中每个元素的大小以及内容的改动,都会导致整个 table 的重新计算
对于那些复杂的动画,对其设置 position: fixed/absolute,尽可能地使元素脱离文档流,从而减少对其他元素的影响
使用css3硬件加速,可以让transform、opacity、filters这些动画不会引起回流重绘
避免使用 CSS 的 JavaScript 表达式
在使用 JavaScript 动态插入多个节点时, 可以使用DocumentFragment. 创建后一次插入. 就能避免多次的渲染性能
4.页面输入url到回车后是怎么样一个过程?三次握手和四次挥手?
URL解析;DNS域名解析获取到了域名对应的目标服务器IP地址;TCP连接(三次握手);发送 http 请求;响应请求;请求响应完后发起TCP四次挥手;页面渲染
三次握手和四次挥手过程:
https://vue3js.cn/interview/http/after_url.html#%E4%B8%80%E3%80%81%E7%AE%80%E5%8D%95%E5%88%86%E6%9E%90
5.div居中怎么实现?除了绝对定位和flex还有什么其他方式?
a,盒子没有宽高时,绝对定位+top50%+left50%+transform:translate(-50%,-50%)
b,盒子有宽高时,绝对定位+四个方向值为0+margin:auto;
c,盒子有宽高时,绝对定位+top50%+left50%+margin-top:-50px(负自身高度一半)+margin-left:-50px(负自身宽度一半)
d,flex布局
6.flex布局还有什么其他的属性?
https://blog.csdn.net/weixin_48998573/article/details/131240067
justify-content,align-items,flex-direction(row | row-reverse | column | column-reverse);
flex-wrap:nowrap | wrap | wrap-reverse;
flex-flow: <flex-direction> || <flex-wrap>;
align-content: flex-start | flex-end | center | space-between | space-around | stretch;align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
order属性:order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
7.为了解决小程序发版问题这个什么意思?
8.优化方面做了哪些优化?
组件异步加载;动态路由;
webpack打包优化,css分离插件,UI组件库按需导入,splitChunksPlugin分包,减少入口文件体积;
图片使用svg图标矢量库等;
公共组件封装如表单组件配置化;
css一些优化:减少DOM操作;减少DOM层级;减少@import导入css文件等
使用缓存:强缓存和协商缓存结合
开启GZip压缩compression-webpack-plugin,需要后端配合
9.异步组件加载怎么做的?
函数形式+import;动态路由
10.组件封装怎么封装的?组件封装都考虑的哪些因素
11.vue2和vue3区别?
new Proxy();
composition API;
复合式函数对比mixin,保存数据状态
使用ts更加友好,VUE3是基于typescipt编写的
diff算法优化:使用静态标记,会发生变化的地方添加一个flag标记,下次发生变化的时候直接找该地方进行比较
静态提升:Vue3中对不参与更新的元素,会做静态提升,只会被创建一次,在渲染时直接复用,免去了重复的创建操作,优化了运行时候的内存占用
Vue3移除一些不常用的 API,引入tree-shaking可以删除无用模块
事件监听缓存;
SSR优化
编译优化
12.数据类型有哪些?基本数据类型和引用数据类型的区别?
13.slot是什么?
14.diff算法怎么的?vue2和vue3的diff算法有什么区别?
静态标记:vue3在diff算法中相比vue2增加了静态标记。作用是为了会发生变化的地方添加一个flag标记,下次发生变化的时候直接找该地方进行比较
静态提升:Vue3中对不参与更新的元素,会做静态提升,只会被创建一次,在渲染时直接复用,这样就免去了重复的创建节点,大型应用会受益于这个改动,免去了重复的创建操作,优化了运行时候的内存占用
15.技术选型怎么做的?从那几个技术里面决定使用postMessage的
面向大众化,社区支持力度大,postMessage是H5新增的API,文档非常详细且有实现案例;学习成本,易用性好;实现功能完成度
16.ref和reactive的区别?
17.设计稿中如果有字体小于12px时怎么办?
17.怎么从前端转后端的?
18.为什么要回武汉?
我回答的是类怎么写?构造函数、静态属性和方法、原型等
猜测答案:
面向对象二(原型、原型链、类)__Jyann_的博客-CSDN博客
类(class)通过?static?关键字定义静态方法。不能在类的实例上调用静态方法,而应该通过类本身调用。
对象方法需要通过实例化对象去调用
类方法不需要通过实例对象去调用
原型方法也需要通过实例化对象去调用
原型就是一个普通对象,它是为构造函数的实例共享属性和方法;所有实例中引用的原型都是同一个对象
? ? ? ? 使用prototype可以把方法挂在原型上,内存里只保存一份
? ? ? ? __proto__可以理解为指针,实例对象中的属性,指向了构造函数的原型(prototype)
? ? ? ? 原型链 __proto__就是一个实例对象在调用属性和方法的时候,会依次从实例本身、构造函数原型、原型的原型上去查找
单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建
在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象
现在很多第三方库都是单例模式,多次引用只会使用同一个对象,如jquery
、lodash
、moment
..
面试官:说说你对单例模式的理解?如何实现? | web前端面试 - 面试官系列
自己整理的例子?javascript实现单例模式__Jyann_的博客-CSDN博客
类型标注+类型检测+类型推导,最终会转为js代码运行。具有面向对象编程、类、接口、继承、泛型等特性。
strictNullChecks
配置为 true
,可以有效的检测 null
或者 undefined
tsconfig.json文件中常用的属性:
{
"compilerOptions": {
"outDir": "./dist",
"module": "commonjs",
"target": "es2016",
"allowJs": true,
"sourceMap": true,
// 不允许使用any类型
"noImplicitAny": true,
"strictNullChecks": true,
// 开启装饰器
"experimentalDecorators": true,
// Reflect Metadata 能够为对象添加和读取元数据。
"emitDecoratorMetadata": true,
// 可以引入json文件
"resolveJsonModule": true,
"esModuleInterop": true,
// 允许从没有设置默认导出的模块中默认导入
"allowSyntheticDefaultImports": true,
},
"include": [
"./src/**/*"
]
}
Proxy
直接可以劫持整个对象,并返回一个新对象,我们可以只操作新的对象达到响应式目的。Proxy
有多达13种拦截方法,不限于apply
、ownKeys
、deleteProperty
、has
等等Proxy
?不兼容IE,也没有?polyfill
,?defineProperty
?能支持到IE9使用v-model
?可以在组件上使用以实现双向绑定。
<input
type="checkbox"
:checked="checked"
@change="$emit('change', $event.target.checked)"
>
原理:数据双向绑定(数据劫持、模板编译、依赖收集、视图渲染)?
Vue的一个内置组件,包裹组件的时候,会缓存不活跃的组件实例,并不是销毁他们。
:max="10"?用于设置最大缓存数,如果缓存的实例数量即将超过指定的那个最大数量,则最久没有被访问的缓存实例将被销毁。
include和exclude设置匹配或不匹配的路由
作用:把组件切换的状态保存在内存里,防止重复渲染DOM节点,减少加载时间和性能消耗,提高用户体验
<KeepAlive>
<component :is="activeComponent" />
</KeepAlive>
//路由里面配置
meta: {
keepAlive: true
}
Vue
?在更新?DOM
?时是异步执行的。当数据发生变化,Vue
将开启一个异步更新队列,视图需要等队列中所有数据变化完成之后,再统一进行更新。如果想要在修改数据后立刻得到更新后的DOM
结构,可以使用Vue.nextTick()。
实现原理:
Promise.then
、MutationObserver
、setImmediate
、setTimeout任意一种方法
将执行函数放到微任务或者宏任务中实现原理:面试官:Vue中的$nextTick有什么作用? | web前端面试 - 面试官系列
https://blog.csdn.net/qq_34569497/article/details/133356724
我说的是根据数据生成表单的过程,不是一个组件怎么实现。要听清楚问的是什么?
封装过程:
import TForm from "@/components/form/TForm.vue";
export default {
install (app) {
// 在app上进行扩展,app提供 component directive 函数
// 如果要挂载原型 app.config.globalProperties 方式
//app.config.globalProperties.TForm= TForm
//vue3会出现TForm.name为undefined情况,可以是使用TForm.__name或者自定义为“TForm”
app.component(TForm.name, TForm)
}
}
使用的是elementUI?的表单校验。通过自定义rules校验规则后,表单中使用props进行对应。
缺陷:
类JS的后端语言,除了关于浏览器的一些方法,比如window,history等下的方法以及不能直接获取和处理DOM元素,以外其他的js能用的node.js都能用。node.js使用的是commonjs规范,即使用require引入模块资源。
中间件:如koa,express,JWT,Boom, egg框架等等。
插件: koa-bodyParse,koa-static,koa-router,koa-ts-controllor,
自定义的中间件:错误处理,JWT鉴权等。
执行命令,会去项目根目录下找package.json文件中script下的对应命令。如npm run dev即为执行vite命令。
为什么不直接执行vite:因为操作系统中没有vite命令
为什么执行npm run dev即?执行vite能成功,但是直接vite不行?当使用 npm run dev 执行 vue-cli-service serve 时,虽然没有安装 vue-cli-service的全局命令,但是 npm 会到 ./node_modules/.bin 中找到 vue-cli-service 文件作为 脚本来执行,则相当于执行了 ./node_modules/.bin/vue-cli-service serve。
为什么能找到node_modules下对应的文件?当我们npm install 整个新建的vue项目的时候,npm 将 bin/vue-cli-service.js 作为 bin 声明了。
所以在 npm install 时,npm 读到该配置后,就将该文件软链接到 ./node_modules/.bin 目录下,而 npm 还会自动把node_modules/.bin加入$PATH,这样就可以直接作为命令运行依赖程序和开发依赖程序,不用全局安装了。
也就是说,npm install 的时候,npm 就帮我们把这种软连接配置好了,其实这种软连接相当于一种映射,执行npm run dev 的时候,就会到 node_modules/bin中找对应的映射文件,然后再找到相应的js文件来执行。
Vue使用虚拟DOM来实现组件渲染。当数据发生变化时,Vue会生成一个新的虚拟DOM树与旧的虚拟DOM树进行对比,找出发生变化的部分,最后只将这部分内容真实地渲染到DOM中。
1.数据劫持:当数据发生变化时,Vue会通过Proxy?的get和set方法来监听数据变化。当数据被修改时,Vue会通过异步队列的方式将数据变化通知到每个依赖于这个数据的组件,并在nextTick(下一个异步时机)时更新视图。这样做的好处是可以优化性能,减少重复的DOM操作。
2.diff算法:在更新视图时,Vue会通过组件的render函数生成新的虚拟DOM树并与旧的虚拟DOM树进行对比。Vue使用了一些策略来优化这个过程,例如使用key来区分不同的子节点;vue3的diff算法中还增加了静态标记,其作用是为了会发生变化的地方添加一个flag
标记,下次发生变化的时候直接找该地方进行比较,下图这里,已经标记静态节点的p
标签在diff
过程中则不会比较,把性能进一步提高。当然,如果数据量很大,整个过程仍然可能会比较耗时。
3.最后,Vue会将新的虚拟DOM树渲染成真实的DOM。这个过程与一般的DOM操作类似,但Vue会在必要的时候使用一些优化技术,例如使用createElement代替innerHTML来避免重复的DOM操作。
Set
?结构相结合实现数组或字符串去重;可实现数组并集、交集、和差集计算;WeakSet
可以接受一个具有?Iterable
接口的对象作为参数,WeakSet
与Set
有两个区别:WeakSet
没有遍历操作的API,没有size属性;WeakSet
只能成员只能是引用类型,而不能是其他类型的值,WeakSet
里面的引用只要在外部消失,它在?WeakSet
里面的引用就会自动消失。API
中WeakMap
与Map
有两个区别:没有遍历操作API,没有clear清空方法,WeakMap
只接受对象作为键名(null
除外),WeakMap
的键名所指向的对象,一旦不再需要,里面的键名对象和所对应的键值对会自动消失,不用手动删除引用,WeakMap
?弱引用的只是键名,而不是键值。键值依然是正常引用主要了解对前端技术的热爱和积极性,我说是老大让学,踩坑大了
之前做后端开发的时候也同时负责一些前端开发工作,比如做网银的时候就有涉及到原生JS,jQuery等,后面做OA系统的时候又接触到了Vue,elementUI这些框架,然后因为项目的关系后来也一直在用vue,对vue也比较感兴趣,后面就开始做一些前后端分离项目,从那以后就一直在做前端了。
21.你有什么想问的吗?
以后可以问:请问一下面试官针对我刚才的表现有什么意见,我还有什么欠缺的地方?
你们项目是做的是什么业务?
加班情况?
对我今天的表现有什么看法,觉得我还有哪些地方需要继续努力的?
基本数据类型:String、Number、Boolean、Null、undefined、Symbol、BigInt
引用数据类型:Object、Array、Math、Date、Map、WeakMap、Set、WeakSet
对象的key只能存放字符串,而新增的Map类型,key可以存放任意类型的数据
jsonp?的src,cross(前端+后端),vue-cli/vite的proxy配置,Nginx的配置,websocket也可以解决跨域
var ws = new WebSocket('wss://echo.websocket.org');
// 发送
ws.onopen = function (evt) {
console.log('Connection open ...');
ws.send('Hello WebSockets!');
};
// 接受
ws.onmessage = function (evt) {
console.log('Received Message: ', evt.data);
ws.close();
};
// 关闭
ws.onclose = function (evt) {
console.log('Connection closed.');
};
webpack?是一个用于现代 JavaScript 应用程序的静态模块打包工具。webpack会把js css image看作一个模块,用import/require引入,通过一个或多个入口文件找到关联的依赖文件,把他们打包到一起。
首先会找到入口文件(一个或多个),js文件可以直接打包,然后通过loader对非JS文件进行压缩打包,而对loader处理不了的,比如HtmlWebpackPlugin,SplitChunksPlugin等通过plugin插件进行编译处理,最后找到出口文件,进行打包。
在正常开发,挂载周期的执行顺序为:
父beforeCreate => 父created => 父beforeMount => 子beforeCreate => 子created => 子beforeMount => 子mounted => 父mounted
在数据更新阶段执行顺序为:
父beforeUpdate => 子beforeUpdate => 子updated => 父updated
在组件销毁阶段执行顺序为:
父beforeDestroy -> 子beforeDestroy -> 子destroyed -> 父destroyed
由此可见,其实所有周期规律就是:只要子组件被引入触发,所处不管任何周期都是父组件先开始执行,然后等到子组件执行完,父组件收尾。
?
created()拿不到el元素,如果要用需要使用nextTick()
异步队列和事件循环:
什么是闭包:函数内返回函数,闭包会由自己的内部作用域,闭包内可以获取到外部变量和数据,但是外部不能获取到闭包内的数据,从而形成独立作用域。
闭包外为什么无法获取闭包内的变量:闭包有自己的独立作用域,作用域内的变量是私有的,所以外部获取不到。
闭包里的私有变量为什么不会被垃圾回收机制回收:由于闭包的特性是可以获取到外部变量和数据的,所以这部分变量其实是被闭包内引用却一直未释放内存,所以不会被垃圾回收机制检测到
Set
?结构相结合实现数组或字符串去重;实现并集、交集、和差集;Map字典,是键值对的有序列表,而键和值都可以是任意类型,size属性,get(),set(),has(),delete(),clear(),可以遍历keys(),values(),entries(),forEach()。WeakSet
可以接受一个具有?Iterable
接口的对象作为参数,WeakSet
与Set
有两个区别:没有遍历操作的API,没有size属性;WeakSet
只能成员只能是引用类型,而不能是其他类型的值,WeakSet
里面的引用只要在外部消失,它在?WeakSet
里面的引用就会自动消失。在API
中WeakMap
与Map
有两个区别:没有遍历操作API,没有clear清空方法,WeakMap
只接受对象作为键名(null
除外),不接受其他类型的值作为键名,WeakMap
的键名所指向的对象,一旦不再需要,里面的键名对象和所对应的键值对会自动消失,不用手动删除引用,WeakMap
?弱引用的只是键名,而不是键值。键值依然是正常引用flex:1所有子项平分父亲,不管子项是否设置了固定宽度。
flex:1在chrome下表现为以下:
flex:auto在chrome下表现为以下:
技术答题网站:ShowMeBug | 支持实战编程的技术能力评估平台-技术测评和编程面试
arr.sort((a,b)=>b.poll-a.poll)
//arr[0].name即为分数最高的
?星级评价:星星变色且对应评价内容文字更改
vue2: beforeCreate(),created(),beforeMount(),mounted(),beforeUpdate(),updated(),beforeDistroy(),distroyed()
vue3: setup(), onBeforeMount(),onMounted(),onBeforeUpdate(),onUpdated(),onBeforeUnmount(),onUnmounted(),onErrorCaptured(),onActivated(),onDeactivated()
created和mounted的区别?
代码优化:
加载优化:
缓存和压缩优化:
打包优化:
1.数据类型不同, 但是值相同:两个数据分别属于 Undefined 类型和 Null 类型,但是表示的值都是空。
console.log(undefined == null) // true, 不涉及数据类型比较
console.log(undefined === null) // false, 涉及数据类型比较
2.数据类型转换为数值类型的时候结果不一样:null 表示空, 存储的时候也是一大堆 0, 所以转换为数值是 0,undefined 表示没有, 什么都没有内容转换为数值以后是 NaN
console.log(Number(null)) // 0
console.log(Number(undefined)) // NaN
3.使用场景不同:null,在我们需要一个空值或者置空变量的时候手动赋值,原型链的终点位置, 也就是 Object.prototype.proto是 null;undefined,在变量声明未赋值的时候就是 undefined,函数只有形参没有实参的时候, 这个形参的值也是 undefined,如果一个函数没有设置返回值, 那么这个函数的返回值也是 undefined
4.JSON.stringify():对于对象的值为undefined直接删除,null保留。
5.函数的默认参数,如果实参是 null 则会生效。如果是undefined 那么相当于没有参数,会使用默认参数。
6.就是当你查找相关没查到就是null,比如querySelector
是ES6新增构造函数,为了解决异步操作中回调函数的回调地狱而产生。
两个参数:resolve(),reject()
可以进行链式操作.then()和.catch(),所以也很容易造成混乱;
有三个状态:pending, fullfiled,reject。只有两种处理结果:pending->fullfilled或者pending->reject,状态一旦改变不可逆。
有all,race等方法:all()全部状态为成功才返回true否则为false,race()返回第一个返回的状态;
项目中使用:多表单提交的项目背景,有个以父表单,有一个子表单,需要两个都验证通过的情况下,才能提交,就使用all()方法进行校验。
display:flex;
justify-content: space-between;
是JS的一种超类,也是一种面向对象编程的语言,包括类,接口,继承,泛型等等,主要做类型标注+类型检测+类型推导。
做java项目的时候接触到前端相关的东西,比如说做网银的时候就是前后端一起负责的,有用到jquery,原生js相关的东西,后面做公司的OA系统又接触到了Vue相关的东西,后面就觉得Vue挺有趣的也好用,就一直在学习和使用vue,后面也就开始用vue做项目了。
主要从代码优化、加载优化、打包优化,缓存和压缩优化。
我说的是虚拟列表拖拉列宽时,节流中用到了闭包;
vue的data实际上也是利用了闭包
封闭作用域
单例模式里面使用过闭包:全局弹窗只出现一次
ES6 和 CommonJS 都是 JavaScript 模块化的规范,它们之间有以下区别:
总的来说,ES6的模块化规范更加先进、灵活,能够适应更多的应用场景,而CommonJS则更加简单、易用,广泛应用于Node.js开发中。在实际应用中,可以根据具体情况选择使用不同的模块化方案。
原文链接:https://blog.csdn.net/conquer_galaxy/article/details/129677681
Proxy在IE浏览器里面兼容性不好
data,computed,methods
等属性与方法分别处理;Composition Api是通过一个功能将所定义的所有 API 会放在一起,显然逻辑组织和定位上很清晰。另外Options Api中使用mixin混入方式进行代码复用,很容易出现命名冲突和数据来源不清晰的问题;而Composition Api使用组合式函数来封装和复用有状态逻辑的函数,解决了mixin混入带来的问题)Api
?暴露出来(ref,reactive,observable, effect等),引入即可直接使用复合函数有状态的。“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。有状态逻辑负责管理会随时间和操作不同而变化的状态。如组合式 API 实现鼠标跟踪功能。状态可以是异步状态或者是响应式状态。
1.npm打包方式
可以使用CommonJS,ES6各种规范通过模块导出语法暴露方法以供使用。如ComomJs的module.exports = {}; ES6的export default或者直接export?变量或对象
export default {
install (app) {
// 在app上进行扩展,app提供 component directive 函数
// 如果要挂载原型 app.config.globalProperties 方式
app.component(TForm.__name, TForm);
}
}
2.webpack打包方式?
vite ,是一种新型前端构建工具,能够显著提升前端开发体验。
它主要由两部分组成:
其作用类似webpack
+?webpack-dev-server
,其特点如下:
vite特点:
启动速度快:vite
会直接启动开发服务器,不需要进行打包操作,也就意味着不需要分析模块的依赖、不需要编译,因此启动速度非常快ES6模块化
的特性,当浏览器请求某个模块的时候,再根据需要对模块的内容进行编译,这种方式大大缩短了编译时间HMR只编译浏览器请求的修改过的模块
:在热模块HMR
方面,当修改一个模块的时候,仅需让浏览器重新请求该模块即可,无须像webpack
那样需要把该模块的相关依赖模块全部编译一次,效率更高webpack
大而全,很多常用的功能做到开箱即用。有两大最核心的特点:一切皆模块和按需加载
与其他构建工具相比,有如下优势:
主要将表单组件通过数据进行配置化封装。
封装时在JSX文件时,使用defineComponent()进行处理,defineComponent()旨在与组合式 API 和?渲染函数或 JSX?一起使用。使用时需要传入一个函数,这个函数的工作方式与组合式 API 的?setup()?函数相同:它接收 props 和 setup 上下文。setup返回值应该是一个渲染函数——支持?h()
?和 JSX。props属性用于获取到父组件传入的数据,然后在setup方法中根据数据用JSX语法生成各种表单控件并进行返回。
注意事项:如果构建工具是webpack,在函数调用之前添加一个?/*#__PURE__*/
?形式的注释,以告诉 webpack 这个函数调用可以被安全地 tree-shake
export default /*#__PURE__*/ defineComponent(/* ... */)
uniapp有什么优点:
使用uniapp怎么做多端发布:
文档分为功能说明文档还有技术文档。
功能说明文档:
技术文档:
是否在职在职?在职半个月到1个月
离职原因?
现在薪资,期望薪资?
我们团队总共10个人,根据项目需求后面还会进来人,前端的话2个,其他都是后端和测试,我主要是前端负责任人,负责前端开发计划,时间把控,和后端接口对接这些事。主要任务就是进行需求分析,和客户进行需求对接和沟通,然后安排好工作计划,包括需求分析,开发,测试,上线时间,然后做好质量和风险把控。各个环节实时跟进,有问题及时沟通,严格按照计划走。如果计划时间内工作量没有完成,首先要定位未完成原因,如果能加班完成的肯定要加班。如果是技术问题,要及时沟通,并拿出解决方案和完成时间,自己决定不了的往上级汇报。
明确开发规范,开发规范文档;
安装和使用 ESLint;
ts做类型检测
是否深户,有无房车?我问了为什么问这个,说了解一下员工工作压力方面是否抗压
住处?
年纪,已婚已育,家里是否有人带?
经常加班,1.4 5个小时,8.30到6.0点,周六周日加班双薪,能否接受加班?
项目:服务消费者,it部门,供应链,物流,门店,华为外包的ERP系统
技术框架:vue2往3走,需要鸿蒙系统适配
华为外包,坂田,岗头,下地铁8分钟
主要问的小程序商城的题目。对小程序要求多一点,也做后台管理,但是没有问相关问题。
做Sass平台的,低代码平台:组件化拖拽生成H5页面,后台管理系统,后端
小程序商城
小程序:image的mode有个属性实现。图片裁剪、缩放的模式center,保持不缩放显示中间区域
顶部固定;商品展示区进行组件封装根据数据动态加载;通过下拉操作onPullDownRefresh()判断触底距离超过固定值就加载下一页;头像加载动效没做过:怎么实现?可以有滚动组件
有,主要是满减券。
计算:购物车里面点击商品以后,实时计算
支付页面没有消费券选择,购物车页面选中商品后根据领取的消费券自动计算价格
微信小程序开发中生命周期的详细介绍_javascript技巧_脚本之家
我说在请求在created()里面发送,他问你所有的请求都在页面里面做吗?我说对呀。
他说那有那种全局数据根据某个状态显示某个页面的数据要怎么做?使用原生小程序里面使用全局属性app。
还有在应用生命周期函数里面,发起请求获取到数据以后,将数据设置到参数里面,页面就能获取数据了。
对小程序各种生命周期不熟:
应用级的生命周期函数:
组件生命周期:created,attached,ready,moved,detached,error
组件所在页面生命周期:show,hide,resize
有
我说没有做,是另一个同事做的,需要做一下这些变成自己的东西
我说不是一个人做的。
其实这个小程序很小,一个人拿下就可以了。后续在退款、售后、物流、优惠券、商品秒杀、头像动效上要去做一下。
因为我自我介绍也介绍了java后端。直接说了最近都在做前端,前面几年做的后端
做java项目也有接触过前端,比如做网银的时候就有原生JS和JQuery,做OA系统接触过Vue
感觉看复杂情况吧,像那种需要重新去封装组件的肯定就慢,光是页面布局1两天足已
只是布局的话1两天,有数据渲染,组件封装,优化,测试的话就没底了,看要做到什么程度
其实就是Sass低代码平台,包括三个系统:通过组件化拖拽生成的H5页面,组件管理的后台管理系统,后端系统
代码冲突:对同一个文件不同人进行操作,文件文件名更改等都会造成代码冲突。
不同环境版本:用不同的分支进行管理
不同环境上线怎么区分:配置文件中通过环境变量配置不同的打包环境