Я пытаюсь Grunt и нужен простой способ объединить мои модули - программирование
Подтвердить что ты не робот

Я пытаюсь Grunt и нужен простой способ объединить мои модули

Это мой первый раз с использованием Grunt, и я бы хотел, чтобы он объединил все мои js-модули, каждый из которых был завершен в немедленно исполняемую функцию, содержащую объявление "use strict" и помещая их в один файл, завернутый только в одной немедленно исполняющей функции, только с одним объявлением 'use strict'.

Как это обычно делается?

Я понял, что это будет распространенный случай использования? Возможно, я поступил неправильно? Должен ли я использовать один из форматов загрузки модуля (т.е. Commonjs, amd). Все эти файлы всегда будут загружаться вместе в браузере, поэтому я бы не отказался удалить все сразу исполняемые функции, если это обычно происходит с людьми. Важная часть состоит в том, что конечный результат каким-то образом завернут, проходит тесты lint и unit и содержит объявление "use strict".

(я должен уточнить, у меня есть работа, листинг, модульное тестирование, конкатенация и минимизация, просто кажется, что я делаю что-то не так, когда вижу кучу ненужных немедленных выполнения функций в конечном конкатенированном файле.)

4b9b3361

Ответ 1

Я обычно делаю это как команда jQuery делает это. Вы создаете intro.js и outro.js и помещаете все остальное между ними:

intro.js

;(function( window, undefined ){
  'use strict';

outro.js

}( window ));

grunt.js

concat: {
  dist: {
    src: [
      'js/src/intro.js',
      ...
      'js/src/outro.js'
    ],
    dest: 'js/out/app.js'
  }
}

Ответ 2

Как и pull request 10, grunt-contrib-concat теперь имеет параметр footer. Вместо интро и файла outro я бы использовал баннер и нижний колонтитул.

Gruntfile.js

concat: {
  dist: {
    src: ['src/my-lib.js'],
    dest: 'dist/<%= pkg.name %>.js',
    options: {
      banner: ";(function( window, undefined ){ \n 'use strict';",
      footer: "}( window ));"
    }
  }
}

По-моему, это более удобно и позволяет использовать шаблоны, используя другие свойства, определенные в вашем файле Grunt.

Ответ 3

Просто хочу добавить к @elclanrs ответ, что если вы хотите сохранить свои модули в отдельных файлах для более легкой отладки во время разработки, вам, очевидно, придется обернуть их с помощью intro.js и outro.js. Используя встроенную задачу concat, вам нужно написать что-то вроде:

concat: {
  events_debug: { // wrap the 'events' module in IIFE
    src: [
      'js/src/intro.js',
      'js/src/events.js',
      'js/src/outro.js'
    ],
    dest: 'js/out/events.js'
  },
  callbacks_debug: { // wrap the 'callbacks' module in IIFE
    src: [
      'js/src/intro.js',
      'js/src/callbacks.js',
      'js/src/outro.js'
    ],
    dest: 'js/out/callbacks.js'
  }

  // zzZZZ...
}

Это очень утомительно и самоповторяется. Возможно, вы захотите создать настраиваемую задачу для файлов массовой упаковки, например.

wrap: {
    html: {
        intro: 'partials/intro.js',
        outro: 'partials/outro.js',
        src: 'js/*.js',
        dest: 'out' // output directory
    }
}

В последнее время возник вопрос об этом:

Используя grunt concat, как бы я мог автоматизировать конкатенацию одного и того же файла ко многим другим файлам?

Ответ 4

Я бы рекомендовал использовать мой плагин grunt grunt-concat-deps, так как он автоматически разрешает ваши модули независимо от вашей архитектуры.

PLUS: вам не нужна явная конфигурация модуля для плагина, поскольку он использует определение декларативного и децентрализованного модуля в стиле YUIDoc.

См. дополнительную информацию: https://github.com/leoselig/grunt-concat-deps