>  기사  >  웹 프론트엔드  >  Node.js 웹 애플리케이션의 속도를 최적화하기 위한 10가지 팁_node.js

Node.js 웹 애플리케이션의 속도를 최적화하기 위한 10가지 팁_node.js

WBOY
WBOY원래의
2016-05-16 16:37:421005검색

Node.js는 이벤트 중심 및 비동기 특성 덕분에 이미 빠릅니다. 그러나 최신 네트워크에서는 속도만으로는 충분하지 않습니다. Node.js를 사용하여 다음 웹 애플리케이션을 개발할 예정이라면 애플리케이션을 더 빠르고 엄청나게 빠르게 만들기 위해 필요한 모든 조치를 취해야 합니다. 이 기사에서는 Node 애플리케이션을 크게 향상시킬 수 있는 테스트된 10가지 팁을 소개합니다. 더 이상 고민하지 말고 하나씩 살펴보겠습니다.

1. 병렬

웹 애플리케이션을 만들 때 다양한 데이터를 얻기 위해 내부 API를 여러 번 호출해야 할 수도 있습니다. 예를 들어 대시보드 페이지에서 다음 호출을 실행한다고 가정해 보겠습니다.

사용자 정보 -getUserProfile().

현재 활동 -getRecentActivity().

구독 콘텐츠 -getSubscriptions().

알림 내용 -getNotifications().

이 정보를 얻으려면 각 메서드에 대해 별도의 미들웨어를 만든 다음 이를 대시보드 경로에 연결해야 합니다. 그러나 문제는 이러한 메서드의 실행이 선형적이고 이전 메서드가 끝날 때까지 다음 메서드가 시작되지 않는다는 것입니다. 가능한 해결책은 병렬로 호출하는 것입니다.

아시다시피 Node.js는 비동기성으로 인해 여러 메서드를 병렬로 호출하는 데 매우 능숙합니다. 우리는 자원을 낭비할 수 없습니다. 위에서 언급한 메서드에는 종속성이 없으므로 병렬로 실행할 수 있습니다. 이런 방식으로 미들웨어의 양을 줄이고 속도를 크게 높일 수 있습니다.

async.js를 사용하면 JavaScript를 비동기식으로 조정하는 데 특별히 사용되는 노드 모듈인 병렬 처리를 처리할 수 있습니다. 다음 코드는 async.js를 사용하여 여러 메서드를 병렬로 호출하는 방법을 보여줍니다.

코드 복사 코드는 다음과 같습니다.

함수 runInParallel() {
async.parallel([
GetUserProfile
GetRecentActivity
구독하기
알림 받기
], 함수(err, 결과) {
//이 콜백은 모든 함수가 완료되면 실행됩니다
});
}

async.js에 대해 자세히 알아보려면 GitHub 페이지를 방문하세요.

2. 비동기식

Node.js는 단일 스레드로 설계되었습니다. 이를 기반으로 동기 코드가 전체 애플리케이션을 방해할 수 있습니다. 예를 들어 대부분의 파일 시스템 API에는 동기 버전이 있습니다. 다음 코드는 파일 읽기의 동기 및 비동기 작업을 모두 보여줍니다.

코드 복사 코드는 다음과 같습니다.

// 비동기
fs.readFile('file.txt', function(err, buffer) {
var 콘텐츠 = buffer.toString();
});

// 동기
var content = fs.readFileSync('file.txt').toString();


그러나 장기 차단 작업을 수행하는 경우 해당 작업이 완료될 때까지 기본 스레드가 차단됩니다. 이로 인해 애플리케이션 성능이 크게 저하됩니다. 따라서 코드가 API의 비동기 버전을 사용하고 있는지 확인하는 것이 가장 좋습니다. 최소한 성능 노드에서는 비동기여야 합니다. 또한 타사 모듈을 선택할 때는 주의해야 합니다. 코드에서 동기화 작업을 제거하려고 하면 외부 라이브러리의 동기 호출로 인해 모든 노력이 취소되고 애플리케이션 성능이 저하되기 때문입니다.

3. 캐싱

자주 변경되지 않는 일부 데이터를 사용하는 경우 성능 향상을 위해 캐시해야 합니다. 예를 들어 다음 코드는 최신 게시물을 가져와서 표시하는 예입니다.

코드 복사 코드는 다음과 같습니다.

var router = express.Router();

router.route('/latestPosts').get(function(req, res) {
Post.getLatest(function(err, 게시물) {
만약 (오류) {
           오류를 던졌습니다.
}

res.render('posts', { 게시물: 게시물 });
});
});


자주 게시하지 않는 경우 게시물 목록을 캐시하고 일정 기간 후에 삭제할 수 있습니다. 예를 들어 Redis 모듈을 사용하여 이 목적을 달성할 수 있습니다. 물론 서버에 Redis가 설치되어 있어야 합니다. 그런 다음 node_redis라는 클라이언트를 사용하여 키/값 쌍을 저장할 수 있습니다. 다음 예는 게시물을 캐시하는 방법을 보여줍니다.
코드 복사 코드는 다음과 같습니다.

var redis = require('redis'),
클라이언트 = redis.createClient(null, null, { discover_buffers: true }),
라우터 = express.Router();

router.route('/latestPosts').get(function(req,res){
client.get('posts', function (err, post) {
If (게시물) {
Return res.render('posts', { post: JSON.parse(posts) });
}

Post.getLatest(function(err, 게시물) {
만약 (오류) {
          오류를 던졌습니다.
}

client.set('posts', JSON.stringify(posts))
res.render('posts', { 게시물: 게시물 });
});
});
});


먼저 Redis 캐시를 확인하여 게시물이 있는지 확인합니다. 있는 경우 캐시에서 게시물 목록을 가져옵니다. 그렇지 않으면 데이터베이스 내용을 검색하고 결과를 캐시합니다. 또한 일정 시간이 지나면 Redis 캐시를 지워 콘텐츠를 업데이트할 수 있습니다.

4.gzip 압축

gzip 압축을 활성화하면 웹 애플리케이션에 큰 영향을 미칠 수 있습니다. gzip으로 압축된 브라우저가 일부 리소스를 요청하면 서버는 응답을 브라우저에 반환하기 전에 응답을 압축합니다. 정적 리소스를 gzip으로 압축하지 않으면 브라우저가 리소스를 가져오는 데 시간이 더 오래 걸릴 수 있습니다.

Express 애플리케이션에서는 내장된 express.static() 미들웨어를 사용하여 정적 콘텐츠를 처리할 수 있습니다. 또한 압축 미들웨어를 사용하여 정적 콘텐츠를 압축하고 처리할 수 있습니다. 다음은 사용 예입니다.

코드 복사 코드는 다음과 같습니다.

var 압축 = require('압축');

app.use(compression()); //압축 사용
app.use(express.static(path.join(__dirname, 'public')));

5. 가능하면 클라이언트측 렌더링을 사용하세요

요즘에는 AngularJS, Ember, Meteor 등과 같은 다양하고 강력한 클라이언트 측 MVC/MVVM 프레임워크가 많아 단일 페이지 애플리케이션을 매우 쉽게 구축할 수 있습니다. 기본적으로 서버 측에서 페이지를 렌더링하지 않고 API를 노출하고 클라이언트에 JSON 응답을 반환하기만 하면 됩니다. 클라이언트 측에서는 프레임을 사용하여 JSON을 구성하고 UI에 표시할 수 있습니다. 서버에서 JSON 응답만 보내면 모든 응답에서 레이아웃 마크업을 반환할 필요가 없기 때문에 대역폭이 절약되고 성능이 향상됩니다. 그렇죠? 순수한 JSON을 반환한 다음 클라이언트에서 렌더링하기만 하면 됩니다.

Express 4로 RESTful API를 노출하는 방법에 대한 이 튜토리얼을 확인하세요. 또한 이러한 API를 AngularJS와 결합하는 방법을 보여주는 또 다른 튜토리얼을 작성했습니다.

6. 세션에 너무 많은 데이터를 저장하지 마세요

일반적인 Express 페이지 애플리케이션에서는 기본적으로 세션 데이터가 메모리에 저장됩니다. 세션에 너무 많은 데이터를 저장하면 서버 오버헤드가 크게 증가합니다. 따라서 다른 저장 방법으로 전환하여 Session 데이터를 저장하거나 Session에 저장되는 데이터의 양을 줄여보세요.

예를 들어, 사용자가 애플리케이션에 로그인하면 전체 사용자 데이터 개체 대신 해당 ID만 세션에 저장할 수 있습니다. 또한 ID로 객체를 가져올 수 있는 쿼리의 경우 MongoDB 또는 Redis를 사용하여 세션 데이터를 저장하는 것이 좋습니다.

7. 쿼리 최적화

블로그가 있고 홈페이지에 최신 게시물을 표시하고 싶다고 가정해 보겠습니다. 다음과 같이 Mongoose를 통해 데이터를 검색할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

Post.find().limit(10).exec(function(err, post) {
//클라이언트에게 게시물 보내기
});

그러나 문제는 Mongoose의 find() 메소드가 객체의 모든 필드를 쿼리하고 홈페이지에는 많은 필드가 필요하지 않다는 것입니다. 예를 들어 commentsis는 특정 게시물에 대한 답변을 저장합니다. 기사 답변을 표시할 필요가 없으므로 쿼리 시 제외할 수 있습니다. 그러면 속도가 확실히 향상됩니다. 위 쿼리를 다음과 같이 최적화할 수 있습니다.
코드 복사 코드는 다음과 같습니다.

Post.find().limit(10).exclude('comments').exec(function(err, 게시물) {
//클라이언트에게 게시물 보내기
});

8. 표준 V8 방식을 사용합니다

map, Reduce, forEach 등 컬렉션에 대한 일부 작업은 모든 브라우저에서 지원되지 않을 수 있습니다. 프런트엔드 라이브러리를 통해 일부 브라우저 호환성 문제를 해결할 수 있습니다. 하지만 Node.js의 경우 Google의 V8 JavaScript 엔진이 지원하는 작업이 무엇인지 정확히 알아야 합니다. 이러한 방식으로 이러한 기본 제공 메서드를 직접 사용하여 서버 측 컬렉션에 대해 작업을 수행할 수 있습니다.

9. Node 앞에 Nginx를 사용하세요

Nginx는 Node.js 서버의 부하를 줄일 수 있는 작고 가벼운 웹 서버입니다. Node.js 대신 nginx에서 정적 리소스를 구성할 수 있습니다. gzip을 사용하여 nginx에서 응답을 압축하여 모든 응답을 더 작게 만들 수 있습니다. 그래서 실행중인 제품이 있다면 nginx를 사용하여 실행속도를 향상시키는 것이 좋을 것 같습니다.

10. 자바스크립트 패키징

마지막으로 여러 JS 파일을 패키징하여 페이지 적용 속도를 크게 향상시킬 수도 있습니다. 브라우저가 페이지 렌더링 중에