资讯专栏INFORMATION COLUMN

2019.7.15 - 7.21 我们 36人都学了些什么?

Julylovin / 2308人阅读

摘要:作者陈大鱼头如果不希望职业生涯过早结束,持续学习对于开发者来说是必不可少的。最近前端面试之道的作者为了让一些人能在这块地方记录自己学习到的内容而建立起了一个学习仓库。例子如下我们首先定义一个文件叫,一个文件叫。

作者:陈大鱼头

github: KRISACHAN

如果不希望职业生涯过早结束,持续学习对于开发者来说是必不可少的。

最近《前端面试之道》的作者为了让一些人能在这块地方记录自己学习到的内容而建立起了一个学习仓库。

仓库地址如下:

https://github.com/KieSun/tod...

这些内容通常会是一个小点,可能并不足以写成一篇文章。但是这个知识点可能很多人也不知道,那么通过这种记录的方式让别人同样也学习到这个知识点就是一个很棒的事情了。

具体的知识点如下:

CSS CSS Houdini

我们在日常开发中可能会用到过许多 CSS IN JS 或者 CSS module 的方案,但是 JS IN CSS ,你听说过吗?

CSS Houdini 是由一群來自各个国际大厂的工程师所组成的工作小组,志在建立一系列的 API来让开发者能够介入浏览器的CSS引擎中,用来解決 CSS 长久以来的问题。

例子如下:

我们首先定义一个JS文件叫houdini.js,一个HTML文件叫index.html

houdini.js 文件内容如下:

"use strict"
registerPaint("overdraw", class {
    static get inputProperties() { return ["--border-width"]; }
    paint(ctx, geom, properties) {
        const borderWidth = parseInt(properties.get("--border-width"));
        ctx.shadowColor = "rgba(0,0,0,0.25)";
        ctx.shadowBlur = borderWidth;

        ctx.fillStyle = "rgba(255, 255, 255, 1)";
        ctx.fillRect(borderWidth,
                     borderWidth,
                     geom.width - 2 * borderWidth,
                     geom.height - 2 * borderWidth);
    }
});

index.html 文件内容如下:



  
    
    
    
    
    
    
    demo
    
  
  
    

然后开个静态服务器,就可以看效果了,效果如下:

JS 另类的数组求和
let arr = [1, 2, 3, 4, 5]
eval(arr.join("+"))
数组完全展开
function myFlat(arr) {
  while (arr.some(t => Array.isArray(t))) {
       arr = ([]).concat.apply([], arr);
  }
  return arr;
}
var arrTest1 = [1, [2, 3, [4]], 5, 6, [7, 8], [[9, [10, 11], 12], 13], 14];  
// Expected Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
console.log(myFlat(arrTest1))
实现 sleep 函数
function sleep(interval) {
  return new Promise(resolve => {
    setTimeout(resolve, interval);
  })
}
async function test() {
  for (let index = 0; index < 10; index++) {
    console.log(index);
    await sleep(2000)
  }
}
正则过滤违规词
var ma = "大傻逼".split("");
var regstr = ma.join("([^u4e00-u9fa5]*?)");
var str = "这是一篇文章,需要过滤掉大烧饼这三个词,大烧饼中间出汉字以外的字符 大_/_烧a1v饼和 大烧a1v饼";
var reg = new RegExp(regstr , "g");
str.replace(reg,"<替换的词>");
Node 开启 Gzip
const express = require("express");
const compression = require("compression");
const app = express();
app.use(compression());
统计 Git 代码行数
const { exec } = require("child_process");
const { argv } = require("yargs");

const readLines = stdout => {
  const stringArray = stdout
    .toString()
    .split(/(
)/g)
    .filter(str => str !== "
" && str);
  const dataArray = [];
  stringArray.map(str => {
    const data = str.split(/(	)/g).filter(str => str !== "	");
    const [newLine, deletedLine, filePath] = data;
    dataArray.push({ newLine, deletedLine, filePath });
  });
  return dataArray;
};


try {
  if (!argv.commit) throw new Error("")
  exec(`git diff ${argv.commit} --numstat`, (error, stdout, stderr) => {
    console.table(readLines(stdout));
  });
} catch (e) {
  console.log(e);
}
实现一个only函数
var obj = {
    name: "tobi",
    last: "holowaychuk",
    email: "tobi@learnboost.com",
    _id: "12345"
};

const only = (obj, para) => {
    if (!obj || !para) { new Error("please check your args!") }
    let newObj = {};
    let newArr = Array.isArray(para) ? para : typeof (para) === "string" ? para.split(/ +/) : [];
    newArr.forEach((item) => {
        if (item && obj[item] && !newObj[item]) {
            newObj[item] = obj[item];
        }
    })
    return newObj;
}
// {email: "tobi@learnboost.com", last: "holowaychuk", name: "tobi"}
console.log(only(obj, ["name", "last", "email"]));
console.log(only(obj, "name last    email"));
实际业务问题 视频兼容相关

在安卓中,直接使用原生 video 会导致全屏播放,盖住所有元素,因此使用 x5 播放器。但是 x5 播放器还是存在问题,虽然不会盖住元素,但是会自己添加特效(盖一层导航栏蒙层)。

这样可以在安卓下使用 x5 播放器, playsInlinewebkit-playsinline 属性可以在 iOS 环境下启用内联播放。但是通过属性设置内联播放兼容性并不怎么好,所以这时候我们需要使用 iphone-inline-video[2] 这个库,通过 enableInlineVideo(video) 就可以了。

聊天数据渲染

考虑到直播中聊天数据频繁,因此所有接收到的数据会先存入一个数组 buffer 中,等待 2 秒后统一渲染。

// 接收到消息就先 push 到缓存数组中
this.bufferAllComments.push({
  customerName: fromCustomerName,
  commentId,
  content,
  commentType
})
// 利用定时器,每两秒将数组中的中的 concat 到当前聊天数据中并清空缓存
this.commentTimer = setInterval(() => {
  if (this.bufferAllComments.length) {
    this.appendChatData(this.bufferAllComments)
    this.bufferAllComments = []
  }
}, 2000)
链表作为聊天数据的载体

同样考虑到直播中聊天数据频繁插入,因此使用链表来存储显示的聊天数据,目前只存储 50 条数据,这样删除前面的只要很简单。

使用链表的原因是考虑到频繁的去除数组头部数据去造成空间复杂度的问题

另外也实现了支持迭代器的功能,代码如下:

[Symbol.iterator] () {
  let current = null; let target = this
  return {
    next () {
      current = current != null ? current.next : target.head
      if (current != null) {
        return { value: current.value, done: false }
      }
      return { value: undefined, done: true }
    },
    return () {
      return { done: true }
    }
  }
}
总结 工作中建立起来的一些心得

要根据任务四象限划分好每天要做的事,按紧急度去完成任务(重要紧急,重要不紧急,紧急不重要,不重要不紧急);

学会自我总结(写周报或日志汇总所遇到的问题,时刻翻阅);

拥有快速定位并解决问题的能力(通过已知的条件去判断所遇到的问题);

要多与上下游沟通,了解团队大家所做的事以及进度(方便自己合理安排任务);

积极乐观不抱怨(最好可以时常给团队带来正能量,而不是满腹抱怨);

多运动,多休息(身体革命的本钱,没有一个好的身体就什么都做不了)。

最后

这是一个需要大家一起分享才能持续下去的事情,光靠我,YCK或者少量几个人分享是做不下去的。欢迎大家参与到这件事情中来,地址如下:

https://github.com/KieSun/tod...

如果你、喜欢探讨技术,或者对本文有任何的意见或建议,你可以扫描下方二维码,关注微信公众号“鱼头的Web海洋”,随时与鱼头互动。欢迎!衷心希望可以遇见你。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105937.html

相关文章

  • 2019.7.15 - 7.21 我们 36人都了些什么

    摘要:作者陈大鱼头如果不希望职业生涯过早结束,持续学习对于开发者来说是必不可少的。最近前端面试之道的作者为了让一些人能在这块地方记录自己学习到的内容而建立起了一个学习仓库。例子如下我们首先定义一个文件叫,一个文件叫。 作者:陈大鱼头 github: KRISACHAN 如果不希望职业生涯过早结束,持续学习对于开发者来说是必不可少的。 最近《前端面试之道》的作者为了让一些人能在这块地方记...

    legendaryedu 评论0 收藏0
  • 前端面试,从入门到放弃

    摘要:其中经历了入门到放弃系列的火热,想起了此题目,可直到其热度褪去依然没有开写。再之前的实习也是上午面试下午入职的。 这是前几篇前端面试文章的结尾,是很多个月前就该写下的事情。其中经历了入门到放弃系列的火热,想起了此题目,可直到其热度褪去依然没有开写。不能再拖了,否则事情估计都快忘光了。 面试过程 依然是某金融集团的外包,这次换了一个外包公司。首先是电话面试,还是还是些常见的前端问题,自己...

    fantix 评论0 收藏0
  • 【重学前端专栏学习笔记】建立系统的知识架构体系

    摘要:首先一上来就分享了两个学习方法建立知识架构追本溯源。列一份前端知识架构图在这章节中,分享了本专栏要学习的知识架构浏览器的实现原理和前端工程实践四个模块。最后一个是前端工程实践,从性能工具链持续集成搭建系统架构与基础库五个方面讲起。 明确你的前端学习路线 自己特别喜欢屯课,看着自己买的课,有种满足感,仿佛知识都是我的了,翻看极客时间买的课,决定这段时间把重学前端专栏学习一遍。 从周六到今...

    shaonbean 评论0 收藏0
  • react.js,angular.js,vue.js学习哪个好?

    摘要:好好打基础,然后多尝试不同风格的框架,因为只有尝试过后才能理解比如徐飞提到的各种权衡,也只有尝试过后才能知道哪个能真正提升自己的开发效率。 今天看了几篇关于这三个主流框架的PK,如标题:react.js,angular.js,vue.js学习哪个好?相信每个人都有这种问题。 现在的前端框架层出不穷,作为前端开发者何去何从?fackbook的react.js盛世火热,react nati...

    Towers 评论0 收藏0
  • 假如时光倒流,我会这么学习Java

    摘要:看起来没有集合框架,线程,等那么耀眼,但它可是很多框架的基础啊回复反射查看相关文章,先把基础学会,后面的得用到它。 回头看看, 我进入Java 领域已经快15个年头了, 虽然学的也一般, 但是分享下我的心得,估计也能帮大家少走点弯路。[入门]我在2001年之前是C/C++阵营, 有C和面向对象的基础, 后来转到Java ,发现没有指针的Java真是好简单, 另外Java 的类库好用的让...

    bladefury 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<