2012-08-12 2 views
3

Я хотел бы выборочно сжать некоторые из файлов javascript в приложении Rails 3.2, но все же все js-активы будут обслуживаться из одного связанного файла в рабочей среде.Селективные Rails 3.2 сжатие конвейера активов на файл

Синтаксис как это, внутри приложение/активы/JavaScripts/application.js файла, используя выдуманный:compress => false варианта переданного последние 3 звездочек require директивы Я надеюсь, объясняет то, что я пытаюсь добиться.

// Contents of app/assets/javascripts/application.js 
// 
//= require jquery 
//= require jquery_ujs 
//= require angular-1.0.1/angular, :compress => false 
//= require angular-1.0.1/angular-resource, :compress => false 
//= require products, :compress => false 

Так jquery.js и jquery_ujs.js файлы будут сжаты (по Rails компиляции активов, которая использует UglifierJS по умолчанию), а оставшиеся 3 файлы не будут сжаты, но они будут группироваться в приложение .js.

Есть ли способ сделать это?

Мотивация состоит в том, что файл products.js содержит контроллер угловой системы, который использует инъекцию зависимостей углов, которая требует определенных переменных имен, таких как $scope и , не изменяется.

ответ

8

Я использую эту строку в моей конфигурации/окружающей среды/production.rb файл

config.assets.js_compressor = Sprockets::LazyCompressor.new { Uglifier.new(:mangle => false) }

Он сжимает мои контроллеры, но это не меняет сигнатуры метода так DI все еще работает, как ожидалось.

+0

Большое спасибо Милан, работает для меня в Rails 3.2.6, angularjs отлично работает сейчас. –

+0

Из любопытства, что делает часть «Звездочки :: LazyCompressor'? –

+0

Почти все в рельсах - это просто «оболочка», каждая конкретная реализация определенного шаблона обобщается, поэтому вы можете переключиться на альтернативу. Sprockets - это двигатель, который делает сжатие, sass/less precompilation ... и многое другое. Линия Sprockets :: LazyCompressor.new создает ленивый загрузчик для сжатия js, и вы можете использовать что угодно. По умолчанию с помощью rails вы используете uglifier для сжатия ваших файлов, а строка выше - это просто способ сказать uglifier, чтобы избежать переименования аргументов метода. –

3

Обратите внимание, что по этой конкретной причине существует возможность указывать введенные службы со строками, а не с именами переменных. См. Строку под контроллером.

var MyController = function(renamed$scope, renamedGreeter) { 
    ... 
} 
MyController.$inject = ['$scope', 'greeter']; 

Пример взят из http://docs.angularjs.org/guide/di

6

Для того, чтобы получить эту работу с Rails 4, так как она использует более новую версию цепных колес я использовал:

config.assets.js_compressor = Uglifier.new(mangle: false) if defined? Uglifier

в средах/production.rb

Смежные вопросы