我正在尝试通过遵循https://medium.com/js-dojo/advanced-server-side-rendering-with-laravel-vue-multi-page-app-486b706e654在页面加载时呈现服务器端代码。一切正常,但是当我尝试使用全局变量“ window”或“ document”时

我的app.js代码是

import App from './components/App.vue';
import Vue from 'vue';
import { createRouter } from './router'
import { createStore } from './store'
import { sync } from 'vuex-router-sync'
require('./bootstrap');


bootstrap.js是正常的

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';


我需要全局axios,但是php V8Js给出了错误
V8Js::compileString():612: TypeError: window is undefined

我发现V8Js没有浏览器变量,我尝试使用npm包browser-env,但遇到相同的错误。参见屏幕截图http://nimb.ws/zGDmXO

谢谢

最佳答案

您必须使用传递给windowsdocument字符串来摆脱JSV8Js::executeString的麻烦,因为它会查找documentwindow,但是时间和代码不存在在服务器端执行。

在您的app.js
做这样的事情:

import axios from 'axios';
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';


并在后端执行以下操作:

$rendererSrc =\file_get_contents()(\base_path('node_modules/vue-server-renderer/basic.js'));
$appSrc = file_get_contents()(\public_path('js/entry-server.js'));
$v8Js = new \V8Js();
$v8Js->executeString(
                <<<EOT
    var process = { env: { VUE_ENV: "server", NODE_ENV: "production" } };
    this.global = { process: process };
    var url = "path_you_are_hitting";
    {$rendererSrc}
    {$appSrc}
EOT
);


希望能成功

09-12 14:53