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
], 함수 (err, results) {
//이 콜백은 모든 함수가 완료되면 실행됩니다
});
}
Async.js를 더 심층적으로 살펴보고 싶다면 Github 페이지를 이동하십시오.
2. 비동기
Design 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 ( '/lickesposts'). 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}),
라우터 = Express.Router ();
router.route ( '/lickesposts'). get (function (req, res) {
client.get ( 'posts', function (err, posts) {
if (게시물) {
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 압축
GZIP 압축을 켜면 웹 응용 프로그램에 큰 영향을 미칩니다. GZIP 압축 브라우저가 특정 리소스를 요청하면 응답이 브라우저로 반환되기 전에 서버가 압축됩니다. GZIP를 사용하여 정적 자원을 압축하지 않으면 브라우저가 얻는 데 시간이 더 걸릴 수 있습니다.
Express Applications에서는 내장 Express.static () 미들웨어를 사용하여 정적 컨텐츠를 처리 할 수 있습니다. 또한 압축 미들웨어를 사용하여 정적 컨텐츠를 압축하고 처리 할 수 있습니다. 사용 예는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var compression = 요구 ( '압축');
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를 사용하여 편안한 API를 노출시키는 방법에 관한 내 튜토리얼을 살펴 보겠습니다. 또한 이러한 API를 AngularJS와 결합하는 방법을 보여주는 다른 튜토리얼을 썼습니다.
6. 세션에 너무 많은 데이터를 저장하지 마십시오
일반적인 Express Page 응용 프로그램의 경우 세션 데이터가 기본적으로 메모리에 저장됩니다. 세션에서 너무 많은 데이터를 저장하면 서버 오버 헤드가 크게 증가합니다. 따라서 세션 데이터를 저장하기 위해 다른 스토리지 방법으로 전환하거나 세션에 저장된 데이터 양을 최소화하려고 시도하십시오.
예를 들어, 사용자가 앱에 로그인하면 전체 사용자 데이터 객체 대신 세션에서 ID를 저장할 수 있습니다. 또한 ID에서 객체를 얻을 수있는 쿼리의 경우 MongoDB 또는 Redis를 사용하여 세션 데이터를 저장해야합니다.
7. 쿼리 최적화
블로그가 있고 홈페이지에 최신 게시물을 표시하고 싶다고 가정 해 봅시다. 다음과 같은 몽구스를 통해 데이터를 얻을 수 있습니다.
코드 사본은 다음과 같습니다.
post.find (). limit (10) .exec (function (err, posts) {
// 클라이언트에 게시물을 보냅니다
});
그러나 문제는 Mongoose의 find () 메소드가 객체의 모든 필드를 쿼리하고 홈페이지에는 많은 필드가 필요하지 않다는 것입니다. 예를 들어, CommentIS는 특정 게시물에 답장을 저장합니다. 기사 응답을 표시 할 필요가 없으므로 쿼리 할 때 제거 할 수 있습니다. 이것은 의심 할 여지없이 속도를 높일 것입니다. 위의 쿼리는 다음과 같이 최적화 될 수 있습니다.
코드 사본은 다음과 같습니다.
post.find (). limit (10) .exclude ( 'comment'). exec (function (err, posts) {
// 클라이언트에 게시물을 보냅니다
});
8. 표준 V8 방법을 사용하십시오
MAP, Retening 및 Foreach와 같은 컬렉션의 일부 작업이 반드시 모든 브라우저를 지원하지는 않습니다. 전경 라이브러리를 통해 일부 브라우저 호환성 문제를 해결할 수 있습니다. 그러나 Node.js의 경우 Google의 V8 JavaScript 엔진이 지원하는 작업을 정확히 알아야합니다. 이러한 방식 으로이 내장 방법을 직접 사용하여 서버 측에서 컬렉션을 작동 할 수 있습니다.
9. 노드 앞에서 nginx를 사용하십시오
Nginx는 작고 가벼운 웹 서버로 Node.js 서버의로드를 줄일 수 있습니다. 노드 대신 nginx에서 정적 자원을 구성 할 수 있습니다. Nginx에서 GZIP로 응답을 압축하여 모든 응답을 더 작게 만들 수 있습니다. 따라서 작동중인 제품이 있다면 Nginx를 사용하여 달리기 속도를 향상시켜야한다고 생각합니다.
10. 포장 JavaScript
마지막으로 여러 JS 파일을 포장하여 페이지 애플리케이션 속도를 크게 향상시킬 수도 있습니다. 브라우저에서 페이지 렌더링에서 <cript> 요소가 발생하면 차단되며 스크립트가 얻어 질 때까지 (비동기 속성이 설정되지 않는 한) 계속 실행되지 않습니다. 예를 들어, 페이지에 5 개의 JavaScript 파일이있는 경우 브라우저에는 5 개의 개별 HTTP 요청이 발행됩니다. 이 5 개의 파일이 압축되어 하나로 포장되면 전체 성능이 크게 향상됩니다. CSS 파일도 마찬가지입니다. Grunt/Gulp와 같은 컴파일 도구를 사용하여 리소스 파일을 패키지 할 수 있습니다.
결론적으로
위의 10 가지 팁은 웹 애플리케이션의 속도를 확실히 향상시킬 수 있습니다. 그러나 개선 및 최적화의 여지가 있다는 것을 알고 있습니다. 성능 향상을위한 팁이 있으시면 답장에 알려주십시오.
읽어 주셔서 감사합니다!