From 51d5eb20ff2792de288e998cc1964d9248861265 Mon Sep 17 00:00:00 2001 From: Chris Visser <2496739+chris-visser@users.noreply.github.com> Date: Sat, 13 Jun 2020 10:59:21 +0200 Subject: [PATCH 1/3] Refactor vue-ssr index. fix console warning --- packages/vue-router2/plugin/plugin.js | 2 - packages/vue-ssr/package.js | 4 +- packages/vue-ssr/server/data.js | 2 + packages/vue-ssr/server/index.js | 158 +++++------------- .../vue-ssr/server/lib/createDefaultApp.js | 9 + .../vue-ssr/server/lib/defaultAppTemplate.js | 21 +++ packages/vue-ssr/server/lib/isAppUrl.js | 14 ++ 7 files changed, 89 insertions(+), 121 deletions(-) create mode 100644 packages/vue-ssr/server/lib/createDefaultApp.js create mode 100644 packages/vue-ssr/server/lib/defaultAppTemplate.js create mode 100644 packages/vue-ssr/server/lib/isAppUrl.js diff --git a/packages/vue-router2/plugin/plugin.js b/packages/vue-router2/plugin/plugin.js index 839bbbf..957067b 100644 --- a/packages/vue-router2/plugin/plugin.js +++ b/packages/vue-router2/plugin/plugin.js @@ -38,9 +38,7 @@ class VueRouterCompiler extends CachingCompiler { let map = '' let babelOptions = Babel.getDefaultOptions() - babelOptions.sourceMap = true babelOptions.filename = babelOptions.sourceFileName = sourcePath - babelOptions.sourceMapTarget = babelOptions.filename + '.map' // Babel compilation let output = Babel.compile(code, babelOptions) diff --git a/packages/vue-ssr/package.js b/packages/vue-ssr/package.js index 7134a93..68d02a5 100644 --- a/packages/vue-ssr/package.js +++ b/packages/vue-ssr/package.js @@ -19,7 +19,7 @@ Package.onUse(function (api) { 'routepolicy', 'url', 'akryum:npm-check@0.1.1', - 'staringatlights:fast-render@3.2.0', + 'thespider:fast-render@3.2.1', 'ejson', 'server-render', ]) @@ -28,6 +28,6 @@ Package.onUse(function (api) { }) Npm.depends({ - 'vue-server-renderer': '2.6.10', + 'vue-server-renderer': '2.6.11', 'cookie-parser': '1.4.4', }) diff --git a/packages/vue-ssr/server/data.js b/packages/vue-ssr/server/data.js index cd3607d..a9a07c3 100644 --- a/packages/vue-ssr/server/data.js +++ b/packages/vue-ssr/server/data.js @@ -5,6 +5,7 @@ export default function patchSubscribeData (VueSSR) { const originalSubscribe = Meteor.subscribe Meteor.subscribe = function (pubName, ...params) { + console.log('SUBSCRIBE TO', pubName) const ssrContext = VueSSR.ssrContext.get() if (ssrContext) { VueSSR.inSubscription.withValue(true, () => { @@ -37,6 +38,7 @@ export default function patchSubscribeData (VueSSR) { const collection = ssrContext.getCollection(collName) const cursor = collection.find(selector, options) + console.log('SSR LOCAL COLLECTION WAS USED') return cursor } diff --git a/packages/vue-ssr/server/index.js b/packages/vue-ssr/server/index.js index de7e855..1bdbc3c 100644 --- a/packages/vue-ssr/server/index.js +++ b/packages/vue-ssr/server/index.js @@ -1,62 +1,22 @@ -import Vue from 'vue' import { createRenderer } from 'vue-server-renderer' import { WebApp } from 'meteor/webapp' import cookieParser from 'cookie-parser' import { onPageLoad } from 'meteor/server-render' import { FastRender } from 'meteor/staringatlights:fast-render' +import defaultAppTemplate from './lib/defaultAppTemplate' +import createDefaultApp from './lib/createDefaultApp' + import SsrContext from './context' import patchSubscribeData from './data' -function IsAppUrl (req) { - var url = req.url - if (url === '/favicon.ico' || url === '/robots.txt') { - return false - } - - if (url === '/app.manifest') { - return false - } - - // Avoid serving app HTML for declared routes such as /sockjs/. - if (RoutePolicy.classify(url)) { - return false - } - return true -} +export { default as IsAppUrl } from './lib/isAppUrl' -VueSSR = {} +const VueSSR = {} VueSSR.outlet = process.env.VUE_OUTLET || 'app' - -VueSSR.defaultAppTemplate = ` -
-

This is not what you expected

-

- You need to tell vue-ssr how to create your app by setting the VueSSR.createApp function. It should return a new Vue instance. -

-

- Here is an example of server-side code: -

-
import Vue from 'vue'
-import { VueSSR } from 'meteor/akryum:vue-ssr'
-
-function createApp () {
-  return new Vue({
-    render: h => h('div', 'Hello world'),
-  })
-}
-
-VueSSR.createApp = createApp
-
-` - -VueSSR.createApp = function () { - return new Vue({ - template: VueSSR.defaultAppTemplate, - }) -} - +VueSSR.defaultAppTemplate = defaultAppTemplate +VueSSR.createApp = createDefaultApp() VueSSR.ssrContext = new Meteor.EnvironmentVariable() VueSSR.inSubscription = new Meteor.EnvironmentVariable() // <-- needed in data.js @@ -64,7 +24,7 @@ patchSubscribeData(VueSSR) const renderer = createRenderer() -function writeServerError (sink) { +function writeServerError(sink) { sink.appendToBody('Server Error') } @@ -83,63 +43,42 @@ onPageLoad(sink => new Promise((resolve, reject) => { // https://github.com/kadirahq/flow-router/blob/ssr/server/route.js#L61 const ssrContext = new SsrContext() - VueSSR.ssrContext.withValue(ssrContext, () => { + VueSSR.ssrContext.withValue(ssrContext, async () => { try { - // const frData = InjectData.getData(res, 'fast-render-data') - // if (frData) { - // ssrContext.addData(frData.collectionData) - // } - // Vue const context = { url: req.url } - let asyncResult + const result = VueSSR.createApp(context) - if (result && typeof result.then === 'function') { - asyncResult = result - } else { - asyncResult = Promise.resolve(result) - } - - asyncResult.then(app => { - renderer.renderToString( - app, - context, - (error, html) => { - if (error) { - console.error(error) - writeServerError(sink) - return - } - - // const frContext = FastRender.frContext.get() - // const data = frContext.getData() - // // InjectData.pushData(res, 'fast-render-data', data) - // const injectData = EJSON.stringify({ - // 'fast-render-data': data, - // }) - // // sink.appendToHead(``) - - let appendHtml - if (typeof context.appendHtml === 'function') appendHtml = context.appendHtml() - - const head = ((appendHtml && appendHtml.head) || context.head) || '' - const body = ((appendHtml && appendHtml.body) || context.body) || '' - const js = ((appendHtml && appendHtml.js) || context.js) || '' - - const script = js && `` - - sink.renderIntoElementById(VueSSR.outlet, html) - sink.appendToHead(head) - sink.appendToBody([body, script]) - - resolve() - }, - ) - }).catch(e => { - console.error(e) - writeServerError(sink) - resolve() - }) + + const asyncResult = typeof result.then === 'function' ? result : Promise.resolve(result) + + const app = await asyncResult + + renderer.renderToString( + app, + context, + (error, html) => { + if (error) { + console.error(error) + writeServerError(sink) + return + } + + const appendHtml = typeof context.appendHtml === 'function' && context.appendHtml() + + const head = ((appendHtml && appendHtml.head) || context.head) || '' + const body = ((appendHtml && appendHtml.body) || context.body) || '' + const js = ((appendHtml && appendHtml.js) || context.js) || '' + + const script = js && `` + + sink.renderIntoElementById(VueSSR.outlet, html) + sink.appendToHead(head) + sink.appendToBody([body, script]) + + resolve() + } + ) } catch (error) { console.error(error) writeServerError(sink) @@ -149,19 +88,4 @@ onPageLoad(sink => new Promise((resolve, reject) => { }) })) -return - -/* eslint-disable */ - -Meteor.bindEnvironment(function () { - WebApp.rawConnectHandlers.use(cookieParser()) - - WebApp.connectHandlers.use((req, res, next) => { - if (!IsAppUrl(req)) { - next() - return - } - - - }) -})() +export { VueSSR } diff --git a/packages/vue-ssr/server/lib/createDefaultApp.js b/packages/vue-ssr/server/lib/createDefaultApp.js new file mode 100644 index 0000000..ebe8efa --- /dev/null +++ b/packages/vue-ssr/server/lib/createDefaultApp.js @@ -0,0 +1,9 @@ +import Vue from 'vue' + +import defaultAppTemplate from './defaultAppTemplate' + +export default () => { + return new Vue({ + template: defaultAppTemplate + }) +} diff --git a/packages/vue-ssr/server/lib/defaultAppTemplate.js b/packages/vue-ssr/server/lib/defaultAppTemplate.js new file mode 100644 index 0000000..08f5d77 --- /dev/null +++ b/packages/vue-ssr/server/lib/defaultAppTemplate.js @@ -0,0 +1,21 @@ +export default ` +
+

This is not what you expected

+

+ You need to tell vue-ssr how to create your app by setting the VueSSR.createApp function. It should return a new Vue instance. +

+

+ Here is an example of server-side code: +

+
import Vue from 'vue'
+import { VueSSR } from 'meteor/akryum:vue-ssr'
+
+function createApp () {
+  return new Vue({
+    render: h => h('div', 'Hello world'),
+  })
+}
+
+VueSSR.createApp = createApp
+
+` diff --git a/packages/vue-ssr/server/lib/isAppUrl.js b/packages/vue-ssr/server/lib/isAppUrl.js new file mode 100644 index 0000000..91f44f2 --- /dev/null +++ b/packages/vue-ssr/server/lib/isAppUrl.js @@ -0,0 +1,14 @@ +import { RoutePolicy } from 'meteor/routepolicy' + +const nonAppUrls = ['/favicon.ico', '/robots.txt', '/app.manifest'] + +export default (req) => { + const url = req.url + + if (nonAppUrls.includes(url)) { + return false + } + + // Avoid serving app HTML for declared routes such as /sockjs/. + return !RoutePolicy.classify(url) +} From f07673ef590d370163a18136edf68c18f19d879d Mon Sep 17 00:00:00 2001 From: Chris Visser <2496739+chris-visser@users.noreply.github.com> Date: Sat, 13 Jun 2020 12:47:00 +0200 Subject: [PATCH 2/3] Switch to maintained fast-render --- packages/vue-ssr/.versions | 2 +- packages/vue-ssr/package.js | 2 +- packages/vue-ssr/server/context.js | 2 +- packages/vue-ssr/server/index.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vue-ssr/.versions b/packages/vue-ssr/.versions index 7214cb8..159e892 100644 --- a/packages/vue-ssr/.versions +++ b/packages/vue-ssr/.versions @@ -51,7 +51,7 @@ routepolicy@1.0.12 server-render@0.3.0 service-configuration@1.0.11 socket-stream-client@0.1.0 -staringatlights:fast-render@2.16.5 +cloudspider:fast-render@3.2.1 staringatlights:inject-data@2.0.5 tracker@1.1.3 underscore@1.0.10 diff --git a/packages/vue-ssr/package.js b/packages/vue-ssr/package.js index 68d02a5..0167741 100644 --- a/packages/vue-ssr/package.js +++ b/packages/vue-ssr/package.js @@ -19,7 +19,7 @@ Package.onUse(function (api) { 'routepolicy', 'url', 'akryum:npm-check@0.1.1', - 'thespider:fast-render@3.2.1', + 'cloudspider:fast-render@3.2.1', 'ejson', 'server-render', ]) diff --git a/packages/vue-ssr/server/context.js b/packages/vue-ssr/server/context.js index e0e00ed..a7dda40 100644 --- a/packages/vue-ssr/server/context.js +++ b/packages/vue-ssr/server/context.js @@ -1,7 +1,7 @@ // server/ssr_context.js // stolen from https://github.com/kadirahq/flow-router/blob/ssr/server/ssr_context.js -import { FastRender } from 'meteor/staringatlights:fast-render' +import { FastRender } from 'meteor/cloudspider:fast-render' export default class SsrContext { constructor () { diff --git a/packages/vue-ssr/server/index.js b/packages/vue-ssr/server/index.js index 1bdbc3c..da965d4 100644 --- a/packages/vue-ssr/server/index.js +++ b/packages/vue-ssr/server/index.js @@ -2,7 +2,7 @@ import { createRenderer } from 'vue-server-renderer' import { WebApp } from 'meteor/webapp' import cookieParser from 'cookie-parser' import { onPageLoad } from 'meteor/server-render' -import { FastRender } from 'meteor/staringatlights:fast-render' +import { FastRender } from 'meteor/cloudspider:fast-render' import defaultAppTemplate from './lib/defaultAppTemplate' import createDefaultApp from './lib/createDefaultApp' From b1d8dbbf2a997cb3130c8542dab8f54f83ca1b8e Mon Sep 17 00:00:00 2001 From: Chris Visser <2496739+chris-visser@users.noreply.github.com> Date: Sat, 13 Jun 2020 12:48:41 +0200 Subject: [PATCH 3/3] Remove console log --- packages/vue-ssr/server/data.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/vue-ssr/server/data.js b/packages/vue-ssr/server/data.js index a9a07c3..cd3607d 100644 --- a/packages/vue-ssr/server/data.js +++ b/packages/vue-ssr/server/data.js @@ -5,7 +5,6 @@ export default function patchSubscribeData (VueSSR) { const originalSubscribe = Meteor.subscribe Meteor.subscribe = function (pubName, ...params) { - console.log('SUBSCRIBE TO', pubName) const ssrContext = VueSSR.ssrContext.get() if (ssrContext) { VueSSR.inSubscription.withValue(true, () => { @@ -38,7 +37,6 @@ export default function patchSubscribeData (VueSSR) { const collection = ssrContext.getCollection(collName) const cursor = collection.find(selector, options) - console.log('SSR LOCAL COLLECTION WAS USED') return cursor }