├── .gitignore ├── vue-ssr-1 ├── package.json ├── render-vue-app.js └── server.js ├── vue-ssr-2 ├── index.template.html ├── package.json ├── render-vue-app.js └── server.js ├── vue-ssr-3 ├── package.json ├── render-vue-app.js ├── server.js └── src │ ├── app.js │ └── index.template.html ├── vue-ssr-4 ├── build │ ├── vue-loader.config.js │ ├── webpack.base.config.js │ ├── webpack.client.config.js │ └── webpack.server.config.js ├── dist │ ├── app.1b581a83e10a60dc66e9.js │ ├── app.1b581a83e10a60dc66e9.js.map │ ├── app.96af4d5258d43d16dc20.js │ ├── app.96af4d5258d43d16dc20.js.map │ ├── app.e58ef690df1810e3a94a.js │ ├── app.e58ef690df1810e3a94a.js.map │ ├── app.ec69dd591d71bcf6f0f5.js │ ├── app.ec69dd591d71bcf6f0f5.js.map │ ├── manifest.54e67e9f17df71efc259.js │ ├── manifest.54e67e9f17df71efc259.js.map │ ├── vendor.4cb94b73d4795b4d9999.js │ ├── vendor.4cb94b73d4795b4d9999.js.map │ ├── vue-ssr-client-manifest.json │ └── vue-ssr-server-bundle.json ├── package-lock.json ├── package.json ├── render-vue-app.js ├── server.js └── src │ ├── App.vue │ ├── app.js │ ├── entry-client.js │ ├── entry-server.js │ └── index.template.html ├── vue-ssr-5 ├── build │ ├── setup-dev-server.js │ ├── vue-loader.config.js │ ├── webpack.base.config.js │ ├── webpack.client.config.js │ └── webpack.server.config.js ├── dist │ ├── app.04aafe95e9e39db0bd8f.js │ ├── app.04aafe95e9e39db0bd8f.js.map │ ├── manifest.54e67e9f17df71efc259.js │ ├── manifest.54e67e9f17df71efc259.js.map │ ├── vendor.d979c5f5d5c24fc2dec9.js │ ├── vendor.d979c5f5d5c24fc2dec9.js.map │ ├── vue-ssr-client-manifest.json │ └── vue-ssr-server-bundle.json ├── package-lock.json ├── package.json ├── server.js └── src │ ├── App.vue │ ├── app.js │ ├── entry-client.js │ ├── entry-server.js │ ├── index.template.html │ ├── pages │ ├── about.vue │ └── index.vue │ ├── router │ └── index.js │ └── store │ └── index.js ├── vue-ssr-6 ├── build │ ├── setup-dev-server.js │ ├── vue-loader.config.js │ ├── webpack.base.config.js │ ├── webpack.client.config.js │ └── webpack.server.config.js ├── dist │ ├── app.04aafe95e9e39db0bd8f.js │ ├── app.04aafe95e9e39db0bd8f.js.map │ ├── manifest.54e67e9f17df71efc259.js │ ├── manifest.54e67e9f17df71efc259.js.map │ ├── vendor.d979c5f5d5c24fc2dec9.js │ ├── vendor.d979c5f5d5c24fc2dec9.js.map │ ├── vue-ssr-client-manifest.json │ └── vue-ssr-server-bundle.json ├── package-lock.json ├── package.json ├── server.js └── src │ ├── App.vue │ ├── app.js │ ├── entry-client.js │ ├── entry-server.js │ ├── index.template.html │ ├── pages │ ├── about.vue │ └── index.vue │ ├── router │ └── index.js │ └── store │ └── index.js ├── vue-ssr-amsterdam.key └── vue-ssr-nuxt ├── .nuxt ├── App.js ├── client.js ├── components │ ├── no-ssr.js │ ├── nuxt-child.js │ ├── nuxt-error.vue │ ├── nuxt-link.js │ ├── nuxt-loading.vue │ └── nuxt.js ├── empty.js ├── index.js ├── layouts │ └── default.vue ├── loading.html ├── middleware.js ├── router.js ├── server.js ├── store.js ├── utils.js └── views │ ├── app.template.html │ └── error.html ├── package-lock.json ├── package.json ├── pages ├── about.vue └── index.vue └── store └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /vue-ssr-1/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-ssr", 3 | "version": "1.0.0", 4 | "description": "Vue.js & Vue-Server-Renderer", 5 | "scripts": { 6 | "dev": "node server.js" 7 | }, 8 | "dependencies": { 9 | "express": "^4.16.2", 10 | "vue": "^2.5.13", 11 | "vue-server-renderer": "^2.5.13" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /vue-ssr-1/render-vue-app.js: -------------------------------------------------------------------------------- 1 | const Vue = require('vue') 2 | const renderer = require('vue-server-renderer').createRenderer() 3 | 4 | module.exports = async (req, res) => { 5 | const app = new Vue({ 6 | data: { 7 | url: req.url 8 | }, 9 | template: `

The visited URL is: {{ url }}

` 10 | }) 11 | 12 | try { 13 | const appHtml = await renderer.renderToString(app) 14 | 15 | res.send(` 16 | 17 | 18 | Hello 19 | ${appHtml} 20 | ` 21 | ) 22 | } catch (err) { 23 | res.status(500).end(err.message) 24 | } 25 | } -------------------------------------------------------------------------------- /vue-ssr-1/server.js: -------------------------------------------------------------------------------- 1 | const server = require('express')() 2 | const renderVueApp = require('./render-vue-app') 3 | 4 | server.get('*', renderVueApp) 5 | 6 | server.listen(3000) 7 | console.log('Server listening on http://localhost:3000') -------------------------------------------------------------------------------- /vue-ssr-2/index.template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Hello 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /vue-ssr-2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-ssr", 3 | "version": "1.0.0", 4 | "description": "Vue.js & Vue-Server-Renderer", 5 | "scripts": { 6 | "dev": "node server.js" 7 | }, 8 | "dependencies": { 9 | "express": "^4.16.2", 10 | "vue": "^2.5.13", 11 | "vue-server-renderer": "^2.5.13" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /vue-ssr-2/render-vue-app.js: -------------------------------------------------------------------------------- 1 | const Vue = require('vue') 2 | const renderer = require('vue-server-renderer').createRenderer({ 3 | template: require('fs').readFileSync('./index.template.html', 'utf-8') 4 | }) 5 | 6 | module.exports = async (req, res) => { 7 | const app = new Vue({ 8 | data: { 9 | url: req.url 10 | }, 11 | template: `

The visited URL is: {{ url }}

` 12 | }) 13 | 14 | try { 15 | const html = await renderer.renderToString(app) 16 | 17 | res.send(html) 18 | } catch (err) { 19 | res.status(500).end(err.message) 20 | } 21 | } -------------------------------------------------------------------------------- /vue-ssr-2/server.js: -------------------------------------------------------------------------------- 1 | const server = require('express')() 2 | const renderVueApp = require('./render-vue-app') 3 | 4 | server.get('*', renderVueApp) 5 | 6 | server.listen(3000) 7 | console.log('Server listening on http://localhost:3000') -------------------------------------------------------------------------------- /vue-ssr-3/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-ssr", 3 | "version": "1.0.0", 4 | "description": "Vue.js & Vue-Server-Renderer", 5 | "scripts": { 6 | "dev": "node server.js" 7 | }, 8 | "dependencies": { 9 | "express": "^4.16.2", 10 | "vue": "^2.5.13", 11 | "vue-server-renderer": "^2.5.13" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /vue-ssr-3/render-vue-app.js: -------------------------------------------------------------------------------- 1 | const renderer = require('vue-server-renderer').createRenderer({ 2 | template: require('fs').readFileSync('./src/index.template.html', 'utf-8') 3 | }) 4 | const createApp = require('./src/app') 5 | 6 | module.exports = async (req, res) => { 7 | try { 8 | const context = { url: req.url } 9 | const app = createApp(context) 10 | const html = await renderer.renderToString(app) 11 | 12 | res.send(html) 13 | } catch (err) { 14 | res.status(500).end(err.message) 15 | } 16 | } -------------------------------------------------------------------------------- /vue-ssr-3/server.js: -------------------------------------------------------------------------------- 1 | const server = require('express')() 2 | const renderVueApp = require('./render-vue-app') 3 | 4 | server.get('*', renderVueApp) 5 | 6 | server.listen(3000) 7 | console.log('Server listening on http://localhost:3000') -------------------------------------------------------------------------------- /vue-ssr-3/src/app.js: -------------------------------------------------------------------------------- 1 | const Vue = require('vue') 2 | 3 | module.exports = (context) => { 4 | const app = new Vue({ 5 | data: { 6 | url: context.url 7 | }, 8 | template: `
9 |

The visited URL is: {{ url }}

10 | 11 |
`, 12 | methods: { 13 | sayHello() { 14 | window.alert('Hello!') 15 | } 16 | } 17 | }) 18 | 19 | return app 20 | } -------------------------------------------------------------------------------- /vue-ssr-3/src/index.template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Hello 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /vue-ssr-4/build/vue-loader.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extractCSS: process.env.NODE_ENV === 'production', 3 | preserveWhitespace: false, 4 | postcss: [ 5 | require('autoprefixer')({ 6 | browsers: ['last 3 versions'] 7 | }) 8 | ] 9 | } -------------------------------------------------------------------------------- /vue-ssr-4/build/webpack.base.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const webpack = require('webpack') 3 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 5 | const vueConfig = require('./vue-loader.config') 6 | 7 | const isProd = process.env.NODE_ENV === 'production' 8 | 9 | module.exports = { 10 | devtool: isProd 11 | ? false 12 | : '#cheap-module-source-map', 13 | output: { 14 | path: path.resolve(__dirname, '../dist'), 15 | publicPath: '/dist/', 16 | filename: '[name].[chunkhash].js' 17 | }, 18 | module: { 19 | noParse: /es6-promise\.js$/, // avoid webpack shimming process 20 | rules: [ 21 | { 22 | test: /\.vue$/, 23 | loader: 'vue-loader', 24 | options: vueConfig 25 | }, 26 | { 27 | test: /\.js$/, 28 | loader: 'babel-loader', 29 | exclude: /node_modules/ 30 | }, 31 | { 32 | test: /\.(png|jpg|gif|svg)$/, 33 | loader: 'url-loader', 34 | options: { 35 | limit: 10000, 36 | name: '[name].[ext]?[hash]' 37 | } 38 | }, 39 | { 40 | test: /\.css$/, 41 | use: isProd 42 | ? ExtractTextPlugin.extract({ 43 | use: 'css-loader?minimize', 44 | fallback: 'vue-style-loader' 45 | }) 46 | : ['vue-style-loader', 'css-loader'] 47 | } 48 | ] 49 | }, 50 | performance: { 51 | maxEntrypointSize: 300000, 52 | hints: isProd ? 'warning' : false 53 | }, 54 | plugins: isProd 55 | ? [ 56 | new webpack.optimize.UglifyJsPlugin({ 57 | compress: { warnings: false } 58 | }), 59 | new webpack.optimize.ModuleConcatenationPlugin(), 60 | new ExtractTextPlugin({ 61 | filename: 'common.[chunkhash].css' 62 | }) 63 | ] 64 | : [ 65 | new FriendlyErrorsPlugin() 66 | ] 67 | } -------------------------------------------------------------------------------- /vue-ssr-4/build/webpack.client.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const merge = require('webpack-merge') 3 | const VueSSRClientPlugin = require('vue-server-renderer/client-plugin') 4 | const base = require('./webpack.base.config') 5 | 6 | const config = merge(base, { 7 | entry: { 8 | app: './src/entry-client.js' 9 | }, 10 | plugins: [ 11 | // strip dev-only code in Vue source 12 | new webpack.DefinePlugin({ 13 | 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'), 14 | 'process.env.VUE_ENV': '"client"' 15 | }), 16 | // extract vendor chunks for better caching 17 | new webpack.optimize.CommonsChunkPlugin({ 18 | name: 'vendor', 19 | minChunks: function (module) { 20 | // a module is extracted into the vendor chunk if... 21 | return ( 22 | // it's inside node_modules 23 | /node_modules/.test(module.context) && 24 | // and not a CSS file (due to extract-text-webpack-plugin limitation) 25 | !/\.css$/.test(module.request) 26 | ) 27 | } 28 | }), 29 | // extract webpack runtime & manifest to avoid vendor chunk hash changing 30 | // on every build. 31 | new webpack.optimize.CommonsChunkPlugin({ 32 | name: 'manifest', 33 | minChunks: Infinity 34 | }), 35 | // This plugins generates `vue-ssr-client-manifest.json` in the 36 | // output directory. 37 | new VueSSRClientPlugin() 38 | ] 39 | }) 40 | 41 | module.exports = config -------------------------------------------------------------------------------- /vue-ssr-4/build/webpack.server.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const merge = require('webpack-merge') 3 | const base = require('./webpack.base.config') 4 | const nodeExternals = require('webpack-node-externals') 5 | const VueSSRServerPlugin = require('vue-server-renderer/server-plugin') 6 | 7 | module.exports = merge(base, { 8 | target: 'node', 9 | devtool: '#source-map', 10 | entry: './src/entry-server.js', 11 | output: { 12 | filename: 'server-bundle.js', 13 | libraryTarget: 'commonjs2' 14 | }, 15 | // https://webpack.js.org/configuration/externals/#externals 16 | // https://github.com/liady/webpack-node-externals 17 | externals: nodeExternals({ 18 | // do not externalize CSS files in case we need to import it from a dependency 19 | whitelist: /\.css$/ 20 | }), 21 | plugins: [ 22 | new webpack.DefinePlugin({ 23 | 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'), 24 | 'process.env.VUE_ENV': '"server"' 25 | }), 26 | new VueSSRServerPlugin() 27 | ] 28 | }) -------------------------------------------------------------------------------- /vue-ssr-4/dist/app.1b581a83e10a60dc66e9.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],[ 2 | /* 0 */, 3 | /* 1 */ 4 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 5 | 6 | "use strict"; 7 | // 8 | // 9 | // 10 | // 11 | // 12 | // 13 | // 14 | 15 | /* harmony default export */ __webpack_exports__["a"] = ({ 16 | data() { 17 | return { 18 | url: 'Lost it' 19 | }; 20 | }, 21 | methods: { 22 | sayHello() { 23 | window.alert('Hello!'); 24 | } 25 | } 26 | }); 27 | 28 | /***/ }), 29 | /* 2 */ 30 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 31 | 32 | "use strict"; 33 | Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); 34 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(3); 35 | 36 | 37 | const { app } = Object(__WEBPACK_IMPORTED_MODULE_0__app__["a" /* createApp */])(); 38 | 39 | // This assumes App.vue template root element has `id="app"` 40 | app.$mount('#app'); 41 | 42 | /***/ }), 43 | /* 3 */ 44 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 45 | 46 | "use strict"; 47 | /* harmony export (immutable) */ __webpack_exports__["a"] = createApp; 48 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(4); 49 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__App_vue__ = __webpack_require__(8); 50 | 51 | 52 | 53 | /* 54 | ** Export a factory function for creating fresh app, 55 | ** router and store instances 56 | */ 57 | function createApp(context) { 58 | const app = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */](__WEBPACK_IMPORTED_MODULE_1__App_vue__["a" /* default */]); 59 | 60 | return { app }; 61 | } 62 | 63 | /***/ }), 64 | /* 4 */, 65 | /* 5 */, 66 | /* 6 */, 67 | /* 7 */, 68 | /* 8 */ 69 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 70 | 71 | "use strict"; 72 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__ = __webpack_require__(1); 73 | /* unused harmony namespace reexport */ 74 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__ = __webpack_require__(9); 75 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(10); 76 | var disposed = false 77 | /* script */ 78 | 79 | 80 | /* template */ 81 | 82 | /* template functional */ 83 | var __vue_template_functional__ = false 84 | /* styles */ 85 | var __vue_styles__ = null 86 | /* scopeId */ 87 | var __vue_scopeId__ = null 88 | /* moduleIdentifier (server only) */ 89 | var __vue_module_identifier__ = null 90 | 91 | var Component = Object(__WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 92 | __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__["a" /* default */], 93 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["a" /* render */], 94 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["b" /* staticRenderFns */], 95 | __vue_template_functional__, 96 | __vue_styles__, 97 | __vue_scopeId__, 98 | __vue_module_identifier__ 99 | ) 100 | Component.options.__file = "src/App.vue" 101 | 102 | /* hot reload */ 103 | if (false) {(function () { 104 | var hotAPI = require("vue-hot-reload-api") 105 | hotAPI.install(require("vue"), false) 106 | if (!hotAPI.compatible) return 107 | module.hot.accept() 108 | if (!module.hot.data) { 109 | hotAPI.createRecord("data-v-7ba5bd90", Component.options) 110 | } else { 111 | hotAPI.reload("data-v-7ba5bd90", Component.options) 112 | } 113 | module.hot.dispose(function (data) { 114 | disposed = true 115 | }) 116 | })()} 117 | 118 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 119 | 120 | 121 | /***/ }), 122 | /* 9 */ 123 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 124 | 125 | "use strict"; 126 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 127 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 128 | var render = function() { 129 | var _vm = this 130 | var _h = _vm.$createElement 131 | var _c = _vm._self._c || _h 132 | return _c("div", [ 133 | _c("p", [_vm._v("The visited URL is: " + _vm._s(_vm.url))]), 134 | _c("button", { on: { click: _vm.sayHello } }, [_vm._v("Hello")]) 135 | ]) 136 | } 137 | var staticRenderFns = [] 138 | render._withStripped = true 139 | 140 | if (false) { 141 | module.hot.accept() 142 | if (module.hot.data) { 143 | require("vue-hot-reload-api") .rerender("data-v-7ba5bd90", { render: render, staticRenderFns: staticRenderFns }) 144 | } 145 | } 146 | 147 | /***/ }) 148 | ],[2]); 149 | //# sourceMappingURL=app.1b581a83e10a60dc66e9.js.map -------------------------------------------------------------------------------- /vue-ssr-4/dist/app.1b581a83e10a60dc66e9.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"app.1b581a83e10a60dc66e9.js","sources":["webpack:///App.vue","webpack:///src/entry-client.js","webpack:///src/app.js","webpack:///./src/App.vue","webpack:///./src/App.vue?3a25"],"sourcesContent":["\n\n\n\n\n// WEBPACK FOOTER //\n// App.vue","import { createApp } from './app'\n\nconst { app } = createApp()\n\n// This assumes App.vue template root element has `id=\"app\"`\napp.$mount('#app')\n\n\n// WEBPACK FOOTER //\n// src/entry-client.js","import Vue from 'vue'\nimport App from './App.vue'\n\n/*\n** Export a factory function for creating fresh app,\n** router and store instances\n*/\nexport function createApp (context) {\n\tconst app = new Vue(App)\n\n\treturn { app }\n}\n\n\n// WEBPACK FOOTER //\n// src/app.js","var disposed = false\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7ba5bd90\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/App.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-7ba5bd90\", Component.options)\n } else {\n hotAPI.reload(\"data-v-7ba5bd90\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = 8\n// module chunks = 1","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\"p\", [_vm._v(\"The visited URL is: \" + _vm._s(_vm.url))]),\n _c(\"button\", { on: { click: _vm.sayHello } }, [_vm._v(\"Hello\")])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-7ba5bd90\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7ba5bd90\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = 9\n// module chunks = 1"],"mappings":";;;;;;;;;;;;;;AAQA;AAEA;;AAEA;AADA;AAGA;;AAEA;AACA;AACA;AAHA;AANA;;;;;;;ACTA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACXA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1CA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} -------------------------------------------------------------------------------- /vue-ssr-4/dist/app.96af4d5258d43d16dc20.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],[ 2 | /* 0 */, 3 | /* 1 */ 4 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 5 | 6 | "use strict"; 7 | // 8 | // 9 | // 10 | // 11 | // 12 | // 13 | // 14 | 15 | /* harmony default export */ __webpack_exports__["a"] = ({ 16 | data() { 17 | return { 18 | url: 'Lost it' 19 | }; 20 | }, 21 | methods: { 22 | sayHello() { 23 | window.alert('Hello!'); 24 | } 25 | } 26 | }); 27 | 28 | /***/ }), 29 | /* 2 */ 30 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 31 | 32 | "use strict"; 33 | Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); 34 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(3); 35 | 36 | 37 | const { app } = Object(__WEBPACK_IMPORTED_MODULE_0__app__["a" /* createApp */])(); 38 | 39 | // This assumes App.vue template root element has `id="app"` 40 | app.$mount('#app'); 41 | 42 | /***/ }), 43 | /* 3 */ 44 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 45 | 46 | "use strict"; 47 | /* harmony export (immutable) */ __webpack_exports__["a"] = createApp; 48 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(4); 49 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__App_vue__ = __webpack_require__(8); 50 | 51 | 52 | 53 | /* 54 | ** Export a factory function for creating fresh app, 55 | ** router and store instances 56 | */ 57 | function createApp(context) { 58 | const app = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */](__WEBPACK_IMPORTED_MODULE_1__App_vue__["a" /* default */]); 59 | 60 | return { app }; 61 | } 62 | 63 | /***/ }), 64 | /* 4 */, 65 | /* 5 */, 66 | /* 6 */, 67 | /* 7 */, 68 | /* 8 */ 69 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 70 | 71 | "use strict"; 72 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__ = __webpack_require__(1); 73 | /* unused harmony namespace reexport */ 74 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__ = __webpack_require__(9); 75 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(10); 76 | var disposed = false 77 | /* script */ 78 | 79 | 80 | /* template */ 81 | 82 | /* template functional */ 83 | var __vue_template_functional__ = false 84 | /* styles */ 85 | var __vue_styles__ = null 86 | /* scopeId */ 87 | var __vue_scopeId__ = null 88 | /* moduleIdentifier (server only) */ 89 | var __vue_module_identifier__ = null 90 | 91 | var Component = Object(__WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 92 | __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__["a" /* default */], 93 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["a" /* render */], 94 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["b" /* staticRenderFns */], 95 | __vue_template_functional__, 96 | __vue_styles__, 97 | __vue_scopeId__, 98 | __vue_module_identifier__ 99 | ) 100 | Component.options.__file = "src/App.vue" 101 | 102 | /* hot reload */ 103 | if (false) {(function () { 104 | var hotAPI = require("vue-hot-reload-api") 105 | hotAPI.install(require("vue"), false) 106 | if (!hotAPI.compatible) return 107 | module.hot.accept() 108 | if (!module.hot.data) { 109 | hotAPI.createRecord("data-v-7ba5bd90", Component.options) 110 | } else { 111 | hotAPI.reload("data-v-7ba5bd90", Component.options) 112 | } 113 | module.hot.dispose(function (data) { 114 | disposed = true 115 | }) 116 | })()} 117 | 118 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 119 | 120 | 121 | /***/ }), 122 | /* 9 */ 123 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 124 | 125 | "use strict"; 126 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 127 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 128 | var render = function() { 129 | var _vm = this 130 | var _h = _vm.$createElement 131 | var _c = _vm._self._c || _h 132 | return _c("div", { attrs: { id: "app" } }, [ 133 | _c("p", [_vm._v("The visited URL is: " + _vm._s(_vm.url))]), 134 | _c("button", { on: { click: _vm.sayHello } }, [_vm._v("Hello")]) 135 | ]) 136 | } 137 | var staticRenderFns = [] 138 | render._withStripped = true 139 | 140 | if (false) { 141 | module.hot.accept() 142 | if (module.hot.data) { 143 | require("vue-hot-reload-api") .rerender("data-v-7ba5bd90", { render: render, staticRenderFns: staticRenderFns }) 144 | } 145 | } 146 | 147 | /***/ }) 148 | ],[2]); 149 | //# sourceMappingURL=app.96af4d5258d43d16dc20.js.map -------------------------------------------------------------------------------- /vue-ssr-4/dist/app.96af4d5258d43d16dc20.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"app.96af4d5258d43d16dc20.js","sources":["webpack:///App.vue","webpack:///src/entry-client.js","webpack:///src/app.js","webpack:///./src/App.vue","webpack:///./src/App.vue?3a25"],"sourcesContent":["\n\n\n\n\n// WEBPACK FOOTER //\n// App.vue","import { createApp } from './app'\n\nconst { app } = createApp()\n\n// This assumes App.vue template root element has `id=\"app\"`\napp.$mount('#app')\n\n\n// WEBPACK FOOTER //\n// src/entry-client.js","import Vue from 'vue'\nimport App from './App.vue'\n\n/*\n** Export a factory function for creating fresh app,\n** router and store instances\n*/\nexport function createApp (context) {\n\tconst app = new Vue(App)\n\n\treturn { app }\n}\n\n\n// WEBPACK FOOTER //\n// src/app.js","var disposed = false\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7ba5bd90\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/App.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-7ba5bd90\", Component.options)\n } else {\n hotAPI.reload(\"data-v-7ba5bd90\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = 8\n// module chunks = 1","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"app\" } }, [\n _c(\"p\", [_vm._v(\"The visited URL is: \" + _vm._s(_vm.url))]),\n _c(\"button\", { on: { click: _vm.sayHello } }, [_vm._v(\"Hello\")])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-7ba5bd90\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7ba5bd90\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = 9\n// module chunks = 1"],"mappings":";;;;;;;;;;;;;;AAQA;AAEA;;AAEA;AADA;AAGA;;AAEA;AACA;AACA;AAHA;AANA;;;;;;;ACTA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACXA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1CA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} -------------------------------------------------------------------------------- /vue-ssr-4/dist/app.e58ef690df1810e3a94a.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],[ 2 | /* 0 */, 3 | /* 1 */ 4 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 5 | 6 | "use strict"; 7 | // 8 | // 9 | // 10 | // 11 | // 12 | // 13 | // 14 | 15 | /* harmony default export */ __webpack_exports__["a"] = ({ 16 | data() { 17 | return { 18 | url: 'Lost it' 19 | }; 20 | } 21 | }); 22 | 23 | /***/ }), 24 | /* 2 */ 25 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 26 | 27 | "use strict"; 28 | Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); 29 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(3); 30 | 31 | 32 | const { app } = Object(__WEBPACK_IMPORTED_MODULE_0__app__["a" /* createApp */])(); 33 | 34 | // This assumes App.vue template root element has `id="app"` 35 | app.$mount('#app'); 36 | 37 | /***/ }), 38 | /* 3 */ 39 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 40 | 41 | "use strict"; 42 | /* harmony export (immutable) */ __webpack_exports__["a"] = createApp; 43 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(4); 44 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__App_vue__ = __webpack_require__(8); 45 | 46 | 47 | 48 | /* 49 | ** Export a factory function for creating fresh app, 50 | ** router and store instances 51 | */ 52 | function createApp(context) { 53 | const app = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */]({ 54 | // the root instance simply renders the App component. 55 | render: h => h(__WEBPACK_IMPORTED_MODULE_1__App_vue__["a" /* default */]) 56 | }); 57 | 58 | return { app }; 59 | } 60 | 61 | /***/ }), 62 | /* 4 */, 63 | /* 5 */, 64 | /* 6 */, 65 | /* 7 */, 66 | /* 8 */ 67 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 68 | 69 | "use strict"; 70 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__ = __webpack_require__(1); 71 | /* unused harmony namespace reexport */ 72 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__ = __webpack_require__(9); 73 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(10); 74 | var disposed = false 75 | /* script */ 76 | 77 | 78 | /* template */ 79 | 80 | /* template functional */ 81 | var __vue_template_functional__ = false 82 | /* styles */ 83 | var __vue_styles__ = null 84 | /* scopeId */ 85 | var __vue_scopeId__ = null 86 | /* moduleIdentifier (server only) */ 87 | var __vue_module_identifier__ = null 88 | 89 | var Component = Object(__WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 90 | __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__["a" /* default */], 91 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["a" /* render */], 92 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["b" /* staticRenderFns */], 93 | __vue_template_functional__, 94 | __vue_styles__, 95 | __vue_scopeId__, 96 | __vue_module_identifier__ 97 | ) 98 | Component.options.__file = "src/App.vue" 99 | 100 | /* hot reload */ 101 | if (false) {(function () { 102 | var hotAPI = require("vue-hot-reload-api") 103 | hotAPI.install(require("vue"), false) 104 | if (!hotAPI.compatible) return 105 | module.hot.accept() 106 | if (!module.hot.data) { 107 | hotAPI.createRecord("data-v-7ba5bd90", Component.options) 108 | } else { 109 | hotAPI.reload("data-v-7ba5bd90", Component.options) 110 | } 111 | module.hot.dispose(function (data) { 112 | disposed = true 113 | }) 114 | })()} 115 | 116 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 117 | 118 | 119 | /***/ }), 120 | /* 9 */ 121 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 122 | 123 | "use strict"; 124 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 125 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 126 | var render = function() { 127 | var _vm = this 128 | var _h = _vm.$createElement 129 | var _c = _vm._self._c || _h 130 | return _c("div", [ 131 | _c("p", [_vm._v("The visited URL is: " + _vm._s(_vm.url))]), 132 | _c( 133 | "button", 134 | { 135 | on: { 136 | click: function($event) { 137 | _vm.alert("hello") 138 | } 139 | } 140 | }, 141 | [_vm._v("Hello")] 142 | ) 143 | ]) 144 | } 145 | var staticRenderFns = [] 146 | render._withStripped = true 147 | 148 | if (false) { 149 | module.hot.accept() 150 | if (module.hot.data) { 151 | require("vue-hot-reload-api") .rerender("data-v-7ba5bd90", { render: render, staticRenderFns: staticRenderFns }) 152 | } 153 | } 154 | 155 | /***/ }) 156 | ],[2]); 157 | //# sourceMappingURL=app.e58ef690df1810e3a94a.js.map -------------------------------------------------------------------------------- /vue-ssr-4/dist/app.e58ef690df1810e3a94a.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"app.e58ef690df1810e3a94a.js","sources":["webpack:///App.vue","webpack:///src/entry-client.js","webpack:///src/app.js","webpack:///./src/App.vue","webpack:///./src/App.vue?3a25"],"sourcesContent":["\n\n\n\n\n// WEBPACK FOOTER //\n// App.vue","import { createApp } from './app'\n\nconst { app } = createApp()\n\n// This assumes App.vue template root element has `id=\"app\"`\napp.$mount('#app')\n\n\n// WEBPACK FOOTER //\n// src/entry-client.js","import Vue from 'vue'\nimport App from './App.vue'\n\n/*\n** Export a factory function for creating fresh app,\n** router and store instances\n*/\nexport function createApp (context) {\n\tconst app = new Vue({\n\t\t// the root instance simply renders the App component.\n\t\trender: h => h(App)\n\t})\n\n\treturn { app }\n}\n\n\n// WEBPACK FOOTER //\n// src/app.js","var disposed = false\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7ba5bd90\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/App.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-7ba5bd90\", Component.options)\n } else {\n hotAPI.reload(\"data-v-7ba5bd90\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = 8\n// module chunks = 1","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\"p\", [_vm._v(\"The visited URL is: \" + _vm._s(_vm.url))]),\n _c(\n \"button\",\n {\n on: {\n click: function($event) {\n _vm.alert(\"hello\")\n }\n }\n },\n [_vm._v(\"Hello\")]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-7ba5bd90\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7ba5bd90\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = 9\n// module chunks = 1"],"mappings":";;;;;;;;;;;;;;AAQA;AAEA;;AAEA;AADA;AAGA;AALA;;;;;;;ACTA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AAFA;AACA;AAIA;AACA;;;;;;;;;;;ACdA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1CA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} -------------------------------------------------------------------------------- /vue-ssr-4/dist/app.ec69dd591d71bcf6f0f5.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],[ 2 | /* 0 */, 3 | /* 1 */ 4 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 5 | 6 | "use strict"; 7 | // 8 | // 9 | // 10 | // 11 | // 12 | // 13 | // 14 | 15 | /* harmony default export */ __webpack_exports__["a"] = ({ 16 | data() { 17 | return { 18 | url: 'Lost it' 19 | }; 20 | } 21 | }); 22 | 23 | /***/ }), 24 | /* 2 */ 25 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 26 | 27 | "use strict"; 28 | Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); 29 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(3); 30 | 31 | 32 | const { app } = Object(__WEBPACK_IMPORTED_MODULE_0__app__["a" /* createApp */])(); 33 | 34 | // This assumes App.vue template root element has `id="app"` 35 | app.$mount('#app'); 36 | 37 | /***/ }), 38 | /* 3 */ 39 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 40 | 41 | "use strict"; 42 | /* harmony export (immutable) */ __webpack_exports__["a"] = createApp; 43 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(4); 44 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__App_vue__ = __webpack_require__(8); 45 | 46 | 47 | 48 | /* 49 | ** Export a factory function for creating fresh app, 50 | ** router and store instances 51 | */ 52 | function createApp(context) { 53 | const app = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */](__WEBPACK_IMPORTED_MODULE_1__App_vue__["a" /* default */]); 54 | 55 | return { app }; 56 | } 57 | 58 | /***/ }), 59 | /* 4 */, 60 | /* 5 */, 61 | /* 6 */, 62 | /* 7 */, 63 | /* 8 */ 64 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 65 | 66 | "use strict"; 67 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__ = __webpack_require__(1); 68 | /* unused harmony namespace reexport */ 69 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__ = __webpack_require__(9); 70 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(10); 71 | var disposed = false 72 | /* script */ 73 | 74 | 75 | /* template */ 76 | 77 | /* template functional */ 78 | var __vue_template_functional__ = false 79 | /* styles */ 80 | var __vue_styles__ = null 81 | /* scopeId */ 82 | var __vue_scopeId__ = null 83 | /* moduleIdentifier (server only) */ 84 | var __vue_module_identifier__ = null 85 | 86 | var Component = Object(__WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 87 | __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__["a" /* default */], 88 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["a" /* render */], 89 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["b" /* staticRenderFns */], 90 | __vue_template_functional__, 91 | __vue_styles__, 92 | __vue_scopeId__, 93 | __vue_module_identifier__ 94 | ) 95 | Component.options.__file = "src/App.vue" 96 | 97 | /* hot reload */ 98 | if (false) {(function () { 99 | var hotAPI = require("vue-hot-reload-api") 100 | hotAPI.install(require("vue"), false) 101 | if (!hotAPI.compatible) return 102 | module.hot.accept() 103 | if (!module.hot.data) { 104 | hotAPI.createRecord("data-v-7ba5bd90", Component.options) 105 | } else { 106 | hotAPI.reload("data-v-7ba5bd90", Component.options) 107 | } 108 | module.hot.dispose(function (data) { 109 | disposed = true 110 | }) 111 | })()} 112 | 113 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 114 | 115 | 116 | /***/ }), 117 | /* 9 */ 118 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 119 | 120 | "use strict"; 121 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 122 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 123 | var render = function() { 124 | var _vm = this 125 | var _h = _vm.$createElement 126 | var _c = _vm._self._c || _h 127 | return _c("div", [ 128 | _c("p", [_vm._v("The visited URL is: " + _vm._s(_vm.url))]), 129 | _c( 130 | "button", 131 | { 132 | on: { 133 | click: function($event) { 134 | _vm.console.log("hello") 135 | } 136 | } 137 | }, 138 | [_vm._v("Hello")] 139 | ) 140 | ]) 141 | } 142 | var staticRenderFns = [] 143 | render._withStripped = true 144 | 145 | if (false) { 146 | module.hot.accept() 147 | if (module.hot.data) { 148 | require("vue-hot-reload-api") .rerender("data-v-7ba5bd90", { render: render, staticRenderFns: staticRenderFns }) 149 | } 150 | } 151 | 152 | /***/ }) 153 | ],[2]); 154 | //# sourceMappingURL=app.ec69dd591d71bcf6f0f5.js.map -------------------------------------------------------------------------------- /vue-ssr-4/dist/app.ec69dd591d71bcf6f0f5.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"app.ec69dd591d71bcf6f0f5.js","sources":["webpack:///App.vue","webpack:///src/entry-client.js","webpack:///src/app.js","webpack:///./src/App.vue","webpack:///./src/App.vue?3a25"],"sourcesContent":["\n\n\n\n\n// WEBPACK FOOTER //\n// App.vue","import { createApp } from './app'\n\nconst { app } = createApp()\n\n// This assumes App.vue template root element has `id=\"app\"`\napp.$mount('#app')\n\n\n// WEBPACK FOOTER //\n// src/entry-client.js","import Vue from 'vue'\nimport App from './App.vue'\n\n/*\n** Export a factory function for creating fresh app,\n** router and store instances\n*/\nexport function createApp (context) {\n\tconst app = new Vue(App)\n\n\treturn { app }\n}\n\n\n// WEBPACK FOOTER //\n// src/app.js","var disposed = false\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7ba5bd90\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/App.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-7ba5bd90\", Component.options)\n } else {\n hotAPI.reload(\"data-v-7ba5bd90\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = 8\n// module chunks = 1","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\"p\", [_vm._v(\"The visited URL is: \" + _vm._s(_vm.url))]),\n _c(\n \"button\",\n {\n on: {\n click: function($event) {\n _vm.console.log(\"hello\")\n }\n }\n },\n [_vm._v(\"Hello\")]\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-7ba5bd90\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7ba5bd90\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = 9\n// module chunks = 1"],"mappings":";;;;;;;;;;;;;;AAQA;AAEA;;AAEA;AADA;AAGA;AALA;;;;;;;ACTA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACXA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1CA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} -------------------------------------------------------------------------------- /vue-ssr-4/dist/manifest.54e67e9f17df71efc259.js: -------------------------------------------------------------------------------- 1 | /******/ (function(modules) { // webpackBootstrap 2 | /******/ // install a JSONP callback for chunk loading 3 | /******/ var parentJsonpFunction = window["webpackJsonp"]; 4 | /******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) { 5 | /******/ // add "moreModules" to the modules object, 6 | /******/ // then flag all "chunkIds" as loaded and fire callback 7 | /******/ var moduleId, chunkId, i = 0, resolves = [], result; 8 | /******/ for(;i < chunkIds.length; i++) { 9 | /******/ chunkId = chunkIds[i]; 10 | /******/ if(installedChunks[chunkId]) { 11 | /******/ resolves.push(installedChunks[chunkId][0]); 12 | /******/ } 13 | /******/ installedChunks[chunkId] = 0; 14 | /******/ } 15 | /******/ for(moduleId in moreModules) { 16 | /******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { 17 | /******/ modules[moduleId] = moreModules[moduleId]; 18 | /******/ } 19 | /******/ } 20 | /******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules); 21 | /******/ while(resolves.length) { 22 | /******/ resolves.shift()(); 23 | /******/ } 24 | /******/ if(executeModules) { 25 | /******/ for(i=0; i < executeModules.length; i++) { 26 | /******/ result = __webpack_require__(__webpack_require__.s = executeModules[i]); 27 | /******/ } 28 | /******/ } 29 | /******/ return result; 30 | /******/ }; 31 | /******/ 32 | /******/ // The module cache 33 | /******/ var installedModules = {}; 34 | /******/ 35 | /******/ // objects to store loaded and loading chunks 36 | /******/ var installedChunks = { 37 | /******/ 2: 0 38 | /******/ }; 39 | /******/ 40 | /******/ // The require function 41 | /******/ function __webpack_require__(moduleId) { 42 | /******/ 43 | /******/ // Check if module is in cache 44 | /******/ if(installedModules[moduleId]) { 45 | /******/ return installedModules[moduleId].exports; 46 | /******/ } 47 | /******/ // Create a new module (and put it into the cache) 48 | /******/ var module = installedModules[moduleId] = { 49 | /******/ i: moduleId, 50 | /******/ l: false, 51 | /******/ exports: {} 52 | /******/ }; 53 | /******/ 54 | /******/ // Execute the module function 55 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 56 | /******/ 57 | /******/ // Flag the module as loaded 58 | /******/ module.l = true; 59 | /******/ 60 | /******/ // Return the exports of the module 61 | /******/ return module.exports; 62 | /******/ } 63 | /******/ 64 | /******/ 65 | /******/ // expose the modules object (__webpack_modules__) 66 | /******/ __webpack_require__.m = modules; 67 | /******/ 68 | /******/ // expose the module cache 69 | /******/ __webpack_require__.c = installedModules; 70 | /******/ 71 | /******/ // define getter function for harmony exports 72 | /******/ __webpack_require__.d = function(exports, name, getter) { 73 | /******/ if(!__webpack_require__.o(exports, name)) { 74 | /******/ Object.defineProperty(exports, name, { 75 | /******/ configurable: false, 76 | /******/ enumerable: true, 77 | /******/ get: getter 78 | /******/ }); 79 | /******/ } 80 | /******/ }; 81 | /******/ 82 | /******/ // getDefaultExport function for compatibility with non-harmony modules 83 | /******/ __webpack_require__.n = function(module) { 84 | /******/ var getter = module && module.__esModule ? 85 | /******/ function getDefault() { return module['default']; } : 86 | /******/ function getModuleExports() { return module; }; 87 | /******/ __webpack_require__.d(getter, 'a', getter); 88 | /******/ return getter; 89 | /******/ }; 90 | /******/ 91 | /******/ // Object.prototype.hasOwnProperty.call 92 | /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 93 | /******/ 94 | /******/ // __webpack_public_path__ 95 | /******/ __webpack_require__.p = "/dist/"; 96 | /******/ 97 | /******/ // on error function for async loading 98 | /******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; 99 | /******/ }) 100 | /************************************************************************/ 101 | /******/ ([]); 102 | //# sourceMappingURL=manifest.54e67e9f17df71efc259.js.map -------------------------------------------------------------------------------- /vue-ssr-4/dist/manifest.54e67e9f17df71efc259.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"manifest.54e67e9f17df71efc259.js","sources":["webpack:///webpack/bootstrap 57c9b3f77efe5307fcbf"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 57c9b3f77efe5307fcbf"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} -------------------------------------------------------------------------------- /vue-ssr-4/dist/vue-ssr-client-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "publicPath": "/dist/", 3 | "all": [ 4 | "vendor.4cb94b73d4795b4d9999.js", 5 | "app.96af4d5258d43d16dc20.js", 6 | "manifest.54e67e9f17df71efc259.js", 7 | "vendor.4cb94b73d4795b4d9999.js.map", 8 | "app.96af4d5258d43d16dc20.js.map", 9 | "manifest.54e67e9f17df71efc259.js.map" 10 | ], 11 | "initial": [ 12 | "manifest.54e67e9f17df71efc259.js", 13 | "vendor.4cb94b73d4795b4d9999.js", 14 | "app.96af4d5258d43d16dc20.js" 15 | ], 16 | "async": [], 17 | "modules": { 18 | "38cd436c": [ 19 | 0, 20 | 3 21 | ], 22 | "75f0c764": [ 23 | 1, 24 | 4 25 | ], 26 | "fe068bc4": [ 27 | 1, 28 | 4 29 | ], 30 | "21707a29": [ 31 | 1, 32 | 4 33 | ], 34 | "a0e9e66c": [ 35 | 0, 36 | 3 37 | ], 38 | "39f06fb6": [ 39 | 0, 40 | 3 41 | ], 42 | "0763ed98": [ 43 | 0, 44 | 3 45 | ], 46 | "7831c00a": [ 47 | 0, 48 | 3 49 | ], 50 | "1302e0d6": [ 51 | 1, 52 | 4 53 | ], 54 | "7e9642e4": [ 55 | 1, 56 | 4 57 | ], 58 | "47e73a78": [ 59 | 0, 60 | 3 61 | ] 62 | } 63 | } -------------------------------------------------------------------------------- /vue-ssr-4/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-ssr", 3 | "version": "1.0.0", 4 | "description": "Vue.js & Vue-Server-Renderer", 5 | "scripts": { 6 | "dev": "npm run build && node server.js", 7 | "build": "npm run build:client && npm run build:server", 8 | "build:client": "webpack --config build/webpack.client.config.js --progress --hide-modules", 9 | "build:server": "webpack --config build/webpack.server.config.js --progress --hide-modules" 10 | }, 11 | "dependencies": { 12 | "es6-promise": "^4.2.4", 13 | "express": "^4.16.2", 14 | "vue": "^2.5.13", 15 | "vue-server-renderer": "^2.5.13" 16 | }, 17 | "devDependencies": { 18 | "autoprefixer": "^8.0.0", 19 | "babel-core": "^6.26.0", 20 | "babel-loader": "^7.1.2", 21 | "css-loader": "^0.28.9", 22 | "extract-text-webpack-plugin": "^3.0.2", 23 | "file-loader": "^1.1.6", 24 | "friendly-errors-webpack-plugin": "^1.6.1", 25 | "url-loader": "^0.6.2", 26 | "vue-loader": "^14.1.1", 27 | "vue-style-loader": "^3.1.2", 28 | "vue-template-compiler": "^2.5.13", 29 | "webpack": "^3.11.0", 30 | "webpack-merge": "^4.1.1", 31 | "webpack-node-externals": "^1.6.0" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /vue-ssr-4/render-vue-app.js: -------------------------------------------------------------------------------- 1 | const { createBundleRenderer } = require('vue-server-renderer') 2 | 3 | const template = require('fs').readFileSync('./src/index.template.html', 'utf-8') 4 | const serverBundle = require('./dist/vue-ssr-server-bundle.json') 5 | const clientManifest = require('./dist/vue-ssr-client-manifest.json') 6 | const renderer = createBundleRenderer(serverBundle, { 7 | template, 8 | clientManifest 9 | }) 10 | 11 | module.exports = async (req, res) => { 12 | try { 13 | const context = { url: req.url } 14 | const html = await renderer.renderToString(context) 15 | 16 | res.send(html) 17 | } catch (err) { 18 | res.status(500).end(err.message) 19 | } 20 | } -------------------------------------------------------------------------------- /vue-ssr-4/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const renderVueApp = require('./render-vue-app') 3 | const app = express() 4 | 5 | app.use('/dist', express.static('./dist')) 6 | app.get('*', renderVueApp) 7 | 8 | app.listen(3000) 9 | console.log('Server listening on http://localhost:3000') -------------------------------------------------------------------------------- /vue-ssr-4/src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /vue-ssr-4/src/app.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | 4 | /* 5 | ** Export a factory function for creating fresh app, 6 | ** router and store instances 7 | */ 8 | export function createApp (context) { 9 | const app = new Vue(App) 10 | 11 | return { app } 12 | } -------------------------------------------------------------------------------- /vue-ssr-4/src/entry-client.js: -------------------------------------------------------------------------------- 1 | import { createApp } from './app' 2 | 3 | const { app } = createApp() 4 | 5 | // This assumes App.vue template root element has `id="app"` 6 | app.$mount('#app') -------------------------------------------------------------------------------- /vue-ssr-4/src/entry-server.js: -------------------------------------------------------------------------------- 1 | import { createApp } from './app' 2 | 3 | export default (context) => { 4 | const { app } = createApp(context) 5 | 6 | return app 7 | } -------------------------------------------------------------------------------- /vue-ssr-4/src/index.template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Hello 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /vue-ssr-5/build/setup-dev-server.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const MFS = require('memory-fs') 4 | const webpack = require('webpack') 5 | const chokidar = require('chokidar') 6 | const clientConfig = require('./webpack.client.config') 7 | const serverConfig = require('./webpack.server.config') 8 | 9 | const readFile = (fs, file) => { 10 | try { 11 | return fs.readFileSync(path.join(clientConfig.output.path, file), 'utf-8') 12 | } catch (e) {} 13 | } 14 | 15 | module.exports = function setupDevServer (app, templatePath, cb) { 16 | let bundle 17 | let template 18 | let clientManifest 19 | 20 | let ready 21 | const readyPromise = new Promise(r => { ready = r }) 22 | const update = () => { 23 | if (bundle && clientManifest) { 24 | ready() 25 | cb(bundle, { 26 | template, 27 | clientManifest 28 | }) 29 | } 30 | } 31 | 32 | // read template from disk and watch 33 | template = fs.readFileSync(templatePath, 'utf-8') 34 | chokidar.watch(templatePath).on('change', () => { 35 | template = fs.readFileSync(templatePath, 'utf-8') 36 | console.log('index.html template updated.') 37 | update() 38 | }) 39 | 40 | // modify client config to work with hot middleware 41 | clientConfig.entry.app = ['webpack-hot-middleware/client', clientConfig.entry.app] 42 | clientConfig.output.filename = '[name].js' 43 | clientConfig.plugins.push( 44 | new webpack.HotModuleReplacementPlugin(), 45 | new webpack.NoEmitOnErrorsPlugin() 46 | ) 47 | 48 | // dev middleware 49 | const clientCompiler = webpack(clientConfig) 50 | const devMiddleware = require('webpack-dev-middleware')(clientCompiler, { 51 | publicPath: clientConfig.output.publicPath, 52 | noInfo: true 53 | }) 54 | app.use(devMiddleware) 55 | clientCompiler.plugin('done', stats => { 56 | stats = stats.toJson() 57 | stats.errors.forEach(err => console.error(err)) 58 | stats.warnings.forEach(err => console.warn(err)) 59 | if (stats.errors.length) return 60 | clientManifest = JSON.parse(readFile( 61 | devMiddleware.fileSystem, 62 | 'vue-ssr-client-manifest.json' 63 | )) 64 | update() 65 | }) 66 | 67 | // hot middleware 68 | app.use(require('webpack-hot-middleware')(clientCompiler, { heartbeat: 5000 })) 69 | 70 | // watch and update server renderer 71 | const serverCompiler = webpack(serverConfig) 72 | const mfs = new MFS() 73 | serverCompiler.outputFileSystem = mfs 74 | serverCompiler.watch({}, (err, stats) => { 75 | if (err) throw err 76 | stats = stats.toJson() 77 | if (stats.errors.length) return 78 | 79 | // read bundle generated by vue-ssr-webpack-plugin 80 | bundle = JSON.parse(readFile(mfs, 'vue-ssr-server-bundle.json')) 81 | update() 82 | }) 83 | 84 | return readyPromise 85 | } -------------------------------------------------------------------------------- /vue-ssr-5/build/vue-loader.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extractCSS: process.env.NODE_ENV === 'production', 3 | preserveWhitespace: false, 4 | postcss: [ 5 | require('autoprefixer')({ 6 | browsers: ['last 3 versions'] 7 | }) 8 | ] 9 | } -------------------------------------------------------------------------------- /vue-ssr-5/build/webpack.base.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const webpack = require('webpack') 3 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 5 | const vueConfig = require('./vue-loader.config') 6 | 7 | const isProd = process.env.NODE_ENV === 'production' 8 | 9 | module.exports = { 10 | devtool: isProd 11 | ? false 12 | : '#cheap-module-source-map', 13 | output: { 14 | path: path.resolve(__dirname, '../dist'), 15 | publicPath: '/dist/', 16 | filename: '[name].[chunkhash].js' 17 | }, 18 | module: { 19 | noParse: /es6-promise\.js$/, // avoid webpack shimming process 20 | rules: [ 21 | { 22 | test: /\.vue$/, 23 | loader: 'vue-loader', 24 | options: vueConfig 25 | }, 26 | { 27 | test: /\.js$/, 28 | loader: 'babel-loader', 29 | exclude: /node_modules/ 30 | }, 31 | { 32 | test: /\.(png|jpg|gif|svg)$/, 33 | loader: 'url-loader', 34 | options: { 35 | limit: 10000, 36 | name: '[name].[ext]?[hash]' 37 | } 38 | }, 39 | { 40 | test: /\.css$/, 41 | use: isProd 42 | ? ExtractTextPlugin.extract({ 43 | use: 'css-loader?minimize', 44 | fallback: 'vue-style-loader' 45 | }) 46 | : ['vue-style-loader', 'css-loader'] 47 | } 48 | ] 49 | }, 50 | performance: { 51 | maxEntrypointSize: 300000, 52 | hints: isProd ? 'warning' : false 53 | }, 54 | plugins: isProd 55 | ? [ 56 | new webpack.optimize.UglifyJsPlugin({ 57 | compress: { warnings: false } 58 | }), 59 | new webpack.optimize.ModuleConcatenationPlugin(), 60 | new ExtractTextPlugin({ 61 | filename: 'common.[chunkhash].css' 62 | }) 63 | ] 64 | : [ 65 | new FriendlyErrorsPlugin() 66 | ] 67 | } -------------------------------------------------------------------------------- /vue-ssr-5/build/webpack.client.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const merge = require('webpack-merge') 3 | const VueSSRClientPlugin = require('vue-server-renderer/client-plugin') 4 | const base = require('./webpack.base.config') 5 | 6 | const config = merge(base, { 7 | entry: { 8 | app: './src/entry-client.js' 9 | }, 10 | plugins: [ 11 | // strip dev-only code in Vue source 12 | new webpack.DefinePlugin({ 13 | 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'), 14 | 'process.env.VUE_ENV': '"client"' 15 | }), 16 | // extract vendor chunks for better caching 17 | new webpack.optimize.CommonsChunkPlugin({ 18 | name: 'vendor', 19 | minChunks: function (module) { 20 | // a module is extracted into the vendor chunk if... 21 | return ( 22 | // it's inside node_modules 23 | /node_modules/.test(module.context) && 24 | // and not a CSS file (due to extract-text-webpack-plugin limitation) 25 | !/\.css$/.test(module.request) 26 | ) 27 | } 28 | }), 29 | // extract webpack runtime & manifest to avoid vendor chunk hash changing 30 | // on every build. 31 | new webpack.optimize.CommonsChunkPlugin({ 32 | name: 'manifest', 33 | minChunks: Infinity 34 | }), 35 | // This plugins generates `vue-ssr-client-manifest.json` in the 36 | // output directory. 37 | new VueSSRClientPlugin() 38 | ] 39 | }) 40 | 41 | module.exports = config -------------------------------------------------------------------------------- /vue-ssr-5/build/webpack.server.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const merge = require('webpack-merge') 3 | const base = require('./webpack.base.config') 4 | const nodeExternals = require('webpack-node-externals') 5 | const VueSSRServerPlugin = require('vue-server-renderer/server-plugin') 6 | 7 | module.exports = merge(base, { 8 | target: 'node', 9 | devtool: '#source-map', 10 | entry: './src/entry-server.js', 11 | output: { 12 | filename: 'server-bundle.js', 13 | libraryTarget: 'commonjs2' 14 | }, 15 | // https://webpack.js.org/configuration/externals/#externals 16 | // https://github.com/liady/webpack-node-externals 17 | externals: nodeExternals({ 18 | // do not externalize CSS files in case we need to import it from a dependency 19 | whitelist: /\.css$/ 20 | }), 21 | plugins: [ 22 | new webpack.DefinePlugin({ 23 | 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'), 24 | 'process.env.VUE_ENV': '"server"' 25 | }), 26 | new VueSSRServerPlugin() 27 | ] 28 | }) -------------------------------------------------------------------------------- /vue-ssr-5/dist/app.04aafe95e9e39db0bd8f.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([0],[ 2 | /* 0 */, 3 | /* 1 */, 4 | /* 2 */, 5 | /* 3 */ 6 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 7 | 8 | "use strict"; 9 | // 10 | // 11 | // 12 | // 13 | // 14 | // 15 | // 16 | // 17 | 18 | /* harmony default export */ __webpack_exports__["a"] = ({ 19 | data() { 20 | return { 21 | url: this.$route.path 22 | }; 23 | }, 24 | methods: { 25 | sayHello() { 26 | window.alert('Hello!'); 27 | } 28 | } 29 | }); 30 | 31 | /***/ }), 32 | /* 4 */ 33 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 34 | 35 | "use strict"; 36 | Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); 37 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(5); 38 | 39 | 40 | const { app } = Object(__WEBPACK_IMPORTED_MODULE_0__app__["a" /* createApp */])(); 41 | 42 | // This assumes App.vue template root element has `id="app"` 43 | app.$mount('#app'); 44 | 45 | /***/ }), 46 | /* 5 */ 47 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 48 | 49 | "use strict"; 50 | /* harmony export (immutable) */ __webpack_exports__["a"] = createApp; 51 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(0); 52 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__App_vue__ = __webpack_require__(9); 53 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__store__ = __webpack_require__(11); 54 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__router__ = __webpack_require__(13); 55 | 56 | 57 | 58 | 59 | 60 | /* 61 | ** Export a factory function for creating fresh app, 62 | ** router and store instances 63 | */ 64 | function createApp(context) { 65 | // create store and router instances 66 | const store = Object(__WEBPACK_IMPORTED_MODULE_2__store__["a" /* createStore */])(); 67 | const router = Object(__WEBPACK_IMPORTED_MODULE_3__router__["a" /* createRouter */])(); 68 | 69 | const app = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */]({ 70 | router, 71 | store, 72 | render: h => h(__WEBPACK_IMPORTED_MODULE_1__App_vue__["a" /* default */]) 73 | }); 74 | 75 | return { app, router, store }; 76 | } 77 | 78 | /***/ }), 79 | /* 6 */, 80 | /* 7 */, 81 | /* 8 */, 82 | /* 9 */ 83 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 84 | 85 | "use strict"; 86 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__ = __webpack_require__(10); 87 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(2); 88 | var disposed = false 89 | /* script */ 90 | var __vue_script__ = null 91 | /* template */ 92 | 93 | /* template functional */ 94 | var __vue_template_functional__ = false 95 | /* styles */ 96 | var __vue_styles__ = null 97 | /* scopeId */ 98 | var __vue_scopeId__ = null 99 | /* moduleIdentifier (server only) */ 100 | var __vue_module_identifier__ = null 101 | 102 | var Component = Object(__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 103 | __vue_script__, 104 | __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["a" /* render */], 105 | __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["b" /* staticRenderFns */], 106 | __vue_template_functional__, 107 | __vue_styles__, 108 | __vue_scopeId__, 109 | __vue_module_identifier__ 110 | ) 111 | Component.options.__file = "src/App.vue" 112 | 113 | /* hot reload */ 114 | if (false) {(function () { 115 | var hotAPI = require("vue-hot-reload-api") 116 | hotAPI.install(require("vue"), false) 117 | if (!hotAPI.compatible) return 118 | module.hot.accept() 119 | if (!module.hot.data) { 120 | hotAPI.createRecord("data-v-7ba5bd90", Component.options) 121 | } else { 122 | hotAPI.reload("data-v-7ba5bd90", Component.options) 123 | } 124 | module.hot.dispose(function (data) { 125 | disposed = true 126 | }) 127 | })()} 128 | 129 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 130 | 131 | 132 | /***/ }), 133 | /* 10 */ 134 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 135 | 136 | "use strict"; 137 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 138 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 139 | var render = function() { 140 | var _vm = this 141 | var _h = _vm.$createElement 142 | var _c = _vm._self._c || _h 143 | return _c("div", { attrs: { id: "app" } }, [_c("router-view")], 1) 144 | } 145 | var staticRenderFns = [] 146 | render._withStripped = true 147 | 148 | if (false) { 149 | module.hot.accept() 150 | if (module.hot.data) { 151 | require("vue-hot-reload-api") .rerender("data-v-7ba5bd90", { render: render, staticRenderFns: staticRenderFns }) 152 | } 153 | } 154 | 155 | /***/ }), 156 | /* 11 */ 157 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 158 | 159 | "use strict"; 160 | /* harmony export (immutable) */ __webpack_exports__["a"] = createStore; 161 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(0); 162 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_vuex__ = __webpack_require__(12); 163 | 164 | 165 | 166 | __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].use(__WEBPACK_IMPORTED_MODULE_1_vuex__["a" /* default */]); 167 | 168 | function createStore() { 169 | return new __WEBPACK_IMPORTED_MODULE_1_vuex__["a" /* default */].Store({ 170 | state: {}, 171 | actions: {}, 172 | mutations: {} 173 | }); 174 | } 175 | 176 | /***/ }), 177 | /* 12 */, 178 | /* 13 */ 179 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 180 | 181 | "use strict"; 182 | /* harmony export (immutable) */ __webpack_exports__["a"] = createRouter; 183 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(0); 184 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_vue_router__ = __webpack_require__(14); 185 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__pages_index_vue__ = __webpack_require__(15); 186 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__pages_about_vue__ = __webpack_require__(17); 187 | 188 | 189 | 190 | __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].use(__WEBPACK_IMPORTED_MODULE_1_vue_router__["a" /* default */]); 191 | 192 | // route-level code splitting 193 | 194 | 195 | 196 | function createRouter() { 197 | return new __WEBPACK_IMPORTED_MODULE_1_vue_router__["a" /* default */]({ 198 | mode: 'history', 199 | routes: [{ path: '/', component: __WEBPACK_IMPORTED_MODULE_2__pages_index_vue__["a" /* default */] }, { path: '/about', component: __WEBPACK_IMPORTED_MODULE_3__pages_about_vue__["a" /* default */] }] 200 | }); 201 | } 202 | 203 | /***/ }), 204 | /* 14 */, 205 | /* 15 */ 206 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 207 | 208 | "use strict"; 209 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue__ = __webpack_require__(3); 210 | /* unused harmony namespace reexport */ 211 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_57509004_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_index_vue__ = __webpack_require__(16); 212 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(2); 213 | var disposed = false 214 | /* script */ 215 | 216 | 217 | /* template */ 218 | 219 | /* template functional */ 220 | var __vue_template_functional__ = false 221 | /* styles */ 222 | var __vue_styles__ = null 223 | /* scopeId */ 224 | var __vue_scopeId__ = null 225 | /* moduleIdentifier (server only) */ 226 | var __vue_module_identifier__ = null 227 | 228 | var Component = Object(__WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 229 | __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue__["a" /* default */], 230 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_57509004_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_index_vue__["a" /* render */], 231 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_57509004_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_index_vue__["b" /* staticRenderFns */], 232 | __vue_template_functional__, 233 | __vue_styles__, 234 | __vue_scopeId__, 235 | __vue_module_identifier__ 236 | ) 237 | Component.options.__file = "src/pages/index.vue" 238 | 239 | /* hot reload */ 240 | if (false) {(function () { 241 | var hotAPI = require("vue-hot-reload-api") 242 | hotAPI.install(require("vue"), false) 243 | if (!hotAPI.compatible) return 244 | module.hot.accept() 245 | if (!module.hot.data) { 246 | hotAPI.createRecord("data-v-57509004", Component.options) 247 | } else { 248 | hotAPI.reload("data-v-57509004", Component.options) 249 | } 250 | module.hot.dispose(function (data) { 251 | disposed = true 252 | }) 253 | })()} 254 | 255 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 256 | 257 | 258 | /***/ }), 259 | /* 16 */ 260 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 261 | 262 | "use strict"; 263 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 264 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 265 | var render = function() { 266 | var _vm = this 267 | var _h = _vm.$createElement 268 | var _c = _vm._self._c || _h 269 | return _c( 270 | "div", 271 | [ 272 | _c("p", [_vm._v("The visited URL is: " + _vm._s(_vm.url))]), 273 | _c("p", [ 274 | _c("button", { on: { click: _vm.sayHello } }, [_vm._v("Hello")]) 275 | ]), 276 | _c("router-link", { attrs: { to: "/about" } }, [_vm._v("About page")]) 277 | ], 278 | 1 279 | ) 280 | } 281 | var staticRenderFns = [] 282 | render._withStripped = true 283 | 284 | if (false) { 285 | module.hot.accept() 286 | if (module.hot.data) { 287 | require("vue-hot-reload-api") .rerender("data-v-57509004", { render: render, staticRenderFns: staticRenderFns }) 288 | } 289 | } 290 | 291 | /***/ }), 292 | /* 17 */ 293 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 294 | 295 | "use strict"; 296 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_96c0458e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_about_vue__ = __webpack_require__(23); 297 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(2); 298 | var disposed = false 299 | function injectStyle (context) { 300 | if (disposed) return 301 | __webpack_require__(18) 302 | } 303 | /* script */ 304 | var __vue_script__ = null 305 | /* template */ 306 | 307 | /* template functional */ 308 | var __vue_template_functional__ = false 309 | /* styles */ 310 | var __vue_styles__ = injectStyle 311 | /* scopeId */ 312 | var __vue_scopeId__ = "data-v-96c0458e" 313 | /* moduleIdentifier (server only) */ 314 | var __vue_module_identifier__ = null 315 | 316 | var Component = Object(__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 317 | __vue_script__, 318 | __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_96c0458e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_about_vue__["a" /* render */], 319 | __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_96c0458e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_about_vue__["b" /* staticRenderFns */], 320 | __vue_template_functional__, 321 | __vue_styles__, 322 | __vue_scopeId__, 323 | __vue_module_identifier__ 324 | ) 325 | Component.options.__file = "src/pages/about.vue" 326 | 327 | /* hot reload */ 328 | if (false) {(function () { 329 | var hotAPI = require("vue-hot-reload-api") 330 | hotAPI.install(require("vue"), false) 331 | if (!hotAPI.compatible) return 332 | module.hot.accept() 333 | if (!module.hot.data) { 334 | hotAPI.createRecord("data-v-96c0458e", Component.options) 335 | } else { 336 | hotAPI.reload("data-v-96c0458e", Component.options) 337 | } 338 | module.hot.dispose(function (data) { 339 | disposed = true 340 | }) 341 | })()} 342 | 343 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 344 | 345 | 346 | /***/ }), 347 | /* 18 */ 348 | /***/ (function(module, exports, __webpack_require__) { 349 | 350 | // style-loader: Adds some css to the DOM by adding a "],"sourceRoot":""}]); 383 | 384 | // exports 385 | 386 | 387 | /***/ }), 388 | /* 20 */, 389 | /* 21 */, 390 | /* 22 */, 391 | /* 23 */ 392 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 393 | 394 | "use strict"; 395 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 396 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 397 | var render = function() { 398 | var _vm = this 399 | var _h = _vm.$createElement 400 | var _c = _vm._self._c || _h 401 | return _c( 402 | "div", 403 | [ 404 | _c("h1", [_vm._v("About page")]), 405 | _c("router-link", { attrs: { to: "/" } }, [_vm._v("Home page")]) 406 | ], 407 | 1 408 | ) 409 | } 410 | var staticRenderFns = [] 411 | render._withStripped = true 412 | 413 | if (false) { 414 | module.hot.accept() 415 | if (module.hot.data) { 416 | require("vue-hot-reload-api") .rerender("data-v-96c0458e", { render: render, staticRenderFns: staticRenderFns }) 417 | } 418 | } 419 | 420 | /***/ }) 421 | ],[4]); 422 | //# sourceMappingURL=app.04aafe95e9e39db0bd8f.js.map -------------------------------------------------------------------------------- /vue-ssr-5/dist/app.04aafe95e9e39db0bd8f.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"app.04aafe95e9e39db0bd8f.js","sources":["webpack:///index.vue","webpack:///src/entry-client.js","webpack:///src/app.js","webpack:///./src/App.vue","webpack:///./src/App.vue?3a25","webpack:///src/store/index.js","webpack:///src/router/index.js","webpack:///./src/pages/index.vue","webpack:///./src/pages/index.vue?6612","webpack:///./src/pages/about.vue","webpack:///./src/pages/about.vue?5c7f","webpack:///./src/pages/about.vue?2f68","webpack:///./src/pages/about.vue?d6c3"],"sourcesContent":["\n\n\n\n\n// WEBPACK FOOTER //\n// index.vue","import { createApp } from './app'\n\nconst { app } = createApp()\n\n// This assumes App.vue template root element has `id=\"app\"`\napp.$mount('#app')\n\n\n// WEBPACK FOOTER //\n// src/entry-client.js","import Vue from 'vue'\nimport App from './App.vue'\nimport { createStore } from './store'\nimport { createRouter } from './router'\n\n/*\n** Export a factory function for creating fresh app,\n** router and store instances\n*/\nexport function createApp (context) {\n\t// create store and router instances\n const store = createStore()\n\tconst router = createRouter()\n\n\tconst app = new Vue({\n\t\trouter,\n\t\tstore,\n\t\trender: h => h(App)\n\t})\n\n\treturn { app, router, store }\n}\n\n\n// WEBPACK FOOTER //\n// src/app.js","var disposed = false\n/* script */\nvar __vue_script__ = null\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7ba5bd90\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/App.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-7ba5bd90\", Component.options)\n } else {\n hotAPI.reload(\"data-v-7ba5bd90\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = 9\n// module chunks = 0","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"app\" } }, [_c(\"router-view\")], 1)\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-7ba5bd90\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7ba5bd90\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = 10\n// module chunks = 0","import Vue from 'vue'\nimport Vuex from 'vuex'\n\nVue.use(Vuex)\n\nexport function createStore () {\n return new Vuex.Store({\n state: {},\n actions: {},\n mutations: {}\n })\n}\n\n\n// WEBPACK FOOTER //\n// src/store/index.js","import Vue from 'vue'\nimport Router from 'vue-router'\n\nVue.use(Router)\n\n// route-level code splitting\nimport Home from '../pages/index.vue'\nimport About from '../pages/about.vue'\n\nexport function createRouter () {\n return new Router({\n mode: 'history',\n routes: [\n { path: '/', component: Home },\n { path: '/about', component: About }\n ]\n })\n}\n\n\n// WEBPACK FOOTER //\n// src/router/index.js","var disposed = false\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-57509004\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./index.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/pages/index.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-57509004\", Component.options)\n } else {\n hotAPI.reload(\"data-v-57509004\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/index.vue\n// module id = 15\n// module chunks = 0","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"p\", [_vm._v(\"The visited URL is: \" + _vm._s(_vm.url))]),\n _c(\"p\", [\n _c(\"button\", { on: { click: _vm.sayHello } }, [_vm._v(\"Hello\")])\n ]),\n _c(\"router-link\", { attrs: { to: \"/about\" } }, [_vm._v(\"About page\")])\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-57509004\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-57509004\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/pages/index.vue\n// module id = 16\n// module chunks = 0","var disposed = false\nfunction injectStyle (context) {\n if (disposed) return\n require(\"!!vue-loader/node_modules/vue-style-loader!css-loader?sourceMap!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-96c0458e\\\",\\\"scoped\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./about.vue\")\n}\n/* script */\nvar __vue_script__ = null\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-96c0458e\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./about.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-96c0458e\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/pages/about.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-96c0458e\", Component.options)\n } else {\n hotAPI.reload(\"data-v-96c0458e\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/about.vue\n// module id = 17\n// module chunks = 0","// style-loader: Adds some css to the DOM by adding a \"],\"sourceRoot\":\"\"}]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader?sourceMap!./node_modules/vue-loader/lib/style-compiler?{\"vue\":true,\"id\":\"data-v-96c0458e\",\"scoped\":true,\"sourceMap\":true}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/pages/about.vue\n// module id = 19\n// module chunks = 0","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"h1\", [_vm._v(\"About page\")]),\n _c(\"router-link\", { attrs: { to: \"/\" } }, [_vm._v(\"Home page\")])\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-96c0458e\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-96c0458e\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/pages/about.vue\n// module id = 23\n// module chunks = 0"],"mappings":";;;;;;;;;;;;;;;;;AASA;AAEA;;AAEA;AADA;AAGA;;AAEA;AACA;AACA;AAHA;AANA;;;;;;;ACVA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AACA;AAKA;AACA;;;;;;;;;;ACrBA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzCA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACdA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;;;;;;;;ACXA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AAOA;;;;;;;;ACjBA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1CA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxBA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACPA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} -------------------------------------------------------------------------------- /vue-ssr-5/dist/manifest.54e67e9f17df71efc259.js: -------------------------------------------------------------------------------- 1 | /******/ (function(modules) { // webpackBootstrap 2 | /******/ // install a JSONP callback for chunk loading 3 | /******/ var parentJsonpFunction = window["webpackJsonp"]; 4 | /******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) { 5 | /******/ // add "moreModules" to the modules object, 6 | /******/ // then flag all "chunkIds" as loaded and fire callback 7 | /******/ var moduleId, chunkId, i = 0, resolves = [], result; 8 | /******/ for(;i < chunkIds.length; i++) { 9 | /******/ chunkId = chunkIds[i]; 10 | /******/ if(installedChunks[chunkId]) { 11 | /******/ resolves.push(installedChunks[chunkId][0]); 12 | /******/ } 13 | /******/ installedChunks[chunkId] = 0; 14 | /******/ } 15 | /******/ for(moduleId in moreModules) { 16 | /******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { 17 | /******/ modules[moduleId] = moreModules[moduleId]; 18 | /******/ } 19 | /******/ } 20 | /******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules); 21 | /******/ while(resolves.length) { 22 | /******/ resolves.shift()(); 23 | /******/ } 24 | /******/ if(executeModules) { 25 | /******/ for(i=0; i < executeModules.length; i++) { 26 | /******/ result = __webpack_require__(__webpack_require__.s = executeModules[i]); 27 | /******/ } 28 | /******/ } 29 | /******/ return result; 30 | /******/ }; 31 | /******/ 32 | /******/ // The module cache 33 | /******/ var installedModules = {}; 34 | /******/ 35 | /******/ // objects to store loaded and loading chunks 36 | /******/ var installedChunks = { 37 | /******/ 2: 0 38 | /******/ }; 39 | /******/ 40 | /******/ // The require function 41 | /******/ function __webpack_require__(moduleId) { 42 | /******/ 43 | /******/ // Check if module is in cache 44 | /******/ if(installedModules[moduleId]) { 45 | /******/ return installedModules[moduleId].exports; 46 | /******/ } 47 | /******/ // Create a new module (and put it into the cache) 48 | /******/ var module = installedModules[moduleId] = { 49 | /******/ i: moduleId, 50 | /******/ l: false, 51 | /******/ exports: {} 52 | /******/ }; 53 | /******/ 54 | /******/ // Execute the module function 55 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 56 | /******/ 57 | /******/ // Flag the module as loaded 58 | /******/ module.l = true; 59 | /******/ 60 | /******/ // Return the exports of the module 61 | /******/ return module.exports; 62 | /******/ } 63 | /******/ 64 | /******/ 65 | /******/ // expose the modules object (__webpack_modules__) 66 | /******/ __webpack_require__.m = modules; 67 | /******/ 68 | /******/ // expose the module cache 69 | /******/ __webpack_require__.c = installedModules; 70 | /******/ 71 | /******/ // define getter function for harmony exports 72 | /******/ __webpack_require__.d = function(exports, name, getter) { 73 | /******/ if(!__webpack_require__.o(exports, name)) { 74 | /******/ Object.defineProperty(exports, name, { 75 | /******/ configurable: false, 76 | /******/ enumerable: true, 77 | /******/ get: getter 78 | /******/ }); 79 | /******/ } 80 | /******/ }; 81 | /******/ 82 | /******/ // getDefaultExport function for compatibility with non-harmony modules 83 | /******/ __webpack_require__.n = function(module) { 84 | /******/ var getter = module && module.__esModule ? 85 | /******/ function getDefault() { return module['default']; } : 86 | /******/ function getModuleExports() { return module; }; 87 | /******/ __webpack_require__.d(getter, 'a', getter); 88 | /******/ return getter; 89 | /******/ }; 90 | /******/ 91 | /******/ // Object.prototype.hasOwnProperty.call 92 | /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 93 | /******/ 94 | /******/ // __webpack_public_path__ 95 | /******/ __webpack_require__.p = "/dist/"; 96 | /******/ 97 | /******/ // on error function for async loading 98 | /******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; 99 | /******/ }) 100 | /************************************************************************/ 101 | /******/ ([]); 102 | //# sourceMappingURL=manifest.54e67e9f17df71efc259.js.map -------------------------------------------------------------------------------- /vue-ssr-5/dist/manifest.54e67e9f17df71efc259.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"manifest.54e67e9f17df71efc259.js","sources":["webpack:///webpack/bootstrap d71239dd40c2de2d3bd4"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d71239dd40c2de2d3bd4"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} -------------------------------------------------------------------------------- /vue-ssr-5/dist/vue-ssr-client-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "publicPath": "/dist/", 3 | "all": [ 4 | "app.04aafe95e9e39db0bd8f.js", 5 | "vendor.d979c5f5d5c24fc2dec9.js", 6 | "manifest.54e67e9f17df71efc259.js", 7 | "app.04aafe95e9e39db0bd8f.js.map", 8 | "vendor.d979c5f5d5c24fc2dec9.js.map", 9 | "manifest.54e67e9f17df71efc259.js.map" 10 | ], 11 | "initial": [ 12 | "manifest.54e67e9f17df71efc259.js", 13 | "vendor.d979c5f5d5c24fc2dec9.js", 14 | "app.04aafe95e9e39db0bd8f.js" 15 | ], 16 | "async": [], 17 | "modules": { 18 | "921f7c2e": [ 19 | 1, 20 | 4 21 | ], 22 | "3ab74f29": [ 23 | 1, 24 | 4 25 | ], 26 | "025cdaf9": [ 27 | 1, 28 | 4 29 | ], 30 | "74091d35": [ 31 | 0, 32 | 3 33 | ], 34 | "09fb2684": [ 35 | 0, 36 | 3 37 | ], 38 | "58d95389": [ 39 | 0, 40 | 3 41 | ], 42 | "dde33ed6": [ 43 | 1, 44 | 4 45 | ], 46 | "3ce11016": [ 47 | 1, 48 | 4 49 | ], 50 | "41bedbfc": [ 51 | 1, 52 | 4 53 | ], 54 | "c4e35316": [ 55 | 0, 56 | 3 57 | ], 58 | "54bbf45e": [ 59 | 0, 60 | 3 61 | ], 62 | "0f81a4b4": [ 63 | 0, 64 | 3 65 | ], 66 | "12d175fb": [ 67 | 1, 68 | 4 69 | ], 70 | "519badf8": [ 71 | 0, 72 | 3 73 | ], 74 | "ff42c102": [ 75 | 1, 76 | 4 77 | ], 78 | "3e02603b": [ 79 | 0, 80 | 3 81 | ], 82 | "de92e4d2": [ 83 | 0, 84 | 3 85 | ], 86 | "1e4a8576": [ 87 | 0, 88 | 3 89 | ], 90 | "b9c4a416": [ 91 | 0, 92 | 3 93 | ], 94 | "f1fa7002": [ 95 | 0, 96 | 3 97 | ], 98 | "bc807c66": [ 99 | 1, 100 | 4 101 | ], 102 | "9206fae2": [ 103 | 1, 104 | 4 105 | ], 106 | "5ab425f6": [ 107 | 1, 108 | 4 109 | ], 110 | "47b0506e": [ 111 | 0, 112 | 3 113 | ] 114 | } 115 | } -------------------------------------------------------------------------------- /vue-ssr-5/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-ssr", 3 | "version": "1.0.0", 4 | "description": "Vue.js & Vue-Server-Renderer", 5 | "scripts": { 6 | "dev": "node server.js", 7 | "start": "cross-env NODE_ENV=production node server", 8 | "build": "rimraf dist && npm run build:client && npm run build:server", 9 | "build:client": "webpack --config build/webpack.client.config.js --progress --hide-modules", 10 | "build:server": "webpack --config build/webpack.server.config.js --progress --hide-modules" 11 | }, 12 | "dependencies": { 13 | "cross-env": "^5.1.3", 14 | "es6-promise": "^4.2.4", 15 | "express": "^4.16.2", 16 | "vue": "^2.5.13", 17 | "vue-router": "^3.0.1", 18 | "vue-server-renderer": "^2.5.13", 19 | "vuex": "^3.0.1" 20 | }, 21 | "devDependencies": { 22 | "autoprefixer": "^8.0.0", 23 | "babel-core": "^6.26.0", 24 | "babel-loader": "^7.1.2", 25 | "chokidar": "^2.0.1", 26 | "css-loader": "^0.28.9", 27 | "extract-text-webpack-plugin": "^3.0.2", 28 | "file-loader": "^1.1.6", 29 | "friendly-errors-webpack-plugin": "^1.6.1", 30 | "memory-fs": "^0.4.1", 31 | "rimraf": "^2.6.2", 32 | "url-loader": "^0.6.2", 33 | "vue-loader": "^14.1.1", 34 | "vue-style-loader": "^3.1.2", 35 | "vue-template-compiler": "^2.5.13", 36 | "webpack": "^3.11.0", 37 | "webpack-dev-middleware": "^2.0.5", 38 | "webpack-hot-middleware": "^2.21.0", 39 | "webpack-merge": "^4.1.1", 40 | "webpack-node-externals": "^1.6.0" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /vue-ssr-5/server.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const express = require('express') 4 | const resolve = file => path.resolve(__dirname, file) 5 | const { createBundleRenderer } = require('vue-server-renderer') 6 | 7 | const isProd = process.env.NODE_ENV === 'production' 8 | const app = express() 9 | 10 | function createRenderer (bundle, options) { 11 | // https://github.com/vuejs/vue/blob/dev/packages/vue-server-renderer/README.md#why-use-bundlerenderer 12 | return createBundleRenderer(bundle, Object.assign(options, { 13 | // recommended for performance 14 | runInNewContext: false 15 | })) 16 | } 17 | 18 | let renderer 19 | let readyPromise 20 | const templatePath = resolve('./src/index.template.html') 21 | if (isProd) { 22 | // In production: create server renderer using template and built server bundle. 23 | // The server bundle is generated by vue-ssr-webpack-plugin. 24 | const template = fs.readFileSync(templatePath, 'utf-8') 25 | const bundle = require('./dist/vue-ssr-server-bundle.json') 26 | // The client manifests are optional, but it allows the renderer 27 | // to automatically infer preload/prefetch links and directly add -------------------------------------------------------------------------------- /vue-ssr-5/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | Vue.use(Router) 5 | 6 | // route-level code splitting 7 | import Home from '../pages/index.vue' 8 | import About from '../pages/about.vue' 9 | 10 | export function createRouter () { 11 | return new Router({ 12 | mode: 'history', 13 | routes: [ 14 | { path: '/', component: Home }, 15 | { path: '/about', component: About } 16 | ] 17 | }) 18 | } -------------------------------------------------------------------------------- /vue-ssr-5/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | Vue.use(Vuex) 5 | 6 | export function createStore () { 7 | return new Vuex.Store({ 8 | state: { 9 | counter: 0 10 | }, 11 | mutations: { 12 | INCREMENT(state) { 13 | state.counter++ 14 | } 15 | } 16 | }) 17 | } -------------------------------------------------------------------------------- /vue-ssr-6/build/setup-dev-server.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const MFS = require('memory-fs') 4 | const webpack = require('webpack') 5 | const chokidar = require('chokidar') 6 | const clientConfig = require('./webpack.client.config') 7 | const serverConfig = require('./webpack.server.config') 8 | 9 | const readFile = (fs, file) => { 10 | try { 11 | return fs.readFileSync(path.join(clientConfig.output.path, file), 'utf-8') 12 | } catch (e) {} 13 | } 14 | 15 | module.exports = function setupDevServer (app, templatePath, cb) { 16 | let bundle 17 | let template 18 | let clientManifest 19 | 20 | let ready 21 | const readyPromise = new Promise(r => { ready = r }) 22 | const update = () => { 23 | if (bundle && clientManifest) { 24 | ready() 25 | cb(bundle, { 26 | template, 27 | clientManifest 28 | }) 29 | } 30 | } 31 | 32 | // read template from disk and watch 33 | template = fs.readFileSync(templatePath, 'utf-8') 34 | chokidar.watch(templatePath).on('change', () => { 35 | template = fs.readFileSync(templatePath, 'utf-8') 36 | console.log('index.html template updated.') 37 | update() 38 | }) 39 | 40 | // modify client config to work with hot middleware 41 | clientConfig.entry.app = ['webpack-hot-middleware/client', clientConfig.entry.app] 42 | clientConfig.output.filename = '[name].js' 43 | clientConfig.plugins.push( 44 | new webpack.HotModuleReplacementPlugin(), 45 | new webpack.NoEmitOnErrorsPlugin() 46 | ) 47 | 48 | // dev middleware 49 | const clientCompiler = webpack(clientConfig) 50 | const devMiddleware = require('webpack-dev-middleware')(clientCompiler, { 51 | publicPath: clientConfig.output.publicPath, 52 | noInfo: true 53 | }) 54 | app.use(devMiddleware) 55 | clientCompiler.plugin('done', stats => { 56 | stats = stats.toJson() 57 | stats.errors.forEach(err => console.error(err)) 58 | stats.warnings.forEach(err => console.warn(err)) 59 | if (stats.errors.length) return 60 | clientManifest = JSON.parse(readFile( 61 | devMiddleware.fileSystem, 62 | 'vue-ssr-client-manifest.json' 63 | )) 64 | update() 65 | }) 66 | 67 | // hot middleware 68 | app.use(require('webpack-hot-middleware')(clientCompiler, { heartbeat: 5000 })) 69 | 70 | // watch and update server renderer 71 | const serverCompiler = webpack(serverConfig) 72 | const mfs = new MFS() 73 | serverCompiler.outputFileSystem = mfs 74 | serverCompiler.watch({}, (err, stats) => { 75 | if (err) throw err 76 | stats = stats.toJson() 77 | if (stats.errors.length) return 78 | 79 | // read bundle generated by vue-ssr-webpack-plugin 80 | bundle = JSON.parse(readFile(mfs, 'vue-ssr-server-bundle.json')) 81 | update() 82 | }) 83 | 84 | return readyPromise 85 | } -------------------------------------------------------------------------------- /vue-ssr-6/build/vue-loader.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extractCSS: process.env.NODE_ENV === 'production', 3 | preserveWhitespace: false, 4 | postcss: [ 5 | require('autoprefixer')({ 6 | browsers: ['last 3 versions'] 7 | }) 8 | ] 9 | } -------------------------------------------------------------------------------- /vue-ssr-6/build/webpack.base.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const webpack = require('webpack') 3 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 5 | const vueConfig = require('./vue-loader.config') 6 | 7 | const isProd = process.env.NODE_ENV === 'production' 8 | 9 | module.exports = { 10 | devtool: isProd 11 | ? false 12 | : '#cheap-module-source-map', 13 | output: { 14 | path: path.resolve(__dirname, '../dist'), 15 | publicPath: '/dist/', 16 | filename: '[name].[chunkhash].js' 17 | }, 18 | module: { 19 | noParse: /es6-promise\.js$/, // avoid webpack shimming process 20 | rules: [ 21 | { 22 | test: /\.vue$/, 23 | loader: 'vue-loader', 24 | options: vueConfig 25 | }, 26 | { 27 | test: /\.js$/, 28 | loader: 'babel-loader', 29 | exclude: /node_modules/ 30 | }, 31 | { 32 | test: /\.(png|jpg|gif|svg)$/, 33 | loader: 'url-loader', 34 | options: { 35 | limit: 10000, 36 | name: '[name].[ext]?[hash]' 37 | } 38 | }, 39 | { 40 | test: /\.css$/, 41 | use: isProd 42 | ? ExtractTextPlugin.extract({ 43 | use: 'css-loader?minimize', 44 | fallback: 'vue-style-loader' 45 | }) 46 | : ['vue-style-loader', 'css-loader'] 47 | } 48 | ] 49 | }, 50 | performance: { 51 | maxEntrypointSize: 300000, 52 | hints: isProd ? 'warning' : false 53 | }, 54 | plugins: isProd 55 | ? [ 56 | new webpack.optimize.UglifyJsPlugin({ 57 | compress: { warnings: false } 58 | }), 59 | new webpack.optimize.ModuleConcatenationPlugin(), 60 | new ExtractTextPlugin({ 61 | filename: 'common.[chunkhash].css' 62 | }) 63 | ] 64 | : [ 65 | new FriendlyErrorsPlugin() 66 | ] 67 | } -------------------------------------------------------------------------------- /vue-ssr-6/build/webpack.client.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const merge = require('webpack-merge') 3 | const VueSSRClientPlugin = require('vue-server-renderer/client-plugin') 4 | const base = require('./webpack.base.config') 5 | 6 | const config = merge(base, { 7 | entry: { 8 | app: './src/entry-client.js' 9 | }, 10 | plugins: [ 11 | // strip dev-only code in Vue source 12 | new webpack.DefinePlugin({ 13 | 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'), 14 | 'process.env.VUE_ENV': '"client"' 15 | }), 16 | // extract vendor chunks for better caching 17 | new webpack.optimize.CommonsChunkPlugin({ 18 | name: 'vendor', 19 | minChunks: function (module) { 20 | // a module is extracted into the vendor chunk if... 21 | return ( 22 | // it's inside node_modules 23 | /node_modules/.test(module.context) && 24 | // and not a CSS file (due to extract-text-webpack-plugin limitation) 25 | !/\.css$/.test(module.request) 26 | ) 27 | } 28 | }), 29 | // extract webpack runtime & manifest to avoid vendor chunk hash changing 30 | // on every build. 31 | new webpack.optimize.CommonsChunkPlugin({ 32 | name: 'manifest', 33 | minChunks: Infinity 34 | }), 35 | // This plugins generates `vue-ssr-client-manifest.json` in the 36 | // output directory. 37 | new VueSSRClientPlugin() 38 | ] 39 | }) 40 | 41 | module.exports = config -------------------------------------------------------------------------------- /vue-ssr-6/build/webpack.server.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const merge = require('webpack-merge') 3 | const base = require('./webpack.base.config') 4 | const nodeExternals = require('webpack-node-externals') 5 | const VueSSRServerPlugin = require('vue-server-renderer/server-plugin') 6 | 7 | module.exports = merge(base, { 8 | target: 'node', 9 | devtool: '#source-map', 10 | entry: './src/entry-server.js', 11 | output: { 12 | filename: 'server-bundle.js', 13 | libraryTarget: 'commonjs2' 14 | }, 15 | // https://webpack.js.org/configuration/externals/#externals 16 | // https://github.com/liady/webpack-node-externals 17 | externals: nodeExternals({ 18 | // do not externalize CSS files in case we need to import it from a dependency 19 | whitelist: /\.css$/ 20 | }), 21 | plugins: [ 22 | new webpack.DefinePlugin({ 23 | 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'), 24 | 'process.env.VUE_ENV': '"server"' 25 | }), 26 | new VueSSRServerPlugin() 27 | ] 28 | }) -------------------------------------------------------------------------------- /vue-ssr-6/dist/app.04aafe95e9e39db0bd8f.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([0],[ 2 | /* 0 */, 3 | /* 1 */, 4 | /* 2 */, 5 | /* 3 */ 6 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 7 | 8 | "use strict"; 9 | // 10 | // 11 | // 12 | // 13 | // 14 | // 15 | // 16 | // 17 | 18 | /* harmony default export */ __webpack_exports__["a"] = ({ 19 | data() { 20 | return { 21 | url: this.$route.path 22 | }; 23 | }, 24 | methods: { 25 | sayHello() { 26 | window.alert('Hello!'); 27 | } 28 | } 29 | }); 30 | 31 | /***/ }), 32 | /* 4 */ 33 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 34 | 35 | "use strict"; 36 | Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); 37 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(5); 38 | 39 | 40 | const { app } = Object(__WEBPACK_IMPORTED_MODULE_0__app__["a" /* createApp */])(); 41 | 42 | // This assumes App.vue template root element has `id="app"` 43 | app.$mount('#app'); 44 | 45 | /***/ }), 46 | /* 5 */ 47 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 48 | 49 | "use strict"; 50 | /* harmony export (immutable) */ __webpack_exports__["a"] = createApp; 51 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(0); 52 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__App_vue__ = __webpack_require__(9); 53 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__store__ = __webpack_require__(11); 54 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__router__ = __webpack_require__(13); 55 | 56 | 57 | 58 | 59 | 60 | /* 61 | ** Export a factory function for creating fresh app, 62 | ** router and store instances 63 | */ 64 | function createApp(context) { 65 | // create store and router instances 66 | const store = Object(__WEBPACK_IMPORTED_MODULE_2__store__["a" /* createStore */])(); 67 | const router = Object(__WEBPACK_IMPORTED_MODULE_3__router__["a" /* createRouter */])(); 68 | 69 | const app = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */]({ 70 | router, 71 | store, 72 | render: h => h(__WEBPACK_IMPORTED_MODULE_1__App_vue__["a" /* default */]) 73 | }); 74 | 75 | return { app, router, store }; 76 | } 77 | 78 | /***/ }), 79 | /* 6 */, 80 | /* 7 */, 81 | /* 8 */, 82 | /* 9 */ 83 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 84 | 85 | "use strict"; 86 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__ = __webpack_require__(10); 87 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(2); 88 | var disposed = false 89 | /* script */ 90 | var __vue_script__ = null 91 | /* template */ 92 | 93 | /* template functional */ 94 | var __vue_template_functional__ = false 95 | /* styles */ 96 | var __vue_styles__ = null 97 | /* scopeId */ 98 | var __vue_scopeId__ = null 99 | /* moduleIdentifier (server only) */ 100 | var __vue_module_identifier__ = null 101 | 102 | var Component = Object(__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 103 | __vue_script__, 104 | __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["a" /* render */], 105 | __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7ba5bd90_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__["b" /* staticRenderFns */], 106 | __vue_template_functional__, 107 | __vue_styles__, 108 | __vue_scopeId__, 109 | __vue_module_identifier__ 110 | ) 111 | Component.options.__file = "src/App.vue" 112 | 113 | /* hot reload */ 114 | if (false) {(function () { 115 | var hotAPI = require("vue-hot-reload-api") 116 | hotAPI.install(require("vue"), false) 117 | if (!hotAPI.compatible) return 118 | module.hot.accept() 119 | if (!module.hot.data) { 120 | hotAPI.createRecord("data-v-7ba5bd90", Component.options) 121 | } else { 122 | hotAPI.reload("data-v-7ba5bd90", Component.options) 123 | } 124 | module.hot.dispose(function (data) { 125 | disposed = true 126 | }) 127 | })()} 128 | 129 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 130 | 131 | 132 | /***/ }), 133 | /* 10 */ 134 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 135 | 136 | "use strict"; 137 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 138 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 139 | var render = function() { 140 | var _vm = this 141 | var _h = _vm.$createElement 142 | var _c = _vm._self._c || _h 143 | return _c("div", { attrs: { id: "app" } }, [_c("router-view")], 1) 144 | } 145 | var staticRenderFns = [] 146 | render._withStripped = true 147 | 148 | if (false) { 149 | module.hot.accept() 150 | if (module.hot.data) { 151 | require("vue-hot-reload-api") .rerender("data-v-7ba5bd90", { render: render, staticRenderFns: staticRenderFns }) 152 | } 153 | } 154 | 155 | /***/ }), 156 | /* 11 */ 157 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 158 | 159 | "use strict"; 160 | /* harmony export (immutable) */ __webpack_exports__["a"] = createStore; 161 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(0); 162 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_vuex__ = __webpack_require__(12); 163 | 164 | 165 | 166 | __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].use(__WEBPACK_IMPORTED_MODULE_1_vuex__["a" /* default */]); 167 | 168 | function createStore() { 169 | return new __WEBPACK_IMPORTED_MODULE_1_vuex__["a" /* default */].Store({ 170 | state: {}, 171 | actions: {}, 172 | mutations: {} 173 | }); 174 | } 175 | 176 | /***/ }), 177 | /* 12 */, 178 | /* 13 */ 179 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 180 | 181 | "use strict"; 182 | /* harmony export (immutable) */ __webpack_exports__["a"] = createRouter; 183 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(0); 184 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_vue_router__ = __webpack_require__(14); 185 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__pages_index_vue__ = __webpack_require__(15); 186 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__pages_about_vue__ = __webpack_require__(17); 187 | 188 | 189 | 190 | __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].use(__WEBPACK_IMPORTED_MODULE_1_vue_router__["a" /* default */]); 191 | 192 | // route-level code splitting 193 | 194 | 195 | 196 | function createRouter() { 197 | return new __WEBPACK_IMPORTED_MODULE_1_vue_router__["a" /* default */]({ 198 | mode: 'history', 199 | routes: [{ path: '/', component: __WEBPACK_IMPORTED_MODULE_2__pages_index_vue__["a" /* default */] }, { path: '/about', component: __WEBPACK_IMPORTED_MODULE_3__pages_about_vue__["a" /* default */] }] 200 | }); 201 | } 202 | 203 | /***/ }), 204 | /* 14 */, 205 | /* 15 */ 206 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 207 | 208 | "use strict"; 209 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue__ = __webpack_require__(3); 210 | /* unused harmony namespace reexport */ 211 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_57509004_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_index_vue__ = __webpack_require__(16); 212 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(2); 213 | var disposed = false 214 | /* script */ 215 | 216 | 217 | /* template */ 218 | 219 | /* template functional */ 220 | var __vue_template_functional__ = false 221 | /* styles */ 222 | var __vue_styles__ = null 223 | /* scopeId */ 224 | var __vue_scopeId__ = null 225 | /* moduleIdentifier (server only) */ 226 | var __vue_module_identifier__ = null 227 | 228 | var Component = Object(__WEBPACK_IMPORTED_MODULE_2__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 229 | __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue__["a" /* default */], 230 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_57509004_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_index_vue__["a" /* render */], 231 | __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_57509004_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_index_vue__["b" /* staticRenderFns */], 232 | __vue_template_functional__, 233 | __vue_styles__, 234 | __vue_scopeId__, 235 | __vue_module_identifier__ 236 | ) 237 | Component.options.__file = "src/pages/index.vue" 238 | 239 | /* hot reload */ 240 | if (false) {(function () { 241 | var hotAPI = require("vue-hot-reload-api") 242 | hotAPI.install(require("vue"), false) 243 | if (!hotAPI.compatible) return 244 | module.hot.accept() 245 | if (!module.hot.data) { 246 | hotAPI.createRecord("data-v-57509004", Component.options) 247 | } else { 248 | hotAPI.reload("data-v-57509004", Component.options) 249 | } 250 | module.hot.dispose(function (data) { 251 | disposed = true 252 | }) 253 | })()} 254 | 255 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 256 | 257 | 258 | /***/ }), 259 | /* 16 */ 260 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 261 | 262 | "use strict"; 263 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 264 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 265 | var render = function() { 266 | var _vm = this 267 | var _h = _vm.$createElement 268 | var _c = _vm._self._c || _h 269 | return _c( 270 | "div", 271 | [ 272 | _c("p", [_vm._v("The visited URL is: " + _vm._s(_vm.url))]), 273 | _c("p", [ 274 | _c("button", { on: { click: _vm.sayHello } }, [_vm._v("Hello")]) 275 | ]), 276 | _c("router-link", { attrs: { to: "/about" } }, [_vm._v("About page")]) 277 | ], 278 | 1 279 | ) 280 | } 281 | var staticRenderFns = [] 282 | render._withStripped = true 283 | 284 | if (false) { 285 | module.hot.accept() 286 | if (module.hot.data) { 287 | require("vue-hot-reload-api") .rerender("data-v-57509004", { render: render, staticRenderFns: staticRenderFns }) 288 | } 289 | } 290 | 291 | /***/ }), 292 | /* 17 */ 293 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 294 | 295 | "use strict"; 296 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_96c0458e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_about_vue__ = __webpack_require__(23); 297 | /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_runtime_component_normalizer__ = __webpack_require__(2); 298 | var disposed = false 299 | function injectStyle (context) { 300 | if (disposed) return 301 | __webpack_require__(18) 302 | } 303 | /* script */ 304 | var __vue_script__ = null 305 | /* template */ 306 | 307 | /* template functional */ 308 | var __vue_template_functional__ = false 309 | /* styles */ 310 | var __vue_styles__ = injectStyle 311 | /* scopeId */ 312 | var __vue_scopeId__ = "data-v-96c0458e" 313 | /* moduleIdentifier (server only) */ 314 | var __vue_module_identifier__ = null 315 | 316 | var Component = Object(__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_runtime_component_normalizer__["a" /* default */])( 317 | __vue_script__, 318 | __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_96c0458e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_about_vue__["a" /* render */], 319 | __WEBPACK_IMPORTED_MODULE_0__node_modules_vue_loader_lib_template_compiler_index_id_data_v_96c0458e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_about_vue__["b" /* staticRenderFns */], 320 | __vue_template_functional__, 321 | __vue_styles__, 322 | __vue_scopeId__, 323 | __vue_module_identifier__ 324 | ) 325 | Component.options.__file = "src/pages/about.vue" 326 | 327 | /* hot reload */ 328 | if (false) {(function () { 329 | var hotAPI = require("vue-hot-reload-api") 330 | hotAPI.install(require("vue"), false) 331 | if (!hotAPI.compatible) return 332 | module.hot.accept() 333 | if (!module.hot.data) { 334 | hotAPI.createRecord("data-v-96c0458e", Component.options) 335 | } else { 336 | hotAPI.reload("data-v-96c0458e", Component.options) 337 | } 338 | module.hot.dispose(function (data) { 339 | disposed = true 340 | }) 341 | })()} 342 | 343 | /* harmony default export */ __webpack_exports__["a"] = (Component.exports); 344 | 345 | 346 | /***/ }), 347 | /* 18 */ 348 | /***/ (function(module, exports, __webpack_require__) { 349 | 350 | // style-loader: Adds some css to the DOM by adding a "],"sourceRoot":""}]); 383 | 384 | // exports 385 | 386 | 387 | /***/ }), 388 | /* 20 */, 389 | /* 21 */, 390 | /* 22 */, 391 | /* 23 */ 392 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 393 | 394 | "use strict"; 395 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return render; }); 396 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return staticRenderFns; }); 397 | var render = function() { 398 | var _vm = this 399 | var _h = _vm.$createElement 400 | var _c = _vm._self._c || _h 401 | return _c( 402 | "div", 403 | [ 404 | _c("h1", [_vm._v("About page")]), 405 | _c("router-link", { attrs: { to: "/" } }, [_vm._v("Home page")]) 406 | ], 407 | 1 408 | ) 409 | } 410 | var staticRenderFns = [] 411 | render._withStripped = true 412 | 413 | if (false) { 414 | module.hot.accept() 415 | if (module.hot.data) { 416 | require("vue-hot-reload-api") .rerender("data-v-96c0458e", { render: render, staticRenderFns: staticRenderFns }) 417 | } 418 | } 419 | 420 | /***/ }) 421 | ],[4]); 422 | //# sourceMappingURL=app.04aafe95e9e39db0bd8f.js.map -------------------------------------------------------------------------------- /vue-ssr-6/dist/app.04aafe95e9e39db0bd8f.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"app.04aafe95e9e39db0bd8f.js","sources":["webpack:///index.vue","webpack:///src/entry-client.js","webpack:///src/app.js","webpack:///./src/App.vue","webpack:///./src/App.vue?3a25","webpack:///src/store/index.js","webpack:///src/router/index.js","webpack:///./src/pages/index.vue","webpack:///./src/pages/index.vue?6612","webpack:///./src/pages/about.vue","webpack:///./src/pages/about.vue?5c7f","webpack:///./src/pages/about.vue?2f68","webpack:///./src/pages/about.vue?d6c3"],"sourcesContent":["\n\n\n\n\n// WEBPACK FOOTER //\n// index.vue","import { createApp } from './app'\n\nconst { app } = createApp()\n\n// This assumes App.vue template root element has `id=\"app\"`\napp.$mount('#app')\n\n\n// WEBPACK FOOTER //\n// src/entry-client.js","import Vue from 'vue'\nimport App from './App.vue'\nimport { createStore } from './store'\nimport { createRouter } from './router'\n\n/*\n** Export a factory function for creating fresh app,\n** router and store instances\n*/\nexport function createApp (context) {\n\t// create store and router instances\n const store = createStore()\n\tconst router = createRouter()\n\n\tconst app = new Vue({\n\t\trouter,\n\t\tstore,\n\t\trender: h => h(App)\n\t})\n\n\treturn { app, router, store }\n}\n\n\n// WEBPACK FOOTER //\n// src/app.js","var disposed = false\n/* script */\nvar __vue_script__ = null\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7ba5bd90\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/App.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-7ba5bd90\", Component.options)\n } else {\n hotAPI.reload(\"data-v-7ba5bd90\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = 9\n// module chunks = 0","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"app\" } }, [_c(\"router-view\")], 1)\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-7ba5bd90\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7ba5bd90\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = 10\n// module chunks = 0","import Vue from 'vue'\nimport Vuex from 'vuex'\n\nVue.use(Vuex)\n\nexport function createStore () {\n return new Vuex.Store({\n state: {},\n actions: {},\n mutations: {}\n })\n}\n\n\n// WEBPACK FOOTER //\n// src/store/index.js","import Vue from 'vue'\nimport Router from 'vue-router'\n\nVue.use(Router)\n\n// route-level code splitting\nimport Home from '../pages/index.vue'\nimport About from '../pages/about.vue'\n\nexport function createRouter () {\n return new Router({\n mode: 'history',\n routes: [\n { path: '/', component: Home },\n { path: '/about', component: About }\n ]\n })\n}\n\n\n// WEBPACK FOOTER //\n// src/router/index.js","var disposed = false\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-57509004\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./index.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/pages/index.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-57509004\", Component.options)\n } else {\n hotAPI.reload(\"data-v-57509004\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/index.vue\n// module id = 15\n// module chunks = 0","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"p\", [_vm._v(\"The visited URL is: \" + _vm._s(_vm.url))]),\n _c(\"p\", [\n _c(\"button\", { on: { click: _vm.sayHello } }, [_vm._v(\"Hello\")])\n ]),\n _c(\"router-link\", { attrs: { to: \"/about\" } }, [_vm._v(\"About page\")])\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-57509004\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-57509004\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/pages/index.vue\n// module id = 16\n// module chunks = 0","var disposed = false\nfunction injectStyle (context) {\n if (disposed) return\n require(\"!!vue-loader/node_modules/vue-style-loader!css-loader?sourceMap!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-96c0458e\\\",\\\"scoped\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./about.vue\")\n}\n/* script */\nvar __vue_script__ = null\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-96c0458e\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./about.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-96c0458e\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\nComponent.options.__file = \"src/pages/about.vue\"\n\n/* hot reload */\nif (module.hot) {(function () {\n var hotAPI = require(\"vue-hot-reload-api\")\n hotAPI.install(require(\"vue\"), false)\n if (!hotAPI.compatible) return\n module.hot.accept()\n if (!module.hot.data) {\n hotAPI.createRecord(\"data-v-96c0458e\", Component.options)\n } else {\n hotAPI.reload(\"data-v-96c0458e\", Component.options)\n }\n module.hot.dispose(function (data) {\n disposed = true\n })\n})()}\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/about.vue\n// module id = 17\n// module chunks = 0","// style-loader: Adds some css to the DOM by adding a \"],\"sourceRoot\":\"\"}]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader?sourceMap!./node_modules/vue-loader/lib/style-compiler?{\"vue\":true,\"id\":\"data-v-96c0458e\",\"scoped\":true,\"sourceMap\":true}!./node_modules/vue-loader/lib/selector.js?type=styles&index=0!./src/pages/about.vue\n// module id = 19\n// module chunks = 0","var render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"h1\", [_vm._v(\"About page\")]),\n _c(\"router-link\", { attrs: { to: \"/\" } }, [_vm._v(\"Home page\")])\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\nexport { render, staticRenderFns }\nif (module.hot) {\n module.hot.accept()\n if (module.hot.data) {\n require(\"vue-hot-reload-api\") .rerender(\"data-v-96c0458e\", { render: render, staticRenderFns: staticRenderFns })\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-96c0458e\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/pages/about.vue\n// module id = 23\n// module chunks = 0"],"mappings":";;;;;;;;;;;;;;;;;AASA;AAEA;;AAEA;AADA;AAGA;;AAEA;AACA;AACA;AAHA;AANA;;;;;;;ACVA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACLA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AACA;AAKA;AACA;;;;;;;;;;ACrBA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzCA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACdA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;;;;;;;;ACXA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AAOA;;;;;;;;ACjBA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1CA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACxBA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACPA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} -------------------------------------------------------------------------------- /vue-ssr-6/dist/manifest.54e67e9f17df71efc259.js: -------------------------------------------------------------------------------- 1 | /******/ (function(modules) { // webpackBootstrap 2 | /******/ // install a JSONP callback for chunk loading 3 | /******/ var parentJsonpFunction = window["webpackJsonp"]; 4 | /******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) { 5 | /******/ // add "moreModules" to the modules object, 6 | /******/ // then flag all "chunkIds" as loaded and fire callback 7 | /******/ var moduleId, chunkId, i = 0, resolves = [], result; 8 | /******/ for(;i < chunkIds.length; i++) { 9 | /******/ chunkId = chunkIds[i]; 10 | /******/ if(installedChunks[chunkId]) { 11 | /******/ resolves.push(installedChunks[chunkId][0]); 12 | /******/ } 13 | /******/ installedChunks[chunkId] = 0; 14 | /******/ } 15 | /******/ for(moduleId in moreModules) { 16 | /******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { 17 | /******/ modules[moduleId] = moreModules[moduleId]; 18 | /******/ } 19 | /******/ } 20 | /******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules); 21 | /******/ while(resolves.length) { 22 | /******/ resolves.shift()(); 23 | /******/ } 24 | /******/ if(executeModules) { 25 | /******/ for(i=0; i < executeModules.length; i++) { 26 | /******/ result = __webpack_require__(__webpack_require__.s = executeModules[i]); 27 | /******/ } 28 | /******/ } 29 | /******/ return result; 30 | /******/ }; 31 | /******/ 32 | /******/ // The module cache 33 | /******/ var installedModules = {}; 34 | /******/ 35 | /******/ // objects to store loaded and loading chunks 36 | /******/ var installedChunks = { 37 | /******/ 2: 0 38 | /******/ }; 39 | /******/ 40 | /******/ // The require function 41 | /******/ function __webpack_require__(moduleId) { 42 | /******/ 43 | /******/ // Check if module is in cache 44 | /******/ if(installedModules[moduleId]) { 45 | /******/ return installedModules[moduleId].exports; 46 | /******/ } 47 | /******/ // Create a new module (and put it into the cache) 48 | /******/ var module = installedModules[moduleId] = { 49 | /******/ i: moduleId, 50 | /******/ l: false, 51 | /******/ exports: {} 52 | /******/ }; 53 | /******/ 54 | /******/ // Execute the module function 55 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 56 | /******/ 57 | /******/ // Flag the module as loaded 58 | /******/ module.l = true; 59 | /******/ 60 | /******/ // Return the exports of the module 61 | /******/ return module.exports; 62 | /******/ } 63 | /******/ 64 | /******/ 65 | /******/ // expose the modules object (__webpack_modules__) 66 | /******/ __webpack_require__.m = modules; 67 | /******/ 68 | /******/ // expose the module cache 69 | /******/ __webpack_require__.c = installedModules; 70 | /******/ 71 | /******/ // define getter function for harmony exports 72 | /******/ __webpack_require__.d = function(exports, name, getter) { 73 | /******/ if(!__webpack_require__.o(exports, name)) { 74 | /******/ Object.defineProperty(exports, name, { 75 | /******/ configurable: false, 76 | /******/ enumerable: true, 77 | /******/ get: getter 78 | /******/ }); 79 | /******/ } 80 | /******/ }; 81 | /******/ 82 | /******/ // getDefaultExport function for compatibility with non-harmony modules 83 | /******/ __webpack_require__.n = function(module) { 84 | /******/ var getter = module && module.__esModule ? 85 | /******/ function getDefault() { return module['default']; } : 86 | /******/ function getModuleExports() { return module; }; 87 | /******/ __webpack_require__.d(getter, 'a', getter); 88 | /******/ return getter; 89 | /******/ }; 90 | /******/ 91 | /******/ // Object.prototype.hasOwnProperty.call 92 | /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 93 | /******/ 94 | /******/ // __webpack_public_path__ 95 | /******/ __webpack_require__.p = "/dist/"; 96 | /******/ 97 | /******/ // on error function for async loading 98 | /******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; 99 | /******/ }) 100 | /************************************************************************/ 101 | /******/ ([]); 102 | //# sourceMappingURL=manifest.54e67e9f17df71efc259.js.map -------------------------------------------------------------------------------- /vue-ssr-6/dist/manifest.54e67e9f17df71efc259.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"manifest.54e67e9f17df71efc259.js","sources":["webpack:///webpack/bootstrap d71239dd40c2de2d3bd4"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d71239dd40c2de2d3bd4"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} -------------------------------------------------------------------------------- /vue-ssr-6/dist/vue-ssr-client-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "publicPath": "/dist/", 3 | "all": [ 4 | "app.04aafe95e9e39db0bd8f.js", 5 | "vendor.d979c5f5d5c24fc2dec9.js", 6 | "manifest.54e67e9f17df71efc259.js", 7 | "app.04aafe95e9e39db0bd8f.js.map", 8 | "vendor.d979c5f5d5c24fc2dec9.js.map", 9 | "manifest.54e67e9f17df71efc259.js.map" 10 | ], 11 | "initial": [ 12 | "manifest.54e67e9f17df71efc259.js", 13 | "vendor.d979c5f5d5c24fc2dec9.js", 14 | "app.04aafe95e9e39db0bd8f.js" 15 | ], 16 | "async": [], 17 | "modules": { 18 | "921f7c2e": [ 19 | 1, 20 | 4 21 | ], 22 | "3ab74f29": [ 23 | 1, 24 | 4 25 | ], 26 | "025cdaf9": [ 27 | 1, 28 | 4 29 | ], 30 | "74091d35": [ 31 | 0, 32 | 3 33 | ], 34 | "09fb2684": [ 35 | 0, 36 | 3 37 | ], 38 | "58d95389": [ 39 | 0, 40 | 3 41 | ], 42 | "dde33ed6": [ 43 | 1, 44 | 4 45 | ], 46 | "3ce11016": [ 47 | 1, 48 | 4 49 | ], 50 | "41bedbfc": [ 51 | 1, 52 | 4 53 | ], 54 | "c4e35316": [ 55 | 0, 56 | 3 57 | ], 58 | "54bbf45e": [ 59 | 0, 60 | 3 61 | ], 62 | "0f81a4b4": [ 63 | 0, 64 | 3 65 | ], 66 | "12d175fb": [ 67 | 1, 68 | 4 69 | ], 70 | "519badf8": [ 71 | 0, 72 | 3 73 | ], 74 | "ff42c102": [ 75 | 1, 76 | 4 77 | ], 78 | "3e02603b": [ 79 | 0, 80 | 3 81 | ], 82 | "de92e4d2": [ 83 | 0, 84 | 3 85 | ], 86 | "1e4a8576": [ 87 | 0, 88 | 3 89 | ], 90 | "b9c4a416": [ 91 | 0, 92 | 3 93 | ], 94 | "f1fa7002": [ 95 | 0, 96 | 3 97 | ], 98 | "bc807c66": [ 99 | 1, 100 | 4 101 | ], 102 | "9206fae2": [ 103 | 1, 104 | 4 105 | ], 106 | "5ab425f6": [ 107 | 1, 108 | 4 109 | ], 110 | "47b0506e": [ 111 | 0, 112 | 3 113 | ] 114 | } 115 | } -------------------------------------------------------------------------------- /vue-ssr-6/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-ssr", 3 | "version": "1.0.0", 4 | "description": "Vue.js & Vue-Server-Renderer", 5 | "scripts": { 6 | "dev": "node server.js", 7 | "start": "cross-env NODE_ENV=production node server", 8 | "build": "rimraf dist && npm run build:client && npm run build:server", 9 | "build:client": "webpack --config build/webpack.client.config.js --progress --hide-modules", 10 | "build:server": "webpack --config build/webpack.server.config.js --progress --hide-modules" 11 | }, 12 | "dependencies": { 13 | "axios": "^0.17.1", 14 | "cross-env": "^5.1.3", 15 | "es6-promise": "^4.2.4", 16 | "express": "^4.16.2", 17 | "vue": "^2.5.13", 18 | "vue-router": "^3.0.1", 19 | "vue-server-renderer": "^2.5.13", 20 | "vuex": "^3.0.1" 21 | }, 22 | "devDependencies": { 23 | "autoprefixer": "^8.0.0", 24 | "babel-core": "^6.26.0", 25 | "babel-loader": "^7.1.2", 26 | "chokidar": "^2.0.1", 27 | "css-loader": "^0.28.9", 28 | "extract-text-webpack-plugin": "^3.0.2", 29 | "file-loader": "^1.1.6", 30 | "friendly-errors-webpack-plugin": "^1.6.1", 31 | "memory-fs": "^0.4.1", 32 | "rimraf": "^2.6.2", 33 | "url-loader": "^0.6.2", 34 | "vue-loader": "^14.1.1", 35 | "vue-style-loader": "^3.1.2", 36 | "vue-template-compiler": "^2.5.13", 37 | "webpack": "^3.11.0", 38 | "webpack-dev-middleware": "^2.0.5", 39 | "webpack-hot-middleware": "^2.21.0", 40 | "webpack-merge": "^4.1.1", 41 | "webpack-node-externals": "^1.6.0" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /vue-ssr-6/server.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const express = require('express') 4 | const resolve = file => path.resolve(__dirname, file) 5 | const { createBundleRenderer } = require('vue-server-renderer') 6 | 7 | const isProd = process.env.NODE_ENV === 'production' 8 | const app = express() 9 | 10 | function createRenderer (bundle, options) { 11 | // https://github.com/vuejs/vue/blob/dev/packages/vue-server-renderer/README.md#why-use-bundlerenderer 12 | return createBundleRenderer(bundle, Object.assign(options, { 13 | // recommended for performance 14 | runInNewContext: false 15 | })) 16 | } 17 | 18 | let renderer 19 | let readyPromise 20 | const templatePath = resolve('./src/index.template.html') 21 | if (isProd) { 22 | // In production: create server renderer using template and built server bundle. 23 | // The server bundle is generated by vue-ssr-webpack-plugin. 24 | const template = fs.readFileSync(templatePath, 'utf-8') 25 | const bundle = require('./dist/vue-ssr-server-bundle.json') 26 | // The client manifests are optional, but it allows the renderer 27 | // to automatically infer preload/prefetch links and directly add 25 | 26 | -------------------------------------------------------------------------------- /vue-ssr-6/src/pages/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /vue-ssr-6/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | Vue.use(Router) 5 | 6 | // route-level code splitting 7 | import Home from '../pages/index.vue' 8 | import About from '../pages/about.vue' 9 | 10 | export function createRouter () { 11 | return new Router({ 12 | mode: 'history', 13 | routes: [ 14 | { path: '/', component: Home }, 15 | { path: '/about', component: About } 16 | ] 17 | }) 18 | } -------------------------------------------------------------------------------- /vue-ssr-6/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | Vue.use(Vuex) 5 | 6 | export function createStore () { 7 | return new Vuex.Store({ 8 | state: { 9 | counter: 0 10 | }, 11 | mutations: { 12 | INCREMENT(state) { 13 | state.counter++ 14 | } 15 | } 16 | }) 17 | } -------------------------------------------------------------------------------- /vue-ssr-amsterdam.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atinux/vue-ssr-amsterdam/27e8e4c79df8413eb74affdacb261392bfdcfe80/vue-ssr-amsterdam.key -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/App.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import NuxtLoading from './components/nuxt-loading.vue' 3 | 4 | 5 | let layouts = { 6 | 7 | "_default": () => import('./layouts/default.vue' /* webpackChunkName: "layouts/default" */).then(m => m.default || m) 8 | 9 | } 10 | 11 | let resolvedLayouts = {} 12 | 13 | export default { 14 | head: {"meta":[],"link":[],"style":[],"script":[]}, 15 | render(h, props) { 16 | const loadingEl = h('nuxt-loading', { ref: 'loading' }) 17 | const layoutEl = h(this.layout || 'nuxt') 18 | const templateEl = h('div', { 19 | domProps: { 20 | id: '__layout' 21 | }, 22 | key: this.layoutName 23 | }, [ layoutEl ]) 24 | 25 | const transitionEl = h('transition', { 26 | props: { 27 | name: 'layout', 28 | mode: 'out-in' 29 | } 30 | }, [ templateEl ]) 31 | 32 | return h('div',{ 33 | domProps: { 34 | id: '__nuxt' 35 | } 36 | }, [ 37 | loadingEl, 38 | transitionEl 39 | ]) 40 | }, 41 | data: () => ({ 42 | layout: null, 43 | layoutName: '' 44 | }), 45 | beforeCreate () { 46 | Vue.util.defineReactive(this, 'nuxt', this.$options.nuxt) 47 | }, 48 | created () { 49 | // Add this.$nuxt in child instances 50 | Vue.prototype.$nuxt = this 51 | // add to window so we can listen when ready 52 | if (typeof window !== 'undefined') { 53 | window.$nuxt = this 54 | } 55 | // Add $nuxt.error() 56 | this.error = this.nuxt.error 57 | }, 58 | 59 | mounted () { 60 | this.$loading = this.$refs.loading 61 | }, 62 | watch: { 63 | 'nuxt.err': 'errorChanged' 64 | }, 65 | 66 | methods: { 67 | 68 | errorChanged () { 69 | if (this.nuxt.err && this.$loading) { 70 | if (this.$loading.fail) this.$loading.fail() 71 | if (this.$loading.finish) this.$loading.finish() 72 | } 73 | }, 74 | 75 | setLayout (layout) { 76 | if (!layout || !resolvedLayouts['_' + layout]) layout = 'default' 77 | this.layoutName = layout 78 | let _layout = '_' + layout 79 | this.layout = resolvedLayouts[_layout] 80 | return this.layout 81 | }, 82 | loadLayout (layout) { 83 | if (!layout || !(layouts['_' + layout] || resolvedLayouts['_' + layout])) layout = 'default' 84 | let _layout = '_' + layout 85 | if (resolvedLayouts[_layout]) { 86 | return Promise.resolve(resolvedLayouts[_layout]) 87 | } 88 | return layouts[_layout]() 89 | .then((Component) => { 90 | resolvedLayouts[_layout] = Component 91 | delete layouts[_layout] 92 | return resolvedLayouts[_layout] 93 | }) 94 | .catch((e) => { 95 | if (this.$nuxt) { 96 | return this.$nuxt.error({ statusCode: 500, message: e.message }) 97 | } 98 | }) 99 | } 100 | }, 101 | components: { 102 | NuxtLoading 103 | } 104 | } 105 | 106 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/components/no-ssr.js: -------------------------------------------------------------------------------- 1 | /* 2 | ** From https://github.com/egoist/vue-no-ssr 3 | ** With the authorization of @egoist 4 | */ 5 | export default { 6 | name: 'no-ssr', 7 | props: ['placeholder'], 8 | data () { 9 | return { 10 | canRender: false 11 | } 12 | }, 13 | mounted () { 14 | this.canRender = true 15 | }, 16 | render (h) { 17 | if (this.canRender) { 18 | if ( 19 | process.env.NODE_ENV === 'development' && 20 | this.$slots.default && 21 | this.$slots.default.length > 1 22 | ) { 23 | throw new Error(' You cannot use multiple child components') 24 | } 25 | return this.$slots.default && this.$slots.default[0] 26 | } 27 | 28 | return h( 29 | 'div', 30 | { 31 | class: ['no-ssr-placeholder'] 32 | }, 33 | this.$slots.placeholder || this.placeholder 34 | ) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/components/nuxt-child.js: -------------------------------------------------------------------------------- 1 | export default { 2 | name: 'nuxt-child', 3 | functional: true, 4 | props: ['keepAlive'], 5 | render (h, { parent, data, props }) { 6 | data.nuxtChild = true 7 | const _parent = parent 8 | const transitions = parent.$nuxt.nuxt.transitions 9 | const defaultTransition = parent.$nuxt.nuxt.defaultTransition 10 | 11 | let depth = 0 12 | while (parent) { 13 | if (parent.$vnode && parent.$vnode.data.nuxtChild) { 14 | depth++ 15 | } 16 | parent = parent.$parent 17 | } 18 | data.nuxtChildDepth = depth 19 | const transition = transitions[depth] || defaultTransition 20 | let transitionProps = {} 21 | transitionsKeys.forEach((key) => { 22 | if (typeof transition[key] !== 'undefined') { 23 | transitionProps[key] = transition[key] 24 | } 25 | }) 26 | let listeners = {} 27 | listenersKeys.forEach((key) => { 28 | if (typeof transition[key] === 'function') { 29 | listeners[key] = transition[key].bind(_parent) 30 | } 31 | }) 32 | // Add triggerScroll event on beforeEnter (fix #1376) 33 | let beforeEnter = listeners.beforeEnter 34 | listeners.beforeEnter = (el) => { 35 | window.$nuxt.$emit('triggerScroll') 36 | if (beforeEnter) return beforeEnter.call(_parent, el) 37 | } 38 | 39 | let routerView = [ 40 | h('router-view', data) 41 | ] 42 | if (typeof props.keepAlive !== 'undefined') { 43 | routerView = [ 44 | h('keep-alive', routerView) 45 | ] 46 | } 47 | return h('transition', { 48 | props: transitionProps, 49 | on: listeners 50 | }, routerView) 51 | } 52 | } 53 | 54 | const transitionsKeys = [ 55 | 'name', 56 | 'mode', 57 | 'appear', 58 | 'css', 59 | 'type', 60 | 'duration', 61 | 'enterClass', 62 | 'leaveClass', 63 | 'appearClass', 64 | 'enterActiveClass', 65 | 'enterActiveClass', 66 | 'leaveActiveClass', 67 | 'appearActiveClass', 68 | 'enterToClass', 69 | 'leaveToClass', 70 | 'appearToClass' 71 | ] 72 | 73 | const listenersKeys = [ 74 | 'beforeEnter', 75 | 'enter', 76 | 'afterEnter', 77 | 'enterCancelled', 78 | 'beforeLeave', 79 | 'leave', 80 | 'afterLeave', 81 | 'leaveCancelled', 82 | 'beforeAppear', 83 | 'appear', 84 | 'afterAppear', 85 | 'appearCancelled' 86 | ] 87 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/components/nuxt-error.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 67 | 68 | 113 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/components/nuxt-link.js: -------------------------------------------------------------------------------- 1 | export default { 2 | name: 'nuxt-link', 3 | functional: true, 4 | render (h, { data, children }) { 5 | return h('router-link', data, children) 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/components/nuxt-loading.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 89 | 90 | 104 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/components/nuxt.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import NuxtChild from './nuxt-child' 3 | import NuxtError from './nuxt-error.vue' 4 | import { compile } from '../utils' 5 | 6 | export default { 7 | name: 'nuxt', 8 | props: ['nuxtChildKey', 'keepAlive'], 9 | render(h) { 10 | // If there is some error 11 | if (this.nuxt.err) { 12 | return h('nuxt-error', { 13 | props: { 14 | error: this.nuxt.err 15 | } 16 | }) 17 | } 18 | // Directly return nuxt child 19 | return h('nuxt-child', { 20 | key: this.routerViewKey, 21 | props: this.$props 22 | }) 23 | }, 24 | beforeCreate () { 25 | Vue.util.defineReactive(this, 'nuxt', this.$root.$options.nuxt) 26 | }, 27 | computed: { 28 | routerViewKey () { 29 | // If nuxtChildKey prop is given or current route has children 30 | if (typeof this.nuxtChildKey !== 'undefined' || this.$route.matched.length > 1) { 31 | return this.nuxtChildKey || compile(this.$route.matched[0].path)(this.$route.params) 32 | } 33 | const Component = this.$route.matched[0] && this.$route.matched[0].components.default 34 | if (Component && Component.options && Component.options.key) { 35 | return (typeof Component.options.key === 'function' ? Component.options.key(this.$route) : Component.options.key) 36 | } 37 | return this.$route.path 38 | } 39 | }, 40 | components: { 41 | NuxtChild, 42 | NuxtError 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/empty.js: -------------------------------------------------------------------------------- 1 | // This file is intentionally left empty for noop aliases 2 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/index.js: -------------------------------------------------------------------------------- 1 | import 'es6-promise/auto' 2 | import Vue from 'vue' 3 | import Meta from 'vue-meta' 4 | import { createRouter } from './router.js' 5 | import NoSSR from './components/no-ssr.js' 6 | import NuxtChild from './components/nuxt-child.js' 7 | import NuxtLink from './components/nuxt-link.js' 8 | import NuxtError from './components/nuxt-error.vue' 9 | import Nuxt from './components/nuxt.js' 10 | import App from './App.js' 11 | import { setContext, getLocation, getRouteData } from './utils' 12 | import { createStore } from './store.js' 13 | 14 | /* Plugins */ 15 | 16 | 17 | // Component: 18 | Vue.component(NoSSR.name, NoSSR) 19 | 20 | // Component: 21 | Vue.component(NuxtChild.name, NuxtChild) 22 | 23 | // Component: 24 | Vue.component(NuxtLink.name, NuxtLink) 25 | 26 | // Component: ` 27 | Vue.component(Nuxt.name, Nuxt) 28 | 29 | // vue-meta configuration 30 | Vue.use(Meta, { 31 | keyName: 'head', // the component option name that vue-meta looks for meta info on. 32 | attribute: 'data-n-head', // the attribute name vue-meta adds to the tags it observes 33 | ssrAttribute: 'data-n-head-ssr', // the attribute name that lets vue-meta know that meta info has already been server-rendered 34 | tagIDKeyName: 'hid' // the property name that vue-meta uses to determine whether to overwrite or append a tag 35 | }) 36 | 37 | const defaultTransition = {"name":"page","mode":"out-in","appear":false,"appearClass":"appear","appearActiveClass":"appear-active","appearToClass":"appear-to"} 38 | 39 | async function createApp (ssrContext) { 40 | const router = createRouter() 41 | 42 | 43 | const store = createStore() 44 | // Add this.$router into store actions/mutations 45 | store.$router = router 46 | 47 | 48 | // Create Root instance 49 | // here we inject the router and store to all child components, 50 | // making them available everywhere as `this.$router` and `this.$store`. 51 | const app = { 52 | router, 53 | store, 54 | nuxt: { 55 | defaultTransition, 56 | transitions: [ defaultTransition ], 57 | setTransitions (transitions) { 58 | if (!Array.isArray(transitions)) { 59 | transitions = [ transitions ] 60 | } 61 | transitions = transitions.map((transition) => { 62 | if (!transition) { 63 | transition = defaultTransition 64 | } else if (typeof transition === 'string') { 65 | transition = Object.assign({}, defaultTransition, { name: transition }) 66 | } else { 67 | transition = Object.assign({}, defaultTransition, transition) 68 | } 69 | return transition 70 | }) 71 | this.$options.nuxt.transitions = transitions 72 | return transitions 73 | }, 74 | err: null, 75 | dateErr: null, 76 | error (err) { 77 | err = err || null 78 | app.context._errored = !!err 79 | if (typeof err === 'string') err = { statusCode: 500, message: err } 80 | const nuxt = this.nuxt || this.$options.nuxt 81 | nuxt.dateErr = Date.now() 82 | nuxt.err = err 83 | // Used in lib/server.js 84 | if (ssrContext) ssrContext.nuxt.error = err 85 | return err 86 | } 87 | }, 88 | ...App 89 | } 90 | 91 | // Make app available into store via this.app 92 | store.app = app 93 | 94 | const next = ssrContext ? ssrContext.next : location => app.router.push(location) 95 | // Resolve route 96 | let route 97 | if (ssrContext) { 98 | route = router.resolve(ssrContext.url).route 99 | } else { 100 | const path = getLocation(router.options.base) 101 | route = router.resolve(path).route 102 | } 103 | 104 | // Set context to app.context 105 | await setContext(app, { 106 | route, 107 | next, 108 | error: app.nuxt.error.bind(app), 109 | store, 110 | payload: ssrContext ? ssrContext.payload : undefined, 111 | req: ssrContext ? ssrContext.req : undefined, 112 | res: ssrContext ? ssrContext.res : undefined, 113 | beforeRenderFns: ssrContext ? ssrContext.beforeRenderFns : undefined 114 | }) 115 | 116 | const inject = function (key, value) { 117 | if (!key) throw new Error('inject(key, value) has no key provided') 118 | if (!value) throw new Error('inject(key, value) has no value provided') 119 | key = '$' + key 120 | // Add into app 121 | app[key] = value 122 | 123 | // Add into store 124 | store[key] = app[key] 125 | 126 | // Check if plugin not already installed 127 | const installKey = '__nuxt_' + key + '_installed__' 128 | if (Vue[installKey]) return 129 | Vue[installKey] = true 130 | // Call Vue.use() to install the plugin into vm 131 | Vue.use(() => { 132 | if (!Vue.prototype.hasOwnProperty(key)) { 133 | Object.defineProperty(Vue.prototype, key, { 134 | get () { 135 | return this.$root.$options[key] 136 | } 137 | }) 138 | } 139 | }) 140 | } 141 | 142 | 143 | if (process.browser) { 144 | // Replace store state before plugins execution 145 | if (window.__NUXT__ && window.__NUXT__.state) { 146 | store.replaceState(window.__NUXT__.state) 147 | } 148 | } 149 | 150 | 151 | // Plugin execution 152 | 153 | 154 | 155 | // If server-side, wait for async component to be resolved first 156 | if (process.server && ssrContext && ssrContext.url) { 157 | await new Promise((resolve, reject) => { 158 | router.push(ssrContext.url, resolve, () => { 159 | // navigated to a different route in router guard 160 | const unregister = router.afterEach(async (to, from, next) => { 161 | ssrContext.url = to.fullPath 162 | app.context.route = await getRouteData(to) 163 | app.context.params = to.params || {} 164 | app.context.query = to.query || {} 165 | unregister() 166 | resolve() 167 | }) 168 | }) 169 | }) 170 | } 171 | 172 | return { 173 | app, 174 | router, 175 | store 176 | } 177 | } 178 | 179 | export { createApp, NuxtError } 180 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/layouts/default.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/loading.html: -------------------------------------------------------------------------------- 1 | 43 | 44 |
45 |
46 |
47 |
48 | 49 | 50 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/middleware.js: -------------------------------------------------------------------------------- 1 | export default {} 2 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | Vue.use(Router) 5 | 6 | const _78d6284c = () => import('../pages/about.vue' /* webpackChunkName: "pages/about" */).then(m => m.default || m) 7 | const _cee3f9de = () => import('../pages/index.vue' /* webpackChunkName: "pages/index" */).then(m => m.default || m) 8 | 9 | 10 | 11 | if (process.client) { 12 | window.history.scrollRestoration = 'manual' 13 | } 14 | const scrollBehavior = function (to, from, savedPosition) { 15 | // if the returned position is falsy or an empty object, 16 | // will retain current scroll position. 17 | let position = false 18 | 19 | // if no children detected 20 | if (to.matched.length < 2) { 21 | // scroll to the top of the page 22 | position = { x: 0, y: 0 } 23 | } else if (to.matched.some((r) => r.components.default.options.scrollToTop)) { 24 | // if one of the children has scrollToTop option set to true 25 | position = { x: 0, y: 0 } 26 | } 27 | 28 | // savedPosition is only available for popstate navigations (back button) 29 | if (savedPosition) { 30 | position = savedPosition 31 | } 32 | 33 | return new Promise(resolve => { 34 | // wait for the out transition to complete (if necessary) 35 | window.$nuxt.$once('triggerScroll', () => { 36 | // coords will be used if no selector is provided, 37 | // or if the selector didn't match any element. 38 | if (to.hash && document.querySelector(to.hash)) { 39 | // scroll to anchor by returning the selector 40 | position = { selector: to.hash } 41 | } 42 | resolve(position) 43 | }) 44 | }) 45 | } 46 | 47 | 48 | export function createRouter () { 49 | return new Router({ 50 | mode: 'history', 51 | base: '/', 52 | linkActiveClass: 'nuxt-link-active', 53 | linkExactActiveClass: 'nuxt-link-exact-active', 54 | scrollBehavior, 55 | routes: [ 56 | { 57 | path: "/about", 58 | component: _78d6284c, 59 | name: "about" 60 | }, 61 | { 62 | path: "/", 63 | component: _cee3f9de, 64 | name: "index" 65 | } 66 | ], 67 | 68 | 69 | fallback: false 70 | }) 71 | } 72 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/server.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import clone from 'clone' 3 | import { stringify } from 'querystring' 4 | import { omit } from 'lodash' 5 | import middleware from './middleware' 6 | import { createApp, NuxtError } from './index' 7 | import { applyAsyncData, sanitizeComponent, getMatchedComponents, getContext, middlewareSeries, promisify, urlJoin } from './utils' 8 | 9 | const debug = require('debug')('nuxt:render') 10 | debug.color = 4 // force blue color 11 | 12 | const isDev = true 13 | 14 | const noopApp = () => new Vue({ render: (h) => h('div') }) 15 | 16 | const createNext = ssrContext => opts => { 17 | ssrContext.redirected = opts 18 | // If nuxt generate 19 | if (!ssrContext.res) { 20 | ssrContext.nuxt.serverRendered = false 21 | return 22 | } 23 | opts.query = stringify(opts.query) 24 | opts.path = opts.path + (opts.query ? '?' + opts.query : '') 25 | if (opts.path.indexOf('http') !== 0 && ('/' !== '/' && opts.path.indexOf('/') !== 0)) { 26 | opts.path = urlJoin('/', opts.path) 27 | } 28 | // Avoid loop redirect 29 | if (opts.path === ssrContext.url) { 30 | ssrContext.redirected = false 31 | return 32 | } 33 | ssrContext.res.writeHead(opts.status, { 34 | 'Location': opts.path 35 | }) 36 | ssrContext.res.end() 37 | } 38 | 39 | // This exported function will be called by `bundleRenderer`. 40 | // This is where we perform data-prefetching to determine the 41 | // state of our application before actually rendering it. 42 | // Since data fetching is async, this function is expected to 43 | // return a Promise that resolves to the app instance. 44 | export default async ssrContext => { 45 | // Create ssrContext.next for simulate next() of beforeEach() when wanted to redirect 46 | ssrContext.redirected = false 47 | ssrContext.next = createNext(ssrContext) 48 | // Used for beforeNuxtRender({ Components, nuxtState }) 49 | ssrContext.beforeRenderFns = [] 50 | // Nuxt object (window.__NUXT__) 51 | ssrContext.nuxt = { layout: 'default', data: [], error: null, state: null, serverRendered: true } 52 | // Create the app definition and the instance (created for each request) 53 | const { app, router, store } = await createApp(ssrContext) 54 | const _app = new Vue(app) 55 | 56 | // Add meta infos (used in renderer.js) 57 | ssrContext.meta = _app.$meta() 58 | // Keep asyncData for each matched component in ssrContext (used in app/utils.js via this.$ssrContext) 59 | ssrContext.asyncData = {} 60 | 61 | const beforeRender = async () => { 62 | // Call beforeNuxtRender() methods 63 | await Promise.all(ssrContext.beforeRenderFns.map((fn) => promisify(fn, { Components, nuxtState: ssrContext.nuxt }))) 64 | 65 | // Add the state from the vuex store 66 | ssrContext.nuxt.state = store.state 67 | 68 | } 69 | const renderErrorPage = async () => { 70 | // Load layout for error page 71 | let errLayout = (typeof NuxtError.layout === 'function' ? NuxtError.layout(app.context) : NuxtError.layout) 72 | ssrContext.nuxt.layout = errLayout || 'default' 73 | await _app.loadLayout(errLayout) 74 | _app.setLayout(errLayout) 75 | await beforeRender() 76 | return _app 77 | } 78 | const render404Page = () => { 79 | app.context.error({ statusCode: 404, path: ssrContext.url, message: 'This page could not be found' }) 80 | return renderErrorPage() 81 | } 82 | 83 | const s = isDev && Date.now() 84 | 85 | // Components are already resolved by setContext -> getRouteData (app/utils.js) 86 | const Components = getMatchedComponents(router.match(ssrContext.url)) 87 | 88 | 89 | /* 90 | ** Dispatch store nuxtServerInit 91 | */ 92 | if (store._actions && store._actions.nuxtServerInit) { 93 | try { 94 | await store.dispatch('nuxtServerInit', app.context) 95 | } catch (err) { 96 | debug('error occurred when calling nuxtServerInit: ', err.message) 97 | throw err 98 | } 99 | } 100 | // ...If there is a redirect or an error, stop the process 101 | if (ssrContext.redirected) return noopApp() 102 | if (ssrContext.nuxt.error) return renderErrorPage() 103 | 104 | 105 | /* 106 | ** Call global middleware (nuxt.config.js) 107 | */ 108 | let midd = [] 109 | midd = midd.map((name) => { 110 | if (typeof name === 'function') return name 111 | if (typeof middleware[name] !== 'function') { 112 | app.context.error({ statusCode: 500, message: 'Unknown middleware ' + name }) 113 | } 114 | return middleware[name] 115 | }) 116 | await middlewareSeries(midd, app.context) 117 | // ...If there is a redirect or an error, stop the process 118 | if (ssrContext.redirected) return noopApp() 119 | if (ssrContext.nuxt.error) return renderErrorPage() 120 | 121 | /* 122 | ** Set layout 123 | */ 124 | let layout = Components.length ? Components[0].options.layout : NuxtError.layout 125 | if (typeof layout === 'function') layout = layout(app.context) 126 | await _app.loadLayout(layout) 127 | layout = _app.setLayout(layout) 128 | // ...Set layout to __NUXT__ 129 | ssrContext.nuxt.layout = _app.layoutName 130 | 131 | /* 132 | ** Call middleware (layout + pages) 133 | */ 134 | midd = [] 135 | if (layout.middleware) midd = midd.concat(layout.middleware) 136 | Components.forEach((Component) => { 137 | if (Component.options.middleware) { 138 | midd = midd.concat(Component.options.middleware) 139 | } 140 | }) 141 | midd = midd.map((name) => { 142 | if (typeof name === 'function') return name 143 | if (typeof middleware[name] !== 'function') { 144 | app.context.error({ statusCode: 500, message: 'Unknown middleware ' + name }) 145 | } 146 | return middleware[name] 147 | }) 148 | await middlewareSeries(midd, app.context) 149 | // ...If there is a redirect or an error, stop the process 150 | if (ssrContext.redirected) return noopApp() 151 | if (ssrContext.nuxt.error) return renderErrorPage() 152 | 153 | /* 154 | ** Call .validate() 155 | */ 156 | let isValid = true 157 | Components.forEach((Component) => { 158 | if (!isValid) return 159 | if (typeof Component.options.validate !== 'function') return 160 | isValid = Component.options.validate({ 161 | params: app.context.route.params || {}, 162 | query: app.context.route.query || {}, 163 | store 164 | }) 165 | }) 166 | // ...If .validate() returned false 167 | if (!isValid) { 168 | // Don't server-render the page in generate mode 169 | if (ssrContext._generate) ssrContext.nuxt.serverRendered = false 170 | // Render a 404 error page 171 | return render404Page() 172 | } 173 | 174 | // If no Components found, returns 404 175 | if (!Components.length) return render404Page() 176 | 177 | // Call asyncData & fetch hooks on components matched by the route. 178 | let asyncDatas = await Promise.all(Components.map(Component => { 179 | let promises = [] 180 | 181 | // Call asyncData(context) 182 | if (Component.options.asyncData && typeof Component.options.asyncData === 'function') { 183 | let promise = promisify(Component.options.asyncData, app.context) 184 | promise.then(asyncDataResult => { 185 | ssrContext.asyncData[Component.cid] = asyncDataResult 186 | applyAsyncData(Component) 187 | return asyncDataResult 188 | }) 189 | promises.push(promise) 190 | } else { 191 | promises.push(null) 192 | } 193 | 194 | // Call fetch(context) 195 | if (Component.options.fetch) { 196 | promises.push(Component.options.fetch(app.context)) 197 | } 198 | else { 199 | promises.push(null) 200 | } 201 | 202 | return Promise.all(promises) 203 | })) 204 | 205 | if (asyncDatas.length) debug('Data fetching ' + ssrContext.url + ': ' + (Date.now() - s) + 'ms') 206 | 207 | // datas are the first row of each 208 | ssrContext.nuxt.data = asyncDatas.map(r => r[0] || {}) 209 | 210 | // ...If there is a redirect or an error, stop the process 211 | if (ssrContext.redirected) return noopApp() 212 | if (ssrContext.nuxt.error) return renderErrorPage() 213 | 214 | // Call beforeNuxtRender methods & add store state 215 | await beforeRender() 216 | 217 | return _app 218 | } 219 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | Vue.use(Vuex) 5 | 6 | // Recursive find files in {srcDir}/store 7 | const files = require.context('@/store', true, /^\.\/(?!-).*\.(js)$/) 8 | const filenames = files.keys() 9 | 10 | // Store 11 | let storeData = {} 12 | 13 | // Check if store/index.js exists 14 | let indexFilename 15 | filenames.forEach((filename) => { 16 | if (filename.indexOf('./index.') !== -1) { 17 | indexFilename = filename 18 | } 19 | }) 20 | if (indexFilename) { 21 | storeData = getModule(indexFilename) 22 | } 23 | 24 | // If store is not an exported method = modules store 25 | if (typeof storeData !== 'function') { 26 | 27 | // Store modules 28 | if (!storeData.modules) { 29 | storeData.modules = {} 30 | } 31 | 32 | for (let filename of filenames) { 33 | let name = filename.replace(/^\.\//, '').replace(/\.(js)$/, '') 34 | if (name === 'index') continue 35 | 36 | let namePath = name.split(/\//) 37 | let module = getModuleNamespace(storeData, namePath) 38 | 39 | name = namePath.pop() 40 | module[name] = getModule(filename) 41 | module[name].namespaced = true 42 | } 43 | 44 | } 45 | 46 | // createStore 47 | export const createStore = storeData instanceof Function ? storeData : () => { 48 | return new Vuex.Store(Object.assign({ 49 | strict: (process.env.NODE_ENV !== 'production'), 50 | }, storeData, { 51 | state: storeData.state instanceof Function ? storeData.state() : {} 52 | })) 53 | } 54 | 55 | // Dynamically require module 56 | function getModule (filename) { 57 | const file = files(filename) 58 | const module = file.default || file 59 | if (module.commit) { 60 | throw new Error('[nuxt] store/' + filename.replace('./', '') + ' should export a method which returns a Vuex instance.') 61 | } 62 | if (module.state && typeof module.state !== 'function') { 63 | throw new Error('[nuxt] state should be a function in store/' + filename.replace('./', '')) 64 | } 65 | return module 66 | } 67 | 68 | function getModuleNamespace (storeData, namePath) { 69 | if (namePath.length === 1) { 70 | return storeData.modules 71 | } 72 | let namespace = namePath.shift() 73 | storeData.modules[namespace] = storeData.modules[namespace] || {} 74 | storeData.modules[namespace].namespaced = true 75 | storeData.modules[namespace].modules = storeData.modules[namespace].modules || {} 76 | return getModuleNamespace(storeData.modules[namespace], namePath) 77 | } 78 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/views/app.template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ HEAD }} 5 | 6 | 7 | {{ APP }} 8 | 9 | 10 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/.nuxt/views/error.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Server error 5 | 6 | 7 | 10 | 11 | 12 |
13 |
14 | 15 |
Server error
16 |
{{ message }}
17 |
18 | 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-ssr", 3 | "version": "1.0.0", 4 | "description": "Vue.js & Vue-Server-Renderer", 5 | "scripts": { 6 | "dev": "nuxt", 7 | "build": "nuxt build", 8 | "start": "nuxt start" 9 | }, 10 | "dependencies": { 11 | "nuxt": "^1.3.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/pages/about.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 17 | 18 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/pages/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /vue-ssr-nuxt/store/index.js: -------------------------------------------------------------------------------- 1 | export const state = () => ({ 2 | counter: 0 3 | }) 4 | 5 | export const mutations = { 6 | INCREMENT(state) { 7 | state.counter++ 8 | } 9 | } --------------------------------------------------------------------------------