javascript - 像其他 Assets 一样通过 CDN URL 从动态导入中加载 block

标签 javascript laravel vue.js webpack laravel-mix

我有一个指向我的基域的 CDN,基本上是 1:1 映射。我正在尝试在服务器上构建我的包,并且我想使用 CDN URL 加载它。 npm run build之后我想拥有什么是:

public/
  css/
    app.css
  js/
    index.js
    1.js.gz
    1.js
    2.js.gz
    2.js

然后我的 CDN 会反射(reflect)这一点,所以我希望像这样加载这些资源:
https://mycdn.com/public/js/index.js
https://mycdn.com/public/css/app.css

我的当前webpack.mix.js配置:
mix
  .sass('resources/sass/app.css', 'public/css')
  .js('resources/js/index.js', 'public/js')

它会在正确的位置生成所有文件,这很好。然后我将它们包含在我的 index.blade.php 中:
<script src="{{ elixirCDN('/js/index.js') }}"></script>
elixirCDN 是我的自定义函数:
function elixirCDN($file)
{
    $cdn = '';

    if(config('system.cdn_url'))
    {
        $cdn = config('system.cdn_url');
    }

    return $cdn . elixir($file);
}

它基本上是在文件名前面加上 CDN url,所以一切正常。

当我使用动态导入时,问题就开始了,如下所示:
const Home = () => import("./Home")

理想的情况是它还与 CDN 一起加载:
https://mycdn.com/public/js/1.js
但相反,它没有,它加载了一个相对路径和我的基域:
https://mybasedomain.com/public/js/1.js
显然,因为它是动态的。我怎样才能让我的 block 也从 CDN 加载?

我试过设置publicPath作为我的 CDN url,但它没有任何效果。我也试过setPublicPath()但它是一样的。

最佳答案

嗨,这不是明确的答案,而是朝着正确方向迈出的一步。我遇到了这个问题,因为我的条件导入在更新所有 webpack 和 babel 包后中断了。
在动态导入之前,您需要将 webpack 的临时公共(public)路径设置为 webpack 需要动态导入的 block 的位置

__webpack_public_path__ = 'https://cdn.dev.acsi.eu/eurocampings/assets/dev/dist/';
比进口作品
import(/* webpackChunkName: "state" */ './modules/BookingState/State')
        .then(({createState}) => {
            createState();
            this.renderEurocampingsWebsite(window);
        });
对我来说,动态导入有效,但似乎之前的条件导入,所有包更新,都在没有异步行为的情况下工作......
刚刚发现 Webpack 有更多神奇的注释,可以使代码表现程序化,代价是同时导入两个模块以进行条件导入。这也可能有帮助
import(
            /* webpackChunkName: "state" */
            /* webpackMode: "eager" */
            /* webpackPreload: true */
            './modules/BookingState/State'
        )
        .then...

关于javascript - 像其他 Assets 一样通过 CDN URL 从动态导入中加载 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61478731/

相关文章:

javascript - 如何在 vue.js 2 上使用 ajax 上传图片?

javascript - 仅当电子邮件和密码正确时才登录用户?

javascript - 排除 Rails 部署的 Heroku ExecJS 程序错误

php - 拉拉维尔 5.7 错误 : Call to a member function save() on null

laravel - 如何连接两个laravel应用程序?

javascript - 用于非 SPA 应用程序的 Vue js - 在没有应用程序组件的情况下加载组件

javascript - php代码在脚本标签下无法正常运行

javascript - 当存在全局标志时,为什么 String.match() 不产生预期结果?

php - Laravel 5.2 上的 MySQL 连接

vue.js - 输入框自动更改为原始值