修改 assetmanager 的 basepath 和 baseurl 必须严格匹配 web 服务器路径:basepath 是绝对文件系统路径(推荐用 @webroot/assets),baseurl 是对应可访问的 url 前缀(如 @web/assets),二者目录结构需一致,且入口迁移时必须同步重定义 @webroot 和 @web 别名。

修改 assetManager 的 basePath 和 baseUrl 必须匹配 Web 服务器路径
很多人改完 assetManager 配置后,JS/CSS 404,根本原因是 basePath(文件系统路径)和 baseUrl(URL 路径)没对齐。比如你设了 'basePath' => '@webroot/assets',那 'baseUrl' => '@web/assets' 才能对应上;如果实际 Web 根目录是 /var/www/html/frontend/web,但 @webroot 指向的是项目根目录,就会发布到错地方、浏览器根本找不到。
常见错误现象:web/assets/ 下有哈希目录,但页面里引用的 URL 是 /assets/xxx.js 却返回 404;或者目录空空如也,资源压根没发布出来。
-
basePath必须是绝对路径,推荐用别名(如@webroot/assets),不要写死成/var/www/... -
baseUrl必须是能被 Web 服务器直接访问的 URL 前缀,通常以@web开头,且要和basePath的目录结构一致 - 如果入口文件挪到了项目根目录(比如用
index.php代替frontend/web/index.php),@webroot和@web的含义就变了,必须同步重定义这两个别名,或显式指定路径
覆盖第三方 Asset Bundle(如禁用 jQuery 或换皮肤)要写全类名
在 components.assetManager.bundles 里覆盖时,键名必须是完整命名空间类名,不能只写短名。比如想禁用 Yii 自带的 jQuery,得写 'yii\web\JqueryAsset' => false,而不是 'JqueryAsset' => false;想定制 AdminLTE 的皮肤,得写 'dmstr\web\AdminLteAsset' => ['skin' => 'skin-red']。
容易踩的坑:类名大小写敏感,yii\web\jqueryasset 或 Yii\web\JqueryAsset 都不生效;另外,覆盖配置必须放在 assetManager 的 bundles 数组里,不是直接写在 components 顶层。
- 用
false禁用某个 Bundle,它就不会被自动加载 - 用数组形式可覆盖其属性,如
$css、$js、$depends,但注意这些值会完全替换原定义,不是合并 - 若只是想加额外 CSS/JS,别在这里改,应该新建自己的 Asset Bundle 并依赖它
开发阶段启用 linkAssets 可避免重复复制文件
默认情况下,AssetManager 把资源从 sourcePath(比如 @npm/bootstrap)复制到 basePath 下的哈希目录。每次改了 JS 就要删 web/assets/ 手动刷新,很烦。设 'linkAssets' => true 后,它会建符号链接,改源文件立刻生效。
但这个选项有前提:Web 服务器用户(如 www-data)必须有权限读取源目录(比如 node_modules/),且操作系统支持符号链接(Linux/macOS OK,Windows 需管理员权限 + 开启开发者模式)。
- 仅建议在开发环境开启,生产环境关掉(
linkAssets默认为false) - 如果用了 Docker,确保容器内挂载的
node_modules权限正确,否则链接会失效 - 某些共享主机不支持符号链接,此时只能靠
appendTimestamp => true强制刷新缓存
压缩资源前必须先确认 assets.php 配置里的路径别名已定义
运行 yii asset 命令压缩 JS/CSS,依赖 assets.php 配置文件里的路径别名(如 @webroot、@web)。如果入口不在 web/ 下,或别名没提前注册,命令会报错 “Alias not found” 或生成的压缩包路径错乱。
典型错误:把 frontend/web/index.php 挪到项目根目录后,没在 assets.php 里补上 Yii::setAlias('@webroot', __DIR__ . '/web');,结果压缩出来的文件发布到了 /web/assets/,但线上 URL 是 /assets/,还是 404。
- 务必在
assets.php开头手动设置关键别名,不要依赖框架自动推导 -
sourcePath在压缩配置里也要用别名,比如'sourcePath' => '@app/../vendor/bower-asset/jquery' - 压缩后检查输出的
assets.php是否包含正确的basePath和baseUrl,再上线
@webroot 和 @web 这两个别名在不同上下文(入口文件位置、console 命令、Web 请求)中指向不一致,导致路径逻辑断裂。动手前,先用 var_dump(Yii::getAlias('@webroot')) 和 var_dump(Yii::getAlias('@web')) 在对应环境里打个印,比反复试错快得多。











