如何解决 Vite 中 Vue 组件无法加载 CSS 代码的问题?
2024-05-31 17:03:28
在 Vue 组件中解决 Vite 不加载 CSS 代码的问题
问题
在使用 Vite、Laravel 和 Inertia.js 构建的应用程序中,当应用程序位于子目录中时,Vite 可能会无法加载 Vue 文件或组件中的 CSS 代码。浏览器控制台中会出现类似这样的错误信息:
Uncaught (in promise) Error: Unable to preload CSS for /build/assets/Login.a0d488b1.css d [http://example.com/subdirectory/build/assets/app.6486bb89.js:1](http://example.com/subdirectory/build/assets/app.6486bb89.js:1)
解决方案
解决此问题的最佳方法是修改 vite.config.js
文件,具体来说,就是在 @vitejs/plugin-vue
插件中为 template
选项添加一个 transformAssetUrls
对象。
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [
laravel({
input : [
'resources/js/app.js'
],
refresh: [{
paths: ['resources/js/**'],
config: { delay: 300 }
}],
}),
vue({
template: {
transformAssetUrls: {
base: null,
includeAbsolute: false,
},
},
}),
],
});
transformAssetUrls 选项详解
transformAssetUrls
对象包含以下设置:
- base: null :将所有资源的 base URL 设置为
null
,意味着它们将相对于当前页面加载。 - includeAbsolute: false :阻止 Vite 将绝对 URL 转换为相对 URL。
优点
这种解决方案有以下优点:
- 使用 Vue 插件提供的标准功能。
- 不修改 Vite 的默认行为,避免意外后果。
替代方案
另一种解决方法是修改 Laravel Vite 插件的配置,如下所示:
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [
laravel({
input : [
'resources/js/app.js'
],
refresh: [{
paths: ['resources/js/**'],
config: { delay: 300 }
}],
base: '/subdirectory' // 将 base URL 设置为子目录
}),
vue({
template: {
transformAssetUrls: {
base: null,
includeAbsolute: false,
},
},
}),
],
});
这种方法通过将 Laravel Vite 插件的 base
选项设置为子目录来工作。然而,它修改了 Vite 的默认行为,因此不那么可取。
结论
通过使用 @vitejs/plugin-vue
插件中的 transformAssetUrls
选项,可以轻松解决 Vite 在 Vue 组件中不加载 CSS 代码的问题。这个解决方案是可靠的,并且不会对 Vite 的默认行为产生意外影响。
常见问题解答
1. 为什么会出现这个问题?
这个问题是由 Vite 的默认行为引起的,它期望所有资源都位于项目的根目录中。当应用程序位于子目录中时,Vite 无法正确解析 Vue 组件中的 CSS 代码的路径。
2. 这个解决方案是否适用于所有项目?
这个解决方案适用于使用 Vite、Laravel 和 Inertia.js 构建的项目。它也可能适用于其他使用 Vite 的项目,但可能需要进行一些调整。
3. 是否有其他解决方法?
除了上面提到的两个解决方案之外,还可以通过修改 Vue 组件中的 CSS 代码路径来解决此问题。但是,这可能会更复杂,并且可能导致其他问题。
4. 这个解决方案是否会影响其他 Vite 功能?
否,这个解决方案不会影响 Vite 的其他功能。它只针对解决 Vue 组件中 CSS 代码无法加载的问题。
5. 如何避免这个问题?
避免此问题的最佳方法是将应用程序放在项目的根目录中。但是,如果这不是一个选项,则可以使用上面提到的解决方案之一。