所以我刚刚听说为每个文件创建一个可导出的未命名 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 创建一个文件可能听起来很糟糕……但我在这里可能是错的。
最佳答案
最正确的答案是:这取决于情况。通常,对于 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,因此很多时候您会希望从文件中进行一次导出。例如, Controller 类、中间件、服务等可能只需要导出一个对象,这使得每个对象一个文件是理想的。
例如: typescript 节点 Controller
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 应用程序中那样向客户端发送 bundle 。
关于javascript - 管理可导出 API 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60089008/