Không sử dụng các hàm JSON.parse
và JSON.stringify
Tôi đã sử dụng cái này trong một thời gian dài và nó rất quan trọng đối với tôi, nhưng khi lượng dữ liệu tôi đưa vào tăng lên, nó sẽ mất rất nhiều thời gian và có thể làm chậm quá trình. Khi lượng dữ liệu tăng lên, thời gian cũng tăng lên. Nếu ứng dụng của tôi tiếp nhận và xử lý các đối tượng JSON lớn từ người dùng, thì tôi nên cẩn thận về lượng dữ liệu mình tiếp nhận.
Lý do tại sao các chức năng này mất nhiều thời gian để hoàn thành là vì chúng đang cố xử lý toàn bộ đầu vào cùng một lúc. Để làm cho chúng nhanh hơn, bạn có thể sử dụng luồng để chia đối tượng hoặc chuỗi thành các phần nhỏ hơn. Có một số mô-đun npm cung cấp API JSON không đồng bộ. Nếu bạn đang xử lý dữ liệu có kích thước từ nhỏ đến trung bình, JSON.parse
và JSON.stringify
sẽ hoạt động tốt, nhưng nếu bạn đang xử lý các tập dữ liệu lớn, bạn nên xem xét các tùy chọn khác sau:
- JSONStream , có API luồng.
- Luồng-json
- Big-Friendly JSON , có API luồng cũng như các phiên bản không đồng bộ của API JSON tiêu chuẩn.
Thêm một máy ghi nhật ký
Thư viện nhật ký có thể giúp bạn theo dõi các thông báo, lỗi và yêu cầu thành công mà ứng dụng của bạn nhận được. Morgan
là một thư viện cho phép bạn lưu trữ nhật ký về các yêu cầu HTTP đã được gửi. Bằng cách thêm Morgan làm phần mềm trung gian, nó sẽ ghi nhật ký vào bảng điều khiển. Bạn cũng có thể xem xét các cơ chế lưu trữ khác để lưu trữ nhật ký. Morgan sẽ giúp bạn phân tích dữ liệu và cải thiện ứng dụng của bạn.
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">var</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'express'</span> <span class="token punctuation">)</span> <span class="token keyword">var</span> morgan <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'morgan'</span> <span class="token punctuation">)</span> <span class="token keyword">var</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token function">morgan</span> <span class="token punctuation">(</span> <span class="token string">'combined'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'hello, world!'</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Tôi khuyên bạn nên sử dụng Winston để theo dõi các lỗi và thông báo. Nó rất đơn giản để sử dụng và có thể lưu trữ thông tin ở những nơi khác nhau như tệp, cơ sở dữ liệu và bảng điều khiển. Bạn cũng có thể chọn mức độ chi tiết mà mình muốn xem, chẳng hạn như thông báo, lỗi, cảnh báo và thông tin.
Những gì tôi thường làm là tạo một tệp nhật ký riêng và xuất tệp đó.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token keyword">const</span> <span class="token punctuation">{</span> createLogger <span class="token punctuation">,</span> format <span class="token punctuation">,</span> transports <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'winston'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> config <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'./config'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> combine <span class="token punctuation">,</span> printf <span class="token punctuation">}</span> <span class="token operator">=</span> format <span class="token punctuation">;</span> <span class="token keyword">const</span> winstonFormat <span class="token operator">=</span> <span class="token function">printf</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter"><span class="token punctuation">{</span> level <span class="token punctuation">,</span> message <span class="token punctuation">,</span> timestamp <span class="token punctuation">,</span> stack <span class="token punctuation">}</span></span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> timestamp <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> level <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> stack <span class="token operator">||</span> message <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> timestamp <span class="token punctuation">}</span> <span class="token operator">=</span> format <span class="token punctuation">;</span> <span class="token keyword">const</span> logger <span class="token operator">=</span> <span class="token function">createLogger</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> level <span class="token operator">:</span> config <span class="token punctuation">.</span> env <span class="token operator">===</span> <span class="token string">'development'</span> <span class="token operator">?</span> <span class="token string">'debug'</span> <span class="token operator">:</span> <span class="token string">'info'</span> <span class="token punctuation">,</span> format <span class="token operator">:</span> <span class="token function">combine</span> <span class="token punctuation">(</span> <span class="token function">timestamp</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> winstonFormat <span class="token punctuation">,</span> config <span class="token punctuation">.</span> env <span class="token operator">===</span> <span class="token string">'development'</span> <span class="token operator">?</span> format <span class="token punctuation">.</span> <span class="token function">colorize</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">:</span> format <span class="token punctuation">.</span> <span class="token function">uncolorize</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> transports <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">transports <span class="token punctuation">.</span> Console</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> module <span class="token punctuation">.</span> exports <span class="token operator">=</span> logger <span class="token punctuation">;</span> |
Chọn một API để sử dụng cho một tác vụ cụ thể
Có thể khó tổ chức các API, nhưng phương pháp này có thể giúp làm cho chúng độc lập hơn, dễ bảo trì hơn và phân chia nhiệm vụ. Nó cũng làm cho ứng dụng của bạn chạy nhanh hơn nếu bạn đặt tất cả các hoạt động trong một API.
Ví dụ: khi tạo biểu mẫu chấp nhận cả văn bản và video, tốt nhất nên có hai API riêng biệt: một để lưu trữ văn bản và một để tải video lên trong thời gian thực. Điều này sẽ làm cho thời gian đáp ứng nhanh hơn.
Tách mã thành các gói npm
Nếu bạn đang làm việc trên nhiều dự án và thấy mình sử dụng đi sử dụng lại cùng một mã, bạn nên đặt mã đó vào một gói npm. Điều này sẽ giúp bạn tiết kiệm thời gian về lâu dài và giúp cộng tác với những người khác dễ dàng hơn.
Thực hiện các phép tính nặng không đồng bộ
Node JS rất tốt trong việc xử lý các hoạt động đầu vào và đầu ra, nhưng nó không phù hợp với các tính toán phức tạp, mất nhiều thời gian. Nếu bạn cố gắng thêm một số lượng lớn số nguyên, ứng dụng của bạn có thể bị kẹt và không thể phục vụ các yêu cầu, vì Node JS chỉ sử dụng một luồng để xử lý tất cả các yêu cầu và không tạo một luồng mới cho mỗi yêu cầu.
Nếu Vòng lặp sự kiện mất quá nhiều thời gian để xử lý một tác vụ, tất cả các yêu cầu hiện tại và yêu cầu mới sẽ không được xử lý. Chúng ta cần nhanh chóng tìm ra giải pháp!
Bạn có thể sử dụng hàm setImmediate
để đảm bảo rằng hàm chặn của bạn được ưu tiên trong vòng lặp sự kiện. Điều này có nghĩa là Node.js sẽ ưu tiên khởi tạo, gán và đăng ký mã không đồng bộ trước khi chạy hàm setImmediate.
1 2 3 4 5 6 | <span class="token comment">// other codes</span> <span class="token function">setImmediate</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">processData</span> <span class="token punctuation">(</span> data <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// other codes</span> |
Vòng lặp sự kiện không chạy hàm processData
ngay lập tức. Thay vào đó, nó đăng ký chức năng ngay lập tức đã đặt và cho phép mã khác chạy trước. Nếu bạn cần làm điều gì đó phức tạp, cách tiếp cận đầu tiên không phải là lựa chọn tốt nhất. Điều này là do nó chỉ sử dụng Vòng lặp sự kiện, vì vậy nó sẽ không tận dụng lợi thế của nhiều lõi. Giải pháp tốt hơn là sử dụng mô-đun Node JS worker_threads
để tạo một luồng riêng để thực hiện các tác vụ đó.
Không lưu trữ nhiều thông tin trong một biến.
Các biến được lưu trữ trong RAM (Bộ nhớ truy cập ngẫu nhiên), giúp lưu và truy cập chúng nhanh chóng. Nếu bạn cần lưu trữ nhiều dữ liệu, tốt nhất nên đặt nó trong cơ sở dữ liệu, vì nếu dữ liệu quá lớn, nó có thể làm chậm máy chủ và ứng dụng của bạn.
Tránh xa
Bạn nên tránh làm những việc không phải là lựa chọn tốt nhất, mặc dù nó có vẻ hài hước. Hãy đảm bảo thực hiện ba điểm này một cách nghiêm túc.
- Không sử dụng phiên bản của chức năng yêu cầu bạn đợi nó hoàn thành trước khi tiếp tục, chẳng hạn như readFileSync. Thay vào đó, hãy sử dụng phiên bản cho phép bạn tiếp tục với các tác vụ khác trong khi nó đang chạy, chẳng hạn như phiên bản gọi lại hoặc lời hứa.
- Không đưa nhiều thông tin vào yêu cầu hoặc phản hồi khi bạn đang gửi dữ liệu, vì điều đó có thể làm chậm thời gian phản hồi. Nếu bạn cần gửi nhiều dữ liệu, thay vào đó hãy sử dụng phương thức truyền trực tuyến.
- Không sử dụng nhiều dữ liệu, chẳng hạn như các tệp JSON lớn, với Node.js yêu cầu vì nó sẽ làm chậm luồng chính. Đặt dữ liệu của bạn vào cơ sở dữ liệu và chỉ lấy những gì bạn cần. Nếu bạn phải lưu trữ nó trong một tệp, hãy sử dụng tính năng phát trực tuyến để lấy các phần của dữ liệu theo cách không đồng bộ.
Và cuối cùng
Như mọi khi, tôi hy vọng bạn thích bài viết này và học được điều gì đó mới. Xin cảm ơn và hẹn gặp lại các bạn trong những bài viết tiếp theo!
Nếu các bạn thích bài viết này thì hãy cho mình 1 like và subscribe để ủng hộ mình nhé. Cảm ơn.