0

[Open Source] #225 - create-gas-app: Hạ tầng phát triển Google Apps Script hiện đại với kiến trúc Monorepo, Vite HMR và cơ chế Type-safe xuyên suốt (End-to-End)

Việc phát triển các ứng dụng trên Google Apps Script (GAS) như Sidebar, Dialog cho Google Sheets/Docs thường gặp phải những rào cản kỹ thuật lớn: không hỗ trợ ES Modules, quy trình build thủ công phức tạp và thiếu cơ chế Live Reload (HMR). create-gas-app ra đời như một "cuộc cách mạng" cho lập trình viên trong hệ sinh thái Google, mang trọn vẹn trải nghiệm phát triển Web hiện đại (React, Vue, Svelte) vào môi trường hạn chế của GAS.

Dưới góc độ kỹ thuật, dự án là một minh chứng xuất sắc về việc ứng dụng kiến trúc Monorepo, kỹ thuật Local Dev Bridge (Cầu nối phát triển cục bộ) và cơ chế Inlining tài nguyên để vượt qua các giới hạn của Iframe Google.

Github: https://github.com/m-mizutani/create-gas-app


🛠️ 1. Nền tảng công nghệ: Giao thoa giữa Modern Web và Google Infrastructure

Dự án sử dụng một ngăn xếp công nghệ được tối ưu hóa để "hiện đại hóa" môi trường scripting của Google:

  • CLI Orchestration: Sử dụng @clack/prompts để xây dựng giao diện tương tác dòng lệnh (TUI) tinh tế và tsup để đóng gói logic CLI thành các module ESM tốc độ cao.
  • Build Engine (Vite): Tận dụng sức mạnh của Vite để xử lý việc biên dịch TypeScript và HMR. Điểm mấu chốt là tích hợp vite-plugin-singlefile để gộp toàn bộ tài nguyên (JS/CSS) vào một file HTML duy nhất — điều kiện tiên quyết để GAS có thể render giao diện.
  • Google Integration (clasp & gas-client): Tích hợp sâu với công cụ clasp chính thức của Google để điều phối việc đẩy code (push) và quản lý phiên bản trên Cloud của Google.

🏗️ 2. Trụ cột kiến trúc: Monorepo và Full-stack Type Safety

Kiến trúc của dự án được thiết kế để giải quyết sự lệch pha giữa mã nguồn chạy trên Client (Sidebar) và Backend (GAS Server):

  • Modular Monorepo Structure: Sử dụng pnpm workspaces để phân rã dự án thành các khối chức năng:
    • packages/server: Chứa mã TypeScript thực thi trên máy chủ Google (tương tác với Spreadsheet/Gmail API).
    • apps/: Các ứng dụng UI độc lập (React, Vue, hoặc Svelte).
    • packages/shared: Nơi định nghĩa các Type và Interface dùng chung.
  • Shared Schema (Type Inference): Đây là điểm sáng kỹ thuật. Bằng cách chia sẻ định nghĩa hàm từ packages/server sang frontend thông qua import type, lập trình viên có thể gọi hàm server với đầy đủ tính năng gợi ý (Intellisense) và kiểm tra kiểu dữ liệu, triệt tiêu hoàn toàn lỗi "undefined function" thường gặp.

🔄 3. Workflow: Vòng đời từ Phát triển đến Triển khai (Sequence Diagram)

Sơ đồ mô tả quy trình dự án điều phối luồng dữ liệu khi lập trình viên thực hiện thay đổi mã nguồn:

image.png


⚡ 4. Các kỹ thuật "Pro-level" trong mã nguồn

  1. Local Dev Bridge (postMessage Proxying): Một kỹ thuật cực kỳ sáng tạo. Vì GAS không cho phép chạy script từ domain khác trong Iframe, dự án tạo ra một file HTML "cầu nối". File này nhúng một Iframe trỏ về localhost, sau đó sử dụng giao thức postMessage để chuyển tiếp các lệnh gọi hàm từ máy cục bộ lên Server Google, cho phép sử dụng Live Reload mà không cần push code liên tục.
  2. Strip GAS Exports Plugin: Google Apps Script yêu cầu các hàm server phải ở phạm vi toàn cục (Global) và không hiểu từ khóa export. Dự án sử dụng một plugin Vite tùy chỉnh để quét mã nguồn cuối cùng, dùng Regex loại bỏ các lệnh export của TypeScript/Rollup, giúp mã nguồn tương thích tuyệt đối với engine của Google.
  3. Externalization via Import Maps: Để giảm kích thước file HTML inlined và tăng tốc độ build, dự án sử dụng <script type="importmap">. Các thư viện nặng như React hay Vue được tải từ CDN (esm.sh) thay vì nhúng trực tiếp, giúp tối ưu hóa bộ nhớ đệm của trình duyệt.
  4. Granular OAuth Scope Management: Tự động hóa việc quản lý các quyền truy cập thông qua file appsscript.json, đảm bảo ứng dụng luôn có đủ quyền để thực thi các tác vụ nhạy cảm như đọc tệp tin hay gửi email mà không cần cấu hình thủ công trong Console.

⚖️ 5. So sánh chiến lược

Tiêu chí create-gas-app Lập trình GAS truyền thống Bản build thủ công (Webpack/Babel)
Trải nghiệm Dev Tốc độ cao (HMR) Rất chậm (Cần Push liên tục) Trung bình (Không có Bridge)
Type Safety End-to-End (Chặt chẽ) Không có Có (nhưng cấu hình khó)
Framework UI Đa dạng (React/Vue/Svelte) Hạn chế (HTML/CSS thuần) Phức tạp trong việc inline
Dung lượng tệp Tối ưu (Import Maps) Nhẹ (nhưng thiếu tính năng) Nặng (Inline mọi thứ)

✅ Kết luận: Tại sao create-gas-app là tương lai của GAS Development?

create-gas-app đã biến Google Apps Script từ một môi trường scripting "vui vẻ" thành một nền tảng phát triển ứng dụng doanh nghiệp thực thụ. Bằng cách giải quyết triệt để bài toán Type-safeLocal Development, dự án này cho phép các đội ngũ kỹ thuật xây dựng những công cụ tự động hóa phức tạp trên nền tảng Google với tốc độ và độ tin cậy tương đương các ứng dụng Web hiện đại.

Đối với các lập trình viên Frontend, nghiên cứu dự án này mang lại giá trị về:

  • Kỹ thuật cấu hình Vite Plugin chuyên sâu.
  • Cách xây dựng Bridge communication giữa các môi trường cô lập.
  • Tư duy thiết kế Scaffolding tool thông minh.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.