一、写在前面
不到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 这个模块包的作者,不然还需要自己去写这个别名的代码