我正在寻求帮助来解决独特部署设置(Vue + Vite + Shopify 应用程序)中的一些代码分割问题。
<component :is=“…” />
。blockTypes.forEach((blockType) => {
app.component(
blockType,
defineAsyncComponent(() => import(`./blocks/${blockType}.vue`))
)
})
到目前为止,当我完全控制部署时,这一切都相当简单。
这就是棘手的地方。
Vue 应用程序部署为 Shopify 应用程序的 Shopify 主题扩展块。这里相关的主要事情是 Shopify 处理部署并设置一些约束。
/assets/
文件夹中(我在 vite 配置中使用了这部分)
rollupOptions
rollupOptions: {
input: './src/main.ts',
output: {
entryFileNames: 'assets/genesis-block.js',
chunkFileNames: 'assets/[name]-[hash].js',
assetFileNames: 'assets/block.[ext]'
}
}
;但资产被放在 CDN
[some-store].myshopify.com
上(并且 cdn.shopify.com/extensions/[theme_extension_uuid]/assets/*
在构建时未知)。
theme_extension_uuid
脚本标签加载入口文件(带有缓存破坏程序参数)——当然,这会加载
第一个块加载正确(因为它是在 HTML 中指定的)
(入口文件是'gen-block.js') 这种情况如何配置?
我也在vite repo中提出了这个问题
讨论在本地运行应用程序时效果很好。主要问题是当部署在不同的域(构建时未知的路径)作为窗口位置时。我尝试了使用
cdn.shopify.com/extensions/[theme_extension_uuid]/assets/index.js?v=1726188069
拆分代码的不同方法,以及 vite 配置中的不同 rollupOptions。
defineAsyncComponent
功能
。对此处概述的代码进行了一些尝试和错误,但看起来我让它适用于 JS 和 CSS 块。
renderBuildUrl
然后为了解决入口文件的缓存清除问题,我创建了一个简单的代理模块来在运行时获取 CDN URL 并导入入口文件。所以这个代理是从脚本标签加载的,而不是入口文件。
// vite.config
experimental: {
renderBuiltUrl(filename, { hostType }) {
if (hostType === 'js') {
return {
runtime: `window.__toCdnUrl(${JSON.stringify(filename)})`
}
} else {
return { relative: true }
}
}
},