2013-11-21 40 views
4

所以我有文件的目录,其中两个文件将立即里面的文件夹:咕噜-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()很好,但最后一个都找不到。我正在使用的别名映射只能看到一个深度级别。我怎样才能让它落到我给它的每一个级别?

+0

'**/*安装。js'应该工作,你可以用'-v'标志运行呢?也许给我们提供你正在使用的软件包的版本号,包括节点。 –

回答

5

整个aliasMappings选项似乎中断,因为我甚至不能让他们的映射示例正常工作。我发现另一个解决方案,使用aliasify(荣誉byronwongthis code)。这是怎么我的工作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有根本的不同,因此不太确定使用该lib的解决方案的样子。

更新:经过一番捣鼓之后,我意识到没有必要使用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']); 

}; 
+0

你真了不起!现在我可以修复我所有的路径了:-) – FakeRainBrigand

+0

非常欢迎您!请检查我添加到github问题的评论。由于它不更新映射,因此它在手表期间无法按预期工作。但如果你能忍受它,它会工作得很好:) – mekwall

+0

@FakeRainBrigand不要忘记接受这个答案,如果它回答了你的问题:) – mekwall

2

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

您可以npm install [email protected]

+0

。我仍然无法工作。 – mrbinky3000

+0

aliasMapping已从grunt-browserify中删除。新选项现在是[别名](https://github.com/jmreidy/grunt-browserify#alias),它实际上并不是直接替代品。查看Marcus Ekwall更新的代码,我正在使用类似的方法,并且工作正常。 –