- 浏览: 411021 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
冯大圆__渐成胡子渣:
写得很详细,想请求一下,bundler install的时候设 ...
Rails Assets Pipeline -
DaSunWarman:
...
#!/usr/bin/env 脚本解释程序的作用 -
alexag:
...
javascript立即执行函数与函数声明和函数表达式 -
houxm:
你也可以使用更简单的方式(只要在元素上添加 data-togg ...
bootstrap 小tip -
jaycongwen:
帮我看看啊,我刚学wen@wen-desktop:~$ cd ...
cannot load such file -- openssl
Assets Pipeline 有什么好处,不用会怎样
怎样禁止Assets Pipeline:
不用当然可以,你可以在config/application.rb中将它干掉:
config.assets.enabled = false
Assets Pipeline 好处:
1、将所有的js或css压缩打包成单一的文件,减少http request的大小与数量,增加你网站的速度
2、支持香scss及coffeescript这样的语言,让你可以用更简单更棒的方式来写css及javascript
Assets Pipeline 组成元件
主要有两个元件组成:Sprockets以及Tilt. Sprockets用来从你的assets路径中打包你所有的assets后,包装成一个文件,然后放到你的目的路径(public/assets),而Tilt主要是一个模板引擎,用来让Sprockets可以去解析Scss,coffeescript或是erb等各种各样的模板。
Assets结构:
在rails目录结构中,有三个地方:
app/assets(通常放置我们自己为了自己的程序所写的js,css,或者是images)
lib/assets(通常是放置我们使用的插件中用到的assets)
vender/assets(通常是放置一些我们从别的地方借用的assets,比如说一些jquery插件)
在默认情况下,这三个文件夹内是共通的(因为都会被打包成一个文件),你可以把你的rails app跑起来,然后在localhost:3000/assets/applications.js中看到你所有的js都在这个文件中,同理,css也一样,你可一在console里面输入Rails.application.config.assets.paths来查看所有的assets路径,你可以发现,除了我们刚刚说的三个目录,还有Gemfile中初夏的jquery,这就是说,将来我们的assets也可以打包成gem来用,如果你有多个projects常重复使用一些共同的assets,不妨我们可以考虑将我们的assets打包成gem,方便以后使用。
Assets目录内文件的导入方式:
以app/assets/javascripts/application.js为例,这是一个manifest文件,主要用来告诉Spockets说,哪些文件是要被载入后打包起来压缩的,最后这些文档里面的所有内容都会被打包成application.js,也是我们在layout/application.html.erb中的javascript_include_tag 'application'中的文档,打开这个文件,里面只有三行:
//= require jquery
//= require jquery_ujs
//= require_tree .
上面两行很明确就是要引入jquery和jquery_ujs这两个文件,这两个文件是呗包含在我们的gem当中的,而下面那行require_tree . 表示把三个assets/javascript目录下的js文件或者子目录内的所有文件都包进来。这时候你一定会问,如果有些js或是css我只想在某西特定页面中使用的话该怎么办,例如:假如说我们今天有个admin_function.js的文件,我只想在我的后台使用,其他页面不使用,那么你有两种方法可以实现:
1、你可以将require_tree的目录改成其他的目录,例如在app/assets/javascript目录下创建一个叫做common的文件夹,然后把require_tree . 改成require_tree ./common,这样的话,所产生的application.js就不会用到admin_function.js这个文件了。
2、你可以建立一个新的文件见,用来盛放那些你不想被application.js载入的文件,例如我们在app/assets/javascript下建立了一个admin的文件夹,并吧刚刚的admin_function.js文件放进去,然后把applicaiton.js文件中的require_tree . 改为require_directory . 这样子,程序只会载入与application.js文件统一级目录中的所有文件,而不会去加载子目录中的文件。
如果你想在某个页面加载admin下的所有的js,那么你需要在这个admin目录下新建一个manifest,用来引入该目录下的文件,比如我们在admin目录下建立了一个叫做admin.js的文件,然后在里面我们可以一样使用require_tree 或者require_directory的方式来载入,然后你需要在你的这个特定的页面中使用javascript_include_tag 'admin/admin'这样来进行引用。
千万要记住,当你使用application.js之外的manifest文件时,一定要在你的环境设置文件中加入precompile的清单,否则伤了production时,你会收到一堆500error xxxx isn't precompiled ,加入的位置在production.rb中加入:config.assets.precompile += %w( 'admin/admin.js' )
除了require_tree 及 require_directory 之外,还有其他的方法,你都可以使用绝对或者相对路径来制定文件的位置,文件的后缀名可有可无:
require[路径]载入某特定的文件,如果该文件被多次载入的话,Sprockets会很聪明的帮你载入一次。
include[路径] 与require一样,差别在于,每次都会重新加载一次文件。
require_directory [路径] 将路径下,不包含子目录的文件按照字母顺序依次载入。
require_tree [路径] 将路径下的文件,包含子文件夹中的文件全部载入
require_self [路径] 告诉Sprockets在载入其他文件之前,先将自己的内容插入
Preprocessing:
Sprockets在Itlt的协助下,有preprocessing的功能,例如你可以使用像是someting.js.coffee.erb这样的文件名,Tilt会一次根据不同的代码调用不同的模板解析器,所以,你可以在js中使用CoffeeScript的写法来写js,并在里面使用ruby的代码来产生你所需要的东西例如:
jQuery ->
number = <%= 1 + 1 %>
Helper:
Assets 提供了很多路径helper,来让你指向你的assets:
audio_path("horse.wav") # => /audios/horse.wav
audio_tag("sound") # => <audio src="/audios/sound" />
font_path("font.ttf") # => /fonts/font.ttf
image_path("edit.png") # => "/images/edit.png"
image_tag("icon.png") # => <img src="/images/icon.png" alt="Icon" />
video_path("hd.avi") # => /videos/hd.avi
video_tag("trailer.ogg") # => <video src="/videos/trailer.ogg" />
Sass还提供了像-url和-path这样的helper来协助你:
image-url("rails.png") # => url(/assets/rails.png)
image-path("rails.png") # => "/assets/rails.png".
asset-url("rails.png", image) # => url(/assets/rails.png)
asset-path("rails.png", image) # => "/assets/rails.png"
Production:
在还不熟悉的情况下,很容易伤了production环境后发现原本在本地好好的东西全都坏掉了,因此你必须了解一下在production运行时的情形,如果你直接在terminal中打rails s -e production 来启动production环境时,你会发现马上就报错了,类似application.css isn't precompiled这样的错误,这是因为子啊production的环境下,我们的assets是必须呗compile过后存在public/assets目录下的,你可以在terminal中输入rake assets:precompile,rails会帮你把所有的assets文件按照你manifests以及环境设置打包压缩成单一的文件后放在public/assets目录下,并且所有的文件名会加入md5字符串用来标识其内容的快照(版本)。在你precompile后,你再打开localhost;3000会发现这时候已经没有报错了,但是感觉网站看起来像是没有引入css一样乱,这时候查看log你会发现rails找不到assets,这是因为在production环境是不处理静态文件的,所以你必须在production.rb中将config.serve_static_assets = false 改成 true,这时候你重启服务,再次访问,会发现一切正常了。
本文参考了http://gogojimmy.net/2012/07/03/understand-assets-pipline/,如有任何疑问请详细查看该链接
怎样禁止Assets Pipeline:
不用当然可以,你可以在config/application.rb中将它干掉:
config.assets.enabled = false
Assets Pipeline 好处:
1、将所有的js或css压缩打包成单一的文件,减少http request的大小与数量,增加你网站的速度
2、支持香scss及coffeescript这样的语言,让你可以用更简单更棒的方式来写css及javascript
Assets Pipeline 组成元件
主要有两个元件组成:Sprockets以及Tilt. Sprockets用来从你的assets路径中打包你所有的assets后,包装成一个文件,然后放到你的目的路径(public/assets),而Tilt主要是一个模板引擎,用来让Sprockets可以去解析Scss,coffeescript或是erb等各种各样的模板。
Assets结构:
在rails目录结构中,有三个地方:
app/assets(通常放置我们自己为了自己的程序所写的js,css,或者是images)
lib/assets(通常是放置我们使用的插件中用到的assets)
vender/assets(通常是放置一些我们从别的地方借用的assets,比如说一些jquery插件)
在默认情况下,这三个文件夹内是共通的(因为都会被打包成一个文件),你可以把你的rails app跑起来,然后在localhost:3000/assets/applications.js中看到你所有的js都在这个文件中,同理,css也一样,你可一在console里面输入Rails.application.config.assets.paths来查看所有的assets路径,你可以发现,除了我们刚刚说的三个目录,还有Gemfile中初夏的jquery,这就是说,将来我们的assets也可以打包成gem来用,如果你有多个projects常重复使用一些共同的assets,不妨我们可以考虑将我们的assets打包成gem,方便以后使用。
Assets目录内文件的导入方式:
以app/assets/javascripts/application.js为例,这是一个manifest文件,主要用来告诉Spockets说,哪些文件是要被载入后打包起来压缩的,最后这些文档里面的所有内容都会被打包成application.js,也是我们在layout/application.html.erb中的javascript_include_tag 'application'中的文档,打开这个文件,里面只有三行:
//= require jquery
//= require jquery_ujs
//= require_tree .
上面两行很明确就是要引入jquery和jquery_ujs这两个文件,这两个文件是呗包含在我们的gem当中的,而下面那行require_tree . 表示把三个assets/javascript目录下的js文件或者子目录内的所有文件都包进来。这时候你一定会问,如果有些js或是css我只想在某西特定页面中使用的话该怎么办,例如:假如说我们今天有个admin_function.js的文件,我只想在我的后台使用,其他页面不使用,那么你有两种方法可以实现:
1、你可以将require_tree的目录改成其他的目录,例如在app/assets/javascript目录下创建一个叫做common的文件夹,然后把require_tree . 改成require_tree ./common,这样的话,所产生的application.js就不会用到admin_function.js这个文件了。
2、你可以建立一个新的文件见,用来盛放那些你不想被application.js载入的文件,例如我们在app/assets/javascript下建立了一个admin的文件夹,并吧刚刚的admin_function.js文件放进去,然后把applicaiton.js文件中的require_tree . 改为require_directory . 这样子,程序只会载入与application.js文件统一级目录中的所有文件,而不会去加载子目录中的文件。
如果你想在某个页面加载admin下的所有的js,那么你需要在这个admin目录下新建一个manifest,用来引入该目录下的文件,比如我们在admin目录下建立了一个叫做admin.js的文件,然后在里面我们可以一样使用require_tree 或者require_directory的方式来载入,然后你需要在你的这个特定的页面中使用javascript_include_tag 'admin/admin'这样来进行引用。
千万要记住,当你使用application.js之外的manifest文件时,一定要在你的环境设置文件中加入precompile的清单,否则伤了production时,你会收到一堆500error xxxx isn't precompiled ,加入的位置在production.rb中加入:config.assets.precompile += %w( 'admin/admin.js' )
除了require_tree 及 require_directory 之外,还有其他的方法,你都可以使用绝对或者相对路径来制定文件的位置,文件的后缀名可有可无:
require[路径]载入某特定的文件,如果该文件被多次载入的话,Sprockets会很聪明的帮你载入一次。
include[路径] 与require一样,差别在于,每次都会重新加载一次文件。
require_directory [路径] 将路径下,不包含子目录的文件按照字母顺序依次载入。
require_tree [路径] 将路径下的文件,包含子文件夹中的文件全部载入
require_self [路径] 告诉Sprockets在载入其他文件之前,先将自己的内容插入
Preprocessing:
Sprockets在Itlt的协助下,有preprocessing的功能,例如你可以使用像是someting.js.coffee.erb这样的文件名,Tilt会一次根据不同的代码调用不同的模板解析器,所以,你可以在js中使用CoffeeScript的写法来写js,并在里面使用ruby的代码来产生你所需要的东西例如:
jQuery ->
number = <%= 1 + 1 %>
Helper:
Assets 提供了很多路径helper,来让你指向你的assets:
audio_path("horse.wav") # => /audios/horse.wav
audio_tag("sound") # => <audio src="/audios/sound" />
font_path("font.ttf") # => /fonts/font.ttf
image_path("edit.png") # => "/images/edit.png"
image_tag("icon.png") # => <img src="/images/icon.png" alt="Icon" />
video_path("hd.avi") # => /videos/hd.avi
video_tag("trailer.ogg") # => <video src="/videos/trailer.ogg" />
Sass还提供了像-url和-path这样的helper来协助你:
image-url("rails.png") # => url(/assets/rails.png)
image-path("rails.png") # => "/assets/rails.png".
asset-url("rails.png", image) # => url(/assets/rails.png)
asset-path("rails.png", image) # => "/assets/rails.png"
Production:
在还不熟悉的情况下,很容易伤了production环境后发现原本在本地好好的东西全都坏掉了,因此你必须了解一下在production运行时的情形,如果你直接在terminal中打rails s -e production 来启动production环境时,你会发现马上就报错了,类似application.css isn't precompiled这样的错误,这是因为子啊production的环境下,我们的assets是必须呗compile过后存在public/assets目录下的,你可以在terminal中输入rake assets:precompile,rails会帮你把所有的assets文件按照你manifests以及环境设置打包压缩成单一的文件后放在public/assets目录下,并且所有的文件名会加入md5字符串用来标识其内容的快照(版本)。在你precompile后,你再打开localhost;3000会发现这时候已经没有报错了,但是感觉网站看起来像是没有引入css一样乱,这时候查看log你会发现rails找不到assets,这是因为在production环境是不处理静态文件的,所以你必须在production.rb中将config.serve_static_assets = false 改成 true,这时候你重启服务,再次访问,会发现一切正常了。
本文参考了http://gogojimmy.net/2012/07/03/understand-assets-pipline/,如有任何疑问请详细查看该链接
评论
1 楼
冯大圆__渐成胡子渣
2017-12-17
写得很详细,想请求一下,bundler install的时候设置了path,这时候会自动加入到application.config.assets.paths吗?
发表评论
-
ruby module :: 前置操作符
2014-04-02 16:55 753在ruby代码中,我们经常看到有类似这样的获取module的用 ... -
关于Ruby动态方法定义的区别
2014-04-02 16:05 867A.class_eval(<<-EOF, __ ... -
%Q, %q, %W, %w, %x, %r, %s
2014-04-02 10:52 1072%Q 遇到引号嵌套的时候我们往往需要使用反斜线来实现转义,使用 ... -
Ruby extend self
2013-10-22 10:14 1007我们想让实例方法同时为类方法,那么可以使用extend sel ... -
$:.unshift File.expand_path('..', __FILE__)
2013-10-22 10:05 1328一直能看到一些gem里面会有这样一句代码: $:.unshif ... -
rails cattr_accessor and mattr_accessor
2013-09-27 09:37 0http://stackoverflow.com/questi ... -
Rails、Nginx、Passenger、bundle,这几者是怎么协作的?
2013-06-27 00:33 1145注:本文转自知乎,原文请参考 Bundle是Gem包的依赖管 ... -
bundle open a specify gem
2013-06-26 23:48 1032今天在看railscasts教程http://railscas ... -
关于测试
2013-06-25 00:52 739http://asciicasts.com/episodes/ ... -
Rails高级编程 笔记
2013-04-23 18:00 0Ruby基础 1、类:主要负责封装和分离事物 2 ... -
ruby通用符号
2013-04-10 22:34 0%Q 当你在”字符串中” 有大量的使用双引号时,频繁的转义字符 ... -
rails_client_validations
2013-02-22 10:57 923看了下rails的服务端验证怎样转换到客户端,实现类似于aja ... -
rails Authration and Password
2013-02-19 18:23 1013以下是我总结的在rails项目中用到的与登录注册相关的资源: ... -
deployment RoR with nginx & unicorn on ubuntu
2013-01-09 14:50 1859本来一直都是用rails自带的webrick做本地开发的,但是 ... -
rails attr_protected、 attr_accessible
2013-01-06 10:02 1043attr_protected、 attr_accessible ... -
NewRelic
2013-01-04 17:52 6339NewRelic是一家提供Rails性能监测服务的网站, Ne ... -
rails中处理北京时间以及数据库的时区问题
2012-10-10 11:18 0解释4个时区设置的不同: config.active_rec ... -
eigenclass 与 class 关系
2012-09-20 16:24 1122声明:本文转载自http://ruanwz.github.co ... -
单例模块儿
2012-09-11 17:01 949#单例模块,存在的意义就是在模块被载入类时,给类添加类方法和创 ... -
ruby 输入输出
2012-07-13 17:10 1627Ruby提供了两种不同的I/O方法。 第一种就是我们一直在用的 ...
相关推荐
在Rails开发过程中,前端资源管理经历了从Assets Pipeline到Webpack的转变。Assets Pipeline是Rails框架早期引入的一个重要特性,用于处理和优化JavaScript、CSS以及其他静态资源。然而,随着前端开发技术的迅速发展...
这个 gem 与来自的最后一个标记发布版本捆绑在一起,它由 Rails Assets Pipeline 自动为您缩小。 如果您需要自定义功能检测测试,请考虑本 README 中的部分。 安装 导轨 3.x 将以下内容添加到 Gemfile 中的assets...
这是一个打包器,它允许您在 Rails Assets Pipeline 中通过 RubyGem 简单地安装和维护 Fotorama。 在开发中它将使用本地副本,在生产中它将使用 CDN。 Fotorama 由创建和维护。 安装 将fotoramajs gem 添加到...
为基于资产管道的主题添加theme-image-url sass帮助器方法更新生成器和rake任务以支持基于资产管道的主题( NEW )可与Rails Assets Pipeline一起使用,而不会产生干扰并加以利用。兼容性此gem可与3.0版到3.2.1版...
- 原有架构:Rails Assets Pipeline - 新架构:Webpack + Babel + Gulp - **单元测试(Unit Testing)**: - 原有架构:Rspec - 新架构:Mocha + Chai + Sinon + Enzyme - **样式(CSS)**: - 原有架构:SCSS - ...
磁通-轨道-资产用于Rails Asset Pipeline的和与不使用CommonJS,而是在窗口上创建FluxDispatcher和EventEmitter以便轻松地使用Assets Pipeline。 与react-rails服务器端渲染效果很好。 助焊剂版本: 安装将此行添加...
Rails Assets 将与基于的应用程序集成在一起。 一体化 文件 此应用程序使用将 Sinatra 与 Sprockets 集成的 Sinatra 。 您还需要添加适当的source和rails-assets- gems。 source 'https://rubygems.org' gem '...
同时,`jquery-ui-1.10.4.zip`文件包含的是jQuery UI的一个具体版本,如果需要自定义某些组件或者使用非默认的主题,可以直接解压这个文件并将其内容引入到Rails项目的assets目录下,以便在asset pipeline中使用。...
9. **Assets Pipeline**:Rails的静态资源管理机制,集成了Sass、CoffeeScript等预处理器,方便管理和优化CSS、JavaScript等资源。 10. **Rails Console**:交互式的命令行工具,用于运行Rails应用的上下文中的Ruby...
`cljs-rails` 提供了Rails友好的集成方式,包括自动编译、Sprockets的集成、Rails Asset Pipeline的兼容等,使得Clojurescript可以像其他Rails asset一样被管理和部署。 使用`cljs-rails` 的步骤通常包括以下几点:...
这种方式是Rails的Asset Pipeline所支持的,它能有效地管理前端资源,提高加载速度。 接下来,我们需要在HTML视图中创建一个日期输入字段。在Rails中,这通常是通过`<%= f.date_field :date_field_name %>`这样的...
13. **Asset Pipeline**:Rails的Asset Pipeline用于管理和优化静态资源,如CSS、JavaScript和图片。通过`app/assets`目录组织这些文件,并支持Sass、CoffeeScript等预处理器。 14. **ActiveRecord**:Rails的ORM...
Asset Sync构建为与Rails 3.1中引入的新的Rails Asset Pipeline功能一起运行。 运行bundle exec rake asset:后,将对资产进行预编译。Asset Sync在Rails和S3之间同步资产。 Asset Sync构建为与Rails 3.1中引入的新...
# github flavored markdown css packaged for the rails asset pipeline gem 'github-css-rails' , '~> 1.1.3' 然后执行: $ bundle 或者自己安装: $ gem install github-css-rails 用法 将这些行添加到app/...
2.在Rails Asset Pipeline中包含模板 然后,在application.js文件中,需要angular-rails-templates和您的模板: //= require angularjs // ... //= require angular-rails-templates // // Templates in app/assets...
- **Assets Pipeline**:Rails 4 引入了一个新的特性,即资源管道,它可以将 JavaScript、CSS 等前端资源文件进行压缩合并,从而提高应用的加载速度。 **5. Rails 的开发流程** - **环境搭建**:在开始开发之前,...
1. **Asset Pipeline**:Laravel Assets提供了一个类似Rails的资产管道系统,允许开发者将多个JS或CSS文件合并成一个单一的文件,减少HTTP请求,从而提高网页加载速度。 2. **版本控制**:通过自动添加版本号到静态...
# qtip2 jquery plugin packaged for the rails asset pipeline gem 'qtip2-jquery-rails' , '~> 2.2.100' 然后执行: $ bundle 或者自己安装: $ gem install qtip2-jquery-rails 宝石版注意事项: 版本采用...