Если программисты хотят продолжать это делать, необходимо непрерывное обучение.
Люди, ищущие работу, обычно предпочитают команду с лучшей технической атмосферой, потому что это может помочь им расти лучше, но не в каждой команде есть такая атмосфера. Поэтому мне пришла в голову идея создать место, где некоторые люди могли бы записывать то, что они узнали. Обычно это мелочи, и их может быть недостаточно для написания статьи. Но эта точка знания может быть неизвестна многим людям, поэтому было бы здорово позволить другим также изучить эту точку знания с помощью этого метода записи.
Если вы тоже хотите принять участие в этой записи, вы можете внести свой вклад,Адрес здесь.
В общей сложности 36 человек внесли свой вклад в то, что он узнал на этой неделе.Вот некоторые интегрированные материалы.Более подробный контент рекомендуется перейти на склад, чтобы прочитать.
Авторская практика работы функции прямых трансляций в среде WeChat
Проблемы совместимости
Связанные с совместимостью видео
В Android прямое использование нативного видео приводит к полноэкранному воспроизведению, охватывающему все элементы, поэтому используйте проигрыватель 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 под Android,playsInlineиwebkit-playsinlineСвойство для включения встроенного воспроизведения в среде iOS. Но установка совместимости встроенного воспроизведения через свойства не очень хороша, поэтому в данный момент нам нужно использоватьiphone-inline-videoэта библиотека черезenableInlineVideo(video)Вот и все.
Автовоспроизведение видео
Совместимость автоматического воспроизведения видео с Android очень плохая, поэтому пользователи могут запускать воспроизведение видео только вручную. Однако в iOS видео может воспроизводиться автоматически, прослушивая события WeChat.
document.addEventListener("WeixinJSBridgeReady", function () {
player.play()
}, false)
Проблема с протоколом под iOS
Поскольку на странице используется протокол HTTPS, iOS требует, чтобы безопасный протокол также использовался на страницах HTTPS. Поэтому, если используется протокол ws, под iOS будет сообщено об ошибке, а протокол wss будет использоваться для ее решения позже.
испытывать проблемы
Под iOS клавиатура всплывает и закрывается
В 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)
}
})
оптимизация производительности
Отображение данных чата
Учитывая частые данные чата в прямом эфире, все полученные данные сначала будут храниться в буфере массива и будут отображаться равномерно после ожидания в течение 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 }
}
}
}
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))
Реализовать функцию сна
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,"<替换的词>");
Node
Включить сжатие
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(/(\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'));
разное
Несколько когниций, разработанных на работе
- Расставьте приоритеты для самых важных вещей (вы можете записывать свои ежедневные задачи в блокнот или использовать программное обеспечение, такое как todolist)
- Понимать «мышление по замкнутому циклу» (регулярно сообщать о ходе проекта руководителям и своевременно синхронизировать ход проекта с коллегами и подчиненными)
- Умение решать проблемы и решать проблемы быстро
- Будьте надежным, умным, твердым и заслуживающим доверия человеком. Улучшите свою незаменимость.
- У всего есть объяснение, у всего есть свое падение, у всего есть эхо.
- Благодарен за ошибки. Именно ошибки заставляют вас расти. Чтобы расти, вы должны решать больше ошибок и выполнять больше задач.
- Будь позитивным и оптимистичным, будь позитивным человеком. (Держитесь подальше от людей и вещей с негативной энергией)
Скрипт, после превышения количества данных в массиве памяти вдруг становится меньше?
Наконец
Это то, чем нужно поделиться со всеми, чтобы продолжать, и я не могу сделать это в одиночку. Все желающие могут принять участие в этом мероприятии.Адрес здесь.