grunt-browserify aliasMapping два уровня в глубину

Итак, у меня есть каталог файлов, в котором два файла находятся непосредственно внутри папки:

views/view1.js
views/view2.js

Но один вложен на уровень глубже

views/other/view3.js

Я хочу скомпилировать их с помощью grunt-browserify, используя сопоставление псевдонимов, чтобы я мог потребовать их как:

require('view1')

require('view2')

require('other/view3')

Поэтому я настраиваю простое сопоставление в конфигурации grunt-browserify:

{
  expand: true,
  cwd: 'views/',
  src: ['**/*.js'],
  dest: ''
}

Первые два файла require() в порядке, но последний не может быть найден. Сопоставление псевдонимов, которое я использую, просматривает только один уровень глубины. Как я могу заставить его опускаться каждый уровень, который я даю ему?


person alt    schedule 21.11.2013    source источник
comment
**/*.js должно работать, не могли бы вы запустить его с флагом -v? И, возможно, сообщите нам номера версий пакетов, которые вы используете, включая node.   -  person Allan Kimmer Jensen    schedule 10.02.2014


Ответы (2)


Вся опция aliasMappings кажется сломанной, потому что я даже не могу заставить их пример сопоставления работать должным образом. Я нашел другое решение, в котором используется aliasify (престижность byronwong для этого кода). Вот как выглядит мой рабочий Gruntfile:

var util = require('util');
var aliasify = require('aliasify');

module.exports = function(grunt) {

  // takes grunt-browserify aliasMappings config and converts it into an aliasify config.
  function configureAliasify(aliasMappings) {
    var expandedAliases = {};
    aliases = util.isArray(aliasMappings) ? aliasMappings : [aliasMappings];
    aliases.forEach(function (alias) {
      grunt.file.expandMapping(alias.src, alias.dest, {cwd: alias.cwd}).forEach(function(file) {
        var expose = file.dest.substr(0, file.dest.lastIndexOf('.'));
        expandedAliases[expose] = './' + file.src[0];
      });
    });

    return require('aliasify').configure({
      aliases: expandedAliases
    });
  }

  // Create alias mappings with aliasify
  var aliasMappings = configureAliasify({
    cwd: 'views',
    src: ['**/*.js'],
    dest: ''
  });

  // Project configuration.
  grunt.initConfig({
    browserify: {
      dist: {
        files: {
          'build/app.js': ['client/entry.js']
        },
        options: {
          debug: true,
          transform: [aliasMappings]
        }
      }
    }
  });

  // Load the plugin that provides the "browserify" task.
  grunt.loadNpmTasks('grunt-browserify');

  // Default task(s).
  grunt.registerTask('default', ['browserify']);

};

Файл client/entry.js теперь может требовать все файлы, существующие в каталоге views, в качестве псевдонимов.

Обратите внимание, что хотя приведенное выше решение работает, aliasify больше не поддерживается в пользу tagify. Однако tagify принципиально отличается от aliasify, поэтому не совсем уверен, как будет выглядеть решение, использующее эту библиотеку.

Обновление: Повозившись еще немного, я понял, что нет необходимости использовать aliasify или tagify. В основном нужна функция отображения, которая принимает aliasMapping и возвращает массив alias. Это примерно то, что grunt-browserify должен делать с aliasMapping, но по какой-то причине это не работает. Вот что у меня получилось:

var util = require('util');

module.exports = function(grunt) {

  // Takes grunt-browserify aliasMappings config and converts it into an alias array
  function aliasMappingsToAliasArray(aliasMappings) {
    var aliasArray = [];
    aliases = util.isArray(aliasMappings) ? aliasMappings : [aliasMappings];
    aliases.forEach(function (alias) {
      grunt.file.expandMapping(alias.src, alias.dest, {cwd: alias.cwd}).forEach(function(file) {
        var expose = file.dest.substr(0, file.dest.lastIndexOf('.'));
        aliasArray.push('./' + file.src[0] + ':' + expose);
      });
    });
    return aliasArray;
  }

  // Project configuration.
  grunt.initConfig({
    browserify: {
      dist: {
        files: {
            'build/app.js': ['client/entry.js']
        },
        options: {
          debug: true,
          alias: aliasMappingsToAliasArray({
            cwd: 'shared',
            src: ['**/*.js'],
            dest: ''
          })
        }
      }
    }
  });

  // Load the plugin that provides the "browserify" task.
  grunt.loadNpmTasks('grunt-browserify');

  // Default task(s).
  grunt.registerTask('default', ['browserify']);

};
person mekwall    schedule 11.02.2014
comment
Ты удивительный! Теперь я могу исправить все свои пути :-) - person Brigand; 12.02.2014
comment
Добро пожаловать! Пожалуйста, проверьте комментарий, который я добавил к проблеме github. Он не будет работать должным образом во время наблюдения, поскольку не обновляет сопоставления. Но если вы можете жить с этим, это будет работать просто отлично :) - person mekwall; 12.02.2014
comment
@FakeRainBrigand Не забудьте принять этот ответ, если он ответил на ваш вопрос :) - person mekwall; 07.03.2014
comment
Если бы я мог; к сожалению, изначально это был не мой вопрос. - person Brigand; 07.03.2014

Эта конфигурация aliasMapping теперь работает, как и ожидалось, в бета-версии v2.

Вы можете установить его с помощью npm install grunt-browserify@2

person Joni Bekenstein    schedule 01.03.2014
comment
aliasMapping был удален из grunt-browserify. Новая опция теперь называется псевдонимом, который на самом деле не является прямой заменой. Ознакомьтесь с обновленным кодом Маркуса Эквалла, я использую аналогичный подход, и он отлично работает. - person Joni Bekenstein; 11.06.2014