mm_machine 2.1.1 → 2.1.3
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/.prettierrc +8 -0
- package/README.md +583 -576
- package/app/test1/config_demo.json +11 -8
- package/app/test1/demo.json +8 -8
- package/app/test1/index.js +14 -14
- package/app/test2/after.js +6 -6
- package/app/test2/config_demo.json +11 -8
- package/app/test2/demo.json +8 -8
- package/app/test2/index.js +1 -2
- package/app/test2/main.js +8 -8
- package/debug_config.js +37 -0
- package/debug_detailed.js +75 -0
- package/debug_test.js +65 -0
- package/demo/test1/config_demo.json +33 -33
- package/demo/test1/demo.json +33 -33
- package/demo/test1/index.js +19 -16
- package/demo/test2/after.js +9 -9
- package/demo/test2/config_demo.json +70 -68
- package/demo/test2/demo.json +70 -68
- package/demo/test2/index.js +9 -9
- package/demo/test2/main.js +9 -9
- package/demo2/test1/demo.json +33 -33
- package/demo2/test1/index.js +19 -16
- package/demo2/test2/after.js +9 -9
- package/demo2/test2/demo.json +70 -68
- package/demo2/test2/main.js +9 -9
- package/eslint.config.js +209 -0
- package/index.js +640 -571
- package/item.js +684 -589
- package/methods_documentation.md +15 -4
- package/nodemon.json +25 -26
- package/package.json +49 -39
- package/test +3 -0
- package/test.js +124 -107
- package/test.json +9 -0
package/methods_documentation.md
CHANGED
|
@@ -3,18 +3,21 @@
|
|
|
3
3
|
## 1. index.js - Index类方法
|
|
4
4
|
|
|
5
5
|
### 构造函数
|
|
6
|
+
|
|
6
7
|
- **constructor(scope, dir_base)** - 初始化Index类实例
|
|
7
8
|
- `scope`: 作用域(同时作为检索的后缀名)
|
|
8
9
|
- `dir_base`: 模块目录
|
|
9
10
|
|
|
10
11
|
### 私有方法
|
|
11
|
-
|
|
12
|
+
|
|
13
|
+
- **\_execute(module, method, params)** - 执行模块方法
|
|
12
14
|
- `module`: 模块对象
|
|
13
15
|
- `method`: 方法名称
|
|
14
16
|
- `params`: 参数数组
|
|
15
17
|
- 返回: Promise<any> - 执行结果
|
|
16
18
|
|
|
17
19
|
### 公共方法
|
|
20
|
+
|
|
18
21
|
- **clear()** - 清除接口缓存
|
|
19
22
|
- **load(dir, cg, file)** - 加载项
|
|
20
23
|
- `dir`: 文件路径
|
|
@@ -94,20 +97,24 @@
|
|
|
94
97
|
- 返回: Promise<any> - 执行结果
|
|
95
98
|
|
|
96
99
|
### 属性
|
|
100
|
+
|
|
97
101
|
- **Drive** - 默认驱动类,指向Item类
|
|
98
102
|
|
|
99
103
|
## 2. item.js - Item类方法
|
|
100
104
|
|
|
101
105
|
### 构造函数
|
|
106
|
+
|
|
102
107
|
- **constructor(dir, dir_base)** - 初始化Item类实例
|
|
103
108
|
- `dir`: 当前目录
|
|
104
109
|
- `dir_base`: 模块目录
|
|
105
110
|
|
|
106
111
|
### 私有方法
|
|
107
|
-
|
|
112
|
+
|
|
113
|
+
- **\_remove(module)** - 移除模块
|
|
108
114
|
- `module`: 模块对象或路径
|
|
109
115
|
|
|
110
116
|
### 公共方法
|
|
117
|
+
|
|
111
118
|
- **setConfig(config)** - 设置配置
|
|
112
119
|
- `config`: 配置对象
|
|
113
120
|
- **setConfig_after()** - 设置配置后钩子方法
|
|
@@ -165,6 +172,7 @@
|
|
|
165
172
|
## 方法命名规范检查
|
|
166
173
|
|
|
167
174
|
### 符合规范的方法名(小驼峰)
|
|
175
|
+
|
|
168
176
|
- clear
|
|
169
177
|
- load
|
|
170
178
|
- loads
|
|
@@ -195,6 +203,7 @@
|
|
|
195
203
|
- main
|
|
196
204
|
|
|
197
205
|
### 符合规范的时态方法名
|
|
206
|
+
|
|
198
207
|
- update_before
|
|
199
208
|
- update_after
|
|
200
209
|
- setConfig_after
|
|
@@ -202,13 +211,15 @@
|
|
|
202
211
|
- load_before
|
|
203
212
|
|
|
204
213
|
### 需要注意的方法名
|
|
214
|
+
|
|
205
215
|
- **updateScript** - 已从update_script修改为符合小驼峰命名规范
|
|
206
|
-
- **update_main** -
|
|
216
|
+
- **update_main** - 保持不变,因为\_main属于时态方法命名格式(main表示主逻辑)
|
|
207
217
|
|
|
208
218
|
## 重复方法名
|
|
209
219
|
|
|
210
220
|
在index.js中发现两个同名的load方法:
|
|
221
|
+
|
|
211
222
|
1. `load(dir, cg, file)` - 加载项
|
|
212
223
|
2. `load(name)` - 加载插件
|
|
213
224
|
|
|
214
|
-
建议重命名其中一个以避免混淆。
|
|
225
|
+
建议重命名其中一个以避免混淆。
|
package/nodemon.json
CHANGED
|
@@ -1,26 +1,25 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"restartable": "rs",
|
|
3
|
+
"ignore": [
|
|
4
|
+
".git",
|
|
5
|
+
".svn",
|
|
6
|
+
"node_modules/**/node_modules",
|
|
7
|
+
"static/src/*",
|
|
8
|
+
"static/js/*",
|
|
9
|
+
"static/**/js",
|
|
10
|
+
"static/*.js",
|
|
11
|
+
"*data.json",
|
|
12
|
+
"*cache.json"
|
|
13
|
+
],
|
|
14
|
+
"verbose": true,
|
|
15
|
+
"execMap": {
|
|
16
|
+
"": "node",
|
|
17
|
+
"js": "node --harmony"
|
|
18
|
+
},
|
|
19
|
+
"watch": [],
|
|
20
|
+
"env": {
|
|
21
|
+
"NODE_ENV": "development"
|
|
22
|
+
},
|
|
23
|
+
"ext": "js json",
|
|
24
|
+
"legacy-watch": false
|
|
25
|
+
}
|
package/package.json
CHANGED
|
@@ -1,39 +1,49 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "mm_machine",
|
|
3
|
+
"version": "2.1.3",
|
|
4
|
+
"description": "这是超级美眉框架机制构建辅助模块,用于快速构建一个机制,支持动态加载、热更新、模块管理等功能,并具有增强的错误处理和现代JavaScript特性支持。",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "node ./test.js",
|
|
8
|
+
"dev": "nodemon ./test.js",
|
|
9
|
+
"lint": "eslint .",
|
|
10
|
+
"lint:fix": "eslint . --fix",
|
|
11
|
+
"format": "prettier --write .",
|
|
12
|
+
"format:check": "prettier --check ."
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://gitee.com/qiuwenwu91/mm_machine.git"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"common",
|
|
20
|
+
"com",
|
|
21
|
+
"run",
|
|
22
|
+
"cmd",
|
|
23
|
+
"load",
|
|
24
|
+
"save",
|
|
25
|
+
"get",
|
|
26
|
+
"set",
|
|
27
|
+
"add",
|
|
28
|
+
"del",
|
|
29
|
+
"hot-reload",
|
|
30
|
+
"module-management",
|
|
31
|
+
"modern-js"
|
|
32
|
+
],
|
|
33
|
+
"author": "邱文武",
|
|
34
|
+
"license": "ISC",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://gitee.com/qiuwenwu91/mm_machine/issues"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://gitee.com/qiuwenwu91/mm_machine#readme",
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"mm_config": "^2.1.9",
|
|
41
|
+
"mm_hot_reload": "^1.1.4"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"eslint": "^9.39.2",
|
|
45
|
+
"eslint-plugin-jsdoc": "^61.5.0",
|
|
46
|
+
"mm_eslint": "^1.4.0",
|
|
47
|
+
"prettier": "^3.7.4"
|
|
48
|
+
}
|
|
49
|
+
}
|
package/test
ADDED
package/test.js
CHANGED
|
@@ -1,30 +1,27 @@
|
|
|
1
|
-
var {
|
|
2
|
-
Item,
|
|
3
|
-
Index
|
|
4
|
-
} = require('./index.js');
|
|
1
|
+
var { Item, Index } = require('./index.js');
|
|
5
2
|
|
|
6
3
|
class Drive extends Item {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
constructor(dir, dir_base) {
|
|
5
|
+
super(dir, dir_base);
|
|
6
|
+
this.default_file = './demo.json';
|
|
7
|
+
}
|
|
11
8
|
}
|
|
12
9
|
|
|
13
10
|
class Engine extends Index {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
11
|
+
constructor(scope, dir_base) {
|
|
12
|
+
super(scope, dir_base);
|
|
13
|
+
/**
|
|
14
|
+
* 模式
|
|
15
|
+
* 1.生产模式,改变文件不会重新加载
|
|
16
|
+
* 2.热更新模式,改变配置文件会重新加载配置,不重新加载脚本
|
|
17
|
+
* 3.热重载模式,改变配置文件都会加载配置和脚本
|
|
18
|
+
* 4.热更新+重载模式,改变配置文件重新加载配置和脚本,执行完后重新加载脚本
|
|
19
|
+
* 5.重载模式,执行完后重新加载脚本,避免变量污染
|
|
20
|
+
*/
|
|
21
|
+
this.mode = 3;
|
|
22
|
+
// 机制类型,必须填写,用于检索文件
|
|
23
|
+
this.type = 'demo';
|
|
24
|
+
}
|
|
28
25
|
}
|
|
29
26
|
|
|
30
27
|
/**
|
|
@@ -33,102 +30,122 @@ class Engine extends Index {
|
|
|
33
30
|
*/
|
|
34
31
|
Engine.prototype.Drive = Drive;
|
|
35
32
|
|
|
36
|
-
async function
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
async function initEngine() {
|
|
34
|
+
var engine = new Engine('sys', __dirname);
|
|
35
|
+
console.info('→ 加载mod');
|
|
36
|
+
await engine.update('./app/'.fullname(__dirname));
|
|
37
|
+
console.log('模块数', engine.list.length);
|
|
38
|
+
return engine;
|
|
39
|
+
}
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
async function runBasicTests(engine) {
|
|
42
|
+
await engine.run('test1', 'init');
|
|
43
|
+
await engine.exec('test1', 'init');
|
|
44
|
+
await engine.run(null, 'main');
|
|
45
|
+
await engine.exec(null, 'main');
|
|
43
46
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
var ret = await engine.run('test2', 'main');
|
|
48
|
+
console.log('指明回调test2', ret);
|
|
49
|
+
|
|
50
|
+
var ret = await engine.exec('test1', 'main');
|
|
51
|
+
console.log('指明回调test1', ret);
|
|
52
|
+
}
|
|
48
53
|
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
function setupMainTimer(engine) {
|
|
55
|
+
var i = 0;
|
|
56
|
+
var timer = setInterval(async () => {
|
|
57
|
+
await engine.run('test1', 'main');
|
|
58
|
+
await engine.run('test2', 'main');
|
|
59
|
+
i++;
|
|
60
|
+
if (i == 3) {
|
|
61
|
+
console.info('→ 重载mod');
|
|
62
|
+
await engine.reload('test1');
|
|
63
|
+
} else if (i == 5) {
|
|
64
|
+
console.info('→ 卸载mod');
|
|
65
|
+
await engine.unload('test2');
|
|
66
|
+
} else if (i == 16) {
|
|
67
|
+
console.info('→ 卸载并删除mod');
|
|
68
|
+
await engine.unload('test1', true);
|
|
69
|
+
} else if (i == 18) {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
}
|
|
72
|
+
}, 3000);
|
|
73
|
+
return timer;
|
|
74
|
+
}
|
|
51
75
|
|
|
52
|
-
|
|
53
|
-
|
|
76
|
+
function setupFileMods(engine) {
|
|
77
|
+
setTimeout(async () => {
|
|
78
|
+
var file = './app/test1/index.js'.fullname(__dirname);
|
|
79
|
+
if (file.hasFile()) {
|
|
80
|
+
var text = file.loadText();
|
|
81
|
+
text = text.replace('counter = 0', 'counter = 100');
|
|
82
|
+
file.saveText(text);
|
|
83
|
+
var ret = await engine.exec('test1', 'main');
|
|
84
|
+
console.log('这结果', ret);
|
|
85
|
+
}
|
|
86
|
+
}, 7000);
|
|
54
87
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
} else if (i == 5) {
|
|
64
|
-
console.info("→ 卸载mod");
|
|
65
|
-
await engine.unload("test2");
|
|
66
|
-
} else if (i == 16) {
|
|
67
|
-
console.info("→ 卸载并删除mod");
|
|
68
|
-
await engine.unload("test1", true);
|
|
69
|
-
} else if (i == 18) {
|
|
70
|
-
clearTimeout(timer);
|
|
71
|
-
}
|
|
72
|
-
}, 3000);
|
|
88
|
+
setTimeout(() => {
|
|
89
|
+
var file = './demo/test2/index.js'.fullname(__dirname);
|
|
90
|
+
if (file.hasFile()) {
|
|
91
|
+
var text = file.loadText();
|
|
92
|
+
text = text.replace('123', '7654321');
|
|
93
|
+
file.saveText(text);
|
|
94
|
+
}
|
|
95
|
+
}, 11000);
|
|
73
96
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
97
|
+
setTimeout(async () => {
|
|
98
|
+
console.info('→ 热重载失效');
|
|
99
|
+
$.mod.config.watch = false;
|
|
100
|
+
var file = './app/test1/index.js'.fullname(__dirname);
|
|
101
|
+
if (file.hasFile()) {
|
|
102
|
+
var text = file.loadText();
|
|
103
|
+
text = text.replace('counter = 100', 'counter = 200');
|
|
104
|
+
file.saveText(text);
|
|
105
|
+
var ret = await engine.exec('test1', 'main');
|
|
106
|
+
console.log('这结果', ret);
|
|
107
|
+
}
|
|
108
|
+
}, 16000);
|
|
109
|
+
}
|
|
82
110
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
111
|
+
function setupFinalTimer(engine) {
|
|
112
|
+
var n = 0;
|
|
113
|
+
var timer_2 = setInterval(async () => {
|
|
114
|
+
var ret = await engine.exec('test1', 'main');
|
|
115
|
+
console.info('最后运行test1', ret);
|
|
116
|
+
var plug = engine.get('test1');
|
|
117
|
+
if (plug) {
|
|
118
|
+
console.log('查看变化1', plug.config);
|
|
119
|
+
}
|
|
120
|
+
var plug = engine.get('test2');
|
|
121
|
+
if (plug) {
|
|
122
|
+
var ret = await plug.run();
|
|
123
|
+
console.log('查看变化2', plug.config);
|
|
124
|
+
}
|
|
125
|
+
n++;
|
|
126
|
+
if (n == 6) {
|
|
127
|
+
clearInterval(timer_2);
|
|
128
|
+
process.exit(0);
|
|
129
|
+
}
|
|
130
|
+
}, 10000);
|
|
131
|
+
return timer_2;
|
|
132
|
+
}
|
|
89
133
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
var text = file.loadText();
|
|
97
|
-
text = text.replace("counter = 100", "counter = 200");
|
|
98
|
-
file.saveText(text);
|
|
99
|
-
var ret = await engine.exec("test1", 'main');
|
|
100
|
-
console.log("这结果", ret);
|
|
101
|
-
}, 16000)
|
|
102
|
-
|
|
103
|
-
var n = 0;
|
|
104
|
-
var timer_2 = setInterval(async () => {
|
|
105
|
-
// await engine.update(null, false, false, false);
|
|
106
|
-
var ret = await engine.exec('test1', 'main');
|
|
107
|
-
console.info("最后运行test1", ret);
|
|
108
|
-
var plug = engine.get("test1");
|
|
109
|
-
if (plug) {
|
|
110
|
-
console.log("查看变化1", plug.config);
|
|
111
|
-
}
|
|
112
|
-
var plug = engine.get("test2");
|
|
113
|
-
if (plug) {
|
|
114
|
-
var ret = await plug.run();
|
|
115
|
-
console.log("查看变化2", plug.config);
|
|
116
|
-
}
|
|
117
|
-
n++;
|
|
118
|
-
if (n == 6) {
|
|
119
|
-
clearInterval(timer_2);
|
|
120
|
-
process.exit(0);
|
|
121
|
-
}
|
|
122
|
-
}, 10000);
|
|
134
|
+
async function demo() {
|
|
135
|
+
var engine = await initEngine();
|
|
136
|
+
await runBasicTests(engine);
|
|
137
|
+
setupMainTimer(engine);
|
|
138
|
+
setupFileMods(engine);
|
|
139
|
+
setupFinalTimer(engine);
|
|
123
140
|
}
|
|
124
141
|
|
|
125
142
|
/* 调用示例 */
|
|
126
143
|
async function test() {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
144
|
+
'./demo2'.fullname(__dirname).copyDir('./demo'.fullname(__dirname), () => {
|
|
145
|
+
setTimeout(() => {
|
|
146
|
+
demo();
|
|
147
|
+
}, 1000);
|
|
148
|
+
});
|
|
132
149
|
}
|
|
133
150
|
|
|
134
|
-
test();
|
|
151
|
+
test();
|