`

Rails Assets Pipeline

 
阅读更多
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/,如有任何疑问请详细查看该链接
分享到:
评论
1 楼 冯大圆__渐成胡子渣 2017-12-17  
写得很详细,想请求一下,bundler install的时候设置了path,这时候会自动加入到application.config.assets.paths吗?

相关推荐

    从 Assets Pipeline 到 Webpack,Rails 6 的新前端方案们 - 过纯中1

    在Rails开发过程中,前端资源管理经历了从Assets Pipeline到Webpack的转变。Assets Pipeline是Rails框架早期引入的一个重要特性,用于处理和优化JavaScript、CSS以及其他静态资源。然而,随着前端开发技术的迅速发展...

    modernizr-rails:通过 Rails 3.1 资产管道包含 Modernizr.js 库的 Gem 包装器

    这个 gem 与来自的最后一个标记发布版本捆绑在一起,它由 Rails Assets Pipeline 自动为您缩小。 如果您需要自定义功能检测测试,请考虑本 README 中的部分。 安装 导轨 3.x 将以下内容添加到 Gemfile 中的assets...

    fotoramajs:Ruby on Rails 的 Fotorama

    这是一个打包器,它允许您在 Rails Assets Pipeline 中通过 RubyGem 简单地安装和维护 Fotorama。 在开发中它将使用本地副本,在生产中它将使用 CDN。 Fotorama 由创建和维护。 安装 将fotoramajs gem 添加到...

    themes_for_rails:Rails 3的主题支持

    为基于资产管道的主题添加theme-image-url sass帮助器方法更新生成器和rake任务以支持基于资产管道的主题( NEW )可与Rails Assets Pipeline一起使用,而不会产生干扰并加以利用。兼容性此gem可与3.0版到3.2.1版...

    架构创新与演进(解决方案专场)——FreeWheel在微服务架构下的前端改造实践 共39页.pdf

    - 原有架构:Rails Assets Pipeline - 新架构:Webpack + Babel + Gulp - **单元测试(Unit Testing)**: - 原有架构:Rspec - 新架构:Mocha + Chai + Sinon + Enzyme - **样式(CSS)**: - 原有架构:SCSS - ...

    flux-rails-assets:助焊剂-轨道-资产宝石

    磁通-轨道-资产用于Rails Asset Pipeline的和与不使用CommonJS,而是在窗口上创建FluxDispatcher和EventEmitter以便轻松地使用Assets Pipeline。 与react-rails服务器端渲染效果很好。 助焊剂版本: 安装将此行添加...

    rails-assets-sinatra:那是

    Rails Assets 将与基于的应用程序集成在一起。 一体化 文件 此应用程序使用将 Sinatra 与 Sprockets 集成的 Sinatra 。 您还需要添加适当的source和rails-assets- gems。 source 'https://rubygems.org' gem '...

    jquery-ui+jquery-ui-rails

    同时,`jquery-ui-1.10.4.zip`文件包含的是jQuery UI的一个具体版本,如果需要自定义某些组件或者使用非默认的主题,可以直接解压这个文件并将其内容引入到Rails项目的assets目录下,以便在asset pipeline中使用。...

    Ruby on Rails Web开发学习实录随书光盘(源代码).

    9. **Assets Pipeline**:Rails的静态资源管理机制,集成了Sass、CoffeeScript等预处理器,方便管理和优化CSS、JavaScript等资源。 10. **Rails Console**:交互式的命令行工具,用于运行Rails应用的上下文中的Ruby...

    Ruby-Rails的Clojurescript集成类似于webpackrails

    `cljs-rails` 提供了Rails友好的集成方式,包括自动编译、Sprockets的集成、Rails Asset Pipeline的兼容等,使得Clojurescript可以像其他Rails asset一样被管理和部署。 使用`cljs-rails` 的步骤通常包括以下几点:...

    rails中使用javascript日期控件

    这种方式是Rails的Asset Pipeline所支持的,它能有效地管理前端资源,提高加载速度。 接下来,我们需要在HTML视图中创建一个日期输入字段。在Rails中,这通常是通过`&lt;%= f.date_field :date_field_name %&gt;`这样的...

    ruby on rails 实例depot

    13. **Asset Pipeline**:Rails的Asset Pipeline用于管理和优化静态资源,如CSS、JavaScript和图片。通过`app/assets`目录组织这些文件,并支持Sass、CoffeeScript等预处理器。 14. **ActiveRecord**:Rails的ORM...

    在Rails和S3之间同步资产-Ruby开发

    Asset Sync构建为与Rails 3.1中引入的新的Rails Asset Pipeline功能一起运行。 运行bundle exec rake asset:后,将对资产进行预编译。Asset Sync在Rails和S3之间同步资产。 Asset Sync构建为与Rails 3.1中引入的新...

    gem-github-css-rails:为 Rails 3.1+ 资产管道提供 GitHub Flavored Markdown CSS

    # github flavored markdown css packaged for the rails asset pipeline gem 'github-css-rails' , '~&gt; 1.1.3' 然后执行: $ bundle 或者自己安装: $ gem install github-css-rails 用法 将这些行添加到app/...

    angular-rails-templates:将角度模板与rails的资产管道一起使用

    2.在Rails Asset Pipeline中包含模板 然后,在application.js文件中,需要angular-rails-templates和您的模板: //= require angularjs // ... //= require angular-rails-templates // // Templates in app/assets...

    Ruby On Rails For Dummies

    - **Assets Pipeline**:Rails 4 引入了一个新的特性,即资源管道,它可以将 JavaScript、CSS 等前端资源文件进行压缩合并,从而提高应用的加载速度。 **5. Rails 的开发流程** - **环境搭建**:在开始开发之前,...

    Laravel开发-laravel-assets

    1. **Asset Pipeline**:Laravel Assets提供了一个类似Rails的资产管道系统,允许开发者将多个JS或CSS文件合并成一个单一的文件,减少HTTP请求,从而提高网页加载速度。 2. **版本控制**:通过自动添加版本号到静态...

    gem-qtip2-jquery-rails:提供为 Rails 3.1+ 资产管道打包的 `qTip2` jQuery 插件

    # qtip2 jquery plugin packaged for the rails asset pipeline gem 'qtip2-jquery-rails' , '~&gt; 2.2.100' 然后执行: $ bundle 或者自己安装: $ gem install qtip2-jquery-rails 宝石版注意事项: 版本采用...

Global site tag (gtag.js) - Google Analytics