Скомпилируйте и объедините coffeescript и javascript с помощью grunt

Я включил библиотеку, написанную на Javascript, а также у меня есть код coffeescript, который зависит от этих библиотек.

Когда я публикую с помощью GRUNT, я хочу создать один файл Javascript, который создается путем объединения всех файлов JS и Coffee вместе. Очевидно, ни grunt-contrib-uglifyjs, ни Grunt-contrib-coffee поддерживает такое поведение. Каково решение этой проблемы?


person tusharmath    schedule 19.11.2013    source источник
comment
Я ответил на ваш вопрос?   -  person Leonardo Barbosa    schedule 20.11.2013


Ответы (2)


Вы можете использовать concat для этого.

Например, в вашем Gruntfile.js:

module.exports = function(grunt) {
  return grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    // EDIT: TO COMPILE YOUR COFFEESCRIPT
    coffee: {
      "default": {
        src: paths.coffee_src,
        dest: paths.js_dir,
        options: {
          preserve_dirs: true,
          base_path: paths.coffee_dir
        }
      }
    },
    concat: {
      options: {
        separator: ';'
      },
      dist: {
        src: ['assets/javascripts/libs/underscore/underscore.js', 'assets/javascripts/libs/jquery/jquery.js', 'assets/javascripts/libs/json2/json2.js', 'assets/javascripts/libs/handlebars-wycats/dist/handlebars.js', 'assets/javascripts/libs/backbone/backbone.js', 'assets/javascripts/libs/marionette/lib/backbone.marionette.js', 'assets/javascripts/*.js', 'assets/javascripts/utilities/*.js', 'assets/javascripts/models/*.js', 'assets/javascripts/collections/*.js', 'assets/javascripts/modules/**/**/*.js'],
        dest: '<%= pkg.name %>.js'
      }
    },
    // ...
    // EDIT: TO MINIFY YOUR CONCATENATED JS
    uglify: {
      options: {
        banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
      },
      dist: {
        files: {
          '<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
        }
      }
    },
    // ...

Здесь я объединяю все файлы в указанном порядке (начиная с underscore.js), поэтому у вас будет один js-файл со всеми этими файлами в определенном порядке.

Дополнительные сведения см. в этой документации.

person Leonardo Barbosa    schedule 19.11.2013
comment
это не минимизирует и не запутывает выходной файл. Более того, он не будет работать с coffeescripts. - person tusharmath; 19.11.2013
comment
Пожалуйста, проверьте мой обновленный ответ. Сначала вам нужно будет использовать coffee для компиляции coffeescript в js, затем использовать concat для объединения ваших js и скомпилированных файлов coffeescript, а затем использовать uglify для его минимизации. - person Leonardo Barbosa; 19.11.2013
comment
Вы компилируете файлы кофе во временное место, а затем объединяете их с уже существующими файлами js? - person tusharmath; 19.11.2013
comment
Вы можете выбрать, где хотите, не обязательно, чтобы это была временная папка. Вы можете создать каталог скомпилированных файлов, а затем игнорировать его, используя .gitignore - person Leonardo Barbosa; 19.11.2013
comment
Это то, что я делаю прямо сейчас. Было бы намного лучше, если бы был плагин, который мог бы делать то же самое за один раз. - person tusharmath; 19.11.2013
comment
Для этого вам не нужен плагин. Ваш Gruntfile — это всего лишь один файл, и он был создан для выполнения этих задач за вас. Вы можете использовать github.com/gruntjs/grunt-contrib-clean grunt-contrib-clean, чтобы очистить временные папки после создания ваших активов. - person Leonardo Barbosa; 19.11.2013

Grunt — это файл nodejs, который выполняется как nodejs. Итак, попробуйте следующее:

require('child_process').exec('coffee --compile --output lib/ src/',  function () {
    /*add callback or use execSync */
});

Просто отредактируйте команду кофе.

person Pinal    schedule 19.11.2013
comment
как мне объединить их с файлами javascript? - person tusharmath; 19.11.2013
comment
И скомпилируйте файл js, например, grunt-contrib-concat. - person Pinal; 19.11.2013