Javascript 将其他文件夹中的函数添加到此文件夹中的对象
我想创建一个从另一个文件夹导入函数的对象,其外观如下:Javascript 将其他文件夹中的函数添加到此文件夹中的对象,javascript,node.js,Javascript,Node.js,我想创建一个从另一个文件夹导入函数的对象,其外观如下: class={ 职能:{ //这里的所有功能 } } 这些函数将位于不同的文件夹中,但是,我想创建某种导入器,它将为在文件夹中找到的每个新函数/文件创建新类 someFunction.js函数文件: function someFunction(){ log(“这是一些函数”); } 所以我想让它看起来像这样: class.functions.someFunction() 不,我不想将其硬编码到对象中,我想从文件夹中导入所有函数并创建类
class={
职能:{
//这里的所有功能
}
}
这些函数将位于不同的文件夹中,但是,我想创建某种导入器,它将为在文件夹中找到的每个新函数/文件创建新类
someFunction.js
函数文件:
function someFunction(){
log(“这是一些函数”);
}
所以我想让它看起来像这样:
class.functions.someFunction()
不,我不想将其硬编码到对象中,我想从文件夹中导入所有函数并创建类似的函数。好吧,首先我不想回答您的问题,因为我认为这不是正确的方法 我还假设使用
class
时,您不是指实际对象,而是指普通对象
这就是代码:
const fs = require('fs');
const path = require('path');
function importer(dirPath) {
const absoluteDirPath = path.normalize(
path.isAbsolute(dirPath)
? dirPath
: path.resolve(process.cwd(), dirPath)
);
const output = {
functions: {}
};
const content = fs.readdirSync(path.normalize(absoluteDirPath));
content.forEach((basename) => {
const absoluteItemPath = path.join(absoluteDirPath, basename);
if (fs.statSync(absoluteItemPath).isFile() && /\.js$/i.test(basename)) {
output.functions[basename.slice(-3)] = require(path.relative(
__dirname,
absoluteItemPath
));
}
});
return output;
}
module.exports = importer;
要使其正常工作,文件中的所有函数都应按如下方式导出:
module.exports = function myFunction() {};
要使用“导入器”,您只需执行以下操作:
const artemis = importer('/path/to/directory'); // PATH MUST BE ABSOLUTE OR RELATIVE TO CWD.
/*
SUPPOSING THAT YOUR DIRECTORY CONTAINS THE FOLLOWING FILES:
function1.js
function2.js
Then you can do:
artemis.function1();
artemis.function2();
Please note that your files must be named in a JS friendly way (a valid string for an object key).
*/
关于这个奇怪方法的最后一个重要注意事项是:这只会在NodeJS环境中起作用。即使功能可以在其他环境中工作(如浏览器)。下一种方法将在正确的构建过程之后适用于任何ECMAScript环境:transpilation(例如:Babel)和bundling(例如:Webpack)
建议的解决方案 像现代JS库一样使用ES6静态/静态。这带来了巨大的好处,从静态代码分析到树抖动等等 让我们假设以下层次结构:
//-index.js
//-内部构件/
//-index.js
//-module-1.js
//-module-2.js
internal/module-1.js
function module1() {}
export {module1};
import {module1} from 'module-1.js';
function module2() {
// YOU CAN USE module1 IF YOU NEED. (AVOID CIRCULAR REFERENCES)
module1();
}
export {module2};
import {module1} from './module-1.js';
import {module2} from './module-2.js';
export {module1, module2};
import * as moduleGroup from './internals/index.js';
export {moduleGroup};
internal/module-2.js
function module1() {}
export {module1};
import {module1} from 'module-1.js';
function module2() {
// YOU CAN USE module1 IF YOU NEED. (AVOID CIRCULAR REFERENCES)
module1();
}
export {module2};
import {module1} from './module-1.js';
import {module2} from './module-2.js';
export {module1, module2};
import * as moduleGroup from './internals/index.js';
export {moduleGroup};
internal/index.js
function module1() {}
export {module1};
import {module1} from 'module-1.js';
function module2() {
// YOU CAN USE module1 IF YOU NEED. (AVOID CIRCULAR REFERENCES)
module1();
}
export {module2};
import {module1} from './module-1.js';
import {module2} from './module-2.js';
export {module1, module2};
import * as moduleGroup from './internals/index.js';
export {moduleGroup};
index.js
function module1() {}
export {module1};
import {module1} from 'module-1.js';
function module2() {
// YOU CAN USE module1 IF YOU NEED. (AVOID CIRCULAR REFERENCES)
module1();
}
export {module2};
import {module1} from './module-1.js';
import {module2} from './module-2.js';
export {module1, module2};
import * as moduleGroup from './internals/index.js';
export {moduleGroup};
最后,在导入模块组的地方,您可以执行以下操作:
moduleGroup.module1();
moduleGroup.module2();
显然,这是一个基本场景,但这是交付一组函数和其他内容的正确方式。如果您有任何疑问,请告诉我。
class
是一个关键字,因此您将无法使用它。您熟悉模块的工作原理吗?这可能就是您要寻找的:您的函数是否通过上下文/状态(如This
)相互交互?我是多个JS库的维护者,我认为如果您稍后解释如何使用这些函数,我可以帮助您更好地组织导出。无论如何。你想知道使用ES6模块还是CJ的答案吗?@ZacAnger是的,我明白,我做这些只是为了回答这个问题,对象名为“artemis”。@ErnestoStifano我的函数没有。我希望函数能够像“client.utils.functions.someFunction()”那样工作。