Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make browserify modules external with Gulp

I have a library lib.js that I want to create from lib/a.js and lib/b.js and to be able to use it from a script client.js using var a = require('lib/a.js'); and that it works when I just include the compiled lib.js library before client.js (therefore, lib.js has to declare a require function that knows about lib/a.js)

I guess I have to use external and alias but I am not sure what is the proper way to do it

Also, is it possible to have a Gulp file that creates all the alias automatically for the folders in my library? eg. creates an alias for all the files in the lib/ dir?

like image 495
oulipo Avatar asked Jan 31 '14 16:01

oulipo


People also ask

Is Gulp better than Webpack?

For instance, if our focus is only coding, we might need a task runner and in such cases, gulp. js is a better pick for us. On the other hand, if all we need to do is configure and tweak, perhaps a module binder such as webpack is more apt for our needs.

Do you need Gulp with Webpack?

CSS and HTML files are used, and it finds the code easily in the entire application. Gulp can manage only a single application, and it is never a replacement for Webpack, whereas Webpack can be used as a replacement for Gulp. As both uses JavaScript, users will not feel different while migrating from Gulp to Webpack.

Is Gulp still relevant?

It's no longer necessary with tools like create-react-app and next-js. Gulp used to make sense before Webpack and React. You needed to process files, build your project, and have a functioning web server (BrowserSync) that refreshes the browser when you make changes.

When should I use Browserify?

Browserify solves the problems of having too many JS files referenced in your HTML, inability to use Node modules in the browser, and inability to reference your own modules in your own code. Watchify streamlines the process of bundling your files and will make a change every time you change a JS file in your project.


1 Answers

Here are a couple of gulp tasks that would help to build your common lib.js and the client.js bundles separately.

Note that you have to tell browserify to b.require() lib/*.js when bundling lib.js, and you have to tell it to b.external() the libraries that will be loaded separately when bundling client.js

var path = require('path');
var gulp = require('gulp');
var browserify = require('browserify');
var concat = require('gulp-concat');
var transform = require('vinyl-transform');

gulp.task('build-lib', function () {

  // use `vinyl-transform` to wrap around the regular ReadableStream returned by b.bundle();
  // so that we can use it down a vinyl pipeline as a vinyl file object.
  // `vinyl-transform` takes care of creating both streaming and buffered vinyl file objects.
  var browserified = transform(function(filename) {

    // basename, for eg: 'a.js'
    var basename = path.basename(filename);

    // define the exposed name that your client.js would use to require();
    // for eg: require('lib/a.js'); // -> exposed name should be 'lib/a.js'
    var expose = 'lib/' + basename;

    return browserify(filename)
      .require(filename, { expose: expose})
      .bundle();
  });

  return gulp.src(['./lib/*.js'])
    .pipe(browserified)
    .pipe(concat('lib.js'))
    .pipe(gulp.dest('./dist'));
});

gulp.task('build-client', function () {

  var browserified = transform(function(filename) {
    // filename = './client.js'

    // let browserify know that lib/a.js and and lib/b.js are external files
    // and will be loaded externally (in your case, by loading the bundled lib.js 
    // for eg: <script src='dist/lib.js'>)
    return browserify(filename)
      .external('lib/a.js')
      .external('lib/b.js')
      .bundle();
  });

  return gulp.src(['./client.js'])
    .pipe(browserified)
    .pipe(gulp.dest('./dist'));
});

gulp.task('default', ['build-lib', 'build-client']);
like image 143
Hafiz Ismail Avatar answered Oct 22 '22 09:10

Hafiz Ismail