onelaraveljs 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -0
- package/docs/integration_analysis.md +116 -0
- package/docs/onejs_analysis.md +108 -0
- package/docs/optimization_implementation_group2.md +458 -0
- package/docs/optimization_plan.md +130 -0
- package/index.js +16 -0
- package/package.json +13 -0
- package/src/app.js +61 -0
- package/src/core/API.js +72 -0
- package/src/core/ChildrenRegistry.js +410 -0
- package/src/core/DOMBatcher.js +207 -0
- package/src/core/ErrorBoundary.js +226 -0
- package/src/core/EventDelegator.js +416 -0
- package/src/core/Helper.js +817 -0
- package/src/core/LoopContext.js +97 -0
- package/src/core/OneDOM.js +246 -0
- package/src/core/OneMarkup.js +444 -0
- package/src/core/Router.js +996 -0
- package/src/core/SEOConfig.js +321 -0
- package/src/core/SectionEngine.js +75 -0
- package/src/core/TemplateEngine.js +83 -0
- package/src/core/View.js +273 -0
- package/src/core/ViewConfig.js +229 -0
- package/src/core/ViewController.js +1410 -0
- package/src/core/ViewControllerOptimized.js +164 -0
- package/src/core/ViewIdentifier.js +361 -0
- package/src/core/ViewLoader.js +272 -0
- package/src/core/ViewManager.js +1962 -0
- package/src/core/ViewState.js +761 -0
- package/src/core/ViewSystem.js +301 -0
- package/src/core/ViewTemplate.js +4 -0
- package/src/core/helpers/BindingHelper.js +239 -0
- package/src/core/helpers/ConfigHelper.js +37 -0
- package/src/core/helpers/EventHelper.js +172 -0
- package/src/core/helpers/LifecycleHelper.js +17 -0
- package/src/core/helpers/ReactiveHelper.js +169 -0
- package/src/core/helpers/RenderHelper.js +15 -0
- package/src/core/helpers/ResourceHelper.js +89 -0
- package/src/core/helpers/TemplateHelper.js +11 -0
- package/src/core/managers/BindingManager.js +671 -0
- package/src/core/managers/ConfigurationManager.js +136 -0
- package/src/core/managers/EventManager.js +309 -0
- package/src/core/managers/LifecycleManager.js +356 -0
- package/src/core/managers/ReactiveManager.js +334 -0
- package/src/core/managers/RenderEngine.js +292 -0
- package/src/core/managers/ResourceManager.js +441 -0
- package/src/core/managers/ViewHierarchyManager.js +258 -0
- package/src/core/managers/ViewTemplateManager.js +127 -0
- package/src/core/reactive/ReactiveComponent.js +592 -0
- package/src/core/services/EventService.js +418 -0
- package/src/core/services/HttpService.js +106 -0
- package/src/core/services/LoggerService.js +57 -0
- package/src/core/services/StateService.js +512 -0
- package/src/core/services/StorageService.js +856 -0
- package/src/core/services/StoreService.js +258 -0
- package/src/core/services/TemplateDetectorService.js +361 -0
- package/src/core/services/Test.js +18 -0
- package/src/helpers/devWarnings.js +205 -0
- package/src/helpers/performance.js +226 -0
- package/src/helpers/utils.js +287 -0
- package/src/init.js +343 -0
- package/src/plugins/auto-plugin.js +34 -0
- package/src/services/Test.js +18 -0
- package/src/types/index.js +193 -0
- package/src/utils/date-helper.js +51 -0
- package/src/utils/helpers.js +39 -0
- package/src/utils/validation.js +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# onelaraveljs
|
|
2
|
+
|
|
3
|
+
The Core JavaScript Framework for OneLaravel applications. This library provides the fundamental runtime, view management, and routing capabilities for building OneLaravel SPAs.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install onelaraveljs
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
OneJS is designed to be the "engine" while your application provides the "map" (Views and Configuration).
|
|
14
|
+
|
|
15
|
+
### 1. Project Structure
|
|
16
|
+
|
|
17
|
+
Ensure your project has the following recommended structure for frontend assets:
|
|
18
|
+
```
|
|
19
|
+
resources/js/
|
|
20
|
+
├── app.js # Main entry point
|
|
21
|
+
├── config/
|
|
22
|
+
│ └── viewRegistry.generated.js # (Generated by build tools)
|
|
23
|
+
└── views/ # Your specific application views
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. Main Entry (`app.js`)
|
|
27
|
+
|
|
28
|
+
In your project's main JavaScript entry point, you need to wire up the Core with your Project's views:
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
import { App, viewLoader } from 'onelaraveljs';
|
|
32
|
+
import { viewRegistry } from './config/viewRegistry.generated.js';
|
|
33
|
+
|
|
34
|
+
// 1. Dependency Injection: Tell the Core where to find your views
|
|
35
|
+
viewLoader.setRegistry(viewRegistry);
|
|
36
|
+
|
|
37
|
+
// 2. Initialize the App
|
|
38
|
+
// The App will look for window.APP_CONFIGS (injected by Laravel Blade) to configure itself
|
|
39
|
+
if (window.APP_CONFIGS) {
|
|
40
|
+
App.init();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 3. Export for UMD/Debugging (Optional)
|
|
44
|
+
window.App = App;
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 3. Server-Side Setup (Blade)
|
|
48
|
+
|
|
49
|
+
Ensure your main layout file injects the configuration:
|
|
50
|
+
|
|
51
|
+
```html
|
|
52
|
+
<script>
|
|
53
|
+
window.APP_CONFIGS = {
|
|
54
|
+
env: { ... },
|
|
55
|
+
routes: [ ... ],
|
|
56
|
+
// ... other configurations
|
|
57
|
+
};
|
|
58
|
+
</script>
|
|
59
|
+
<script src="{{ mix('js/app.js') }}"></script>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Core Concepts
|
|
63
|
+
|
|
64
|
+
### ViewLoader vs ViewRegistry
|
|
65
|
+
|
|
66
|
+
- **ViewLoader** (Library): The logic responsible for dynamically importing and caching views. It is "blind" until it receives a registry.
|
|
67
|
+
- **ViewRegistry** (Project): A map of view names (e.g., `'auth.login'`) to dynamic import functions. This is typically auto-generated by your build tools.
|
|
68
|
+
|
|
69
|
+
### Event Service
|
|
70
|
+
|
|
71
|
+
OneJS comes with a built-in Event Service for cross-component communication:
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
import { App } from '@onelaravel/onejs';
|
|
75
|
+
|
|
76
|
+
// Listen
|
|
77
|
+
App.Event.on('user:logged-in', (user) => {
|
|
78
|
+
console.log(user);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Emit
|
|
82
|
+
App.Event.emit('user:logged-in', { id: 1, name: 'John' });
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## License
|
|
86
|
+
|
|
87
|
+
MIT
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Tương Tác Giữa ViewManager, View và ViewControllerOptimized
|
|
2
|
+
|
|
3
|
+
Tài liệu này giải thích cách `ViewControllerOptimized` sẽ thay thế `ViewController` hiện tại mà không làm gãy cấu trúc `View` và `ViewManager` của OneJS.
|
|
4
|
+
|
|
5
|
+
## 1. Mối Quan Hệ Hiện Tại
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
graph TD
|
|
9
|
+
ViewManager --> |quản lý| View
|
|
10
|
+
View --> |sở hữu (composition)| ViewController
|
|
11
|
+
ViewController --> |sở hữu| Managers(EventManager, ReactiveManager...)
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
- **ViewManager**: Gọi `new View(name, data)` để tạo view mới.
|
|
15
|
+
- **View**: Trong `constructor()`, nó khởi tạo `this.__ = new ViewController(path, this, null)`.
|
|
16
|
+
- **ViewController**: Là "bộ não" xử lý mọi logic render, state, event.
|
|
17
|
+
|
|
18
|
+
## 2. Chiến Lược Thay Thế Trong Suốt (Transparent Replacement)
|
|
19
|
+
|
|
20
|
+
Chúng ta sẽ thay thế class `ViewController` cũ bằng `ViewControllerOptimized` (được đổi tên thành `ViewController` khi release) sao cho `View` và `ViewManager` **không hề hay biết** về sự thay đổi này.
|
|
21
|
+
|
|
22
|
+
### Điều Kiện Cần
|
|
23
|
+
|
|
24
|
+
`ViewControllerOptimized` phải implement (hoặc bridge) toàn bộ **Public API** mà `View` đang gọi đến.
|
|
25
|
+
|
|
26
|
+
### Các "Điểm Chạm" (Touch Points) Chính
|
|
27
|
+
|
|
28
|
+
#### A. Khởi Tạo (Trong `View.js`)
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
// core/View.js
|
|
32
|
+
import { ViewController } from "./ViewController.js"; // <-- Sau này sẽ trỏ tới file mới
|
|
33
|
+
|
|
34
|
+
export class View {
|
|
35
|
+
constructor(path, config) {
|
|
36
|
+
// ...
|
|
37
|
+
// Logic này giữ nguyên, chỉ cần đảm bảo ViewController mới nhận đúng tham số
|
|
38
|
+
const controller = new ViewController(path, this, null);
|
|
39
|
+
// ...
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
#### B. Setup & Config (Trong `ViewManager.js` & `View.js`)
|
|
45
|
+
|
|
46
|
+
`View` gọi `this.__.setup(config)`.
|
|
47
|
+
|
|
48
|
+
- **Cũ**: `ViewController.setup()` gọi `InitializationManager` (hoặc logic hỗn hợp).
|
|
49
|
+
- **Mới**: `ViewControllerOptimized.setup()` sẽ gọi `ConfigHelper.process(this, config)`.
|
|
50
|
+
|
|
51
|
+
#### C. Rendering (Trong `ViewManager.js`)
|
|
52
|
+
|
|
53
|
+
`ViewManager` gọi `view.__.render()` hoặc `virtualRender()`.
|
|
54
|
+
|
|
55
|
+
- **Cũ**: `this._renderEngine.render()`.
|
|
56
|
+
- **Mới**: `RenderHelper.render(this)`.
|
|
57
|
+
|
|
58
|
+
#### D. Hydration (SSR) (Trong `ViewManager.js`)
|
|
59
|
+
|
|
60
|
+
`ViewManager` gọi `view.__.__scan(ssrData)`.
|
|
61
|
+
|
|
62
|
+
- **Cũ**: Logic scan nằm trong `RenderEngine` hoặc inline.
|
|
63
|
+
- **Mới**: `scanRenderedView` gọi `RenderHelper.scan(this, ssrData)`.
|
|
64
|
+
|
|
65
|
+
#### E. State & Props Access (Trong Compiled View Files)
|
|
66
|
+
|
|
67
|
+
Các file view đã compile (như `WebTemplatesExamplesSectionsDebtItem.js`) truy cập `this` (là instance của `View`), và `View` proxy sang `ViewController`.
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
// Ví dụ compiled code
|
|
71
|
+
render() {
|
|
72
|
+
return `... ${this.__reactive(id, keys, ...)} ...`;
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- **Yêu cầu**: `ViewControllerOptimized` **BẮT BUỘC** phải có phương thức `__reactive`.
|
|
77
|
+
- **Implementation**:
|
|
78
|
+
```javascript
|
|
79
|
+
__reactive(id, keys, renderFn) {
|
|
80
|
+
// Forward sang Helper
|
|
81
|
+
return ReactiveHelper.renderOutputComponent(this, keys, renderFn);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 3. Bản Đồ API (API Mapping)
|
|
86
|
+
|
|
87
|
+
Dưới đây là mapping chi tiết các method mà `View` gọi sang `ViewController`:
|
|
88
|
+
|
|
89
|
+
| View Method (Caller) | ViewController (Old) | ViewControllerOptimized (New) | Helper |
|
|
90
|
+
| :------------------- | :-------------------------- | :---------------------------- | :-------------------------------------- |
|
|
91
|
+
| `setup(config)` | `setup(config)` | `setup(config)` | `ConfigHelper` |
|
|
92
|
+
| `render()` | `_renderEngine.render()` | `render()` | `RenderHelper` |
|
|
93
|
+
| `prerender()` | `_renderEngine.prerender()` | `prerender()` | `RenderHelper` |
|
|
94
|
+
| `destroy()` | `destroy()` | `destroy()` | Gọi `LifecycleHelper`, `EventHelper`... |
|
|
95
|
+
| `.states` (Getter) | `this.states` | `this.states` | _Giữ nguyên (ViewState)_ |
|
|
96
|
+
| `.id` (Getter) | `this.id` | `this.id` | _Property trực tiếp_ |
|
|
97
|
+
| `__reactive()` | _(via RenderEngine/Mixin)_ | `__reactive()` | `ReactiveHelper` |
|
|
98
|
+
| `addEventConfig()` | Use `_eventManager` | `addEventConfig()` | `EventHelper` / `this.events` (data) |
|
|
99
|
+
|
|
100
|
+
## 4. Kế Hoạch Thay Thế (Release Plan)
|
|
101
|
+
|
|
102
|
+
1. **Giai đoạn 1 (Hiện tại)**:
|
|
103
|
+
- Hoàn thiện `ViewControllerOptimized` và các `Helper`.
|
|
104
|
+
- Đảm bảo `ViewControllerOptimized` chạy song song và pass unit test/manual test.
|
|
105
|
+
2. **Giai đoạn 2 (Switch)**:
|
|
106
|
+
|
|
107
|
+
- Đổi tên `ViewController.js` -> `ViewControllerLegacy.js`.
|
|
108
|
+
- Đổi tên `ViewControllerOptimized.js` -> `ViewController.js`.
|
|
109
|
+
|
|
110
|
+
3. **Giai đoạn 3 (Integration Test)**:
|
|
111
|
+
- Chạy thử `ViewManager` với Controller mới.
|
|
112
|
+
- Vì `ViewManager` và `View` chỉ import `ViewController` theo đường dẫn file `core/ViewController.js`, việc đổi tên file là đủ để tích hợp.
|
|
113
|
+
|
|
114
|
+
## 5. Kết Luận
|
|
115
|
+
|
|
116
|
+
`ViewManager` và `View` **không cần sửa đổi code**. Chúng tương tác với Controller thông qua một Interface ngầm định (duck typing). Miễn là `ViewControllerOptimized` implement đủ các method public (như `render`, `setup`, `destroy`, `__reactive`), hệ thống sẽ hoạt động bình thường với hiệu suất cao hơn.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Phân Tích Framework OneJS
|
|
2
|
+
|
|
3
|
+
Tài liệu này tổng hợp phân tích về cấu trúc và cơ chế hoạt động của **OneJS**, một framework frontend custom được thiết kế để hoạt động chặt chẽ với Laravel Blade (dựa trên cấu trúc file và cách sinh code).
|
|
4
|
+
|
|
5
|
+
## 1. Tổng Quan
|
|
6
|
+
|
|
7
|
+
OneJS là một Single Page Application (SPA) framework tự xây dựng, có khả năng:
|
|
8
|
+
|
|
9
|
+
- **Client-side Rendering (CSR)**: Render giao diện động tại phía client.
|
|
10
|
+
- **Server-side Rendering (SSR) Hydration**: Có khả năng "scan" và "hydrate" HTML được render sẵn từ server (Laravel Blade) để gắn logic Javascript vào.
|
|
11
|
+
- **Component-based**: Tổ chức code theo các View/Component độc lập.
|
|
12
|
+
- **Reactivity**: Hệ thống state management reactive tự xây dựng.
|
|
13
|
+
|
|
14
|
+
## 2. Cấu Trúc Thư Mục (`resources/js/onejs`)
|
|
15
|
+
|
|
16
|
+
- **`core/`**: Chứa mã nguồn cốt lõi của framework.
|
|
17
|
+
- `ViewManager.js`: Quản lý toàn bộ hệ thống view, routing và điều phối.
|
|
18
|
+
- `ViewController.js`: Controller cho từng instance của view, quản lý lifecycle, state, và events.
|
|
19
|
+
- `managers/`: Các module con hỗ trợ `ViewController` (như `RenderEngine`, `EventManager`, `ReactiveManager`).
|
|
20
|
+
- `OneMarkup.js`: Công cụ thao tác DOM và parse cấu trúc markup.
|
|
21
|
+
- `Router.js`: Xử lý điều hướng client-side.
|
|
22
|
+
- **`views/`**: Chứa các file Javascript được biên dịch (compiled) từ các file gốc (có thể là Blade component). Đây là nơi chứa logic cụ thể của từng view.
|
|
23
|
+
- **`app.js` & `init.js`**: Điểm khởi chạy của ứng dụng.
|
|
24
|
+
|
|
25
|
+
## 3. Kiến Trúc Cốt Lõi
|
|
26
|
+
|
|
27
|
+
### A. ViewManager (`core/ViewManager.js`)
|
|
28
|
+
|
|
29
|
+
Đây là "bộ não" của ứng dụng:
|
|
30
|
+
|
|
31
|
+
- **Quản lý View**: Lưu trữ cache các view template (`templates`, `cachedViews`).
|
|
32
|
+
- **Loading**: Hỗ trợ Dynamic Import view thông qua `ViewLoader`.
|
|
33
|
+
- **Routing**: Tích hợp với `Router` để load view dựa trên URL.
|
|
34
|
+
- **Render & Scan**: Cung cấp 2 phương thức chính:
|
|
35
|
+
- `loadView()`: Load và render mới một view (CSR).
|
|
36
|
+
- `scanView()`: Scan DOM hiện tại (được server render) để gắn logic JS vào (SSR Hydration).
|
|
37
|
+
- **Super View**: Hỗ trợ khái niệm "Layout" (Super View) cho phép lồng các view con vào view cha.
|
|
38
|
+
|
|
39
|
+
### B. ViewController (`core/ViewController.js`)
|
|
40
|
+
|
|
41
|
+
Mỗi view instance sẽ có một `ViewController` riêng biệt:
|
|
42
|
+
|
|
43
|
+
- **Lifecycle Management**: Quản lý các hooks như `created`, `mounted`, `destroyed` thông qua `LifecycleManager`.
|
|
44
|
+
- **Managers**: Nó ủy quyền các tác vụ cụ thể cho các manager con:
|
|
45
|
+
- `RenderEngine`: Xử lý render HTML.
|
|
46
|
+
- `EventManager`: Đăng ký và xử lý sự kiện DOM.
|
|
47
|
+
- `ReactiveManager`: Theo dõi thay đổi state và cập nhật UI.
|
|
48
|
+
- `ResourceManager`: Quản lý CSS/JS assets riêng của view.
|
|
49
|
+
|
|
50
|
+
### C. RenderEngine (`core/managers/RenderEngine.js`)
|
|
51
|
+
|
|
52
|
+
Chịu trách nhiệm sinh ra HTML hoặc cập nhật DOM:
|
|
53
|
+
|
|
54
|
+
- **Render**: Chạy hàm `render()` của view để tạo ra chuỗi HTML.
|
|
55
|
+
- **Scan**: Duyệt qua cấu trúc DOM thực tế để tìm các element tương ứng với logic của view (`scanDOMElements`).
|
|
56
|
+
- **Virtual Render**: Chế độ render ảo để tính toán cấu trúc mà không update DOM ngay lập tức.
|
|
57
|
+
- **Wrapper**: Hỗ trợ bọc view trong các thẻ container (wrapper) để quản lý phạm vi.
|
|
58
|
+
|
|
59
|
+
### D. Hệ Thống Reactivity (`core/ViewState.js` & `views/...js`)
|
|
60
|
+
|
|
61
|
+
Logic reactive hoạt động như sau:
|
|
62
|
+
|
|
63
|
+
1. **Khai báo State**: Trong file view biên dịch, các state được đăng ký qua `__STATE__.__.register()`.
|
|
64
|
+
2. **Setters**: Tạo ra các hàm setter (ví dụ `setDebtData`).
|
|
65
|
+
3. **Binding**: Trong hàm `render`, các cấu trúc như `this.__reactive` hoặc `this.__classBinding` được sử dụng để gắn kết dữ liệu với DOM.
|
|
66
|
+
4. **Update**: Khi state thay đổi qua setter, `ReactiveManager` sẽ kích hoạt cập nhật lại các phần DOM bị ảnh hưởng (fine-grained updates).
|
|
67
|
+
|
|
68
|
+
## 4. Luồng Hoạt Động (Data Flow)
|
|
69
|
+
|
|
70
|
+
### Khởi tạo App
|
|
71
|
+
|
|
72
|
+
1. `init.js` kiểm tra config `window.APP_CONFIGS`.
|
|
73
|
+
2. Khởi tạo `OneMarkup`, `Router`, `ViewManager`.
|
|
74
|
+
3. Nếu là SSR, gọi `Router.start(true)` và hệ thống sẽ thực hiện `scanView` thay vì render mới.
|
|
75
|
+
|
|
76
|
+
### Quy trình Render một View (CSR)
|
|
77
|
+
|
|
78
|
+
1. `ViewManager.loadView(name)` được gọi.
|
|
79
|
+
2. Load module view từ `views/`.
|
|
80
|
+
3. Tạo instance `ViewEngine` (wrapper của `ViewController`).
|
|
81
|
+
4. Chạy `RenderEngine.render` -> Sinh HTML string.
|
|
82
|
+
5. Insert HTML vào container (`#app-root`).
|
|
83
|
+
6. Gọi hook `mounted`.
|
|
84
|
+
|
|
85
|
+
### Quy trình Hydrate một View (SSR)
|
|
86
|
+
|
|
87
|
+
1. `ViewManager.scanView(name)` được gọi.
|
|
88
|
+
2. Tìm kiếm dữ liệu `ssrData` đã được server inject.
|
|
89
|
+
3. Tạo instance View.
|
|
90
|
+
4. `RenderEngine.scan` -> Tìm các element trong DOM tương ứng với View ID.
|
|
91
|
+
5. Gắn các event handlers và binding mà không render lại HTML.
|
|
92
|
+
|
|
93
|
+
## 5. Phân Tích File View (`views/WebTemplatesExamplesSectionsDebtItem.js`)
|
|
94
|
+
|
|
95
|
+
File view được biên dịch chứa:
|
|
96
|
+
|
|
97
|
+
- **Hàm khởi tạo**: Nhận `App`, `systemData`, `$$$DATA$$$` (props).
|
|
98
|
+
- **State Setup**: `useState`, `setDebtData`...
|
|
99
|
+
- **Methods**: Các hàm xử lý logic (ví dụ `togglePaidStatus`, `handleUpdateDebt`).
|
|
100
|
+
- **Render Function**: Trả về chuỗi HTML template string, sử dụng các helper:
|
|
101
|
+
- `${this.__classBinding(...)}`: Binding class động.
|
|
102
|
+
- `${this.__addEventConfig(...)}`: Gắn sự kiện (click, submit...).
|
|
103
|
+
- `${this.__reactive(...)}`: Hiển thị dữ liệu text động.
|
|
104
|
+
- `${this.__watch(...)}`: Render lại khối HTML khi state phụ thuộc thay đổi.
|
|
105
|
+
|
|
106
|
+
## Kết luận
|
|
107
|
+
|
|
108
|
+
OneJS là một framework khá phức tạp và mạnh mẽ, được thiết kế tối ưu cho việc kết hợp giữa Server-side Rendering của Laravel và tính năng động của SPA. Nó tự quản lý DOM, Event và State mà không phụ thuộc vào các thư viện lớn như React hay Vue, giúp tối ưu hóa tải trọng và kiểm soát chi tiết quá trình render.
|