When looking at both the HeightGrid Component by andreasplesch and the Terrain Model Component by bryik I noticed that both referenced a project called Browserify.
Browserify lets you require(‘modules’) in the browser by bundling up all of your dependencies.
In other words, you can use Browserify to include lots of different JavaScript components and package them up into one JavaScript file that can then be easily included in your projects.
To start with, I decided to try to re-make the A-Frame Terrain Model Component – Olympic Peninsula that I had previously duplicated from bryik.
First of all, I had to install Browserify via npm globally:
npm install browserify --global
Second, install both A Frame and A-Frame Terrain Model Component via npm locally:
npm install aframe --save npm install aframe-terrain-model-component --save
Third, I created a new JavaScript file (main.js) in a newly created js folder inside my previously created src folder:
cd src mkdir js cd js touch main.js
Fourth, I added the following content to my new main.js file:
require('aframe'); require('aframe-terrain-model-component');
Fifth, I created a new .pug file (aFrameTerrainModelComponentOlympicPeninsulaGeneratedViaLessAndPugAndBrowserify.pug) in my previously created pug folder inside my previously created src folder, with the following content:
doctype html html head meta(charset='utf-8') title A-Frame Terrain Model Component - Olympic Peninsula made via Less and Pug and Browserify meta(name='description', content='A-Frame Terrain Model Component - Olympic Peninsula made via Less and Pug and Browserify') script(src='build.js') link(href="style.css", rel="stylesheet", media="all") body a-scene(antialias='true') //Is this assets line even necessary? a-assets //Camera a-entity(position='100 40 70' rotation='0 30 0') a-entity(camera look-controls wasd-controls) //Terrain a-entity(terrain-model='DEM: url(aframe-terrain-model-component/docs/Olympic-Peninsula/data/clipped-envi.bin); texture: url(aframe-terrain-model-component/docs/Olympic-Peninsula/data/olympic-texture.jpg); planeWidth: 287; planeHeight: 151; segmentsWidth: 287; segmentsHeight: 151; zPosition: 50;') //Sky a-sky(color='grey') //Light a-entity(light='type: ambient; color: #0xeeeeee')
Which was created by converting the original HTML source code, liberal use of the JavaScript console and the Pug API reference, particulary the attributes section.
Sixth, I could now check that my new .pug file was correctly formatted by running the following command in the root of my project:
gulp pug
Unfortunately, the newly generated html file wasn’t loading yet as build.js didn’t exist, so it was time to add a new task to my gulpfile.js, so that Browserify could create it:
// Modules var gulp = require('gulp'); var pug = require('gulp-pug'); var less = require('gulp-less'); var browserSync = require('browser-sync').create(); var source = require('vinyl-source-stream'); var browserify = require('browserify'); // Tasks gulp.task('default', ['pug', 'less', 'browserify']); gulp.task('pug', function(){ return gulp.src( './src/pug/**/*.pug') .pipe( pug( {pretty: true})) .pipe( gulp.dest('./docs/')); }); gulp.task('less', function(){ return gulp.src( './src/less/**/*.less') .pipe( less()) .pipe( gulp.dest('./docs/')); }); gulp.task('browserify', function() { return browserify('./src/js/main.js') .bundle() //Pass desired output filename to vinyl-source-stream .pipe(source('build.js')) // Start piping stream to tasks! .pipe(gulp.dest('./docs/')); }); // Watching gulp.task('watch', function(){ browserSync.init({ port: 4000, //where is browser sync proxy: 'http://localhost:3000/', //what are we proxying? ui: {port: 4001}, //where is the UI browser: [] //empty array of browsers }); gulp.watch('./src/pug/**/*.pug', [ 'pug']) .on('change', browserSync.reload); gulp.watch('./src/less/**/*.less', [ 'less']) .on('change', browserSync.reload); gulp.watch('./src/js/main.js', [ 'browserify']) .on('change', browserSync.reload); });
In order to make this new task work, I also had to install vinyl-source-stream via npm locally, as well as browserify locally:
npm install vinyl-source-stream --save npm install browserify --save
I could see the files running locally by running commands that I first used in a previous post:
nodemon app.server.js gulp && gulp watch
I’ve pushed all these changes to my GitHub for the project, and you can see the generated html file here, it’s identical to the file I duplicated manually before.
The following tutorials were useful as reference for this post: