咕哝浏览别名映射两个层次

grunt-browserify aliasMapping two levels deep

本文关键字:两个 层次 浏览 别名 映射      更新时间:2023-09-26

所以我有一个文件目录,其中两个文件直接在文件夹中:

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()很好,但找不到最后一个。我使用的别名映射看起来只有一个层次的深度。我怎样才能让它降到我给它的每一个级别?

整个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。然而,tagifyaliasify有着根本的不同,因此不确定使用该库的解决方案会是什么样子。

更新:经过更多的修改,我意识到没有必要使用aliasifytagify。所需要的基本上是一个获取aliasMapping并返回alias数组的映射函数。这或多或少是grunt-browserifyaliasMapping应该做的,但由于某种原因,它不起作用。这就是我最终得到的:

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']);
};

aliasMapping配置现在在v2测试版中按预期工作。

您可以使用npm install grunt-browserify@2 进行安装