我刚刚听说,在每个文件中创建一个可导出的未命名API方法是一种更好的做法,而不是将所有可导出的命名API方法收集到一个文件中。
所以就像在API文件夹内的fileA.js中一样
/* The only method inside fileA */
export default async function(){
/* Some actions here to fetch or post data */
}
和在API文件夹内的fileB.js中
/* The only method inside fileB */
export default async function(){
/* Some actions here to fetch or post data */
}
而不是将所有方法都收集到一个文件Api.js下
/* Placing all exportable APIs under one file */
export default async function thisAction(){
/* Some actions here to fetch or post data */
}
export default async function thatAction(){
/* Some actions here to fetch or post data */
}
谁能告诉我这两种做法的利弊。在包大小和文件管理方面,为每个API创建一个文件听起来可能不太好……但在这里我可能错了。
发布于 2020-02-10 21:58:38
最正确的答案是:视情况而定。通常,对于API,您要做的是让每个文件导出与其用途相关的函数/对象。也就是说,在设计类和函数时要牢记single responsibility principle。在这样做的过程中,您经常会看到更多的代码分离,比如将单个函数或类导出到它自己的文件中。
例如:一个node.js服务模块
const crypto = require('crypto');
/**
* @description Generates a random salt value with a default of 256 char buffer.
* @param {Number} size integar value for salt size
*/
function createSalt(size = 256) {
const salt = crypto.randomBytes(size).toString('hex');
return salt;
}
/**
* @description Hashes a given string with a provided salt value.
* @param {String} str String to be hashed.
* @param {Number} salt The provided salt value.
*/
function hashString(str, salt) {
const hashedStr = crypto.pbkdf2Sync(str, salt, 1000, 512, 'sha512').toString('hex');
return hashedStr;
}
module.exports = { createSalt, hashString };
上面是一个简单的Node.js文件,它使用Crypto包处理加盐和散列字符串。此模块的单一用途是能够对字符串进行加盐/散列操作,这使得在同一文件中同时包含两个函数更可取。由于您要处理的是API,因此在很多情况下,您会希望从一个文件导出一个文件。例如,控制器类、中间件、服务等可能只需要导出单个对象,这将使每个对象的单个文件成为理想。
例如: typescript节点控制器
import { Response, Request } from "express";
import UserData from "../data/Users/UserData";
import AccountData, { IDetails } from "../data/Account/AccountData";
import UserSchema, { IUserModel } from "../models/UserModel";
import ILoginResult from "../data/Users/ILoginResult";
class UserController {
public async addUser(req: Request, res: Response) {
let newUser: IUserModel = new UserSchema(req.body);
let result: ILoginResult = await UserData.createNewUser(newUser);
res.status(result.status).send(result.result);
}
public async loginUser(req: Request, res: Response) {
const { name, password } = req.body;
let result: ILoginResult = await UserData.login(name, password);
res.status(result.status).send(result.result);
}
public async getAllUsers(req: Request, res: Response) {
try {
const payload = req["decoded"];
if (payload) {
let users: ILoginResult = await UserData.getAllUsers(payload);
res.status(users.status).send(users.result);
}
} catch (e) {
res.status(500).send({ error: e.toString() });
}
}
}
export default new UserController();
为了处理用户,您有一个具有所需适当方法的类,通常是一个单独的类或模块,用于导出具有这些函数的对象。所以最好的方法是在需要的时候使用。你只需要一个函数或对象?然后,您只需要导出该对象。你需要多个相关函数吗?导出多个功能。坚持只使用一种方法,而不使用另一种方法,只会阻碍你的代码,并用不干净的代码和/或过多的文件弄乱你的代码库。
您确实希望进行代码分离,以获得更干净的代码库和更容易的可维护性,但您也不希望将其发挥到极致。至于包的大小,除非你向应用程序的客户端发送了很多逻辑,否则你不应该担心任何事情。API驻留在服务器上,因此您不会像在React/Vue/Angular应用程序中那样向客户端发送包。
https://stackoverflow.com/questions/60089008
复制相似问题