程序員這行若是想一直作下去,那麼持續學習是必不可少的。javascript
你們找工做一般會喜歡技術氛圍好點的團隊,由於這樣可以幫助本身更好的成長,可是並非每一個團隊都擁有這樣的氛圍。因而萌發一個念頭,想創建一個地方,讓一些人能在這塊地方記錄本身學習到的內容。這些內容一般會是一個小點,可能並不足以寫成一篇文章。可是這個知識點可能不少人也不知道,那麼經過這種記錄的方式讓別人一樣也學習到這個知識點就是一個很棒的事情了。html
若是你也想參與這個記錄的事情,歡迎貢獻你的一份力量,地址在這裏。java
本週總共有 36 我的貢獻了它所學到的知識,如下是一些整合後的內容,更詳細的內容推薦前往倉庫閱讀。git
在安卓中,直接使用原生 video 會致使全屏播放,蓋住全部元素,所以使用 x5 播放器。可是 x5 播放器仍是存在問題,雖然不會蓋住元素,可是會本身添加特效(蓋一層導航欄蒙層)。程序員
<video className='live-detail__video vjs-big-play-centered' id='live-player' controls={false} playsInline webkit-playsinline='true' x5-video-player-type='h5' x5-video-orientation='portrait' x5-playsinline='true' style={style} />
複製代碼
這樣能夠在安卓下使用 x5 播放器, playsInline
及 webkit-playsinline
屬性能夠在 iOS 環境下啓用內聯播放。可是經過屬性設置內聯播放兼容性並不怎麼好,因此這時候咱們須要使用 iphone-inline-video 這個庫,經過 enableInlineVideo(video)
就能夠了。github
在安卓下視頻自動播放的兼容性不好,所以只能讓用戶手動觸發視頻播放。可是在 iOS 下能夠經過監聽微信的事件實現視頻的自動播放。web
document.addEventListener("WeixinJSBridgeReady", function () {
player.play()
}, false)
複製代碼
由於頁面使用的是 HTTPS 協議,iOS 強制規定在 HTTPS 頁面下也必須使用安全協議。所以使用 ws 協議的話在 iOS 下報錯,後續使用 wss 協議解決。express
在 iOS 中,輸入框彈起鍵盤先後,頁面均可能出現問題,須要監聽下鍵盤彈起收起的狀態,而後本身滾動一下。數組
// 監聽鍵盤收起及彈出狀態
document.body.addEventListener('focusout', () => {
if (isIphone()) {
setTimeout(() => {
document.body.scrollTop = document.body.scrollHeight
}, 100)
}
})
document.body.addEventListener('focusin', () => {
if (isIphone()) {
setTimeout(() => {
document.body.scrollTop = document.body.scrollHeight
}, 100)
}
})
複製代碼
考慮到直播中聊天數據頻繁,所以全部接收到的數據會先存入一個數組 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)
複製代碼
另外直播中其實涉及到了不少異步數據的拉取及狀態的變動,這時候若是能使用 RxJS 能很好的解決數據流轉的問題,後續能夠嘗試重構這部分的代碼。
一樣考慮到直播中聊天數據頻繁插入,所以使用鏈表來存儲顯示的聊天數據,目前只存儲 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 }
}
}
}
複製代碼
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))
複製代碼
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 = "大xx".split('');
var regstr = ma.join('([^\u4e00-\u9fa5]*?)');
var str = "這是一篇文章,須要過濾掉大xx這三個詞,大xx中間出漢字之外的字符 大_/_傻a1v逼和 大傻a1v逼";
var reg = new RegExp(regstr , 'g');
str.replace(reg,"<替換的詞>");
複製代碼
const express = require('express');
const compression = require('compression');
const app = express();
app.use(compression());
複製代碼
const { exec } = require('child_process');
const { argv } = require('yargs');
const readLines = stdout => {
const stringArray = stdout
.toString()
.split(/(\n)/g)
.filter(str => str !== '\n' && str);
const dataArray = [];
stringArray.map(str => {
const data = str.split(/(\t)/g).filter(str => str !== '\t');
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);
}
複製代碼
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'));
複製代碼
這是一個須要你們一塊兒分享才能持續下去的事情,光靠我一人分享是作不下去的。歡迎你們參與到這件事情中來,地址在這裏。