Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将其他文件夹中的函数添加到此文件夹中的对象_Javascript_Node.js - Fatal编程技术网

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()”那样工作。