Feathers - Node.js、React Native及浏览器的REST和实时API层

 2019年06月03日    412     声明


Feathers是一个轻量级的REST和实时的API层,可以在Node.js、React Native及浏览器中使用。其核心是一组工具和架构模式,可以轻松创建可扩展的REST API和实时应用程序。使用Feathers,你可以在几分钟内构建原型,并在几天内生产就绪的应用程序。

Feathers通过在一些经过实战考验的开源技术之间的粘合代码实现了这一点 - 增加了一些最小的抽象,并引入了比传统MVC架构更容易理解,维护和扩展的应用程序架构。

  1. 快速创建你的第一个实时应用程序
  2. 通过优雅、灵活的代码保持敏捷性
  3. Feathers如此特别的原因

1. 快速创建你的第一个实时应用程序

依次输入以下命令,创建并启动一个Feathers应用:

$ npm install -g @feathersjs/cli

$ mkdir my-app

$ cd my-app

$ feathers generate app

$ npm start

在以上操作中,我局安装了Feathers的命令行工具@feathersjs/cli,这会生成一个feathers命令,可以通过feathers --helpfeathers -h来查看feathers命令行说明。之后创建了一个my-app目录,并在该目录中使用feathers generate app命令来创建了一个新的Feathers应用。在创建应用时,需要我们录入一些应用相关信息,然后生成命令会自动安装依赖包。完成应用创建后,使用npm start启动应用。

查看文档官方文档)以了解有关Feathers的更多信息,或在Slack小组中打个招呼,或在Twitter上给个关注。


feathers命令行说明

$ feathers --help
用法: feathers generate [type]

选项:
  -V, --version      输出版本号
  -h, --help         输出本使用说明

命令:
  generate|g [type]  运行一个生成器。Type 可以是
    • app - 在当前目录下创建一个新的 Feathers 应用
    • authentication - 为当前应用设置身份验证
    • connection - 初始化新的数据库连接
    • hook - 创建一个新的钩子
    • middleware - 创建一个 Express 中件间
    • secret - 生成新的身份验证密钥
    • service - 生成新服务
    • plugin - 创建一个新的 Feathers 插件
  
  upgrade|u          尝试自动升级到最新的Feathers版本
  *


2. 通过优雅、灵活的代码保持敏捷性

我们隐藏了生成器背后的实现逻辑,现在来看一下从头开始创建REST和实时API有多容易。

安装模块化依赖项:

$ npm install @feathersjs/feathers @feathersjs/socketio @feathersjs/express feathers-memory

服务端

const feathers = require('@feathersjs/feathers');
const express = require('@feathersjs/express');
const socketio = require('@feathersjs/socketio');

const memory = require('feathers-memory');

// 创建Express兼容的Feathers应用程序
const app = express(feathers());

// 解析 HTTP JSON 请求体
app.use(express.json());
// 解析 URL-encoded 参数
app.use(express.urlencoded({ extended: true }));
// 添加 REST API 支持
app.configure(express.rest());
// 配置 Socket.io 实时 APIs
app.configure(socketio());
// 使用分页注册消息服务
app.use('/messages', memory({
  paginate: {
    default: 10,
    max: 25
  }
}));
// 注册比默认的Express错误处理程序更好的错误处理程序
app.use(express.errorHandler());

// 添加一个新的实时连接到'everybody'频道
app.on('connection', connection => app.channel('everybody').join(connection));
// 将所有事件发布到'everybody'频道
app.publish(data => app.channel('everybody'));

// 启动服务
app.listen(3030).on('listening', () =>
  console.log('Feathers server listening on localhost:3030')
);


浏览器

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Feathers Example</title>
</head>
<body>
  <h1>Welcome to Feathers<h1>
  <p>Open up the console in your browser.</p>
  <script src="//unpkg.com/@feathersjs/client@^3.0.0/dist/feathers.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js"></script>
  <script type="text/javascript">
    // 设置 socket.io
    const socket = io('http://localhost:3030');
    // 设置Feathers客户端
    const app = feathers();
    
    // 注册 socket.io
    app.configure(feathers.socketio(socket));
    
    // 获取与服务器通信的消息服务
    const messages = app.service('messages');
    // Log 新创建的消息
    messages.on('created', message => {
      console.log('Someone created a messages', message);
    });
    // 创建新消息然后获取所有消息列表
    messages.create({ text: 'Hello from the browser' })
      .then(() => messages.find())
      .then(page => console.log('Messages', page));
  </script>
</body>
</html>


React Native

import io from 'socket.io-client';
import feathers from '@feathersjs/feathers'
import socketio from '@feathersjs/socketio-client'

const host = 'http://localhost:3030';
const socket = io(host, { transports: ['websocket'] });

// 设置Feathers客户端
const app = feathers();

// 注册 socket.io
app.configure(socketio(socket));

// 获取与服务器通信的消息服务
const messages = app.service('messages');

// 记录新创建的消息
messages.on('created', message => {
  console.log('Someone created a messages', message);
});

// 创建新消息然后获取所有消息列表
messages.create({ text: 'Hello from the browser' })
  .then(() => messages.find())
  .then(page => console.log('Messages', page));


3. Feathers如此特别的原因

现代,稳固,且100%的JavaScript

Feathers基于promises和ES6功能构建,是ExpressSocket.io 上的一个小巧、完全兼容的包装器,两者都已被数千家公司用于生产。


通用

Feathers可以在浏览器、React Native和Node.js服务器端使用。通过Feathers客户端,你可以快速添加身份验证,在服务器和客户端之间共享代码,并轻松实现应用。


架构友好

Feathers可以轻松地与任何客户端框架集成。无论是Angular、React还是VueJS都没问题,同样也适用于React Native。


面向服务

Feathers从开始就提供了面向服务构建的应用程序的结构。当你最终需要将应用程序拆分为微服务时,会是一个简单的过渡,你的Feathers应用程序可以轻松的扩展。


即时的实时REST API

Feathers通过Services提供即时的CRUD功能,通过Socket.io或Primus自动暴露RESTful API和实时后端。


数据存储不可知

Feathers提供了15+数据源适配器,包括MongoDB,Postgres,RethinkDB和S3。你可以在一个应用程序中使用多个数据存储区,并且由于Feathers提供一致的查询接口,来轻松地与它们交互。

灵活的插件

Feathers是“包含电池但易于更换的框架”。它有完全可选的插件,允许你实现300个Passport身份验证提供程序,灵活的授权权限以及开箱即用的SMS或电子邮件消息。