Usemin "Различные источники, пытающиеся писать в одном месте"

У меня есть приложение AngularJS. Я работаю над задачами usemin. Это приложение имеет 2 html-страницы, оба включают блок, минитизированный в common.js, а на других страницах - js, уменьшенный для этих конкретных страниц.

page1.html

<!-- build:js scripts/common.js -->
<!-- bower:js -->
<script src="a.js"></script>
<script src="b.js"></script>
<!-- endbower -->
<!-- endbuild -->

<!-- build:js scripts/page1.js -->
<!-- bower:js -->
<script src="c.js"></script>
<script src="d.js"></script>
<!-- endbower -->
<!-- endbuild -->

page2.html

<!-- build:js scripts/common.js -->
<!-- bower:js -->
<script src="a.js"></script>
<script src="b.js"></script>
<!-- endbower -->
<!-- endbuild -->

<!-- build:js scripts/page2.js -->
<!-- bower:js -->
<script src="e.js"></script>
<script src="f.js"></script>
<!-- endbower -->
<!-- endbuild -->

Gruntfile.js

useminPrepare: {
    html: ['<%= yeoman.app %>/page1.html', '<%= yeoman.app %>/page2.html'],
        options: {
            dest: '<%= yeoman.dist %>'
        }
    },

Usemin расстроен, потому что common.js определен в обоих файлах с ошибкой: Fatal error: разные источники, пытающиеся записать в тот же пункт назначения:. Я (думаю) Мне нужно включить и page1 и page2 в useminPrepare, чтобы правильно получить page1.js и page2.js. Как люди решают эту проблему?

Ответы

Ответ 1

Обычно с angular люди создают одностраничные приложения и создают только один "основной" index.html для всего скелета страницы. Таким образом, вам приходится иметь дело только с одним набором файлов. Различные подстраницы отображаются в данный div, используя ui-router, ng-includes или что-то еще.

Ответ 2

Проблема для меня, когда я столкнулся с этой проблемой, заключалась в том, что код должен быть точно таким же между комментариями build/endbuild html. Кажется, он должен совпадать с именами файлов, но, похоже, он соответствует содержимому комментариев. Даже проблема с вкладками или пробелами может быть проблемой.

Ответ 3

ПРЕДУПРЕЖДЕНИЕ НЕВЕСТИРОВАНО.

Вы можете создать настраиваемый блок, который будет переписывать блок в <script src="scripts/common.js"></script>, но не будет пытаться "построить" script в процессе usemin.

options: {
    blockReplacements: {
      noBuild: function (block) {
          return '<script src="scripts/common.js"></script>';
      }
    }

Затем во всех HTML файлах, которые вы НЕ хотите создавать общий script для, но вы хотите заменить путь, напишите следующее:

<!-- build:noBuild scripts/common.js -->
<!-- bower:js -->
<script src="a.js"></script>
<script src="b.js"></script>
<!-- endbower -->
<!-- endbuild -->