remix 中必须用 links 函数声明路由级 css,因其支持 ssr 注入、媒体查询、预加载等能力,而直接 import 会导致 fouc 和失去控制权;路径须为以 / 开头的 public 可访问路径,且 remix 自动合并嵌套路由 links 并去重。

Remix 中每个路由文件都能独立控制自己需要的 CSS,核心就是 links 函数——它不是可选配置,而是 Remix 路由级资源声明的唯一标准方式。
为什么必须用 links 而不是直接 import CSS?
直接 import './admin.css' 在 Remix 里确实能工作,但会把样式打包进 JS bundle,失去关键能力:服务端渲染时无法提前注入 <link rel="stylesheet">,导致 FOUC(无样式内容闪烁),也丧失媒体查询、预加载、条件加载等控制权。而 links 函数返回的是纯对象数组,Remix 会在 SSR 阶段精准注入到 中,且支持所有原生 <link> 属性。
links 函数怎么写才不 404?
路径必须是运行时浏览器可访问的 public 路径,不是源码相对路径。常见错误是写成 import adminStyles from '~/styles/admin.css' 后直接传 adminStyles ——这其实是构建后生成的哈希化 URL(如 /styles/admin.abc123.css),但你得确保这个导入本身能被 Remix 构建系统识别并处理。
- 推荐写法:用
import获取构建后的 URL,再在links中返回对象 -
href值必须以/开头(如/styles/admin.css),否则浏览器按当前 URL 目录解析,容易 404 - 如果 CSS 文件放在
public/下(如public/styles/admin.css),href就写/styles/admin.css - 如果用
~别名导入(如import adminStyles from '~/styles/admin.css'),需确认你的 Remix 配置已启用别名解析(默认 Vite 或 Remix App Server 都支持)
如何给不同路由加不同 media 或 preload?
links 返回的每个对象就是一条 <link> 标签,所以所有原生属性都可用,比如 media、as、onload、crossorigin 等。
例如打印样式只在 print 时加载:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
export const links: LinksFunction = () => [
{ rel: "stylesheet", href: "/styles/admin.css" },
{ rel: "preload", as: "style", href: "/styles/print.css", media: "print" }
];
再比如移动端专属样式:
export const links: LinksFunction = () => [
{ rel: "stylesheet", href: "/styles/mobile.css", media: "(max-width: 768px)" }
];
嵌套路由中父/子样式怎么共存不冲突?
Remix 会自动合并所有匹配路由的 links 结果。比如访问 /dashboard/users/123,Remix 会依次执行 app/routes/dashboard.tsx、app/routes/dashboard/users.tsx、app/routes/dashboard/users/$id.tsx 的 links 函数,并把它们返回的所有 link 对象拼成一个数组注入 。
这意味着:
- 父路由可以放全局布局样式(如
dashboard.css) - 子路由只管自己模块样式(如
user-detail.css) - 顺序由文件路径层级决定,后面加载的样式自然覆盖前面的同名规则
- 不需要手动 import 父级样式,也不用担心重复加载——Remix 会去重(基于
href字符串)
最容易被忽略的一点:如果某个子路由没定义 links,它不会继承父路由的 links;只有当前 URL 匹配到的路由模块才会执行自己的 links 函数。所以 index.tsx 和 $id.tsx 是两个独立作用域,各自负责自己的资源声明。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










