Quasar CLI with Webpack - @quasar/app-webpack
SSR生产输出

WARNING

  • 你需要运行在"@quasar/app-webpack"v3.2以上才能使用这个功能。
  • 这个文件只用于你的生产构建,而不是在开发时使用。

注意你生成的/src-ssr包含一个名为production-export.js的文件。这个文件定义了如何为你的SSR webserver提供服务。你可以开始监听一个端口,或者为你的无服务器基础设施提供一个处理程序来使用。这由你决定。

无论这个函数返回什么(如果有的话),都将从你建立的dist/ssr/index.js中导出。

剖析

/src-ssr/production-export.[js|ts]文件是一个简单的JavaScript文件,用于启动SSR webserver并定义webserver的输出内容(如果有输出的话)。

// import something here (serverless packages?)

export default ({
  app, port, isReady, ssrHandler,
  resolve, publicPath, folders, render, serve
}) => {
  // something to do with the server "app"
  // return whatever you want your webserver to export (handler for serverless function?)
}

TIP

记住,无论这个函数返回什么(如果有的话),都将从你建立的dist/ssr/index.js中导出。

你可以用ssrProductionExport辅助器包装返回的函数,以获得更好的IDE自动完成体验(需要Quasar v2.3.1以上版本)。

import { ssrProductionExport } from 'quasar/wrappers'

export default ssrProductionExport(({
  app, port, isReady, ssrHandler,
  resolve, publicPath, folders, render, serve
}) => {
  // something to do with the server "app"
  // return whatever you want your webserver to export (handler for serverless?)
})

参数

我们在这里指的是生产-输出文件的默认输出函数所接收的作为参数的对象。

export default ({
  app, port, isReady, ssrHandler,
  resolve, publicPath, folders, render, serve
}) => {

Detailing the Object:

{
  app,     // Expressjs app instance

  port,    // process.env.PORT or quasar.config.js > ssr > prodPort

  isReady, // Function to call returning a Promise
           // when app is ready to serve clients

  ssrHandler, // Prebuilt app handler if your serverless service
              // doesn't require a specific way to provide it.
              // Form: ssrHandler (req, res, next)
              // Tip: it uses isReady() under the hood already

  // all of the following are the same as
  // for the SSR middlewares (check its docs page);
  // normally you don't need these here
  // (use a real SSR middleware instead)
  resolve: {
    urlPath(path)
    root(arg1, arg2),
    public(arg1, arg2)
  },
  publicPath, // String
  folders: {
    root,     // String
    public    // String
  },
  render(ssrContext),
  serve: {
    static(path, opts),
    error({ err, req, res })
  }
}

默认内容

当你在Quasar CLI项目中添加SSR支持时,以下是/src-ssr/production-export.js的默认内容:

import { ssrProductionExport } from 'quasar/wrappers'

export default ssrProductionExport(({ app, port, isReady }) => {
  return isReady().then(() => {
    app.listen(port, () => {
      console.log('Server listening at port ' + port)
    })
  })
})

使用方法

WARNING

  • 如果你从node_modules中导入任何东西,那么请确保该包在package.json > "dependencies "中指定,而不是在 "devDependencies "中。
  • 这里通常不是添加中间件的地方(但你可以这样做)。通过使用[SSR Middlewares](/quasar-cli-webpack/developing-ssr/ssr-middleware)来添加中间件。你可以将SSR中间件配置为只为开发运行或只为生产运行。

在一个端口上收听

这是你在Quasar CLI项目中添加SSR支持时得到的默认选项。它开始监听配置的端口(process.env.PORT 或 quasar.config.js > ssr > prodPort)。

// src-ssr/production-export.[js|ts]

import { ssrProductionExport } from 'quasar/wrappers'

export default ssrProductionExport(({ app, port, isReady }) => {
  // we wait for app to be ready (including running all SSR middlewares)
  return isReady().then(() => {
    // then we start listening on a port
    app.listen(port, () => {
      // we're ready to serve clients
      console.log('Server listening at port ' + port)
    })
  })
})

无服务器

如果你有一个无服务器的基础设施,那么你一般需要导出一个处理程序,而不是开始监听一个端口。

比方说,你的无服务器服务需要你:

module.exports.handler = __your_handler__

那么你需要做的是:

// src-ssr/production-export.[js|ts]

import { ssrProductionExport } from 'quasar/wrappers'

export default ssrProductionExport(({ ssrHandler }) => {
  // "ssrHandler" is a prebuilt handler which already
  // waits for all the middlewares to run before serving clients

  // whatever you return here is equivalent to module.exports.<key> = <value>
  return { handler: ssrHandler }
})

请注意,提供的ssrHandler是一个函数形式:(req, res, next) => void。 如果你需要导出一个(event, context, callback) => void形式的处理程序,那么你很可能要使用serverless-http包(见下文)。

Example: serverless-http

// src-ssr/production-export.[js|ts]

import serverless from 'serverless-http'
import { ssrProductionExport } from 'quasar/wrappers'

export default ssrProductionExport(({ ssrHandler }) => {
  return { handler: serverless(ssrHandler) }
})

例子: Firebase函数

// src-ssr/production-export.[js|ts]

import * as functions from 'firebase-functions'
import { ssrProductionExport } from 'quasar/wrappers'

export default ssrProductionExport(({ ssrHandler }) => {
  return {
    handler: functions.https.onRequest(ssrHandler)
  }
})