@vureact/compiler-core 1.4.0 → 1.5.1

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.en.md ADDED
@@ -0,0 +1,286 @@
1
+ # @vureact/compiler-core
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@vureact/compiler-core.svg?style=flat-square)](https://vureact.top/)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@vureact/compiler-core.svg?style=flat-square)](https://www.npmjs.com/package/@vureact/compiler-core)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+
7
+ English | [简体中文](./README.md)
8
+
9
+ ## What is VuReact?
10
+
11
+ [VuReact](http://vureact.top/en) (pronounced `/vjuːˈriːækt/`) is a Semantic-Aware Vue 3 to React 18+ compiler for progressive migration.
12
+
13
+ It is not a simple syntax conversion, but **semantic-level compilation**: it understands the intent of Vue code and generates code that adheres to React best practices. It consists of two parts: **compile-time transformation** + **runtime adaptation**.
14
+
15
+ The core strategy is **"convention over configuration"** — through clear compilation conventions, it ensures stable and reliable conversion, making it especially suitable for **progressive migration** scenarios.
16
+
17
+ ## Quick Start
18
+
19
+ This section will guide you through creating, compiling, and running your first VuReact project; alternatively, you can check out the [playground](https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master).
20
+
21
+ After completion, you will clearly understand three things:
22
+
23
+ 1. Under what conventions input SFCs can be stably converted
24
+ 2. What the compiled directory structure looks like
25
+ 3. The semantic correspondence between the output TSX and the original SFC
26
+ 4. The compiler automatically analyzes and appends dependencies, eliminating the need to manually manage React hooks dependencies
27
+
28
+ ## Step 0: Prepare the Directory
29
+
30
+ First, set up a minimal project (illustration):
31
+
32
+ ```txt
33
+ my-app/
34
+ ├─ src/
35
+ │ ├─ components/
36
+ │ │ └─ Counter.vue
37
+ │ ├─ main.ts
38
+ │ └─ index.css
39
+ ├─ package.json
40
+ └─ vureact.config.js
41
+ ```
42
+
43
+ ## Step 1: Installation
44
+
45
+ Install the VuReact compiler in your Vue project:
46
+
47
+ ```bash
48
+ # Using npm
49
+ npm install -D @vureact/compiler-core
50
+
51
+ # Using yarn
52
+ yarn add -D @vureact/compiler-core
53
+
54
+ # Using pnpm
55
+ pnpm add -D @vureact/compiler-core
56
+ ```
57
+
58
+ ## Step 2: Write the Input SFC
59
+
60
+ `src/components/Counter.vue`
61
+
62
+ ```html
63
+ <template>
64
+ <section class="counter-card">
65
+ <h2>{{ props.title || title }}</h2>
66
+ <p>Count: {{ count }}</p>
67
+ <button @click="increment">+1</button>
68
+ <button @click="methods.decrease">-1</button>
69
+ </section>
70
+ </template>
71
+
72
+ <script setup lang="ts">
73
+ // @vr-name: Counter (Note: Tells the compiler what component name to generate)
74
+ import { computed, ref } from 'vue';
75
+
76
+ // You can also use macros to define component names
77
+ defineOptions({ name: 'Counter' });
78
+
79
+ // Define props
80
+ const props = defineProps<{ title?: string }>();
81
+
82
+ // Define emits
83
+ const emits = defineEmits<{
84
+ (e: 'change'): void;
85
+ (e: 'update', value: number): number;
86
+ }>();
87
+
88
+ const step = ref(1);
89
+ const count = ref(0);
90
+ const title = computed(() => `Counter x${step.value}`);
91
+
92
+ const increment = () => {
93
+ count.value += step.value;
94
+ emits('update', count.value);
95
+ };
96
+
97
+ const methods = {
98
+ decrease() {
99
+ count.value -= step.value;
100
+ },
101
+ };
102
+ </script>
103
+
104
+ <style lang="less" scoped>
105
+ @border-color: #ddd;
106
+ @border-radius: 8px;
107
+ @padding-base: 12px;
108
+
109
+ .counter-card {
110
+ border: 1px solid @border-color;
111
+ border-radius: @border-radius;
112
+ padding: @padding-base;
113
+ }
114
+ </style>
115
+ ```
116
+
117
+ ## Step 3: Configure the Compiler
118
+
119
+ `vureact.config.ts`
120
+
121
+ ```ts
122
+ import { defineConfig } from '@vureact/compiler-core';
123
+
124
+ export default defineConfig({
125
+ input: 'src',
126
+ // Key: Exclude Vue entry files to avoid entry semantic conflicts
127
+ exclude: ['src/main.ts'],
128
+ output: {
129
+ workspace: '.vureact',
130
+ outDir: 'dist',
131
+ // Disable environment initialization for tutorial scenarios to observe pure compilation output
132
+ // Recommended to enable in actual use
133
+ bootstrapVite: false,
134
+ },
135
+ });
136
+ ```
137
+
138
+ ## Step 4: Execute Compilation
139
+
140
+ ### Method 1: Use the npx command
141
+
142
+ Run in the root directory:
143
+
144
+ ```bash
145
+ npx vureact build
146
+ ```
147
+
148
+ ### Method 2: Use npm scripts
149
+
150
+ Add script commands to `package.json`:
151
+
152
+ ```json
153
+ "scripts": {
154
+ "watch": "vureact watch",
155
+ "build": "vureact build"
156
+ }
157
+ ```
158
+
159
+ ```bash
160
+ npm run build
161
+ ```
162
+
163
+ ## Step 5: View the Output Directory Tree
164
+
165
+ Compiled directory (illustration):
166
+
167
+ ```txt
168
+ my-app/
169
+ ├─ .vureact/
170
+ │ ├─ cache/
171
+ │ │ └─ _metadata.json
172
+ │ └─ dist/
173
+ │ └─ src/
174
+ │ └─ components/
175
+ │ ├─ Counter.tsx
176
+ │ └─ Counter-<hash>.css
177
+ ├─ src/
178
+ │ └─ ...
179
+ └─ vureact.config.js
180
+ ```
181
+
182
+ ## Step 6: Compare the Generated Results
183
+
184
+ Below is a typical formatted output (slightly simplified for illustration; the actual hash and property names are subject to local output):
185
+
186
+ ```tsx
187
+ import { memo, useCallback, useMemo } from 'react';
188
+ import { useComputed, useVRef } from '@vureact/runtime-core';
189
+ import './Counter-a1b2c3.css';
190
+
191
+ // Derived from defineProps and defineEmits
192
+ type ICounterType = {
193
+ title?: string;
194
+ onChange: () => void;
195
+ onUpdate: (value: number) => number;
196
+ };
197
+
198
+ // Component wrapped with memo
199
+ const Counter = memo((props: ICounterType) => {
200
+ // ref/computed converted to equivalent adaptation APIs
201
+ const step = useVRef(1);
202
+ const count = useVRef(0);
203
+ const title = useComputed(() => `Counter x${step.value}`);
204
+
205
+ // Automatically analyze dependencies of top-level arrow functions and append useCallback optimization
206
+ const increment = useCallback(() => {
207
+ count.value += step.value;
208
+ props.onUpdate?.(count.value); // emits conversion
209
+ }, [count.value, step.value, props.onUpdate]);
210
+
211
+ // Automatically analyze dependencies in top-level objects and append useMemo optimization
212
+ const methods = useMemo(
213
+ () => ({
214
+ decrease() {
215
+ count.value -= step.value;
216
+ },
217
+ }),
218
+ [count.value, step.value],
219
+ );
220
+
221
+ return (
222
+ <>
223
+ <section className="counter-card" data-css-a1b2c3>
224
+ <h2 data-css-a1b2c3>{props.title || title.value}</h2>
225
+ <p data-css-a1b2c3>Count: {count.value}</p>
226
+ <button onClick={increment} data-css-a1b2c3>
227
+ +1
228
+ </button>
229
+ <button onClick={methods.decrease} data-css-a1b2c3>
230
+ -1
231
+ </button>
232
+ </section>
233
+ </>
234
+ );
235
+ });
236
+
237
+ export default Counter;
238
+ ```
239
+
240
+ CSS file content:
241
+
242
+ ```css
243
+ .counter-card[data-css-a1b2c3] {
244
+ border: 1px solid #ddd;
245
+ border-radius: 8px;
246
+ padding: 12px;
247
+ }
248
+ ```
249
+
250
+ ## Key Observations
251
+
252
+ 1. The special comment `// @vr-name: Counter` defines the component name
253
+ 2. `defineProps` and `defineEmits` are converted to TS component types
254
+ 3. Non-pure UI display components are wrapped with `memo` by default
255
+ 4. `ref` / `computed` are converted to runtime adaptation APIs (`useVRef` / `useComputed`)
256
+ 5. Template event callbacks generate React-semantic `onClick`
257
+ 6. Top-level arrow functions have their dependencies automatically analyzed and `useCallback` is injected where applicable
258
+ 7. Top-level variable declarations have their dependencies automatically analyzed and `useMemo` is injected where applicable
259
+ 8. The `.value` suffix is added to original `ref` state values in JSX
260
+ 9. Less styles are compiled to CSS code
261
+ 10. Scoped styles generate hashed CSS files and add scoped attributes to elements
262
+
263
+ ## FAQ
264
+
265
+ - Failure to exclude Vue entry files (e.g., `src/main.ts`)
266
+ - Calling APIs that are converted to Hooks outside the top level
267
+ - Unanalyzable expressions appearing in templates (triggering warnings)
268
+ - Disabling style preprocessing while using `scoped`, leading to scoping failure
269
+
270
+ For more details, please refer to the [FAQ](https://vureact.top/guide/en/faq.html) of the official documentation.
271
+
272
+ ## Ecosystem Integration
273
+
274
+ - **[VuReact Runtime Core](https://runtime.vureact.top/en)**: Provides React versions of Vue's common built-in components, core Composition API, etc.
275
+ - **[VuReact Router](https://router.vureact.top/en)**: Supports conversion from Vue Router 4.x to React Router DOM 7.9+.
276
+
277
+ If necessary, you can choose [☣️ Mixed Coding](https://vureact.top/guide/mind-control-readme.html) to directly use the React ecosystem.
278
+
279
+ ## 🔗 Links
280
+
281
+ - GitHub: <https://github.com/vureact-js/core>
282
+ - Gitee: <https://gitee.com/vureact-js/core>
283
+ - Documentation: [https://vureact.top](https://vureact.top/)
284
+ - Playground:
285
+ - CRM Admin Dashboard (Standard): <https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master>
286
+ - Customer Support Hub (Mixed): <https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true>
package/README.md CHANGED
@@ -3,29 +3,33 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@vureact/compiler-core.svg?style=flat-square)](https://vureact.top/)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/@vureact/compiler-core.svg?style=flat-square)](https://www.npmjs.com/package/@vureact/compiler-core)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Vue 3](https://img.shields.io/badge/Vue-3.x-42b883)](https://vuejs.org/)
7
+ [![React 18+](https://img.shields.io/badge/React-18%2B-61dafb)](https://reactjs.org/)
6
8
 
7
- ## What is VuReact?
9
+ 简体中文 | [English](./README.en.md)
8
10
 
9
- [VuReact](http://vureact.top) (pronounced /vjuːˈriːækt/) is an semantic-aware Vue 3 to React 18+ compiler for progressive migration.
11
+ ## 什么是 VuReact?
10
12
 
11
- It is not a simple syntax conversion, but **semantic-level compilation**: it understands the intent of Vue code and generates code that adheres to React best practices. It consists of two parts: **compile-time transformation** + **runtime adaptation**.
13
+ [VuReact](http://vureact.top)(发音 `/vjuːˈriːækt/`)是一个渐进式语义驱动的 Vue 3 React 18+ 迁移编译器
12
14
 
13
- The core strategy is **"convention over configuration"** — through clear compilation conventions, it ensures stable and reliable conversion, making it especially suitable for **progressive migration** scenarios.
15
+ 它不是简单的语法转换,而是**语义级编译**:理解 Vue 代码的意图,生成符合 React 最佳实践的代码。由**编译时转换** + **运行时适配**两部分构成。
14
16
 
15
- ## Quick Start
17
+ 核心策略是 **“约定优先”** ——通过明确的编译约定,确保转换稳定可靠,尤其适合**渐进式迁移**场景。
16
18
 
17
- This section will guide you through creating, compiling, and running your first VuReact project; alternatively, you can check out the [online examples first](https://codesandbox.io/p/sandbox/examples-f5rlpk).
19
+ ## 快速开始
18
20
 
19
- After completion, you will clearly understand three things:
21
+ 本节将引导你完成第一个 VuReact 项目的创建、编译和运行;或者选择查看 [CodeSandbox 在线案例](https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master)。
20
22
 
21
- 1. Under what conventions input SFCs can be stably converted
22
- 2. What the compiled directory structure looks like
23
- 3. The semantic correspondence between the output TSX and the original SFC
24
- 4. The compiler automatically analyzes and appends dependencies, eliminating the need to manually manage React hooks dependencies
23
+ 完成后你会明确三件事:
25
24
 
26
- ## Step 0: Prepare the Directory
25
+ 1. 输入 SFC 在什么约定下可稳定转换
26
+ 2. 编译后目录会长什么样
27
+ 3. 输出 TSX 与原始 SFC 的语义对应关系
28
+ 4. 编译器会自动分析并追加依赖,无需手动管理 React hooks 依赖项
27
29
 
28
- First, set up a minimal project (illustration):
30
+ ## Step 0:准备目录
31
+
32
+ 先准备一个最小工程(示意):
29
33
 
30
34
  ```txt
31
35
  my-app/
@@ -38,22 +42,22 @@ my-app/
38
42
  └─ vureact.config.js
39
43
  ```
40
44
 
41
- ## Step 1: Installation
45
+ ## Step 1:安装
42
46
 
43
- Install the VuReact compiler in your Vue project:
47
+ 在你的 Vue 项目中安装 VuReact 编译器:
44
48
 
45
49
  ```bash
46
- # Using npm
50
+ # 使用 npm
47
51
  npm install -D @vureact/compiler-core
48
52
 
49
- # Using yarn
53
+ # 使用 yarn
50
54
  yarn add -D @vureact/compiler-core
51
55
 
52
- # Using pnpm
56
+ # 使用 pnpm
53
57
  pnpm add -D @vureact/compiler-core
54
58
  ```
55
59
 
56
- ## Step 2: Write the Input SFC
60
+ ## Step 2:编写输入 SFC
57
61
 
58
62
  `src/components/Counter.vue`
59
63
 
@@ -68,16 +72,16 @@ pnpm add -D @vureact/compiler-core
68
72
  </template>
69
73
 
70
74
  <script setup lang="ts">
71
- // @vr-name: Counter (Note: Tells the compiler what component name to generate)
75
+ // @vr-name: Counter (注:用于告诉编译器,该生成什么组件名)
72
76
  import { computed, ref } from 'vue';
73
77
 
74
- // You can also use macros to define component names
78
+ // 也可以使用宏定义组件名
75
79
  defineOptions({ name: 'Counter' });
76
80
 
77
- // Define props
81
+ // 定义 props
78
82
  const props = defineProps<{ title?: string }>();
79
83
 
80
- // Define emits
84
+ // 定义 emits
81
85
  const emits = defineEmits<{
82
86
  (e: 'change'): void;
83
87
  (e: 'update', value: number): number;
@@ -112,43 +116,40 @@ pnpm add -D @vureact/compiler-core
112
116
  </style>
113
117
  ```
114
118
 
115
- ## Step 3: Configure the Compiler
119
+ ## Step 3:配置编译器
116
120
 
117
- `vureact.config.js`
121
+ `vureact.config.ts`
118
122
 
119
- ```js
123
+ ```ts
120
124
  import { defineConfig } from '@vureact/compiler-core';
121
125
 
122
126
  export default defineConfig({
123
127
  input: 'src',
124
- // Key: Exclude Vue entry files to avoid entry semantic conflicts
128
+ // 关键:排除 Vue 入口文件,避免入口语义冲突
125
129
  exclude: ['src/main.ts'],
126
130
  output: {
127
131
  workspace: '.vureact',
128
132
  outDir: 'dist',
129
- // Disable environment initialization for tutorial scenarios to observe pure compilation output
133
+ // 教程场景关闭环境初始化,便于观察纯编译产物
134
+ // 实际使用时建议开启
130
135
  bootstrapVite: false,
131
136
  },
132
- format: {
133
- enabled: true, // Enable formatting (this will increase compilation time).
134
- formatter: 'prettier',
135
- },
136
137
  });
137
138
  ```
138
139
 
139
- ## Step 4: Execute Compilation
140
+ ## Step 4:执行编译
140
141
 
141
- ### Method 1: Use the npx command
142
+ ### 方式一:使用 npx 命令
142
143
 
143
- Run in the root directory:
144
+ 在根目录下运行:
144
145
 
145
146
  ```bash
146
147
  npx vureact build
147
148
  ```
148
149
 
149
- ### Method 2: Use npm scripts
150
+ ### 方式二:使用 npm scripts
150
151
 
151
- Add script commands to `package.json`:
152
+ `package.json` 里添加脚本命令:
152
153
 
153
154
  ```json
154
155
  "scripts": {
@@ -161,9 +162,9 @@ Add script commands to `package.json`:
161
162
  npm run build
162
163
  ```
163
164
 
164
- ## Step 5: View the Output Directory Tree
165
+ ## Step 5:查看输出目录树
165
166
 
166
- Compiled directory (illustration):
167
+ 编译后目录(示意):
167
168
 
168
169
  ```txt
169
170
  my-app/
@@ -174,42 +175,42 @@ my-app/
174
175
  │ └─ src/
175
176
  │ └─ components/
176
177
  │ ├─ Counter.tsx
177
- │ └─ Counter-<hash>.css
178
+ │ └─ counter-<hash>.css
178
179
  ├─ src/
179
180
  │ └─ ...
180
181
  └─ vureact.config.js
181
182
  ```
182
183
 
183
- ## Step 6: Compare the Generated Results
184
+ ## Step 6:对照生成结果
184
185
 
185
- Below is a typical formatted output (slightly simplified for illustration; the actual hash and property names are subject to local output):
186
+ 下面是一个格式化后的典型输出(为说明做了轻微简化,实际哈希与属性名以本地产物为准):
186
187
 
187
- ```ts
188
+ ```tsx
188
189
  import { memo, useCallback, useMemo } from 'react';
189
190
  import { useComputed, useVRef } from '@vureact/runtime-core';
190
- import './Counter-a1b2c3.css';
191
+ import './counter-a1b2c3.css';
191
192
 
192
- // Derived from defineProps and defineEmits
193
+ // 根据 defineProps defineEmits 推导
193
194
  type ICounterType = {
194
- title?: string
195
+ title?: string;
195
196
  onChange: () => void;
196
197
  onUpdate: (value: number) => number;
197
- }
198
+ };
198
199
 
199
- // Component wrapped with memo
200
+ // memo 包裹组件
200
201
  const Counter = memo((props: ICounterType) => {
201
- // ref/computed converted to equivalent adaptation APIs
202
+ // ref/computed 转换成了对等的适配 API
202
203
  const step = useVRef(1);
203
204
  const count = useVRef(0);
204
205
  const title = useComputed(() => `Counter x${step.value}`);
205
206
 
206
- // Automatically analyze dependencies of top-level arrow functions and append useCallback optimization
207
+ // 自动分析顶层箭头函数依赖,并追加 useCallback 优化
207
208
  const increment = useCallback(() => {
208
209
  count.value += step.value;
209
- props.onUpdate?.(count.value); // emits conversion
210
+ props.onUpdate?.(count.value); // emits 转换
210
211
  }, [count.value, step.value, props.onUpdate]);
211
212
 
212
- // Automatically analyze dependencies in top-level objects and append useMemo optimization
213
+ // 自动分析顶层对象中的依赖,并追加 useMemo 优化
213
214
  const methods = useMemo(
214
215
  () => ({
215
216
  decrease() {
@@ -238,7 +239,7 @@ const Counter = memo((props: ICounterType) => {
238
239
  export default Counter;
239
240
  ```
240
241
 
241
- CSS file content:
242
+ CSS 文件内容:
242
243
 
243
244
  ```css
244
245
  .counter-card[data-css-a1b2c3] {
@@ -248,37 +249,40 @@ CSS file content:
248
249
  }
249
250
  ```
250
251
 
251
- ## Key Observations
252
+ ## 关键观察点
253
+
254
+ 1. `// @vr-name: Counter` 这段特殊注释定义了组件名
255
+ 2. `defineProps` 和 `defineEmits` 被转换成了 TS 组件类型
256
+ 3. 非纯 UI 展示组件,默认会走 `memo` 包装
257
+ 4. `ref` / `computed` 被转换为 runtime 适配 API(`useVRef` / `useComputed`)
258
+ 5. 模板事件回调会生成符合 React 语义的 `onClick`
259
+ 6. 顶层箭头函数自动分析依赖,尝试注入 `useCallback`
260
+ 7. 顶层变量声明自动分析依赖,尝试注入 `useMemo`
261
+ 8. 对 JSX 中的原 `ref` 状态值补上 `.value`
262
+ 9. `less` 样式被编译为 css 代码
263
+ 10. `scoped` 样式会生成带哈希的 css 文件,并在元素上标注作用域属性
252
264
 
253
- 1. The special comment `// @vr-name: Counter` defines the component name
254
- 2. `defineProps` and `defineEmits` are converted to TS component types
255
- 3. Non-pure UI display components are wrapped with `memo` by default
256
- 4. `ref` / `computed` are converted to runtime adaptation APIs (`useVRef` / `useComputed`)
257
- 5. Template event callbacks generate React-semantic `onClick`
258
- 6. Top-level arrow functions have their dependencies automatically analyzed and `useCallback` is injected where applicable
259
- 7. Top-level variable declarations have their dependencies automatically analyzed and `useMemo` is injected where applicable
260
- 8. The `.value` suffix is added to original `ref` state values in JSX
261
- 9. Less styles are compiled to CSS code
262
- 10. Scoped styles generate hashed CSS files and add scoped attributes to elements
265
+ ## 常见问题
263
266
 
264
- ## Common Failure Points
267
+ - 没排除 Vue 入口文件,如 `src/main.ts`
268
+ - 在非顶层调用会被转换为 Hook 的 API
269
+ - 模板里出现不可分析表达式并被告警
270
+ - 关闭样式预处理且使用 `scoped`,导致作用域失效
265
271
 
266
- - Failure to exclude Vue entry files (e.g., `src/main.ts` or `App.vue`)
267
- - Calling APIs that are converted to Hooks outside the top level
268
- - Unanalyzable expressions appearing in templates (triggering warnings)
269
- - Disabling style preprocessing while using `scoped`, leading to scoping failure
272
+ 更多请查阅官方文档的 [FAQ 章节](https://vureact.top/guide/faq.html)
270
273
 
271
- ## Ecosystem Integration
274
+ ## 生态集成
272
275
 
273
- - **[Vue Core Adaptation Package](https://runtime.vureact.top/)**: Provides React versions of Vue's common built-in components, core Composition API, etc.
274
- - **[Vue Router Adaptation Package](https://router.vureact.top/)**: Supports conversion from Vue Router 4.x to React Router DOM 7.9+.
276
+ - **[VuReact Runtime Core](https://runtime.vureact.top/)**:提供 React 版的 Vue 常用内置组件、核心 Composition API
277
+ - **[VuReact Router](https://router.vureact.top/)**:支持 Vue Router 4.x -> React Router DOM 7.9+ 转换
275
278
 
276
- If necessary, you can choose [☣️ Mixed Coding](https://vureact.top/guide/mind-control-readme.html) to directly use the React ecosystem.
279
+ 如果确实需要,你可以选择 [☣️混合编写](https://vureact.top/guide/mind-control-readme.html),以此直接使用 React 生态。
277
280
 
278
- ## 🔗 Links
281
+ ## 🔗 链接
279
282
 
280
- - GitHub: <https://github.com/vureact-js/core>
281
- - Gitee: <https://gitee.com/vureact-js/core>
282
- - Documentation: [https://vureact.top](https://vureact.top/)
283
- - npm: <https://www.npmjs.com/package/@vureact/compiler-core>
284
- - Online Examples: <https://codesandbox.io/p/devbox/compiler-examples-n8yg68>
283
+ - GitHub:<https://github.com/vureact-js/core>
284
+ - Gitee:<https://gitee.com/vureact-js/core>
285
+ - 文档:[https://vureact.top](https://vureact.top/)
286
+ - CodeSandbox 在线案例:
287
+ - 客户关系管理后台(标准):<https://codesandbox.io/p/github/vureact-js/example-crm-admin-backend/master>
288
+ - 客户支持协同后台(混写):<https://codesandbox.io/p/github/vureact-js/example-customer-support-hub/master?import=true>