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?
The whole aliasMappings option seems broken because I can't even get their mapping example to work out properly. I found another solution that uses aliasify (kudos to byronwong for this code). This is how my working Gruntfile looks like:
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']);
};
The client/entry.js file now can require all the files that exist in the views directory as aliases.
Note that while the above solution works, aliasify is no longer maintained in favor for tagify. However, tagify is fundamentally different to aliasify so not really sure how a solution using that lib instead would look like.
Update: After some more fiddling I realized that it's not necessary to use aliasify or tagify. What is needed is basically a mapping function that takes aliasMapping and returns a alias array. This is more or less what grunt-browserify should do with an aliasMapping, but for some reason it isn't working. This is what I ended up with:
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']);
};
That aliasMapping configuration is now working as expected in v2 beta.
You can install it with npm install grunt-browserify@2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With