Chuyển đến nội dung chính

Kích thước Gói & Định dạng Module

SDK cung cấp cả bản dựng CommonJS và ESM, và giữ hai phụ thuộc nặng — Zodsocket.io-client — ra khỏi đồ thị nhập khẩu cho đến khi chúng thực sự được sử dụng. Một dự án chỉ gọi một phương thức, không bật xác thực và không bao giờ mở socket tải 43 kB đã nén (9.7 kB gzip), giảm từ 536 kB (110 kB gzip).

Những gì được cung cấp trong gói

TrườngGiá trịĐược sử dụng bởi
maindist/index.jsNode và bất kỳ người tiêu dùng CommonJS nào
moduleesm/index.jsBundlers (webpack, Vite, Rollup, esbuild)
typesdist/index.d.tsTypeScript
sideEffectsfalseBundlers, để loại bỏ các module không sử dụng

Không có bản đồ "exports", vì vậy mọi nhập sâu hiện có — oneentry/dist/<module>/<module>Interfaces và phần còn lại — được giải quyết chính xác như trước đây. Node tiếp tục giải quyết bản dựng CommonJS thông qua main; không có gì trong thiết lập hiện tại của bạn cần thay đổi.

sideEffects: false cho biết bundler rằng việc nhập một module của SDK không bao giờ làm gì một mình, điều này làm cho việc tree-shaking trở nên khả thi: các module bạn không chạm vào sẽ bị loại bỏ khỏi đầu ra.

Zod chỉ được tải khi xác thực chạy

Xác thực phản hồitắt theo mặc định. Các sơ đồ phản hồi trước đây được nhập tĩnh bởi mọi module, điều này kéo Zod vào mọi gói ngay cả khi không có gì được xác thực. Các sơ đồ và các trợ giúp xác thực hiện được tải theo yêu cầu, lần đầu tiên một phản hồi thực sự cần được xác thực.

  • Với validation.enabled: false (mặc định), Zod và các sơ đồ theo module (341 kB) sẽ nằm trong các chunk không bao giờ được yêu cầu.
  • Với validation.enabled: true, hành vi không thay đổi — các sơ đồ chỉ đơn giản được lấy về lần đầu tiên chúng cần.
  • Trong Node, require('oneentry') không còn tải Zod khi khởi động.

Đối với một dự án chỉ gọi một phương thức với xác thực tắt, mã thực sự tải giảm từ 536 kB xuống 83 kB đã nén (110 kB → 22 kB gzip) — và giảm xuống 43 kB khi socket.io cũng bị loại bỏ (xem bên dưới).

ℹ️ Con số đó giả định một bundler thực hiện chia mã — mặc định trong webpack, Vite và Rollup. Một gói bị ép vào một tệp duy nhất vẫn co lại, nhưng chỉ còn ~427 kB, vì Zod sau đó được inlined mặc dù nó không bao giờ chạy.

Không có API công khai nào thay đổi. Trợ giúp nội bộ _validateResponse trở thành async, điều này chỉ liên quan nếu bạn tự mở rộng các lớp cơ bản của SDK.

socket.io chỉ được tải khi bạn mở một socket

WS.connect() giữ chữ ký đồng bộ của nó và vẫn trả về một Socket của socket.io, nhưng socket.io-client (~41 kB) hiện được nhập lần đầu tiên khi connect() được gọi.

Cho đến khi chunk được giải quyết, đối tượng trả về sẽ xếp hàng bất cứ điều gì bạn làm với nó — on, emit, disconnect — và phát lại nó lên socket thực trong cùng một tick mà socket được tạo, trước khi kết nối có thể cung cấp bất cứ điều gì, vì vậy không có sự kiện nào bị mất:

// Nothing changes in normal use — handlers registered here always fire.
const socket = WS.connect();

socket.on('connect', () => console.log('WebSocket connected'));
socket.on('my_event', (payload) => console.log(payload));

Đọc trạng thái kết nối sớm vẫn chính xác, vì một socket mới được tạo cũng không được kết nối: idundefinedconnectedfalse trong cả hành vi cũ và mới.

Sự khác biệt duy nhất: một phương thức phải trả về một cái gì đó (ví dụ listeners()) không thể trả lời trước khi chunk đến, và các đối tượng lồng nhau như socket.io chỉ có thể truy cập khi nó được tải. Đăng ký các trình xử lý và phát tín hiệu — việc sử dụng bình thường — không bị ảnh hưởng.

Kích thước gói qua một cái nhìn

Tình huốngĐã nénGzip
Trước (mọi người tiêu dùng)536 kB110 kB
Xác thực tắt, không có socket43 kB9.7 kB
Xác thực tắt, socket đã mở~83 kB~22 kB
Gói tệp đơn, không chia mã~427 kB

Để có bản dựng nhỏ nhất

  • Giữ xác thực tắt trong sản xuất. Bật nó trong khi phát triển để phát hiện sự không nhất quán dữ liệu, sau đó tắt nó — các sơ đồ sẽ không nằm trong mã đã tải.
  • Để bundler của bạn chia mã. Chia mã là mặc định trong webpack, Vite và Rollup; tắt nó sẽ inlined các chunk lười biếng và mang lại hầu hết lợi ích.
  • Nhập các loại với import type. Các nhập loại sẽ bị xóa tại thời điểm biên dịch — xem Nhập các loại.
  • Chỉ giải cấu trúc các module bạn sử dụng. Với sideEffects: false và bản dựng ESM, các module không chạm vào sẽ bị loại bỏ khỏi đầu ra.

🔗 Tài liệu liên quan