### [PHP 项目中 Vite 只处理 CSS 不写 JS?详解 Vite 必须同时引入 JS 入口的原理与配置](https://www.huociguo.com/article/1368)
**Published:** 2026-09-14T12:25:12
**Author:** 米了
**Excerpt:** 在 PHP 老旧项目或纯后端渲染场景中,常误以为 Vite 仅用于编译 CSS。本文 Vite 的模块加载机制…
在 PHP 老旧项目或纯后端渲染场景中,常误以为 Vite 仅用于编译 CSS。本文 Vite 的模块加载机制,阐述为何即使只使用 CSS,也必须声明并引入 JavaScript 入口文件,并提供标准的 `vite.config.js` 配置方案,解决 304 缓存与 HMR 失效问题。

随着前端工程化工具的迭代,Vite 凭借其极速的冷启动能力,逐渐成为替代 Webpack 的首选。在 Laravel、ThinkPHP 或原生 PHP 项目中接入 Vite 时,开发者常产生一个误区:如果页面只需要编译 Sass/Less 生成 CSS,是否可以不引入 JS 入口?答案是否定的。Vite 的运行强依赖于 ES Module 的入口检测,忽略 JS 会导致开发服务器无法正常工作。
### 1️⃣ 为什么 Vite 强制需要 JS 入口?
Vite 在设计上是一个**原生 ESM 构建工具**。它的核心逻辑在于:
- **依赖预构建**:Vite 通过扫描 `index.html` 或指定的 JS 入口文件,分析 `import` 语法,将 `node_modules` 中的依赖转换为 ESM 格式。
- **模块图谱(Module Graph)**:Vite 的 HMR(热更新)功能是基于 JS 模块图谱实现的。如果只有 CSS,Vite 无法建立完整的依赖关系树,导致无法监听文件变化并推送到浏览器。
- **CSS 是副作用**:在 Vite 中,CSS 被视为 JS 模块的“副作用”(Side-effect)。当你在 JS 中 `import './style.css'`,Vite 才会处理该 CSS 文件并将其注入到 HTML 中。
### 2️⃣ 正确的 PHP + Vite 配置姿势
即便你只关心 CSS,也必须建立一个“虚拟”的 JS 入口文件。
**步骤一:建立入口文件**
在项目中创建 `resources/js/main.js`(或 `src/main.js`):
```javascript
// 即使不使用 JS 逻辑,也必须保留此文件作为 Vite 的入口锚点
import '../css/app.css'; // 指向你的 CSS 文件
```
**步骤二:配置** `vite.config.js`
```javascript
import { defineConfig } from 'vite';
import path from 'path';
export default defineConfig({
root: './', // 项目根目录
base: '/dist/', // 生产环境资源基础路径
build: {
// 输出目录,PHP 需引用这里的文件
outDir: 'public/dist',
assetsDir: 'assets',
// 必须指定 rollup 的入口
rollupOptions: {
input: {
main: path.resolve(__dirname, './resources/js/main.js'),
},
output: {
// 确保 CSS 文件名不包含哈希(可选,视缓存策略而定)
entryFileNames: `assets/[name].js`,
chunkFileNames: `assets/[name].js`,
assetFileNames: `assets/[name].[ext]`
}
}
},
server: {
// 允许 PHP 服务器通过 IP 访问
host: 'localhost',
port: 5173,
strictPort: true,
}
});
```
### 3️⃣ PHP 模板中的引入方式
在 PHP 视图文件(如 `header.php`)中,不能只写 `` 标签引入 CSS,而必须引入由 Vite 生成的 JS 入口。
**开发环境:**
```php
```
**生产环境:**
```php
```
⚠️ **注意**:生产环境下,Vite 会自动将 JS 中导入的 CSS 提取出来,因此你需要同时保留 `