Я использую Firebase с моим проектом React и пытаюсь изменить размеры изображений, когда они загружаются пользователем. Облачная функция, которую я использую, прекрасно работает, но ее выполнение занимает более 8-10 секунд, и я чувствую, что это не должно занимать так много времени. Я использую библиотеку sharp
для изменения размера изображений и «Spark» (бесплатный) план Firebase. Есть мысли о том, как я могу улучшить производительность? Вот моя облачная функция:
const functions = require('firebase-functions');
const {Storage} = require('@google-cloud/storage');
const sharp = require('sharp');
const os = require('os');
const path = require('path');
const projectId = 'my-project-id';
const storage = new Storage({
projectId: projectId
});
exports.resizeImage = functions.storage.object('images').onFinalize(event => {
const {bucket, name, contentType, resourceState} = event;
if (!contentType.startsWith('image/') || resourceState == 'not_exists') {
console.log('This is not an image.');
return {};
}
if (path.basename(name).startsWith('resized_')){
console.log('Image already processed');
return {};
}
const destinationBucket = storage.bucket(bucket);
const workingDir = path.join(os.tmpdir());
const tempFilePath = path.join(workingDir, path.basename(name));
const metadata = {contentType: contentType};
return destinationBucket.file(name).download({
destination: tempFilePath
})
.then(() => {
const newFilePath = path.join(workingDir, 'resized_' + path.basename(name));
sharp(tempFilePath)
.resize({width: 600})
.toFile(newFilePath)
.then( () => {
return destinationBucket.upload(newFilePath, {destination: 'images/resized_' + path.basename(name)});
})
.catch( err => console.log(err))
})
})