Почему мой grunt-contrib-requirejs ничего не оптимизирует?

Я пытаюсь приступить к работе с задачей grunt-contrib-requirejs.
Будучи новичком в RequireJS в целом и никогда не используя оптимизатор/r.js, я действительно запутался, как заставить это работать.

Для начала я создал простую структуру каталогов, подобную этой:

root
├── js
│   ├── helper
│   │   ├── a.js
│   │   ├── b.js
│   │   └── d-dep.js
│   └── main.js
├── node_modules
│   └── [dependencies from package.json]
├── Gruntfile.js
└── package.json

Я проверил это в браузере, и все зависимости там загружаются правильно.

Мой Gruntfile:

module.exports = function(grunt) {
  grunt.config.init({
    requirejs: {
      options: {
        baseUrl: 'js/',
        mainConfigFile: 'js/main.js',
        dir: 'target/',
        keepBuildDir: true
      }
    }
  });

  require('load-grunt-tasks')(grunt);
}

основной.js:

require(["helper/a", "helper/b"], function(util) {
  console.log('main.js loaded');
});

a.js

console.log('a.js loaded');

b.js

define(['js/helper/b-dep.js'], function(bdep) {
  console.log('b.js loaded');
});

b-dep.js

console.log('b.js dependency loaded');

При запуске grunt requirejs я получаю сообщение Done, without errors., но не вижу ни одного оптимизированного файла — я предполагаю, что ошибка в файле Grunt, возможно, с путем.

Вы видите что-нибудь, что поражает вас? Почему ничего не оптимизировано, хотя написано Done, without errors.?


person Sven    schedule 23.01.2015    source источник


Ответы (2)


Кажется, вы не говорите ему оптимизировать что-то. У вас должна быть установлена ​​опция name, чтобы указать, что такое основной модуль. Также вам не хватает одного уровня конфигурации в конфигурации, которую вы передаете grunt. Объект options должен находиться внутри более конкретной цели, например compile:

requirejs: {
  compile: { // <<== nest the options in this.
    options: {
      baseUrl: 'js/',
      mainConfigFile: 'js/main.js',
      name : 'main', // <<=== add this
      dir: 'target/',
      keepBuildDir: true
    }
  }
}

Установки mainConfigFile недостаточно, потому что это только сообщает оптимизатору, откуда он должен получить конфигурацию времени выполнения. Он не сообщает оптимизатору, что файл является модулем. Обратите внимание, что отсутствие расширения .js в name не является ошибкой. Вам следует избегать использования расширения в именах модулей, если только нет особой причины, требующей расширения. И name относится к baseUrl, вот почему это 'main', а не 'js/main'.

person Louis    schedule 23.01.2015
comment
Спасибо! просмотрев возможные варианты для r.js еще раз, я также заметил, что мне не хватает out, который определяет имя выходного файла. К сожалению, это все еще не работает — нужно ли мне что-то добавить в мой main.js, еще какой-то конфиг? - person Sven; 24.01.2015
comment
Мой первоначальный ответ был получен путем просмотра вашего кода. Я воспроизвел вашу конфигурацию здесь и заметил еще одну проблему. Я отредактировал свой ответ. - person Louis; 24.01.2015
comment
Вау, наконец-то это работает! Спасибо! У меня все еще есть ошибка в моем дереве модулей, но это поправимо для меня - после того, как я часами бился головой о стену ;-) - person Sven; 24.01.2015

Проверьте мою конфигурацию, это то, что я использую для создания файла с именем all.js

     requirejs : {
        dist : {
          options : {
            waitSeconds : 0,
            baseUrl : "./app/",
            name : 'assets/js/main',
            mainConfigFile: 'app/assets/js/main.js',
            out : "dist/assets/js/all.js",
            optimize : "uglify2",
            inlineText : true,
            findNestedDependencies : true,
            paths : {
                requireLib : "assets/bower_components/requirejs/require",
            },
            include : [
                "requireLib"
            ]
          }
        }
      }
person Shan Robertson    schedule 23.01.2015
comment
Спасибо за ответ, не могли бы вы опубликовать соответствующую структуру файлов/папок? - person Sven; 24.01.2015