How to include node_modules in a separate browserify vendor bundle

14,012

I was just trying to do the same thing. I think you need to use --require for the vendor bundle and --export for the application's so that the dependencies don't get bundled twice.

This worked for me using browserify's api and gulp (lodash and pixijs being my node_modules):

var gulp = require('gulp');
var browserify = require('browserify');
var handleErrors = require('../util/handleErrors');
var source = require('vinyl-source-stream');


gulp.task('libs', function () {
  return browserify()
    .require('lodash')
    .require('pixi.js')
    .bundle()
    .on('error', handleErrors)
    .pipe(source('libs.js'))
    .pipe(gulp.dest('./build/'));
});

gulp.task('scripts', function () {
  return browserify('./src/main.js')
    .external('lodash')
    .external('pixi.js')
    .bundle()
    .on('error', handleErrors)
    .pipe(source('main.js'))
    .pipe(gulp.dest('./build/'));
});

gulp.task('watch', function(){
  gulp.watch('src/**', ['scripts']);
});

gulp.task('default', ['libs', 'scripts', 'watch']);

Of course, this solution is a pain to maintain... So I patched browserify to accept arrays in require and external and then you can do this which I think it's a lot better:

var gulp         = require('gulp');
var browserify   = require('browserify');
var handleErrors = require('../util/handleErrors');
var source       = require('vinyl-source-stream');

var packageJson = require('../../package.json');
var dependencies = Object.keys(packageJson && packageJson.dependencies || {});


gulp.task('libs', function () {
  return browserify()
    .require(dependencies)
    .bundle()
    .on('error', handleErrors)
    .pipe(source('libs.js'))
    .pipe(gulp.dest('./build/'));
});

gulp.task('scripts', function () {
  return browserify('./src/main.js')
    .external(dependencies)
    .bundle()
    .on('error', handleErrors)
    .pipe(source('main.js'))
    .pipe(gulp.dest('./build/'));
});

gulp.task('watch', function(){
  gulp.watch('package.json', ['libs']);
  gulp.watch('src/**', ['scripts']);
});

gulp.task('default', ['libs', 'scripts', 'watch']);

That's the best I could come up with... Please, let me know if you find a better way.

Share:
14,012

Related videos on Youtube

kpg
Author by

kpg

I have a great breadth of experience in business and technology gained over many years working in many different roles in every type of organisation in several countries around the world. I am an ICF certified coach. I am a Zoho consultant and a director of Appz Ltd, A Zoho Partner based in Malta but still like to get my hand dirty writing Typescript/Javascript for Node.js and Zoho Catalyst.

Updated on June 21, 2022

Comments

  • kpg
    kpg about 2 years

    I am trying to convert an AngularJS app to use browserify. I have installed all my bower packages in node_modules using napa. Now I want to browserify them into a separate vendor bundle and declare them as 'external' dependencies. I would like to give them aliases, so that I can "require('angular')" instead of "require('angular/angular')", as it seems you can do with externals.

    The examples I have seen (e.g. http://benclinkinbeard.com/posts/external-bundles-for-faster-browserify-builds/) all assume that I have downloaed the vendor files into a 'lib' directory. I want to just bundle my vendor files from node_modules. It seems like it should be easy but I can't see how to do it.

  • kpg
    kpg about 10 years
    Thanks for the response Oscar. I put my Browserify adventure on hold for now, so unfortunately cannot verify this answer. When I revisit the problem I will try to remember to test and accept your answer.
  • CheapSteaks
    CheapSteaks over 9 years
    So I patched browserify any chance you could send that in as a pull request?
  • Oscar Morante
    Oscar Morante over 9 years
    hi there, this patch was already merged here.
  • apple16
    apple16 about 8 years
    Is it possible to just get the frontend dependencies instead of getting all of the dependencies in package.json (which will include gulp itself)? I don't want to bundle gulp itself in the browserify bundle.
  • torvin
    torvin over 7 years
    @apple16 that's what devDependencies are for