Skip to content

Commit 71d3ee4

Browse files
author
Zing
committed
feat(js/lua引擎): 添加异步执行模式和状态管理功能
为JS和Lua引擎添加异步执行模式(ExecuteModeAsync)和状态管理功能(启动/暂停/恢复/停止) 扩展引擎配置支持自定义require路径和默认执行模式 更新文档以说明新增功能和API使用方法 升级goja_nodejs依赖以支持Node.js兼容特性
1 parent d58edde commit 71d3ee4

10 files changed

Lines changed: 630 additions & 106 deletions

File tree

docs/js_engine/README.md

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ func main() {
169169

170170
### 6.1 基本 require
171171

172-
JavaScript 中,可以使用 `require` 函数来加载其他 JavaScript 文件(仅限用户自定义的 JS 文件)。例如
172+
JavaScript 引擎使用 **goja_nodejs** 提供的 `require` 功能,可以加载其他 JavaScript 文件(仅限用户自定义的 JS 文件)。使用方式与标准 Node.js 相同
173173

174174
```javascript
175175
// 加载同目录下的 utils.js 文件
@@ -222,7 +222,7 @@ var handle = websocket.connect(
222222

223223
### 6.4 模块导出
224224

225-
在 JavaScript 中,使用 `module.exports` 来导出模块:
225+
在 JavaScript 中,使用 `module.exports` 来导出模块,与标准 Node.js 相同
226226

227227
```javascript
228228
// utils.js
@@ -240,7 +240,77 @@ module.exports = {
240240
};
241241
```
242242

243-
## 7. 注意事项
243+
### 6.5 Node.js 兼容性
244+
245+
JavaScript 引擎使用 goja_nodejs 提供的 Node.js 兼容层,支持以下 Node.js 特性:
246+
247+
- `require()` 函数 - 与 Node.js 相同的模块加载机制
248+
- `module.exports` 模块导出 - 标准的 Node.js 模块导出方式
249+
- `__dirname``__filename` 变量 - 提供模块的目录和文件名信息
250+
- `console` 模块 - 标准的控制台输出功能
251+
- `process` 模块 - 提供进程相关信息
252+
253+
这使得你可以使用与 Node.js 完全相同的方式编写 JavaScript 脚本,提高了代码的可移植性和兼容性。
254+
255+
## 7. 执行模式
256+
257+
JavaScript 引擎支持两种执行模式:
258+
259+
### 7.1 同步执行
260+
同步执行是默认模式,会阻塞等待脚本执行完成:
261+
262+
```go
263+
// 同步执行文件
264+
err := engine.ExecuteFile("script.js")
265+
if err != nil {
266+
log.Fatalf("执行失败: %v", err)
267+
}
268+
269+
// 同步执行字符串
270+
err = engine.ExecuteString("console.log('Hello');", "scripts")
271+
if err != nil {
272+
log.Fatalf("执行失败: %v", err)
273+
}
274+
```
275+
276+
### 7.2 异步执行
277+
异步执行会在后台运行脚本,不会阻塞当前线程:
278+
279+
```go
280+
// 异步执行文件
281+
err := engine.ExecuteFileWithMode("script.js", js_engine.ExecuteModeAsync)
282+
if err != nil {
283+
log.Fatalf("执行失败: %v", err)
284+
}
285+
286+
// 异步执行字符串
287+
err = engine.ExecuteStringWithMode("console.log('Hello');", js_engine.ExecuteModeAsync, "scripts")
288+
if err != nil {
289+
log.Fatalf("执行失败: %v", err)
290+
}
291+
```
292+
293+
## 8. Require 路径配置
294+
295+
### 8.1 自动路径管理
296+
- 脚本执行时,当前脚本所在目录会自动添加到模块搜索路径中
297+
- 这意味着你可以直接 require 同目录下的文件,无需指定完整路径
298+
299+
### 8.2 自定义路径
300+
你可以通过 API 添加自定义的 require 搜索路径:
301+
302+
```go
303+
// 添加单个路径
304+
erengine.AddRequirePath("/path/to/modules")
305+
306+
// 设置多个路径
307+
erengine.SetRequirePaths([]string{
308+
"/path/to/modules",
309+
"/another/path"
310+
})
311+
```
312+
313+
## 9. 注意事项
244314

245315
1. JavaScript 脚本文件的扩展名必须是 `.js`
246316
2. require 时可以添加 `.js` 扩展名,也可以省略

docs/lua_engine/README.md

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,65 @@ end
228228
return utils
229229
```
230230

231-
## 7. 注意事项
231+
## 7. 执行模式
232+
233+
Lua 引擎支持两种执行模式:
234+
235+
### 7.1 同步执行
236+
同步执行是默认模式,会阻塞等待脚本执行完成:
237+
238+
```go
239+
// 同步执行文件
240+
err := engine.ExecuteFile("script.lua")
241+
if err != nil {
242+
log.Fatalf("执行失败: %v", err)
243+
}
244+
245+
// 同步执行字符串
246+
err = engine.ExecuteString("print('Hello')", "scripts")
247+
if err != nil {
248+
log.Fatalf("执行失败: %v", err)
249+
}
250+
```
251+
252+
### 7.2 异步执行
253+
异步执行会在后台运行脚本,不会阻塞当前线程:
254+
255+
```go
256+
// 异步执行文件
257+
err := engine.ExecuteFileWithMode("script.lua", lua_engine.ExecuteModeAsync)
258+
if err != nil {
259+
log.Fatalf("执行失败: %v", err)
260+
}
261+
262+
// 异步执行字符串
263+
err = engine.ExecuteStringWithMode("print('Hello')", lua_engine.ExecuteModeAsync, "scripts")
264+
if err != nil {
265+
log.Fatalf("执行失败: %v", err)
266+
}
267+
```
268+
269+
## 8. Require 路径配置
270+
271+
### 8.1 自动路径管理
272+
- 脚本执行时,当前脚本所在目录会自动添加到 Lua 的搜索路径中
273+
- 这意味着你可以直接 require 同目录下的文件,无需指定完整路径
274+
275+
### 8.2 自定义路径
276+
你可以通过 API 添加自定义的 require 搜索路径:
277+
278+
```go
279+
// 添加单个路径
280+
engine.AddRequirePath("/path/to/modules")
281+
282+
// 设置多个路径
283+
engine.SetRequirePaths([]string{
284+
"/path/to/modules",
285+
"/another/path"
286+
})
287+
```
288+
289+
## 9. 注意事项
232290

233291
1. Lua 脚本文件的扩展名必须是 `.lua`
234292
2. require 时不需要添加 `.lua` 扩展名
@@ -239,9 +297,9 @@ return utils
239297
7. 手动放置脚本时,需要确保脚本文件路径正确
240298
8. **AutoGo 项目的运行必须要使用 AutoGo 的 VSCode Extension 或 GoLand Extension 来执行**
241299

242-
## 8. 示例脚本
300+
## 10. 示例脚本
243301

244-
### 8.1 基本操作示例
302+
### 10.1 基本操作示例
245303

246304
```lua
247305
-- 直接使用全局模块,无需 require
@@ -253,7 +311,7 @@ console.log("屏幕宽度: " .. device.width)
253311
console.log("屏幕高度: " .. device.height)
254312
```
255313

256-
### 8.2 多文件脚本示例
314+
### 10.2 多文件脚本示例
257315

258316
**utils.lua**
259317

@@ -290,7 +348,7 @@ console.log("5 + 3 = " .. sum)
290348
console.log("10 - 4 = " .. difference)
291349
```
292350

293-
### 8.3 完整的 Go 示例(Embed 方式 - autogo 风格)
351+
### 10.3 完整的 Go 示例(Embed 方式 - autogo 风格)
294352

295353
```go
296354
package main
@@ -334,7 +392,7 @@ func main() {
334392
}
335393
```
336394

337-
### 8.4 完整的 Go 示例(手动放置方式 - autogo 风格)
395+
### 10.4 完整的 Go 示例(手动放置方式 - autogo 风格)
338396

339397
```go
340398
package main
@@ -367,7 +425,7 @@ func main() {
367425
}
368426
```
369427

370-
### 8.5 完整的 Go 示例(Embed 方式 - lrappsoft 风格)
428+
### 10.5 完整的 Go 示例(Embed 方式 - lrappsoft 风格)
371429

372430
```go
373431
package main
@@ -411,7 +469,7 @@ func main() {
411469
}
412470
```
413471

414-
### 8.6 完整的 Go 示例(手动放置方式 - lrappsoft 风格)
472+
### 10.6 完整的 Go 示例(手动放置方式 - lrappsoft 风格)
415473

416474
```go
417475
package main
@@ -444,7 +502,7 @@ func main() {
444502
}
445503
```
446504

447-
## 9. 示例代码 GitHub 地址
505+
## 11. 示例代码 GitHub 地址
448506

449507
Lua 引擎的示例代码可以在以下 GitHub 地址找到:
450508

go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/ZingYao/autogo_scriptengine
22

3-
go 1.25
3+
go 1.25.0
44

55
require (
66
github.com/Dasongzi1366/AutoGo v0.0.0-20250701130936-d7d8087a0f89
@@ -14,9 +14,10 @@ require (
1414
require (
1515
filippo.io/edwards25519 v1.1.0 // indirect
1616
github.com/dlclark/regexp2 v1.11.4 // indirect
17-
github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
18-
github.com/google/pprof v0.0.0-20230207041349-798e818bf904 // indirect
19-
golang.org/x/text v0.3.8 // indirect
17+
github.com/dop251/goja_nodejs v0.0.0-20260212111938-1f56ff5bcf14 // indirect
18+
github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect
19+
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect
20+
golang.org/x/text v0.16.0 // indirect
2021
)
2122

2223
replace github.com/Dasongzi1366/AutoGo => ./AutoGo

go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@ github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yA
66
github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
77
github.com/dop251/goja v0.0.0-20260311135729-065cd970411c h1:OcLmPfx1T1RmZVHHFwWMPaZDdRf0DBMZOFMVWJa7Pdk=
88
github.com/dop251/goja v0.0.0-20260311135729-065cd970411c/go.mod h1:MxLav0peU43GgvwVgNbLAj1s/bSGboKkhuULvq/7hx4=
9+
github.com/dop251/goja_nodejs v0.0.0-20260212111938-1f56ff5bcf14 h1:3U8dTgyNBhEQ/GVw0jZW5q+93Zw2gAZPRWhJ9TwV3rM=
10+
github.com/dop251/goja_nodejs v0.0.0-20260212111938-1f56ff5bcf14/go.mod h1:Tb7Xxye4LX7cT3i8YLvmPMGCV92IOi4CDZvm/V8ylc0=
911
github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU=
1012
github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
13+
github.com/go-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q=
14+
github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
1115
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
1216
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
1317
github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U=
1418
github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg=
19+
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=
20+
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
1521
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
1622
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
1723
github.com/makiuchi-d/gozxing v0.1.1 h1:xxqijhoedi+/lZlhINteGbywIrewVdVv2wl9r5O9S1I=
@@ -20,6 +26,8 @@ github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M
2026
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
2127
golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
2228
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
29+
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
30+
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
2331
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
2432
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
2533
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=

0 commit comments

Comments
 (0)