本人技术不咋地,还老想搞一些东西出来。
前言
话说,准备用nodejs开发一个经典MVC框架程序,第一个要解决的问题是自动加载。php有自动加载规范,可以实现类的自动加载。nodejs虽有模块require,可在实际项目种,对于项目文件require各种路径还是很麻烦的,于是便有了本npm模块。
模块
noader:即nodejs+loader的合称。
项目地址:https://github.com/yafoo/noader
安装
npm i noader
使用
const noader = require('noader');
const loader = noader();
执行noader()
函数后,会返回一个以当前模块目录为根目录的根加载器,此加载器会像js对象一样,使用点号或中括号,按文件路径实现模块的自动加载,如果要加载的模块不存在,则返回undefined
,如果要加载的模块是一个class文件,则访问class属性,会自动生成一个class实例,并调用实例的属性,并且该实例为单例。
noader
函数参数,第一个参数为根加载目录,为绝对地址或相对地址。不输入则默认以调用函数的模块目录为根目录。后面的参数作为在class模块自动实例化时参数使用。
假设有以下项目结构
├── test
│ ├── app
│ │ └── module
│ │ └── a.js
│ ├── app2
│ │ └── b.js
│ └── index.js
a.js模块代码
module.exports = {
prop: 'prop a',
fun: function(str){
this.prop = str;
return this.prop;
}
}
b.js模块代码
module.exports = class {
constructor(str) {
this.str = str;
}
fun(str) {
this.str = str;
return this.str;
}
self() {
return this;
}
}
index.js模块测试代码
const noader = require('noader');
const loader = noader();
console.log(loader.app.module.a); // Object: a
console.log(loader.app.module.a.prop); // String: 'prop a'
console.log(loader.app.module.a.fun('test1')); // String: 'test1'
console.log(loader.app2.b); // Class: b
console.log(loader.app2.b === loader.app2.b); // Boolean: true
console.log(loader.app2.b.str); // Undefined
console.log(loader.app2.b.fun('test2')); // String: 'test2'
console.log(loader.app2.b.$map.instance); // Class: b instance
console.log(loader.app2.b.$map.instance === loader.app2.b.$map.instance); // Boolean: true
console.log(loader.app2.b.$map.is_class); // Boolean: true
const c = new loader.app2.b('test3');
console.log(c); // Class b instance: c
console.log(c.str); // String: 'test3'
console.log('---------------------------------');
const loader2 = noader(__dirname + '/../', 'test4');
console.log(loader2.test.app.module.a); // Object: a
console.log(loader2.test.app2.b); // Class: b
console.log(loader2.test.app2.b.str); // String: 'test4'
console.log('---------------------------------');
console.log(loader2.test.app2.b === loader.app2.b); // Boolean: false (because the class is a proxy object)
console.log(loader2.test.app2.b.$map.instance === loader.app2.b.$map.instance); // Boolean: false
console.log(loader2.test.app2.b.$map.path); // the absoulte path of b
执行程序
# node index.js
{ prop: 'prop a', fun: [Function: fun] }
prop a
test1
[Function]
true
undefined
test2
{ str: 'test2' }
true
true
{ str: 'test3' }
test3
---------------------------------
{ prop: 'test1', fun: [Function: fun] }
[Function]
test4
---------------------------------
false
false
D:\wwwroot\noader\test/app2/b/
也可以快速运行模块测试脚本
git clone https://github.com/yafoo/noader.git
npm i
npm test
最后
有了此加载器,可以按照项目目录结构任意访问项目文件,很是方便,就是不知道安全性怎么样,希望思否的大神给点意见。
最后放上基于以此加载器开发的mvc框架开发的我的博客的链接:https://me.i-i.me/article/12.html
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。