首页 > 解决方案 > Vue + SSR webpackJsonp 未定义

问题描述

我正在开发一个使用 VueJS 的 Laravel 项目。在我仅以预渲染方式进行开发之前。现在项目几乎完成了。但是我想支持SEO,所以开始改用SSR。我已经完成了 V8js PHP 扩展。但问题出在 webpack.mix.js

const { mix } = require('laravel-mix');
let webpack = require('webpack');
mix.setPublicPath('public');

mix
.js('./src/Packages/Front/Resource/assets/js/client.js', 'public/js')
.js('./src/Packages/Front/Resource/assets/js/server.js', 'public/js')

在这段代码中,SSR 没有错误。

但是如果我在 mix.js() 错误之后添加 .extract(['jQuery' ]) 就会像这样出现。

V8Js::compileString():1: ReferenceError: webpackJsonp is not defined

当然,我按此顺序添加了文件

<script src="{{ mix('/js/manifest.js','uyghur') }}" type="text/javascript"></script>

 <script src="{{ mix('/js/vendor.js','uyghur') }}" type="text/javascript"></script>
 <script src="{{ mix('/js/client.js','uyghur') }}" type="text/javascript"></script>

有人知道这个错误到底是什么吗?

这花了我很多时间。已经需要3天了。我被困在这里。

标签: javascriptwebpacklaravel-mixserver-side-rendering

解决方案


我不太熟悉用 Laravel 和 Vue 做 SSR;但我想建议不要使用提取,因为你正在做 SSR。不过,您的问题可能只是在编译之前弄清楚如何让 V8 加载所有 Javascript。让我提供一些可能有助于您进行故障排除的推理和替代方法:

  1. 您需要输出按特定顺序排列的原因webpackJsonp是混合构建到manifest.js. 您应该能够在其中找到该功能。由于您没有提供任何 v8 代码,所以让我在这里尝试猜测一下:

$manifestSrc = File::get(public_path('js/manifest.js'));
$vendorSrc   = File::get(public_path('js/vendor.js'));
$appSrc      = File::get(public_path('js/entry-server.js'));

$allSrc = $manifestSrc . $vendorSrc . $appSrc;

$v8->executeString($allSrc);

  1. 使用jQuery,将其定义为外部可能更容易,如下所示:
mix.webpackConfig({
  externals: {
    'jquery': 'jQuery'
  }
 // other settings
})

那么你就不用担心在 V8 端 加载manifest.js和加载了。vendor.js

请注意,如果您使用 jQuery 在服务器上进行渲染,那么您还必须按照上面的示例将其附加到服务器上。这是我没有更新的地方。我不确定 V8js 和 jQuery 的最新进展是什么,但它们在历史上并不能很好地配合使用。人们倾向于在服务器端使用 NodeJS 而不是 V8js 来使用 jQuery。


推荐阅读