Đối tượng toàn cục NUT – Thành phần cốt lõi trong kiến trúc nền tảng NoCode ZilCode
Viết bởi: Huy Hoàng
ZilCode là nền tảng NoCode được thiết kế để người không biết lập trình có thể xây dựng ứng dụng bằng cấu hình, đồng thời vẫn mở ra khả năng mở rộng mã nguồn cho lập trình viên thông qua các thành phần như đối tượng toàn cục NUT.
Bài viết này giải thích khái quát và hướng dẫn thực tế về đối tượng toàn cục NUT (và n$) như được triển khai trong mã nguồn của project.
1. NUT là gì và đóng vai trò gì?
NUT là đối tượng toàn cục trung tâm trong ứng dụng JavaScript của project — nơi chứa:
cấu hình kết nối (URL, API, token),
các service cốt lõi (data source, map, window manager, file manager),
cache cấu hình (apps, tables, workflows),
các tiện ích UI wrapper cho w2ui.
Nói ngắn gọn: NUT là bộ hạ tầng chung mà các module khác (window, map, fileman, component trong site/) dựa vào để hoạt động.
2. Mối quan hệ giữa n$ và NUT
n$là một object tiện ích chứa trạng thái cấp ứng dụng và các helper (ví dụn$.user,n$.now(),n$.BASE, ...).NUTchứa cấu hình hệ thống và các thành phần được gán vào trong quá trình khởi động (ví dụNUT.ds,NUT.AGMap,NUT.NWin,NUT.FMan, và các wrapper của w2ui).
3. Những thuộc tính & thành phần chính của NUT (cheat-sheet)
Dưới đây là các phần quan trọng trong NUT mà bạn thường tương tác:
NUT.URL,NUT.URL_DB,NUT.URL_UPLOAD,NUT.URL_SOURCE,NUT.URL_TOKEN,NUT.URL_PROXY
→ các endpoint API & upload.NUT.ds
→ data source (mặc địnhSqlREST). Thực hiện CRUD qua REST API.NUT.AGMap
→ lớp tích hợp bản đồ (ArcGIS). Cung cấpmap,view,layers, helpers nhưzoomToCoords.NUT.NWin
→ lớp tạo cửa sổ (form, grid, toolbar), xử lý logic add/edit/delete, linking.NUT.FMan
→ file manager (tree, preview, upload).NUT.apps,NUT.tables,NUT.workflows,NUT.relates
→ cache cấu hình ứng dụng / ERD để tạo giao diện động.NUT.w2ui,NUT.w2form,NUT.w2grid, ...
→ các wrapper/alias để gọi w2ui components.
4. Luồng khởi động (tóm tắt) — nơi NUT được gán giá trị
nut.jsđược nạp trước — định nghĩan$vàNUTvới giá trị mặc định, helper function.index.js(module chính) import các script nhưSqlREST,AGMap,NWin,FManvà gán chúng vàoNUT(NUT.ds = SqlREST, v.v.).window.onloaddùng cấu hình từNUTđể hiển thị form đăng nhập, lấy token, role/org rồi gọiopenDesktop()để dựng giao diện chính.Sau khi desktop mở,
NUT.apps/NUT.tablesđược đọc để render danh sách app, click app sẽ gọiNUT.runComponenthoặc load scriptsite/...rồi thực thirun(data).
5. Ví dụ cụ thể: gọi data source qua NUT.ds
Giả sử NUT.ds đã được gán SqlREST, một cuộc gọi lấy dữ liệu sẽ có dạng:
// lấy danh sách sản phẩm
NUT.ds.select({
url: NUT.URL_DB + “product”,
where: { product_code: “like ‘%ABC%’” },
limit: 100
}, function (data) {
console.log(”result:”, data);
});Hoặc dùng NUT.ds.get cho các request token/role ban đầu. (SqlREST cung cấp select, insert, update, delete, get, post).
6. Các nguyên tắc thiết kế và best practices khi dùng NUT
Không lạm dụng global:
NUTlà trung tâm, nhưng module nên nhận dependencies thông qua tham sốrun(data)hoặcNUT.runComponent. Tránh thêm state riêng vàoNUTkhi không cần.Tách config & runtime: các URL, hạn mức, ERD lưu dưới
NUTlà hợp lý; nhưng dữ liệu tạm (form record) nên để trong scope của window/module.Quản lý token an toàn:
NUT.ds.tokenchứa Bearer token — không log ra console ở môi trường production.Sử dụng
NUTlàm facade: chỉ expose API cần thiết (NUT.ds,NUT.NWin,NUT.AGMap) để dễ test và mock khi viết unit test.Document rõ contract: khi thêm method/prop mới vào
NUT, cập nhật tài liệu (vìNUTlà điểm chung cho mọi team).
9. Kết luận — Vì sao hiểu NUT quan trọng?
NUT là trái tim vận hành của ứng dụng: nắm được NUT giúp:
Hiểu luồng khởi động và phụ thuộc giữa module.
Dễ dàng mở rộng service (map, ds, fileman).
Kiểm soát cách các UI component (w2ui) được gọi và tái sử dụng.
Việc hiểu rõ đối tượng toàn cục NUT giúp lập trình viên nắm được kiến trúc tổng thể của hệ thống, từ đó dễ dàng mở rộng module, tích hợp dịch vụ và xây dựng các ứng dụng mới trên nền tảng này.
Trong các bài viết tiếp theo, chúng ta sẽ tiếp tục tìm hiểu sâu hơn về các thành phần quan trọng như SqlREST, NWin, AGMap và cách xây dựng một module hoàn chỉnh trong hệ thống.


