cssbundling-rails生产环境无法找到外部CSS库的原因及疑问
问题原因解析
1. Rails资产管道对带扩展名导入的特殊处理
Rails的资产管道在处理SCSS/SASS文件的@import时,规则很明确:
- 要是导入的文件不带.css后缀,资产管道会把它当成SCSS/SASS源码的一部分,先做预处理(比如解析变量、展开嵌套),然后把内容合并到最终打包的
application-{hash}.css里——这就是Bootstrap能正常打包的原因。 - 但如果导入的文件带.css后缀,资产管道就会把它当成一个独立的静态资源,不会把内容合并到主文件,而是生成一个单独的资源引用路径。问题出在生产环境:资产管道默认只预编译
application.*这类指定文件,单独的slimselect.min.css不在预编译列表里,所以虽然路径能解析出来,但对应的文件是空的,自然报404。
2. 开发环境为啥没问题?
开发环境下资产管道是实时处理模式,不管有没有预编译,只要文件存在就能动态读取返回,所以带后缀的导入也能正常加载。但生产环境是预编译模式,只有提前配置好的资产才会被编译成有效文件。
保留原导入方式的解决办法
如果一定要保留slim-select/dist/slimselect.min.css的完整后缀导入,有两种靠谱的调整方式:
方法1:把slimselect的CSS加入预编译列表
打开config/initializers/assets.rb,添加一行配置:
Rails.application.config.assets.precompile += %w( slimselect.min.css )
这样生产环境预编译时,会单独生成带哈希的slimselect.min-{hash}.css文件,对应的引用路径就能加载到正确内容了。
方法2:用SCSS的!inline指令强制合并
在导入时加上!inline,强制资产管道把这个CSS文件的内容直接合并到主打包文件里,而不是生成单独引用:
@import "slim-select/dist/slimselect.min.css" !inline;
这种方式不用改预编译配置,文件会和Bootstrap一样被打包进application-{hash}.css,彻底解决独立资源的问题。
内容的提问来源于stack exchange,提问作者Gavin Esplin
相关产品推荐
相关产品推荐

