返回

如何解决 Vite 中 Vue 组件无法加载 CSS 代码的问题?

javascript

在 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. 如何避免这个问题?

避免此问题的最佳方法是将应用程序放在项目的根目录中。但是,如果这不是一个选项,则可以使用上面提到的解决方案之一。