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)
}
})