Bỏ qua, đến nội dung

@digiforce-nc/plugin-block-lowcode

Plugin cho phép viết và thực thi JavaScript tùy chỉnh ngay trong giao diện ứng dụng - biến bất kỳ block nào thành vùng logic động với CodeMirror 6 editor và RequireJS integration.

Plugin này làm gì?

Khi các block có sẵn không đáp ứng yêu cầu nghiệp vụ đặc thù, Low-code block cho phép developer viết JavaScript trực tiếp. Code được thực thi trong context của block với quyền truy cập API, resource, i18n và DOM element.

Ba nhiệm vụ chính

#Nhiệm vụChi tiết
1Code editor tích hợpCodeMirror 6 với syntax highlighting, autocomplete, linting
2Thực thi JS an toànChạy user code trong block context với các API có sẵn
3Quản lý dependencyRequireJS integration cho phép import thư viện bên ngoài

Kiến trúc

Tổng quan

Plugin hoạt động hoàn toàn ở client - code JavaScript được lưu trong block schema props và thực thi trực tiếp trên trình duyệt.

Hai widget

WidgetTrạng tháiVai trò
LowcodeBlockWidgetLegacy, ẩnWidget cũ, không hiển thị trong menu
JavaScriptBlockWidgetActiveWidget chính cho JavaScript block

Block context (ctx)

Khi code thực thi, nó nhận được object ctx chứa:

PropertyKiểuMô tả
ctx.elementHTMLElementDOM element của block, dùng để render UI
ctx.apiAPIClientClient gọi API server
ctx.resourcesObjectTruy cập các resource đã đăng ký
ctx.i18nObjectHệ thống đa ngôn ngữ
ctx.currentUserObjectThông tin user đang đăng nhập
ctx.currentRecordObjectBản ghi hiện tại (nếu trong context)

Luồng thực thi code

Tính năng

Tính năngMô tả
CodeMirror 6Editor hiện đại với syntax highlighting, bracket matching
Acorn lintingKiểm tra lỗi cú pháp realtime dùng acorn parser
RequireJSImport thư viện bên ngoài qua requireAsync()
Auto-executeCode tự chạy khi block mount hoặc khi lưu
Block contextTruy cập DOM element, API client, resources, i18n
Error handlingBắt lỗi runtime, hiển thị thông báo thay vì crash
ResizeEditor có thể resize theo nhu cầu

Ví dụ sử dụng

Render chart đơn giản

javascript
const echarts = await requireAsync('echarts');
const chart = echarts.init(ctx.element);
chart.setOption({
  xAxis: { type: 'category', data: ['Q1', 'Q2', 'Q3', 'Q4'] },
  yAxis: { type: 'value' },
  series: [{ data: [120, 200, 150, 80], type: 'bar' }],
});

Gọi API và hiển thị kết quả

javascript
const response = await ctx.api.request({
  url: 'users:list',
  params: { pageSize: 5 },
});
const users = response.data.data;
ctx.element.innerHTML = users
  .map((u) => `<div>${u.nickname}</div>`)
  .join('');

Thành phần client

Thành phầnMô tả
JavaScriptBlockWidgetWidget chính đăng ký JavaScript block
LowcodeBlockWidgetWidget legacy (ẩn, backward compatibility)
CodeEditorComponent bọc CodeMirror 6 với cấu hình JS
JavaScriptBlockInitializerĐăng ký vào menu "Add block"
jsBlockSettingsSettings panel cho block (editor options)

Dependencies

PackageVai trò
@digiforce-nc/clientClient framework (peer)
@digiforce-nc/serverServer framework - chỉ dùng khi build (peer)
@codemirror/lang-javascriptCodeMirror JavaScript language support
@codemirror/viewCodeMirror view layer
@codemirror/stateCodeMirror state management
@codemirror/lintCodeMirror lint framework
acornJavaScript parser cho linting
acorn-walkAST walker cho acorn

Mục lục chi tiết