2

我正在用 PHP 为服务器端和 Ember.js 为客户端构建一个项目。

我已经在 CoffeScript 中编写了所有脚本,在 .hbs 文件中编写了模板,在 .scss 文件中编写了样式,现在我使用 rake-pipeline 来编译所有脚本,但我有几个问题:

  • 如何组织依赖关系
  • 如何在其他文件中包含脚本
  • 如何确定脚本的顺序

现在我有一个硬编码 AssetFile 用于对最终 .js 文件中的脚本进行排序,但我的应用程序变得更加复杂,一些文件需要增长并拆分为更多文件,但我遇到了之前提到的问题。

资产文件

output BUILD_DIR
input SRC_DIR do
  match '**/*.handlebars' do
    handlebars :precompile => true
    concat '0.js'
  end

  match '**/lib/*.coffee' do
    coffee_script
    concat '1.js'
  end
  match '**/app.coffee' do
    coffee_script
    concat '2.js'
  end
  match '**/controller/*.coffee' do
    coffee_script
    concat '3.js'
  end
end

我的项目布局就像

Resources/
   assets/
      js/         # Are like my vendors (jquery, ember, etc...)
      images/     # i copy this without process
      styles/     # Here are .scss and .sass files
   scripts/
      templates/  # It's a directory tree with files .hbs 
      controller/ # Dirs with arbitrary names
      lib/
      ...
      main.coffee # main point, ej: App = Rkmax.App.create();App.initialize();

你可以看到主要的麻烦是在咖啡编译器生成concat .js文件时给出正确的顺序,我在rails中看到了一些项目并require在.coffe文件中使用了这句话,但不知道如何让rake-pipeline理解这句话.

4

2 回答 2

1

某种方式require将成为您的解决方案。使用声明依赖关系require让您的工具连接和/或加载模块是正确的顺序。

大多数使用的 rake-pipeline 项目require都使用 minispade ( github ),它是 rake-pipeline 过滤器的伴侣 MinispadeFilter。(github)。

您可能还希望将 Iridium ( github ) 视为将这些工具与其他工具打包在一起的工具示例。

于 2012-10-21T05:56:58.140 回答
0

搜索了一段时间后。我决定用Sprockets代替 rakepipeline有一个类似的系统来编译你需要的一切

宝石文件

gem 'sprockets'
gem 'sprockets-sass'
gem 'sass'
gem 'coffe-script'

耙文件

require 'sprockets'
require 'logger'
require 'fileutils'
require 'pathname'

task :compile => :clean do
    sprockets = Sprockets::Environment.new(ROOT)

    sprockets.append_path SOURCE_DIR.to_s

    %w( app.js vendor.s template.js ).each do |bundle|
        assets = sprockets.find_asset(bundle)
        ext = bundle.split(".")[1]
        name = assets.pathname.basename(assets.pathname.extname)
        FileUtils.mkpath BUILD_DIR.join(ext)
        assets.write_to BUILD_DIR.join(ext, "#{name}.#{ext}")    
    end
end

Sprockets 具有“指令处理器”,例如

  • 要求
  • 包括
  • 需要自己

它们让我可以轻松地组织依赖项。唯一的问题是它没有处理.handlebars默认值,但我写了一个简单的handlebars_template.rb

车把模板.rb

require 'tilt'
require 'json'

module Sprockets
  class HandlebarsTemplate < Tilt::Template
    self.default_mime_type = 'application/javascript'    

    def prepare
    end

    # Compile template data
    def evaluate(scope, locals, &block)
      "Ember.TEMPLATES['#{scope.logical_path.split("/")[1..-1].join("/")}']=Ember.Handlebars.compile(#{data.to_json});\n"
    end
  end
end

在正确的地方注册,瞧!处理我的模板

register_engine 'handlebars', ::Sprockets::HandlebarsTemplate
register_engine 'hbs',        ::Sprockets::HandlebarsTemplate
于 2012-10-21T00:20:50.130 回答