4

So I have a directory of files where two of the files are immediately inside the folder:

views/view1.js
views/view2.js

But one is nested a level deeper

views/other/view3.js

I want to compile these with grunt-browserify using an alias mapping so I can require them as:

require('view1')

require('view2')

require('other/view3')

So I setup the simple mapping in the grunt-browserify config:

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

The first two files require() fine, but the last one can't be found. The alias mapping I'm using is only looking a single level deep. How can I get it to go down every level I give it?

4

2 回答 2

5

整个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

更新:经过一番摆弄后,我意识到没有必要使用aliasifyor tagify。需要的基本上是一个映射函数,它接受aliasMapping并返回一个alias数组。这或多或少grunt-browserify应该对 a 做些什么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']);

};
于 2014-02-11T20:03:07.973 回答
2

aliasMapping配置现在在 v2 beta 中按预期工作。

你可以安装它npm install grunt-browserify@2

于 2014-03-01T12:53:54.690 回答