Sprocket的require机制如何工作?为何可引入非同级目录的gem资源?
实现原理说明
这个现象是Ruby on Rails内置的Sprockets资产管道的路径查找机制带来的,并非只能加载当前同级目录下的资产文件,具体逻辑如下:
- Sprockets打包前会维护一个全局的资产加载路径列表,除了你项目本地的
app/assets/javascripts目录外,还会自动纳入所有符合Rails规范的已安装gem/引擎自带的资产目录。 - 你安装的i18n相关gem(通常为
i18n-js这类提供前端多语言能力的封装gem)本身遵循Rails资产打包规范,会主动把自身携带的i18n.js、i18n-rules.js等文件注册到Sprockets的加载路径列表中。 - 当你在
application.js中通过//= require i18n声明依赖时,Sprockets会按优先级遍历所有已注册的加载路径,匹配对应名称的JS文件,只要在任意路径下命中目标文件,就会将其内容拼接进最终打包的application.js中,不需要你手动将文件复制到项目本地的assets目录下。
默认情况下Sprockets的加载路径包含两类位置:
- 项目自身的
app/assets/*、lib/assets/*、vendor/assets/*目录 - 所有符合规范的第三方gem/引擎自带的资产目录
你可以在Rails控制台执行
Rails.application.config.assets.paths命令,查看当前项目所有已注册的资产加载路径,验证i18n gem的资产目录是否已经被纳入列表。
内容的提问来源于stack exchange,提问作者seifeslimene
相关产品推荐
相关产品推荐

