nodejs别名映射

一、写在前面

不到100行代码的js就可以解决你如下的烦恼:

require('./posts');
require('./controllers/posts');
require('../controllers/posts');
require('../../controllers/posts');
require('../../../apis/controllers/posts');

或者

require(ROOT_PATH + '/application/apis/controllers/posts');
// other require()...
require(ROOT_PATH + '/application/apis/controllers/users');
require(ROOT_PATH + '/application/apis/controllers/products');
require(ROOT_PATH + '/application/apis/services/rest');
require(ROOT_PATH + '/application/apis/config');

看起来很头疼是吧,下面的方案可以解决你的烦恼。

二、第一种方案,本地自己手撸一个

不多说,开始:

1.新建一个名为 best-require.js

可以放到你本地项目中的libs或者plugins里。
在这里插入图片描述
2.js的代码如下:

/**
 * Enhance the 'require()' function.
 *
 * Note that the original module.require() will be hooked.
 *
 * @param {String} root project root directory (use '~' in path)
 * @param {Object} map macro definitions (use ':macroname' in path)
 * @return {Function} original require() function
 */
const solveDependences = (pathMap) => {
    let cache = {};
    function solveDependences(name) {
        if (!cache[name]) {
            if (cache[name] === '') {
                throw new Error('BestRequire: cyclic dependence occurs in the difinition of name mapping!');
            }
            cache[name] = '';
            cache[name] = pathMap[name]
                .split(/[\\/]/g)
                .map(s => (pathMap[s] ? solveDependences(s) : s))
                .join('/');
        }
        return cache[name];
    }
    for (let name in pathMap) {
        solveDependences(name);
    }
    return cache;
};

module.exports = function(root, map) {
    const path = require('path');
    const process = require('process');
    root = root || process.cwd();

    if (!path.isAbsolute(root)) {
        throw new Error('BestRequire: The root path must be absolute!');
    }

    let pathMap = { '~': root };
    for (let name in map) {
        pathMap[':' + name] = map[name];
    }

    let cache = solveDependences(pathMap);

    // eslint-disable-next-line no-proto
    const old = module.__proto__.require;
    // eslint-disable-next-line no-proto
    module.__proto__.require = function(id, ...args) {
        return old.apply(this, [
            id
                .split(/[\\/]/g)
                .map(function(s) {
                    if (s.startsWith('::')) {
                        return s.substring(1);
                    } else return cache.hasOwnProperty(s) ? cache[s] : s;
                })
                .join('/'),
            ...args // for future compatibility
        ]);
    };
    return old;
};

3.使用方法如下:

放到启动文件的最前面,我的启动文件为 server/index.js,
放到这里面进行初始化之后,后面才真正的启动koa-server服务,否则的话会报路径错误.
在这里插入图片描述

//index.js
const path = require('path');
const ROOT_PATH = path.join(__dirname, '../');
const SRC_PATH = path.join(__dirname, `./src`);
//映射目录别名
require('./src/lib/best-require')(ROOT_PATH, {
    root: ROOT_PATH,
    src: SRC_PATH,
    controllers: path.join(SRC_PATH, '/controllers'),
    models: path.join(SRC_PATH, '/models'),
    routes: path.join(SRC_PATH, '/routes'),
    crawlers: path.join(SRC_PATH, '/crawlers'),
    services: path.join(SRC_PATH, '/services'),
    middleware: path.join(SRC_PATH, '/middleware'),
    lib: path.join(SRC_PATH, '/lib'),
    config: path.join(SRC_PATH, '/config'),
    logs: path.join(SRC_PATH, '/logs')
});
//需要注意的是,
//运行服务
require('./src/bin/Server').run();

在这里插入图片描述


//bin/Server.js的内容
//这里就是koa或者其它服务框架的应用实例.

上面几步都做好了之后,就可以这样使用了

const 模块名 = require(':+别名/库名');//这里的:lib 有点类似于webpack的@lib

在这里插入图片描述

三、第二种方案,从npm下载,使用现成的.

方法如下:

1.安装库 best-require 进行别名映射

npm i best-require --save

2.配置基础路径的别名

配置方法和上面的几乎一样,只是require(’./src/lib/best-require’)变为require(‘best-require’)了,这个时候,node会从node_modules里进行查找…

//index.js
//映射目录别名
require('best-require',/**config**/);	//和上面手撸的一样
//需要注意的是,
//运行服务
//todo...
四、写在后面

可能在这里有人会吐槽,为什么不先写第二种方案再写第一种方案,捣鼓了半天,原来有个现成的库.

但是这样做是有原因的,best-require这个库很久都没更新了,出了基本的别名映射,没别的扩展配置,

如果你的项目需要进行扩展或者使用别的符号作为别名的时候,我还是建议你直接在本地手撸一个吧,

这样方便修改和扩展。

五、鸣谢与推荐

推荐学习nest和typeorm

当然,你们看到博客里的这些基础的koa服务和基础的koa项目是博主以前写的一些项目.

目前写node服务使用的typescript和nest.js,orm框架使用的typeorm,

当然,nest和typeorm的上手难度要比koa2的难度要高。

首先你要有良好的nodejs基础,typescript基础,也要熟悉基本的express框架。

学习路线推荐就是先学js基础,node服务,typescript基础。

nestjs有点像java里的Spring框架,所以nestjs也被称为nodejs版本的Spring。

加油,凡事一步一步来,着急是没有用的。

感谢您的阅读,如果此文章或项目对您有帮助,请给个一键三连吧,GitHub有开源项目,需要的小伙伴可以顺手star一下!好了,快动手试试吧.有问题请留言或者@博主,谢谢支持o( ̄︶ ̄)o~

GitHub: https://github.com/langyuxiansheng

更多信息请关注公众号: “笔优站长”

笔优站长

扫码关注“笔优站长”,支持站长

鸣谢

感谢一下 best-require 这个模块包的作者,不然还需要自己去写这个别名的代码

github 链接 https://github.com/yuezhihan/best-require

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狼丶宇先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值