Skip to content
This repository was archived by the owner on Mar 16, 2020. It is now read-only.

Commit b7df627

Browse files
committed
asyncData
1 parent 8b44986 commit b7df627

File tree

7 files changed

+903
-320
lines changed

7 files changed

+903
-320
lines changed

assets/js/app.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@ import Vue from 'vue';
33
import router from './router'
44
import store from './store';
55

6+
Vue.mixin({
7+
beforeMount() {
8+
const {asyncData} = this.$options;
9+
if (asyncData) {
10+
this.dataPromise = asyncData({
11+
store: this.$store,
12+
route: this.$route
13+
})
14+
}
15+
}
16+
});
17+
618
export default new Vue({
719
router,
820
store,

assets/js/components/FetchNumber.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
import {mapActions, mapGetters} from 'vuex';
1010
1111
export default {
12+
asyncData({store, route}) {
13+
if (!window.__INITIAL_STATE__) {
14+
store.dispatch('fetchNumber');
15+
}
16+
},
1217
name: "index",
1318
computed: {
1419
...mapGetters(['number'])

assets/js/store.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@ import axios from 'axios';
44

55
Vue.use(Vuex);
66

7+
const state = {
8+
number: null
9+
};
10+
711
export default new Vuex.Store({
12+
state,
813
actions: {
914
fetchNumber({commit}) {
10-
if (typeof window === 'undefined') {
11-
commit('setNumber', 1234567890);
12-
} else {
13-
axios.get('/number').then(number => {
14-
commit('setNumber', number.data.number);
15-
});
16-
}
15+
axios.get('/number').then(number => {
16+
commit('setNumber', number.data.number);
17+
});
1718
}
1819
},
1920
mutations: {

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"babel-plugin-transform-object-rest-spread": "^6.26.0",
66
"vue": "^2.5.9",
77
"vue-loader": "^13.5.0",
8+
"vue-router": "^3.0.1",
89
"vue-server-renderer": "^2.5.9",
910
"vue-template-compiler": "^2.5.9",
1011
"vuex": "^3.0.1"
@@ -17,7 +18,5 @@
1718
"watch": "encore dev --watch",
1819
"build": "encore production"
1920
},
20-
"dependencies": {
21-
"vue-router": "^3.0.1"
22-
}
21+
"dependencies": {}
2322
}

readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Until recently server-side rendering in VueJS wasn't possible outside Node.js en
1414

1515
1) `composer install` to get PHP dependencies
1616
2) `yarn install` to get JS dependencies
17-
3) `yarn run encore dev` to build JS files (or `yarn run encore dev --watch` for interactive watch)
17+
3) `yarn run dev` to build JS files (or `yarn run watch` for interactive watch)
1818
4) `php bin/console server:run` to start a PHP server on `127.0.0.1:8000`
1919

2020
## Explanation

src/Service/RenderService.php

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,49 @@
11
<?php
2+
23
namespace App\Service;
34

45
class RenderService
56
{
6-
/**
7-
* string
8-
*/
9-
private $nodeRoot;
10-
11-
/**
12-
* string
13-
*/
14-
private $jsRoot;
15-
16-
public function __construct(string $rootDirectory)
17-
{
18-
$this->nodeRoot = sprintf('%s/../node_modules', $rootDirectory);
19-
$this->jsRoot = sprintf('%s/../public/build/js', $rootDirectory);
20-
}
21-
22-
public function render($path): string
23-
{
24-
$vueRenderer = file_get_contents(sprintf('%s/vue-server-renderer/basic.js', $this->nodeRoot));
25-
$entryPoint = file_get_contents(sprintf('%s/server.js', $this->jsRoot));
26-
$v8 = new \V8Js();
27-
28-
ob_start();
29-
30-
$js =
31-
<<<EOT
7+
/**
8+
* string
9+
*/
10+
private $nodeRoot;
11+
12+
/**
13+
* string
14+
*/
15+
private $jsRoot;
16+
17+
public function __construct(string $rootDirectory)
18+
{
19+
$this->nodeRoot = sprintf('%s/../node_modules', $rootDirectory);
20+
$this->jsRoot = sprintf('%s/../public/build/js', $rootDirectory);
21+
}
22+
23+
public function render($path): string
24+
{
25+
$vueRenderer = file_get_contents(sprintf('%s/vue-server-renderer/basic.js', $this->nodeRoot));
26+
$entryPoint = file_get_contents(sprintf('%s/server.js', $this->jsRoot));
27+
28+
$v8 = new \V8Js();
29+
try {
30+
ob_start();
31+
32+
$js =
33+
<<<EOT
3234
var process = { env: { VUE_ENV: "server", NODE_ENV: "production" } };
3335
this.global = { process: process };
3436
let url = "$path";
3537
EOT;
36-
37-
$v8->executeString($js);
38-
$v8->executeString($vueRenderer);
39-
$v8->executeString($entryPoint);
40-
41-
return ob_get_clean();
42-
}
38+
39+
$v8->executeString($js);
40+
$v8->executeString($vueRenderer);
41+
$v8->executeString($entryPoint);
42+
$result = ob_get_clean();
43+
} catch (\Exception $e) {
44+
$result = $e->getMessage();
45+
}
46+
47+
return $result;
48+
}
4349
}

0 commit comments

Comments
 (0)