Cảnh báo Chương này chỉ áp dụng cho cách tiếp cận code first.
Một trong những lợi thế lớn nhất khi dùng TypeScript cho backend của dự án là khả năng tái sử dụng cùng một model trong ứng dụng frontend viết bằng TypeScript, thông qua một package TypeScript dùng chung.
Nhưng có một vấn đề: các model được tạo ra bằng cách tiếp cận code first bị gắn rất nhiều decorator liên quan đến GraphQL. Các decorator đó không có ý nghĩa gì ở phía frontend, và ảnh hưởng tiêu cực đến hiệu năng.
Dùng model shim
Để giải quyết vấn đề này, NestJS cung cấp một “shim” cho phép bạn thay thế các decorator gốc bằng code trung tính (inert code) thông qua cấu hình webpack (hoặc tương tự).
Để dùng shim này, cấu hình một alias giữa package @nestjs/graphql và shim.
Ví dụ, với webpack thì cấu hình như sau:
resolve: { // xem: https://webpack.js.org/configuration/resolve/
alias: {
"@nestjs/graphql": path.resolve(__dirname, "../node_modules/@nestjs/graphql/dist/extra/graphql-model-shim")
}
}
Ghi chú người dịch Cơ chế này giống hệt việc bạn alias một module sang bản “stub” trong webpack/jest để loại bỏ code không cần thiết khỏi bundle: shim định nghĩa lại @ObjectType(), @Field()… thành các hàm/decorator rỗng, không làm gì cả. Nhờ đó khi bundler build cho frontend, các decorator GraphQL vẫn biên dịch được (không lỗi cú pháp/type) nhưng không kéo theo bất kỳ logic hay dependency nặng nào của @nestjs/graphql vào bundle client.