实现一个优雅的按模块划分的api
utils类
1234567891011export function applyMixins(derivedCtor: any, baseCtors: any[]) {baseCtors.forEach(baseCtor => {Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {Object.defineProperty(derivedCtor.prototype,name,Object.getOwnPropertyDescriptor(baseCtor.prototype, name));});});}request类
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import fetch from 'isomorphic-unfetch'type Config = {apiKey: string,basePath?: string,}export type Pagination = {page?: number,per_page?: number,}export abstract class Base {private apiKey: stringprivate basePath: stringconstructor(config: Config) {this.apiKey = config.apiKeythis.basePath = config.basePath || 'https://dev.to/api/'}protected request<T> (endpoint: string, options?: RequestInit): Promise<T> {const url = this.basePath + endpointconst headers = {'api-key': this.apiKey,'Content-type': 'application/json'}const config = {...options,headers,}return fetch(url, config).then(r => {if (r.ok) {return r.json()}throw new Error(r.statusText)})}}class DevTo extends Base {}interface DevTo extends Articles, Comments, Users, Followers, Listings, PodcastEpisodes, Tags, Videos, Webhooks {}applyMixins(DevTo, [Articles, Comments, Users, Followers, Listings, PodcastEpisodes, Tags, Videos, Webhooks]);export default DevTo
具体参考dev-to-js
3.nodejs后台 书写规范
设置环境变量
123NODE_ENV=production node server.jsHere’s a quick hint to improve performance. Would you believe that only by setting the NODE_ENV environment variable to production will make your Express.js application three times fasterenable gzip compression
1234const compression = require('compression')const express = require('express')const app = express()app.use(compression())
降低了网络传输文件大小,有效的加速了网页内容的加载
- Always Use Asynchronous Functions123async function getData() {await promisfy(fn)(data);}
The last thing you want to do is to block the thread of execution
Managing Environment Variables in Node.js with dotenv
1234567NODE_ENV=productionDEBUG=falseLOGS_TOKEN=xxx-yyy-zzzMONITORING_TOKEN=xxx-yyy-zzzINFRA_TOKEN=xxx-yyy-zzzrequire('dotenv').config()Load Balancing with the Cluster Module
123456789101112131415const cluster = require('cluster')const numCPUs = require('os').cpus().lengthconst app = require('./src/app')const port = process.env.PORT || 3000const masterProcess = () => Array.from(Array(numCPUs)).map(cluster.fork)const childProcess = () => app.listen(port)if (cluster.isMaster) {masterProcess()} else {childProcess()}cluster.on('exit', () => cluster.fork())Enabling Caching with Redis
123456789101112131415161718192021222324252627282930313233343536373839404142const express = require('express')const app = express()const redis = require('redis')const redisClient = redis.createClient(6379)async function getSomethingFromDatabase (req, res, next) {try {const { id } = req.params;const data = await database.query()// Set data to RedisredisClient.setex(id, 3600, JSON.stringify(data))res.status(200).send(data)} catch (err) {console.error(err)res.status(500)}}function cache (req, res, next) {const { id } = req.paramsredisClient.get(id, (err, data) => {if (err) {return res.status(500).send(err)}// If data exists return the cached valueif (data != null) {return res.status(200).send(data)}// If data does not exist, proceed to the getSomethingFromDatabase functionnext()})}app.get('/data/:id', cache, getSomethingFromDatabase)app.listen(3000, () => console.log(`Server running on Port ${port}`))
好了 就到这