You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopify部署下,如何配置Vite实现跨域名动态导入(代码分割)?

解决Vue+Vite+Shopify部署中的代码分割路径问题

核心问题分析

你的问题源于Shopify部署的跨域资产路径特性:入口文件从CDN加载(带缓存参数),但Vite默认生成的动态chunk/CSS路径指向HTML域名,且未携带缓存参数,导致404和重复请求。

解决方案

1. 运行时动态注入CDN资产前缀

Shopify的CDN路径(含UUID和缓存参数)只能在运行时通过模板获取,在入口文件最顶部添加以下代码:

// src/main.ts 第一行
if (window.SHOPIFY_ASSET_BASE) {
  (import.meta as any).env.BASE_URL = window.SHOPIFY_ASSET_BASE;
}

然后在Shopify的Liquid模板(如extension.liquid)中注入全局变量:

<script>
  // 提取带缓存参数的CDN资产前缀
  window.SHOPIFY_ASSET_BASE = "{{ asset_url 'genesis-block.js' | split: 'genesis-block.js' | first }}";
</script>
<script src="{{ asset_url 'genesis-block.js' }}"></script>

这段Liquid代码会自动获取CDN的完整前缀(包括UUID和?v=xxx缓存参数),无需硬编码。

2. 调整Vite构建配置

修改vite.config.ts,确保生成的资源路径兼容动态base:

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  build: {
    cssCodeSplit: true, // 强制动态组件的CSS单独分割
    base: '', // 禁用静态base,依赖运行时动态设置
    rollupOptions: {
      input: './src/main.ts',
      output: {
        entryFileNames: 'assets/genesis-block.js',
        chunkFileNames: 'assets/[name]-[hash].js',
        assetFileNames: 'assets/block.[ext]',
        format: 'es', // 使用ES模块,确保动态导入路径正确解析
        // 禁用rollup的绝对路径生成,强制相对路径
        paths: {
          './blocks/*': './blocks/*'
        }
      }
    }
  }
});

3. 验证动态组件导入

你的defineAsyncComponent代码无需修改,只要blocks目录在src下,路径解析就会正常:

blockTypes.forEach((blockType) => {
  app.component(
    blockType,
    defineAsyncComponent(() => import(`./blocks/${blockType}.vue`))
  );
});

效果验证

  • 动态chunk会自动使用CDN域名+缓存参数请求,不再出现HTML域名的404
  • Chunk引用入口文件时会携带缓存参数,避免重复请求未缓存的版本
  • CSS chunk会通过动态base指向CDN,解决404问题

内容的提问来源于stack exchange,提问作者Jon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:57:35