Вступление
Express - безусловно, самый популярный веб-фреймворк для Node.js благодаря простому API, доступным плагинам и огромному сообществу. Благодаря сообществу нет недостатка в документации и примерах использования основного Express API, и это здорово, но не всегда сразу понятно, как улучшить производительность вашего веб-приложения по мере его роста. Здесь я покажу вам некоторые из самых простых и эффективных способов повысить производительность ваших приложений Express.
gzip сжатие
Сжатие gzip не является чем-то новым для веб-серверов, но о нем легко забыть, особенно если вы привыкли использовать фреймворки, которые включают его по умолчанию. Это одно из тех улучшений, которые очень легко добавить, и оно обеспечивает значительный прирост производительности. Сжатие содержимого вашей страницы может уменьшить размер страницы до 70% .
var compression = require('compression');
var express = require('express');
var app = express();
app.use(compression());
Запустите Express в производственном режиме
По умолчанию Express будет работать в режиме разработки, что легко упустить из виду, особенно тем, кто только начинает работать с Node.js / Express.
Так в чем же разница между производственным режимом и режимом разработки? Оказывается, в режиме разработки шаблоны представлений считываются из файла для каждого запроса, тогда как в производственном режиме шаблоны загружаются один раз и кешируются. Это сделано для того, чтобы вы могли легко вносить изменения на лету, не перезагружая приложение каждый раз во время разработки. Однако в производственной среде это может значительно снизить производительность, поскольку приходится иметь дело с медленным вводом-выводом файлов по сравнению с гораздо более быстрой оперативной памятью.
К счастью для вас, перевести Express в рабочий режим очень просто. Это просто вопрос установки переменной окружения.
$ export NODE_ENV=production
Однако будьте осторожны с этим методом. Если сервер перезапустится, вы
потеряете эту переменную среды и вернетесь в режим разработки. Более
постоянное решение - установить переменную в вашем .bash_profile
:
$ echo export NODE_ENV=production >> ~/.bash_profile
$ source ~/.bash_profile
Минимизировать с помощью Uglify
Практически для каждого веб-сайта, особенно с большим количеством стилей и клиентской функциональностью, статические ресурсы могут сильно снижать производительность. Необходимость отправки нескольких файлов JavaScript и CSS для каждого запроса в конечном итоге сказывается на вашем сервере, и это даже не учитывая время, в течение которого пользователь должен ждать завершения всех отдельных HTTP-запросов на стороне клиента.
Чтобы смягчить это, вы можете использовать служебный пакет, такой как Uglify, для минимизации и объединения ваших файлов JavaScript и CSS. Объедините это с средством запуска задач, таким как Grunt, и вы легко сможете автоматизировать процесс и не беспокоиться об этом. Достаточно функциональный файл Grunt (с использованием плагина grunt-contrib-uglify ) может выглядеть примерно так:
module.exports = function(grunt) {
grunt.initConfig({
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
dist: {
files: {
'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.registerTask('default', ['uglify']);
};
Уменьшите свое промежуточное ПО
Я не говорю, что вам никогда не следует использовать промежуточное программное обеспечение, очевидно, что это необходимо, и есть много причин для использования промежуточного программного обеспечения в ваших приложениях Express, но легко пойти за борт и скопировать все промежуточное программное обеспечение, которое вы видите в других приложениях. Просмотрите свой список зависимостей и решите, действительно ли вам нужно все, что вы установили (файлы cookie, сеансы, i18n, регистраторы запросов и т. Д.).
В некоторых случаях вам нужны только пакеты промежуточного программного обеспечения для разработки, поэтому вы можете легко отключить их в производственной среде:
var express = require('express');
var debugMiddleware = require('my-debug-middleware');
var app = express();
if (process.env.NODE_ENV !== 'production') {
app.use(debugMiddleware());
}
Увеличить максимальное количество сокетов
По умолчанию HTTP-сервер Node.js имеет ограничение пула сокетов всего 5. Это очень консервативное число, и большинство серверов могут обрабатывать гораздо большее количество сокетов, чем это.
В качестве альтернативы вы можете разрешить как можно больше сокетов:
var http = require('http');
var https = require('https');
http.globalAgent.maxSockets = Infinity;
https.globalAgent.maxSockets = Infinity;
Изменить : это относится только к Node v0.10 и старше. Начиная с
версии maxSockets
для maxSockets (как для http
и для https
)
установлено значение Infinity
.
Используйте Cache-Control
Вы можете установить HTTP-заголовок, который сообщит браузеру пользователя, что нужно кэшировать только что полученный контент. Обычно это хорошая идея для статических ресурсов (JS, CSS и т. Д.), Которые меняются нечасто. Для назначения настроек кеша для всего приложения используйте:
var express = require('express');
var app = express();
app.use(express.static(__dirname + '/public', { maxAge: 31557600 }));
Это назначит настройки кеширования для всего в public
каталоге. Для
более детального управления вы можете настроить кеширование на основе
отдельных запросов / маршрутов:
var express = require('express');
var app = express();
app.get('/index.html', function (req, res) {
res.setHeader('Cache-Control', 'public, max-age=86400');
res.render('index.html');
});
Заключение
Имейте в виду, что вы можете найти отличные советы, просматривая веб-сайты с открытым исходным кодом, такие как платформа для ведения блогов Ghost. Эти приложения разрабатываются и используются тысячами людей, поэтому обычно вы можете найти отличные полезные фрагменты, о которых иначе вы бы не услышали.
Есть немало вещей, которые вы можете сделать за пределами Express, чтобы ускорить процесс, поэтому, если вы еще этого не сделали, попробуйте Redis, Nginx и другие механизмы кэширования, чтобы улучшить свое приложение. Поверьте, это того стоит.
Есть еще советы по производительности Express? Дайте нам знать об этом в комментариях!