Commit 015e059e authored by Evan You's avatar Evan You

update to use vue 2.2.4

parent 6cd1ab46
...@@ -18,6 +18,7 @@ HackerNews clone built with Vue 2.0 + vue-router + vuex, with server-side render ...@@ -18,6 +18,7 @@ HackerNews clone built with Vue 2.0 + vue-router + vuex, with server-side render
- Vue + vue-router + vuex working together - Vue + vue-router + vuex working together
- Server-side data pre-fetching - Server-side data pre-fetching
- Client-side state & DOM hydration - Client-side state & DOM hydration
- Automatically inlines CSS used by rendered components only
- Single-file Vue Components - Single-file Vue Components
- Hot-reload in development - Hot-reload in development
- CSS extraction for production - CSS extraction for production
......
...@@ -4,7 +4,10 @@ const MFS = require('memory-fs') ...@@ -4,7 +4,10 @@ const MFS = require('memory-fs')
const clientConfig = require('./webpack.client.config') const clientConfig = require('./webpack.client.config')
const serverConfig = require('./webpack.server.config') const serverConfig = require('./webpack.server.config')
module.exports = function setupDevServer (app, opts) { module.exports = function setupDevServer (app, cb) {
let bundle
let template
// modify client config to work with hot middleware // modify client config to work with hot middleware
clientConfig.entry.app = ['webpack-hot-middleware/client', clientConfig.entry.app] clientConfig.entry.app = ['webpack-hot-middleware/client', clientConfig.entry.app]
clientConfig.output.filename = '[name].js' clientConfig.output.filename = '[name].js'
...@@ -27,8 +30,10 @@ module.exports = function setupDevServer (app, opts) { ...@@ -27,8 +30,10 @@ module.exports = function setupDevServer (app, opts) {
const fs = devMiddleware.fileSystem const fs = devMiddleware.fileSystem
const filePath = path.join(clientConfig.output.path, 'index.html') const filePath = path.join(clientConfig.output.path, 'index.html')
if (fs.existsSync(filePath)) { if (fs.existsSync(filePath)) {
const index = fs.readFileSync(filePath, 'utf-8') template = fs.readFileSync(filePath, 'utf-8')
opts.templateUpdated(index) if (bundle) {
cb(bundle, template)
}
} }
}) })
...@@ -47,6 +52,9 @@ module.exports = function setupDevServer (app, opts) { ...@@ -47,6 +52,9 @@ module.exports = function setupDevServer (app, opts) {
// read bundle generated by vue-ssr-webpack-plugin // read bundle generated by vue-ssr-webpack-plugin
const bundlePath = path.join(serverConfig.output.path, 'vue-ssr-bundle.json') const bundlePath = path.join(serverConfig.output.path, 'vue-ssr-bundle.json')
opts.bundleUpdated(JSON.parse(mfs.readFileSync(bundlePath, 'utf-8'))) bundle = JSON.parse(mfs.readFileSync(bundlePath, 'utf-8'))
if (template) {
cb(bundle, template)
}
}) })
} }
...@@ -16,37 +16,36 @@ ...@@ -16,37 +16,36 @@
}, },
"dependencies": { "dependencies": {
"compression": "^1.6.2", "compression": "^1.6.2",
"cross-env": "^3.1.3", "cross-env": "^3.2.4",
"es6-promise": "^4.0.5", "es6-promise": "^4.1.0",
"express": "^4.14.0", "express": "^4.15.2",
"firebase": "^3.6.2", "firebase": "^3.7.2",
"lru-cache": "^4.0.2", "lru-cache": "^4.0.2",
"serialize-javascript": "^1.3.0", "serialize-javascript": "^1.3.0",
"serve-favicon": "^2.3.2", "serve-favicon": "^2.4.1",
"vue": "^2.1.10", "vue": "^2.2.4",
"vue-router": "^2.1.0", "vue-router": "^2.3.0",
"vue-server-renderer": "^2.1.10", "vue-server-renderer": "^2.2.4",
"vue-ssr-html-stream": "^1.0.0", "vuex": "^2.2.1",
"vuex": "^2.1.0", "vuex-router-sync": "^4.1.2"
"vuex-router-sync": "^4.0.2"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "^6.5.3", "autoprefixer": "^6.7.7",
"buble": "^0.15.1", "buble": "^0.15.2",
"buble-loader": "^0.4.0", "buble-loader": "^0.4.1",
"css-loader": "^0.26.0", "css-loader": "^0.27.3",
"file-loader": "^0.9.0", "file-loader": "^0.10.1",
"html-webpack-plugin": "^2.24.1", "html-webpack-plugin": "^2.28.0",
"rimraf": "^2.5.4", "rimraf": "^2.6.1",
"stylus": "^0.54.5", "stylus": "^0.54.5",
"stylus-loader": "^2.4.0", "stylus-loader": "^3.0.1",
"sw-precache-webpack-plugin": "^0.7.0", "sw-precache-webpack-plugin": "^0.9.1",
"url-loader": "^0.5.7", "url-loader": "^0.5.8",
"vue-loader": "^10.2.0", "vue-loader": "^11.1.4",
"vue-ssr-webpack-plugin": "^1.0.0", "vue-ssr-webpack-plugin": "^1.0.2",
"vue-template-compiler": "^2.1.8", "vue-template-compiler": "^2.2.4",
"webpack": "^2.2.0", "webpack": "^2.2.1",
"webpack-dev-middleware": "^1.8.4", "webpack-dev-middleware": "^1.10.1",
"webpack-hot-middleware": "^2.13.2" "webpack-hot-middleware": "^2.17.1"
} }
} }
...@@ -3,7 +3,6 @@ const path = require('path') ...@@ -3,7 +3,6 @@ const path = require('path')
const express = require('express') const express = require('express')
const favicon = require('serve-favicon') const favicon = require('serve-favicon')
const compression = require('compression') const compression = require('compression')
const HTMLStream = require('vue-ssr-html-stream')
const resolve = file => path.resolve(__dirname, file) const resolve = file => path.resolve(__dirname, file)
const isProd = process.env.NODE_ENV === 'production' const isProd = process.env.NODE_ENV === 'production'
...@@ -13,28 +12,28 @@ const serverInfo = ...@@ -13,28 +12,28 @@ const serverInfo =
const app = express() const app = express()
let template // generated by html-webpack-plugin let renderer
let renderer // created from the webpack-generated server bundle
if (isProd) { if (isProd) {
// in production: create server renderer and index HTML from real fs // In production: create server renderer using server bundle and index HTML
renderer = createRenderer(require('./dist/vue-ssr-bundle.json')) // template from real fs.
template = fs.readFileSync(resolve('./dist/index.html'), 'utf-8') // The server bundle is generated by vue-ssr-webpack-plugin.
const bundle = require('./dist/vue-ssr-bundle.json')
// src/index.template.html is processed by html-webpack-plugin to inject
// build assets and output as dist/index.html.
const template = fs.readFileSync(resolve('./dist/index.html'), 'utf-8')
renderer = createRenderer(bundle, template)
} else { } else {
// in development: setup the dev server with watch and hot-reload, // In development: setup the dev server with watch and hot-reload,
// and update renderer / index HTML on file change. // and create a new renderer on bundle / index template update.
require('./build/setup-dev-server')(app, { require('./build/setup-dev-server')(app, (bundle, template) => {
bundleUpdated: bundle => { renderer = createRenderer(bundle, template)
renderer = createRenderer(bundle)
},
templateUpdated: _template => {
template = _template
}
}) })
} }
function createRenderer (bundle) { function createRenderer (bundle, template) {
// https://github.com/vuejs/vue/blob/dev/packages/vue-server-renderer/README.md#why-use-bundlerenderer // https://github.com/vuejs/vue/blob/dev/packages/vue-server-renderer/README.md#why-use-bundlerenderer
return require('vue-server-renderer').createBundleRenderer(bundle, { return require('vue-server-renderer').createBundleRenderer(bundle, {
template,
cache: require('lru-cache')({ cache: require('lru-cache')({
max: 1000, max: 1000,
maxAge: 1000 * 60 * 15 maxAge: 1000 * 60 * 15
...@@ -68,18 +67,14 @@ app.get('*', (req, res) => { ...@@ -68,18 +67,14 @@ app.get('*', (req, res) => {
res.status(404).end('404 | Page Not Found') res.status(404).end('404 | Page Not Found')
} else { } else {
// Render Error Page or Redirect // Render Error Page or Redirect
res.status(500).end('Internal Error 500') res.status(500).end('500 | Internal Server Error')
console.error(`error during render : ${req.url}`) console.error(`error during render : ${req.url}`)
console.error(err) console.error(err)
} }
} }
const context = { url: req.url } renderer.renderToStream({ url: req.url })
const htmlStream = new HTMLStream({ template, context })
renderer.renderToStream(context)
.on('error', errorHandler) .on('error', errorHandler)
.pipe(htmlStream)
.on('end', () => console.log(`whole request: ${Date.now() - s}ms`)) .on('end', () => console.log(`whole request: ${Date.now() - s}ms`))
.pipe(res) .pipe(res)
}) })
......
...@@ -17,6 +17,6 @@ ...@@ -17,6 +17,6 @@
<% } %> <% } %>
</head> </head>
<body> <body>
<!-- APP --> <!--vue-ssr-outlet-->
</body> </body>
</html> </html>
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment