本人技术不咋地,还老想搞一些东西出来。

前言

话说,准备用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


雨思
9 声望1 粉丝