以下文章来源于前端Q ,作者时光大佬
我是winty,专注分享前端知识和各类前端资源,乐于分享各种有趣的事,关注我,一起做个有趣的人~
从毕业到现在已经在北京3年了,当年一起来北京的同学,如今都有了要离开的打算。我也在萌生了想要去成都的想法。然而从投递简历开始,就感受到了今年确实不是很景气。很多大厂不是裁员就是锁HC,面试邀约都显得非常宝贵。
HTTPS建立连接过程
http缓存,强缓存时cache-control字符集是什么 publichttps://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control
webpack 有用过哪些loader、webpack做过哪些优化
loader:babel-loader、ts-loader、style-loader、css-loader、less-loader
优化:提取公共代码、代码分割、代码压缩、按需加载、预加载
微前端的问题,设计思路,有遇到哪些问题,如何做样式隔离。
公用路由的设计
采用路由分层的方式,将路由划分为4层,第一层用来区分是iframe还是微应用,第二层用来区分具体的app页面名称由此在配置表中拿到具体的配置信息,第三层为子应用的路由,第4层为子应用的参数。由此实现基座与微应用的路由共享。
{ sandbox : { experimentalStyleIsolation: true } }
,二是vue组件样式使用scoped,三是顶层样式增加私有类名 为什么要使用composition-api
首先因为业务性质需要兼容ie所以项目只能使用vue2
通过使用@vue/composition-api方式使用新特性。转变以往的vue选项式开发,为更贴近函数式的代码开发。使原本关联逻辑分散在各个选项中,组件代码庞大的问题的问题得到解决,提高代码易读性、可维护性。同时通过抽取hook实现逻辑复用,提升效率。相较于mixin具有隐式依赖等缺点,更具备可用性。
纯数字版本号数组排序
function versionSort(versions) {
return versions.sort((a, b) => {
const aArr = a.split(".");
const bArr = b.split(".");
while (aArr.length || bArr.length) {
const A = aArr.shift() || 0;
const B = bArr.shift() || 0;
if (A - B !== 0) {
return A - B;
}
}
});
}
import { *** } from 'vue'
替换为 import { *** } from '@vue/composition-api'
function promsieTask(taskList, maxNum) {
return new Promise((resolve, rejuct) => {
let runCount = 0;
let complated = 0;
const taskNum = taskList.length;
const resArr = [];
let current = 0
function handler() {
if(runCount>=maxNum) return
const a = taskNum - complated;
const b = maxNum - runCount
const arr = taskList.splice(0, a>b?b:a);
arr.forEach((task, index) => {
const d = current+index
task
.then(
(res) => {
console.log(current,index,res)
resArr[current] = res;
},
(reason) => {
resArr[current] = reason;
}
)
.finally(() => {
complated++;
runCount--;
if (complated === taskNum) {
resolve(resArr);
}
handler();
});
});
current += taskList.length
}
handler();
});
}
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
const head = new ListNode()
let current = head
while(l1&&l2){
if(l1.val<l2.val){
current.next = l1
l1 = l1.next
}else{
current.next = l2
l2 =l2.next
}
current = current.next
}
if(l1){
current.next = l1
}
if(l2){
current.next = l2
}
return head.next
};
{ sandbox : { experimentalStyleIsolation: true } }
,二是vue组件样式使用scoped,三是顶层样式增加私有类名1. qiankun的打包配置
https://qiankun.umijs.org/zh/guide
2. 了解市面上其他的微前端方案么
1、是类似乾坤、飞冰这种基于singleSpa的方案
2、是类似美团那种,相同技术架构的,自研原生实现
3. 为什么使用Monorepo组织代码仓库
我们这个库,设计上就是要能够支持vue2、vue3两个版本,以及不同业务需要的 采用Monorepo组织代码仓库,方便管理维护不同的功能包、既做到了独立发布,又能在项目中统一维护
4. webpack知道有哪些插件lodaer么?
5. webpack你知道哪些优化
构建阶段、多线程、缓存
资源产物 代码压缩、代码分割、提取公共代码、懒加载、预加载
6. leetcode 452题
https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/
extenrals
选项,可以将依赖从输出的bundle中移除,并保持资源引入Object.definePropert
数据劫持与数组常用方法的改写来实现的。对于复杂数据类型,需要层层递归劫持,性能较差 proxy
代理实现的,不需要递归,也不需要改写方法,性能更好,支持更好。但是由于代理只是对目标对象,在传递响应式对象时,操作不当容易丢失响应性。// 给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。
// 网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
// 岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
// 示例1:输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
// 输出:16
// 解释:它的周长是上面图片中的 16 个黄色的边
// 示例2:输入:grid = [[1]]
// 输出:4
function search(grid) {
let res = 0
grid.forEach((line, i) => {
line.forEach((item, j) => {
if (item === 1) {
dp(i, j)
}
})
});
function dp(i, j) {
if (i == 0 || grid[i - 1][j] == 0) {
res++
}
if (i + 1 == grid.length || grid[i + 1][j] == 0) {
res++
}
if (j == 0 || grid[i][j - 1] == 0) {
res++
}
if (j + 1 == grid[0][1].length || grid[i][j + 1] == 0) {
res++
}
}
return res
}
const grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
console.log(search(grid))
这一面就是简单沟通了一下现在的工作情况。电话面试大概10分钟就结束了
美团二面感觉面的不是很好, 二面之后就没有后续了
- EOF -
觉得本文对你有帮助?请分享给更多人
推荐关注「前端大全」,提升前端技能
点赞和在看就是最大的支持❤️