grunt.js — Несколько мест назначения при минимизации файлов

Мой grunt.js имеет типичную задачу минификации:

min: {
    dist: {
        src: ['dist/precook.js'],
        dest: 'dist/precook.min.js'
    }
}

Каков самый простой способ иметь несколько файлов назначения? Я хотел бы минимизировать в:

  • dist/precook.min.js
  • пример/js/поставщик/precook.min.js

встроенная минимальная задача не поддерживает несколько назначений, поэтому я предполагаю это может быть достигнуто с помощью простой задачи «копирования». Может кто-нибудь указать мне в правильном направлении?


person Matt Stone    schedule 16.10.2012    source источник


Ответы (3)


Я бы использовал плагин grunt-contrib-copy:

Установите с помощью npm:

npm install grunt-contrib-copy

Измените grunt.js (добавьте определение задачи копирования и загрузите плагин копирования):

    ...
    copy: {
        dist: {
            files: {
                'example/js/vendor/': 'dist/precook.min.js'
            }
        }
    }
    ...

grunt.loadNpmTasks('grunt-contrib-copy');

При желании зарегистрируйте copy в задаче grunt по умолчанию.

Дополнительным преимуществом здесь является то, что теперь вы также можете выполнять все другие задачи копирования. Поддерживаются даже шаблоны, например копирование всех минифицированных файлов ('dist/*.min.js').

person jsalonen    schedule 16.10.2012
comment
Идеально, это именно то, что я искал. Спасибо за дополнительное путешествие по регистрации комбинированной задачи по умолчанию! - person Matt Stone; 18.10.2012

Это альтернативный подход (рядом с решением @jalonen), который может быть вам интересен, ЕСЛИ вы используете requirejs для модуляции вашего проекта, вы можете использовать requirejs оптимизатор для минимизации ваших модулей.

Прежде всего, вам нужно добавить в проект grunt-contrib-requirejs:

npm install grunt-contrib-requirejs --save-dev

Конфигурация Grunt:

        requirejs: {
            production:{
                options:{
                    // don't include libaries when concatenating/minifying
                    paths:{
                        angular:'empty:',
                        jquery:'empty:'
                    },
                    baseUrl:'path/to/src/js',
                    dir:'path/to/target/js',
                    // keeps only the combined files
                    removeCombined:true,
                    modules:[
                        {name:'app', exclude: ['moduleA', 'moduleB']},
                        {name:'moduleA'},
                        {name:'moduleB'}
                    ]
                }
            }
        }
        ...

     grunt.loadNpmTasks('grunt-contrib-copy');

Пояснение:

Допустим, у вас есть это дерево зависимостей (-> означает зависит от):

app -> moduleA -> moduleA1
               -> moduleA2              
app -> moduleB -> moduleB1
               -> moduleB2            

После минификации у вас будет три файла:

  • app (уменьшенная версия приложения)
  • moduleA (уменьшенная версия moduleA, moduleA1 и moduleA2)
  • moduleB (уменьшенная версия moduleB, moduleB1 и moduleB2)
person asgoth    schedule 18.03.2013
comment
Спасибо @asgoth. У меня больше опыта ворчания (0,4 ~) с момента первоначального вопроса, и теперь я использую grunt-contrib-requirejs аналогично этому. - person Matt Stone; 20.03.2013

Столкнулся с похожей проблемой и создал многозадачную программу, которая запускает список указанных задачи в нескольких каталогах

Использование для точного случая: ```

min: {
    dist: {
        src: ['dist/precook.js'],
        dest: 'dist/precook.min.js'
    }
},
multidest: {
    minifiedFiles: {
        tasks: ['min'],
        dest: [
            'dist/precook.min.js',
            'example/js/vendor/precook.min.js'
       ]
    }
}

```

person erjitka    schedule 14.08.2014