mm_machine 2.1.4 → 2.1.6

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/item.js CHANGED
@@ -92,7 +92,7 @@ class Item {
92
92
  * @param {...*} args - 可选参数
93
93
  */
94
94
  Item.prototype.log = function (level, message, ...args) {
95
- this._logger[level](`[${this.config.name}] ${message}`, ...args);
95
+ this._logger[level](`[${this.constructor.name}] [${this.config.name}] ${message}`, ...args);
96
96
  };
97
97
 
98
98
  /**
@@ -100,7 +100,7 @@ Item.prototype.log = function (level, message, ...args) {
100
100
  * @param {object} config 配置对象
101
101
  * @returns {Promise<void>}
102
102
  */
103
- Item.prototype.setConfig = async function (config) {
103
+ Item.prototype.setConfig = function (config) {
104
104
  if (!config) return;
105
105
 
106
106
  // 如果func_file改变,重置加载状态
@@ -109,8 +109,7 @@ Item.prototype.setConfig = async function (config) {
109
109
  }
110
110
 
111
111
  // 合并配置并应用配置处理
112
- const result = await conf({ ...this.config, ...config }, this.filename);
113
- this.config = result;
112
+ this.config = conf({ ...this.config, ...config }, this.filename);
114
113
  };
115
114
 
116
115
  /**
@@ -265,18 +264,6 @@ Item.prototype._loadScript = function (file, name) {
265
264
  return require(file);
266
265
  };
267
266
 
268
- /**
269
- * 处理热重载回调
270
- * @param {string} name 函数名
271
- * @param {object} loaded_module 加载的模块
272
- * @param {string} change_type 变更类型
273
- */
274
- Item.prototype._handleHotReload = function (name, loaded_module, change_type) {
275
- if (change_type === 'change' && loaded_module) {
276
- this._setMainMethod(loaded_module, name);
277
- }
278
- };
279
-
280
267
  /**
281
268
  * 设置主方法
282
269
  * @param {object} module 模块对象
@@ -356,9 +343,9 @@ Item.prototype._handleHotReload = function (loaded_config, change_type) {
356
343
  if (change_type !== 'change' || !loaded_config) return;
357
344
 
358
345
  try {
359
- const target_config = this._findConfigByName(loaded_config, this.config.name);
360
- if (target_config) {
361
- this.setConfig(target_config);
346
+ let config = this._findConfigByName(loaded_config, this.config.name);
347
+ if (config) {
348
+ this.setConfig(config);
362
349
  this.setConfigAfter();
363
350
  this._reloadIfNeeded();
364
351
  }
@@ -484,7 +471,7 @@ Item.prototype.loadConfig = async function (config_data, name) {
484
471
  config = this.loadFile(this.filename, name);
485
472
  }
486
473
 
487
- await this.setConfig(config);
474
+ this.setConfig(config);
488
475
  this.setConfigAfter();
489
476
  } catch (err) {
490
477
  this.log('error', `载入配置失败: `, err);
package/package.json CHANGED
@@ -1,49 +1,37 @@
1
1
  {
2
2
  "name": "mm_machine",
3
- "version": "2.1.4",
4
- "description": "这是超级美眉框架机制构建辅助模块,用于快速构建一个机制,支持动态加载、热更新、模块管理等功能,并具有增强的错误处理和现代JavaScript特性支持。",
3
+ "version": "2.1.6",
4
+ "description": "A flexible Node.js plugin mechanism system for dynamic loading, management and execution of modules. Supports hot reload, lifecycle management, and modern JavaScript features.",
5
5
  "main": "index.js",
6
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 ."
7
+ "test": "node ./test.js"
13
8
  },
14
9
  "repository": {
15
10
  "type": "git",
16
11
  "url": "git+https://gitee.com/qiuwenwu91/mm_machine.git"
17
12
  },
18
13
  "keywords": [
19
- "common",
20
- "com",
21
- "run",
22
- "cmd",
23
- "load",
24
- "save",
25
- "get",
26
- "set",
27
- "add",
28
- "del",
29
- "hot-reload",
14
+ "plugin-system",
30
15
  "module-management",
31
- "modern-js"
16
+ "hot-reload",
17
+ "dynamic-loading",
18
+ "nodejs",
19
+ "javascript",
20
+ "framework",
21
+ "mechanism"
32
22
  ],
33
23
  "author": "邱文武",
34
24
  "license": "ISC",
35
- "bugs": {
36
- "url": "https://gitee.com/qiuwenwu91/mm_machine/issues"
25
+ "engines": {
26
+ "node": ">=12.0.0"
37
27
  },
38
- "homepage": "https://gitee.com/qiuwenwu91/mm_machine#readme",
28
+ "files": [
29
+ "index.js",
30
+ "item.js",
31
+ "README.md"
32
+ ],
39
33
  "dependencies": {
40
- "mm_config": "^2.1.9",
41
- "mm_hot_reload": "^1.1.5"
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"
34
+ "mm_config": "^2.2.3",
35
+ "mm_hot_reload": "^1.2.0"
48
36
  }
49
37
  }
package/.gitattributes DELETED
@@ -1,5 +0,0 @@
1
- # Auto detect text files and perform LF normalization
2
- * text=auto
3
- *.js linguist-language=JavaScript
4
- *.css linguist-language=JavaScript
5
- *.html linguist-language=JavaScript
package/.prettierrc DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "semi": true,
3
- "singleQuote": true,
4
- "tabWidth": 2,
5
- "trailingComma": "none",
6
- "printWidth": 100,
7
- "endOfLine": "lf"
8
- }
@@ -1,13 +0,0 @@
1
- {
2
- "name": "demo1",
3
- "title": "测试模块2",
4
- "description": "完整测试模块2",
5
- "func_file": "./index.js",
6
- "func_name": "",
7
- "sort": 10,
8
- "state": 1,
9
- "show": 1,
10
- "SORT": 10,
11
- "STATE": 1,
12
- "SHOW": 0
13
- }
@@ -1,10 +0,0 @@
1
- {
2
- "name": "test1",
3
- "title": "测试模块1",
4
- "description": "完整测试模块1",
5
- "func_file": "./index.js",
6
- "func_name": "",
7
- "sort": 10,
8
- "state": 1,
9
- "show": 1
10
- }
@@ -1,63 +0,0 @@
1
- /**
2
- * 计数器变量
3
- * @type {number}
4
- */
5
- var counter = 200;
6
-
7
- /**
8
- * 测试函数
9
- * @private
10
- */
11
- function _test() {
12
- console.log('测试模块1执行', counter++);
13
- }
14
-
15
- /**
16
- * 主函数
17
- * @returns {object} 返回执行结果
18
- * @returns {string} return.message - 消息内容
19
- * @returns {number} return.value - 计数器值
20
- */
21
- function main() {
22
- _test();
23
- return { message: '测试模块1返回', value: counter };
24
- }
25
-
26
- exports.main = main;
27
-
28
- /**
29
- * 主函数执行前的钩子函数
30
- * @returns {void}
31
- */
32
- exports.main_before = function () {
33
- console.log('测试模块1前置钩子');
34
- };
35
-
36
- /**
37
- * 主函数执行后的钩子函数
38
- * @param {object} ret - 主函数返回值
39
- * @param {string} ret.message - 消息内容
40
- * @param {number} ret.value - 计数器值
41
- * @returns {Promise<void>}
42
- */
43
- exports.main_after = async function (ret) {
44
- console.log('测试模块1后置钩子', ret);
45
- };
46
-
47
- /**
48
- * 模块加载时的钩子函数
49
- * @returns {void}
50
- */
51
- exports.load = function () {
52
- console.log('加载测试模块1');
53
- };
54
-
55
- /**
56
- * 模块初始化时的钩子函数
57
- * @returns {void}
58
- */
59
- exports.init = function () {
60
- console.log('初始化测试模块1');
61
- };
62
-
63
- console.log('测试模块1被引用');
@@ -1,13 +0,0 @@
1
- /**
2
- * 主函数执行后的钩子函数
3
- * @param {object} ret - 主函数返回值
4
- * @param {string} ret.result - 执行结果
5
- * @param {number} ret.count - 计数器值
6
- * @returns {object} 返回处理后的结果
7
- */
8
- exports.main_after = function (ret) {
9
- console.log('测试模块2后置处理', ret);
10
- return ret;
11
- };
12
-
13
- console.log('测试模块2后置处理文件已加载');
@@ -1,13 +0,0 @@
1
- {
2
- "name": "demo2",
3
- "title": "测试模块2",
4
- "description": "完整测试模块1",
5
- "func_file": "./main.js",
6
- "func_name": "",
7
- "sort": 10,
8
- "state": 1,
9
- "show": 1,
10
- "SORT": 10,
11
- "STATE": 1,
12
- "SHOW": 0
13
- }
@@ -1,10 +0,0 @@
1
- {
2
- "name": "test2",
3
- "title": "测试模块2",
4
- "description": "完整测试模块2",
5
- "func_file": "./main.js",
6
- "func_name": "",
7
- "sort": 20,
8
- "state": 1,
9
- "show": 1
10
- }
@@ -1,16 +0,0 @@
1
- /**
2
- * 导入主模块
3
- */
4
- var mainModule = require('./main.js');
5
-
6
- /**
7
- * 导入后置处理模块
8
- */
9
- var afterModule = require('./after.js');
10
-
11
- /**
12
- * 合并模块导出
13
- */
14
- Object.assign(exports, mainModule, afterModule);
15
-
16
- console.log('测试模块2入口文件已加载');
package/app/test2/main.js DELETED
@@ -1,36 +0,0 @@
1
- /**
2
- * 计数器变量
3
- * @type {number}
4
- */
5
- var count = 0;
6
-
7
- /**
8
- * 主函数
9
- * @returns {object} 返回执行结果
10
- * @returns {string} return.result - 执行结果
11
- * @returns {number} return.count - 计数器值
12
- */
13
- function main() {
14
- console.log('测试模块2执行', count++);
15
- return { result: '测试模块2结果', count: count };
16
- }
17
-
18
- exports.main = main;
19
-
20
- /**
21
- * 模块加载时的钩子函数
22
- * @returns {void}
23
- */
24
- exports.load = function () {
25
- console.log('加载测试模块2');
26
- };
27
-
28
- /**
29
- * 模块初始化时的钩子函数
30
- * @returns {void}
31
- */
32
- exports.init = function () {
33
- console.log('初始化测试模块2');
34
- };
35
-
36
- console.log('测试模块2被引用');
package/debug_config.js DELETED
@@ -1,37 +0,0 @@
1
- const { conf } = require('mm_config');
2
-
3
- async function testConfigMerge() {
4
- console.log('=== 测试配置合并 ===');
5
-
6
- const base_config = {
7
- name: 'test',
8
- sort: 10,
9
- state: 1,
10
- show: 0
11
- };
12
-
13
- const new_config = {
14
- name: 'test1',
15
- sort: 10,
16
- state: 1,
17
- show: 1,
18
- SORT: 10,
19
- STATE: 1,
20
- SHOW: 0
21
- };
22
-
23
- console.log('基础配置:', base_config);
24
- console.log('新配置:', new_config);
25
-
26
- // 测试conf函数
27
- const result = await conf({ ...base_config, ...new_config }, 'test.json');
28
- console.log('conf合并结果:', result);
29
-
30
- // 测试普通合并
31
- const normal_merge = { ...base_config, ...new_config };
32
- console.log('普通合并结果:', normal_merge);
33
-
34
- console.log('=== 测试结束 ===');
35
- }
36
-
37
- testConfigMerge().catch(console.error);
package/debug_detailed.js DELETED
@@ -1,75 +0,0 @@
1
- const { Item, Index } = require('./index.js');
2
-
3
- class Drive extends Item {
4
- constructor(dir, dir_base) {
5
- super(dir, dir_base);
6
- this.default_file = './demo.json';
7
- }
8
- }
9
-
10
- class Engine extends Index {
11
- constructor(scope, dir_base) {
12
- super(scope, dir_base);
13
- this.mode = 1; // 生产模式
14
- this.type = 'demo';
15
- }
16
- }
17
-
18
- Engine.prototype.Drive = Drive;
19
-
20
- async function debugDetailed() {
21
- console.log('=== 详细调试 ===');
22
-
23
- // 检查全局对象
24
- console.log('1. 检查全局对象 $:', typeof global.$ !== 'undefined');
25
- console.log('$.mod:', typeof $.mod !== 'undefined' ? '已定义' : '未定义');
26
- console.log('$.loadJson:', typeof $.loadJson === 'function' ? '已定义' : '未定义');
27
-
28
- // 检查文件路径方法
29
- const test_file = './app/test1/demo.json'.fullname(__dirname);
30
- console.log('2. 检查文件路径方法:');
31
- console.log('文件路径:', test_file);
32
- console.log('文件存在:', test_file.hasFile ? test_file.hasFile() : 'hasFile方法不存在');
33
-
34
- // 检查文件加载
35
- console.log('3. 检查文件加载:');
36
- try {
37
- const json_content = test_file.loadJson ? test_file.loadJson() : 'loadJson方法不存在';
38
- console.log('文件内容:', json_content);
39
- } catch (err) {
40
- console.log('文件加载错误:', err.message);
41
- }
42
-
43
- // 检查$.loadJson
44
- console.log('4. 检查$.loadJson:');
45
- try {
46
- const json_content2 = $.loadJson ? $.loadJson(test_file) : '$.loadJson不存在';
47
- console.log('$.loadJson结果:', json_content2);
48
- } catch (err) {
49
- console.log('$.loadJson错误:', err.message);
50
- }
51
-
52
- // 创建引擎测试
53
- console.log('\n5. 创建引擎测试:');
54
- var engine = new Engine('sys', __dirname);
55
-
56
- // 测试单个文件加载
57
- console.log('6. 测试文件加载:');
58
- try {
59
- const result = await engine.loadFile(test_file, true);
60
- console.log('loadFile结果:', result);
61
- console.log('模块列表长度:', engine.list.length);
62
-
63
- if (engine.list.length > 0) {
64
- const module = engine.list[0];
65
- console.log('模块配置:', module.config);
66
- console.log('模块complete:', module.complete);
67
- }
68
- } catch (err) {
69
- console.log('loadFile错误:', err.message);
70
- }
71
-
72
- console.log('\n=== 详细调试结束 ===');
73
- }
74
-
75
- debugDetailed().catch(console.error);
package/debug_test.js DELETED
@@ -1,65 +0,0 @@
1
- const { Item, Index } = require('./index.js');
2
-
3
- class Drive extends Item {
4
- constructor(dir, dir_base) {
5
- super(dir, dir_base);
6
- this.default_file = './demo.json';
7
- }
8
- }
9
-
10
- class Engine extends Index {
11
- constructor(scope, dir_base) {
12
- super(scope, dir_base);
13
- this.mode = 1; // 生产模式
14
- this.type = 'demo';
15
- }
16
- }
17
-
18
- Engine.prototype.Drive = Drive;
19
-
20
- async function debugTest() {
21
- console.log('=== 开始调试 ===');
22
-
23
- var engine = new Engine('sys', __dirname);
24
-
25
- console.log('1. 创建引擎成功');
26
- console.log('引擎配置:', {
27
- mode: engine.mode,
28
- type: engine.type,
29
- scope: engine.scope
30
- });
31
-
32
- console.log('2. 开始加载模块...');
33
- await engine.update('./app/', false, true, true);
34
-
35
- console.log('3. 模块加载完成');
36
- console.log('模块数量:', engine.list.length);
37
-
38
- // 检查每个模块
39
- for (var i = 0; i < engine.list.length; i++) {
40
- var module = engine.list[i];
41
- console.log(`\n模块 ${i}:`, {
42
- name: module.config?.name,
43
- state: module.config?.state,
44
- func_name: module.config?.func_name,
45
- func_file: module.config?.func_file,
46
- complete: module.complete
47
- });
48
-
49
- // 检查模块是否有main方法
50
- console.log('模块方法检查:', {
51
- hasMain: typeof module.main === 'function',
52
- hasExec: typeof module.exec === 'function'
53
- });
54
-
55
- if (module.config?.state === 1) {
56
- console.log('尝试执行模块方法...');
57
- var result = await module.exec('main');
58
- console.log('执行结果:', result);
59
- }
60
- }
61
-
62
- console.log('\n=== 调试结束 ===');
63
- }
64
-
65
- debugTest().catch(console.error);
@@ -1,34 +0,0 @@
1
- {
2
- /**
3
- * 名称, 由中英文和下“_”组成, 用于卸载接口 例如: demo
4
- */
5
- "name": "demo1",
6
- /**
7
- * 标题, 介绍作用
8
- */
9
- "title": "示例脚本1",
10
- /**
11
- * 描述, 用于描述该有什么用的
12
- */
13
- "description": "用于测试动态加载、更新、卸载、删除脚本",
14
- /**
15
- * 文件路径, 当调用函数不存在时,会先从文件中加载
16
- */
17
- "func_file": "./index.js",
18
- /**
19
- * 回调函数名 用于决定调用脚本的哪个函数
20
- */
21
- "func_name": "",
22
- /**
23
- * 排序
24
- */
25
- "sort": 10,
26
- /**
27
- * 状态, 0表示未启用, 1表示启用
28
- */
29
- "state": 0,
30
- /**
31
- * 显示, 0表示不显示, 1表示显示
32
- */
33
- "show": 0
34
- }
@@ -1,34 +0,0 @@
1
- {
2
- /**
3
- * 名称, 由中英文和下“_”组成, 用于卸载接口 例如: demo
4
- */
5
- "name": "demo1",
6
- /**
7
- * 标题, 介绍作用
8
- */
9
- "title": "示例脚本1",
10
- /**
11
- * 描述, 用于描述该有什么用的
12
- */
13
- "description": "用于测试动态加载、更新、卸载、删除脚本",
14
- /**
15
- * 文件路径, 当调用函数不存在时,会先从文件中加载
16
- */
17
- "func_file": "./index.js",
18
- /**
19
- * 回调函数名 用于决定调用脚本的哪个函数
20
- */
21
- "func_name": "",
22
- /**
23
- * 排序
24
- */
25
- "sort": 10,
26
- /**
27
- * 状态, 0表示未启用, 1表示启用
28
- */
29
- "state": 0,
30
- /**
31
- * 显示, 0表示不显示, 1表示显示
32
- */
33
- "show": 0
34
- }
@@ -1,33 +0,0 @@
1
- var i = 0;
2
-
3
- function test() {
4
- console.log('你好123', i++);
5
- }
6
-
7
- /**
8
- *
9
- */
10
- function main() {
11
- test();
12
- return i;
13
- }
14
-
15
- exports.main = main;
16
-
17
- exports.main_before = function () {
18
- console.log('test1请求前');
19
- };
20
-
21
- exports.main_after = async function (ret) {
22
- console.log('test1请求后', ret);
23
- };
24
-
25
- exports.load = function () {
26
- console.log('加载test1');
27
- };
28
-
29
- exports.init = function () {
30
- console.log('初始化test1');
31
- };
32
-
33
- console.log('引用了test1');
@@ -1,15 +0,0 @@
1
- class Demo {
2
- constructor() {}
3
- }
4
- var i = 0;
5
- Demo.prototype.main = function () {
6
- console.log('我很好123', i++);
7
- return i;
8
- };
9
- Demo.prototype.init = function () {
10
- console.log('初始化test2');
11
- };
12
-
13
- module.exports = new Demo();
14
-
15
- console.log('引用了test2 after');