UNPKG

gridsome

Version:

A JAMstack framework for building blazing fast websites with Vue.js

89 lines (70 loc) 2.41 kB
const fs = require('fs-extra') const chalk = require('chalk') const express = require('express') const createApp = require('./app') const { uniqBy } = require('lodash') const Server = require('./server/Server') const pathToRegexp = require('path-to-regexp') const { prepareUrls } = require('./server/utils') const resolvePort = require('./server/resolvePort') const compileAssets = require('./webpack/compileAssets') const { removeStylesJsChunk } = require('./webpack/utils') module.exports = async (context, args) => { process.env.NODE_ENV = 'production' process.env.GRIDSOME_MODE = 'serve' const app = await createApp(context, { args }) const port = await resolvePort(app.config.port) const hostname = app.config.host const urls = prepareUrls(hostname, port) const server = new Server(app, urls) const { config } = app await app.plugins.run('beforeServe', { context, config }) await fs.ensureDir(config.cacheDir) await fs.emptyDir(config.outputDir) const routes = createRoutes(app) const stats = await compileAssets(app, { 'process.env.SOCKJS_ENDPOINT': JSON.stringify(urls.sockjs.url), 'process.env.GRAPHQL_ENDPOINT': JSON.stringify(urls.graphql.url) }) if (config.css.split !== true) { await removeStylesJsChunk(stats, config.outputDir) } server.hooks.setup.tap('serve', server => { server.use(express.static(config.outputDir)) server.get('*', require('./server/middlewares/renderer')(app, routes)) }) await app.plugins.run('afterServe', { context, config, app }) server.listen(port, hostname, err => { if (err) throw err console.log() console.log(` Site running at: ${chalk.cyan(urls.local.pretty)}`) console.log() }) } function createRoutes (app) { const pages = uniqBy(app.pages.data(), page => page.route) return pages.map(page => { const keys = [] const regex = pathToRegexp(page.route, keys) const toPath = pathToRegexp.compile(page.route) return { regex, path: page.path, route: page.route, query: page.query, toParams (url) { const matches = regex.exec(url) const params = {} keys.forEach((key, index) => { if (typeof key === 'object') { params[key.name] = matches[index + 1] } }) return params }, toPath (params) { return toPath(params) } } }) }