Node.js выиграл от своих управляемых событиями и асинхронными функциями и очень скоро. Тем не менее, в современных сетях невозможно быть быстро. Если вы планируете использовать node.js для разработки следующего веб -приложения, то вам следует сделать все, чтобы сделать ваше приложение быстрее и исключительно быстро. Эта статья представит 10 пунктов, и после тестирования она может значительно улучшить навыки применения узлов. Без лишних слов давайте посмотрим один за другим.
1. Параллель
При создании веб -приложения вам, возможно, придется позвонить во внутренний API несколько раз, чтобы получить различные данные. Например, предположим, на странице приборной панели вы должны выполнить следующие вызовы:
Пользовательская информация - getUserProfile ().
Текущая активность - getRecentactivity ().
Подпишитесь на контент - GetSubScriptions ().
Содержание уведомления - getNotifications ().
Чтобы получить эту информацию, вы должны создать отдельное промежуточное программное обеспечение для каждого метода, а затем связать их с маршрутом приборной панели. Но проблема в том, что выполнение этих методов является линейным, а следующий не запустится до тех пор, пока предыдущий не будет закончен. Осуществимое решение - позвонить им параллельно.
Как вы знаете, Node.js очень хорош в том, чтобы вызовать несколько методов параллельно из -за асинхронности. Мы не можем тратить природные ресурсы. Методы, которые я упомянул выше, не имеют зависимости, поэтому мы можем выполнить их параллельно. Таким образом, мы можем уменьшить количество промежуточного программного обеспечения и значительно увеличить скорость.
Мы можем использовать Async.JS для обработки параллелизма, который представляет собой модуль узла, специально используемый для обучения JavaScript асинхронно. Следующий код демонстрирует, как использовать Async.js для вызова нескольких методов параллельно:
Кода -копия выглядит следующим образом:
функция runInparallel () {
async.parallel ([[[[[
getuserprofile,
getRecentactivity,
GetSubscriptions,
GetNotifications
], function (err, результаты) {
// этот обратный вызов работает, когда все функции завершены
});
}
Если вы хотите, чтобы более глубокий взгляд на Async.JS, пожалуйста, перейдите на его страницу GitHub.
2. асинхронно
По дизайну node.js является однопоточным. Основываясь на этом, синхронный код заблокирует все приложение. Например, большинство API файловых систем имеют свои синхронизированные версии. Следующий код демонстрирует две операции: синхронное и асинхронное чтение файлов:
Кода -копия выглядит следующим образом:
// асинхронно
fs.readfile ('file.txt', function (err, buffer) {
var content = buffer.toString ();
});
// синхронно
var content = fs.readfilesync ('file.txt'). toString ();
Однако, если вы выполняете такие долгосрочные операции блокировки, основной поток будет заблокирован до тех пор, пока эти операции не будут завершены. Это значительно снижает производительность вашего приложения. Поэтому лучше всего убедиться, что ваш код использует асинхронную версию API, по крайней мере, вы должны быть асинхронными в узле производительности. Более того, вы должны быть очень осторожны при выборе сторонних модулей. Потому что, когда вы пытаетесь удалить операции синхронизации из вашего кода, синхронный вызов из внешней библиотеки будет тратить все ваши усилия и снизить производительность ваших приложений.
3. Кэш
Если вы используете некоторые данные, которые не часто меняются, вы должны кэшировать их для повышения производительности. Например, следующий код является примером получения последней публикации и его отображения:
Кода -копия выглядит следующим образом:
var router = express.router ();
router.route ('/andalposts'). get (function (req, res) {
Post.getLatest (function (err, posts) {
if (err) {
бросить ошибку;
}
res.render ('posts', {posts: posts});
});
});
Если вы не публикуете часто, вы можете кэшировать список постов и убирать их через некоторое время. Например, мы можем использовать модуль Redis для достижения этой цели. Конечно, вы должны установить Redis на свой сервер. Затем вы можете сохранить пары ключей/значения с клиентом именем node_redis. В следующем примере показано, как мы кэшируем посты:
Кода -копия выглядит следующим образом:
var redis = require ('redis'),
client = redis.createclient (null, null, {detect_buffers: true}),
router = express.router ();
router.route ('/andalposts'). get (function (req, res) {
client.get ('posts', function (err, posts) {
if (posts) {
return res.render ('posts', {posts: json.parse (posts)});
}
Post.getLatest (function (err, posts) {
if (err) {
бросить ошибку;
}
client.set ('posts', json.stringify (posts));
res.render ('posts', {posts: posts});
});
});
});
Смотрите, давайте сначала проверим кэш Redis, чтобы увидеть, есть ли какие -либо сообщения. Если это так, мы берим эти списки постов из кеша. В противном случае мы получим содержание базы данных и кэшируем результаты. Кроме того, после определенного периода времени мы можем очистить кэш Redis, чтобы контент мог быть обновлен.
4. GZIP Compression
Включение сжатия GZIP окажет огромное влияние на ваши веб -приложения. Когда GZIP сжатый браузер запрашивает определенные ресурсы, сервер сжимает до возврата ответа в браузер. Если вы не используете GZIP для сжатия ваших статических ресурсов, браузеру может потребоваться больше времени.
В Express Applications мы можем использовать промежуточное программное обеспечение Express.static () для обработки статического содержания. Кроме того, статическое содержание может быть сжат и обработано с использованием промежуточного программного обеспечения сжатия. Вот примеры использования:
Кода -копия выглядит следующим образом:
var compression = require ('сжатие');
app.use (compression ()); // Использование сжатия
app.use (express.static (path.join (__ dirname, 'public')));
5. Если возможно, рендеринг с клиентом
Теперь существуют супер универсальные и мощные клиентские фреймворки MVC/MVVM, такие как AngularJS, Ember, Meteor и т. Д., И очень легко создать одностраничное приложение. По сути, вам просто нужно разоблачить API и вернуть ответ JSON на клиента, не отображая страницу на сервере. На клиенте вы можете организовать Jsons с фреймворками и отобразить их на пользовательском интерфейсе. Только отправка ответов JSON на сервере может сохранить пропускную способность и повысить производительность, потому что вам не нужно возвращать макет в каждом ответе, верно, вам просто нужно вернуть Pure JSON, а затем отображать их на клиенте.
Давайте посмотрим на мой учебник, о том, как разоблачить API Restful, используя Express 4. Я также написал еще один урок, показывающий, как объединить эти API с AngularJ.
6. Не храните слишком много данных в сессиях
Для типичных приложений Express Page данные сеанса сохраняются в памяти по умолчанию. Когда вы сохраняете слишком много данных в сеансе, это значительно увеличит накладные расходы на сервер. Таким образом, либо вы переключаетесь на другой метод хранения, чтобы сохранить данные сеанса, или пытаться минимизировать объем данных, хранящихся в сеансе.
Например, когда пользователи войдут в ваше приложение, вы можете сохранить их идентификаторы только в сеансе вместо всего объекта пользовательских данных. Кроме того, для тех запросов вы можете получить объекты от ID, вы хотели бы использовать MongoDB или Redis для хранения данных сеанса.
7. Оптимизировать запрос
Предположим, у вас есть блог, и вы хотите показать последние сообщения на своей домашней странице. Вы можете получить данные через Mongoose, как это:
Кода -копия выглядит следующим образом:
Post.find (). Limit (10) .exec (function (err, posts) {
// отправлять сообщения в клиент
});
Тем не менее, проблема в том, что метод Find () Mongoose () будет запросить все поля объекта, и на домашней странице не требуется многие поля. Например, комментарии сохраняют ответы на конкретные сообщения. Нам не нужно отображать ответы на статью, поэтому мы можем удалить их при запросе. Это, несомненно, увеличит скорость. Приведенный выше запрос может быть оптимизирован таким образом:
Кода -копия выглядит следующим образом:
Post.find (). Limit (10) .exclude ('comments'). Exec (function (err, posts) {
// отправлять сообщения в клиент
});
8. Используйте стандартный метод V8
Некоторые операции на сборе, такие как карта, сокращение и предание, не обязательно поддерживают все браузеры. Мы можем решить некоторые проблемы совместимости браузера через библиотеку переднего плана. Но для Node.js вам нужно точно знать, какие операции Google V8 V8 Javascript поддерживает поддержку двигателя JavaScript. Таким образом, вы можете напрямую использовать эти встроенные методы для работы сбора на стороне сервера.
9. Используйте Nginx перед узлом
Nginx - это небольшой и легкий веб -сервер, который может уменьшить загрузку на вашем сервере Node.js. Вы можете настроить статические ресурсы на Nginx, а не на узле. Вы можете сжать ответы с GZIP на Nginx, чтобы все ответы меньше. Итак, если у вас есть работа, который работает, я думаю, вы должны использовать Nginx для улучшения скорости бега.
10. Упаковка JavaScript
Наконец, вы также можете значительно улучшить скорость приложения страницы, упаковывая несколько файлов JS. Когда браузер встречается с элементом <cript> в рендеринге страницы, он будет заблокирован и не будет продолжать работать до тех пор, пока не будет получен скрипт (если не установлено асинхронное свойство). Например, если на вашей странице есть пять файлов JavaScript, браузер выпустит пять отдельных HTTP -запросов, чтобы получить их. Если эти пять файлов сжаты и упакованы в один, общая производительность будет значительно улучшена. То же самое касается файлов CSS. Вы можете использовать инструмент компиляции, такой как Grunt/Gulp, чтобы упаковать файлы ресурсов.
в заключение
Приведенные выше 10 советов могут определенно улучшить скорость ваших веб -приложений. Тем не менее, я знаю, что есть место для улучшения и оптимизации. Если у вас есть какие -либо советы по повышению производительности, дайте мне знать в ответе.
Спасибо за чтение!