All streams
Search
Write a publication
Pull to refresh
13
0
Send message

А зачем? В моем примере с фронта и так отправляются сырые данные, причем потоково. Вы же сначала грузите весь файл в память (а что если он весит 10 Гб?), а потом отправляете. На стороне Node.js опять же обрабатываете максимально неэффективно — сохраняете целым куском (stream.write(Buffer.from(req.body), 'utf-8')) и преимущества потоков не используются.


Разбивка на байты могла бы пригодиться для реализации возможности докачки, но есть же file.slice.

Дополню свой комментарий. Поскольку передаются сырые данные прямо в теле, то для Node.js достаточно (нужно, конечно, еще добавить обработку ошибок и исключений, например, обрыв соединения) выполнить pipe для потоков запроса и файла:


req.pipe(writeFileStream);

Можно и так:


const url = '/upload-path';
const file = input.files[0];

const xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.setRequestHeader('Content-Type', file.type);
// обрабатываем xhr.onload, xhr.onerror
xhr.send(file);

Или через fetch:


fetch(url, {
 method: 'POST',
 headers: {
   'Content-Type': file.type
  },
  body: file
})
npm i express mysql body-parser --save

Зачем ставить body-parser, если он есть в комплекте с express? Например, вот middleware для обработки json ?

@media (min-width: 400px) {
  img[hidden] {
    display: block;
  }
}

Вот так точно не следует делать. Атрибут hidden нужно ставить/удалять с помощью JavaScript.


someDOMElement.hidden = false /* true */

Только Facebook скорее всего использует Relay, а не Apollo.

Пишите код текстом, пожалуйста!

Благодаря HTML mirror cursor даже F2 нажимать не надо — просто меняешь название, а оно редактируется как в открывающем теге, так и в закрывающем.

достаточно воспользоваться расширением Auto Rename Tag

Достаточно воспользоваться встроенным функционалом HTML mirror cursor или HTML Rename Tags, или воспользоваться командой опять же встроенного плагина EmmetEmmet: update tag.

Попробовал еще с модулем esm и конфигом `ecosystem.config.js` для PM2:


module.exports = {
  apps: [
    {
      name: 'PM2 Demo App',
      script: './app.js',
      instances: 4,
      exec_mode: 'cluster',
      node_args: '-r esm'
    }
  ]
}

Логи без ошибок.

Попробовал так (npm run cluster):


{
  "type": "module",
  "scripts": {
    "start": "node --experimental-modules app.js",
    "cluster": "pm2 -i 4 start npm -- run start"
  },
}

Вроде запустилось:
image

когда сайт рендерится скринридером или тактильным дисплеем.

Скринридер ничего не рендерит, а только читает.

Ждем релиза Network Information API во всех мажорных браузерах.

Jake Acrhibald показывает пример, почему нужно 2-а requestAnimationFrame.

и не может быть отменен

Для этих целей существует Abort Controller, который, к слову, предназначен для отмены любых асинхронных операций. Есть полифилл.

Работу с element.style.height === '0px' я б заменил на работу с каким-нибудь классом, например,


.is-collapsed {
  height: 0;
}

А layout-триггеры можно заменить на requestAnimationFrame (но с небольшим кроссбраузерным хаком):


function onSchedule(fn) {
  /* да, здесь два requestAnimationFrame */     
  requestAnimationFrame(function() {
    requestAnimationFrame(function() {
      fn();
    });
  });
}

Полный пример — https://jsfiddle.net/95tnmdyr/

По поводу npm-пакета. Почему стандартный модуль zlib указан в зависимостях? Также в zlib есть поддержка brotli, начиная, если не путаю, с node 11. Так что утилиту можно было бы разработать полностью без зависимостей.

Можете уточнить, в чем проблема при таких условиях?

Information

Rating
6,298-th
Registered
Activity