当前的前端和 FaaS 函数一体化结合支持的比较有限,如果希望有更多的可能性尝试扩展,我们将提供一些标准化支持。

这些支持分为几个方面

  • 函数端调用和调试
  • 函数构建

本地服务器

适用场景

  • 1、自定义前端框架(Vue,React),前端普通的 URL 类型的请求
  • 2、自定义网关类型的请求

可支持的部分
**
一般来说,前端框架都会有一个适合自己的 DevServer,启动一个端口,为了方便集成,我们会提供一个 koa 和 Express 通用的中间件,其中会集成目前常用的自定义网关 SDK,以及 URL 类型的解析。

  1. import { useExpressDevPack } from '@midwayjs/faas-dev-pack';
  2. // dev server 代码
  3. app = express();
  4. // 加载中间件
  5. app.use(
  6. useExpressDevPack({
  7. functionDir: join(__dirname, './fixtures/ice-demo-repo'),
  8. sourceDir: 'src/apis',
  9. })
  10. );

暴露出两个中间件方法,用于上层集成。

  • useExpressDevPack(options: DevOptions)
  • useKoaDevPack(options: DevOptions)
  1. export interface DevOptions {
  2. functionDir: string; // 本地目录,默认 process.cwd()
  3. sourceDir?: string; // 一体化调用是,需要知道当前的函数目录结构,比如 src/apis
  4. ignorePattern?: string [] | (req) => boolean // 可以忽略部分路径,让中间件好做后续操作
  5. }

示例
**

  1. // koa 下
  2. app.use(
  3. useKoaDevPack({
  4. functionDir: join(__dirname, './fixtures/ice-demo-repo'),
  5. sourceDir: 'src/apis',
  6. ignorePattern: ['/api'] // 忽略所有 /api 的路由,这里的写法是正则,内部会使用 new RegExp(pattern) 来匹配
  7. })
  8. );
  9. // express
  10. app.use(
  11. useExpressDevPack({
  12. functionDir: join(__dirname, './fixtures/ice-demo-repo'),
  13. sourceDir: 'src/apis',
  14. ignorePattern: (req) => {
  15. // return true 即为忽略
  16. }
  17. })
  18. );

示例:React 的支持

针对 React 的 Webpack DevServer 扩展,一般在自定义的 setupProxy.js 文件中。

  1. // @ts-ignore: isolated modules error
  2. const { useExpressDevPack } = require('@midwayjs/faas-dev-pack');
  3. const { resolve } = require('path');
  4. const URL = require('url');
  5. module.exports = function (app) {
  6. app.use(
  7. useExpressDevPack({
  8. functionDir: resolve(__dirname, '../'),
  9. sourceDir: resolve(__dirname, 'apis'),
  10. // 忽略渲染函数
  11. ignoreWildcardFunctions: ['render'],
  12. // 忽略静态文件地址
  13. ignorePattern: (req) => {
  14. const { pathname } = URL.parse(req.url);
  15. return /\.(js|css|map|json|png|jpg|jpeg|gif|svg|eot|woff2|ttf)$/.test(pathname);
  16. },
  17. })
  18. )
  19. }

示例:Vue 的支持

针对 vue cli 的封装场景,我们也封装了一个 vue cli 插件。

具体请参考:https://github.com/midwayjs/vue-cli-plugin-faas