2014-02-08 9 views
14

Ich verwende Browserify, um eine große Node.js-Anwendung in eine einzige Datei zu kompilieren (mit den Optionen --bare und --ignore-missing [um Probleme mit lib-cov in Express zu vermeiden]). Ich habe einige Codes, um dynamisch Module zu laden auf, was in einem Verzeichnis verfügbar:Kompilieren dynamisch benötigter Module mit Browserify

var fs = require('fs'), 
    path = require('path'); 

fs.readdirSync(__dirname).forEach(function (file) { 
    if (file !== 'index.js' && fs.statSync(path.join(__dirname, file)).isFile()) { 
     module.exports[file.substring(0, file.length-3)] = require(path.join(__dirname, file)); 
    } 
}); 

Ich erhalte seltsame Fehler in meiner Anwendung, wo aribtrary Textdateien aus dem Verzeichnis wird meine kompilierte Datei geladen in geladen werden. Ich denke, das liegt daran, dass die Pfade nicht mehr korrekt eingestellt sind, und weil Browserify require() nicht in der Lage ist, die richtigen Dateien zu laden, die so dynamisch geladen werden.

Kurz vor der Erstellung einer statischen index.js Datei, gibt es eine bevorzugte Methode, dynamisch ein Verzeichnis von Modulen zu verlangen, das mit Browserify kompatibel ist?

Antwort

19

Dieses Plugin ermöglicht Glob-Muster zu verlangen: require-globify

Dann, mit einem kleinen Hack Sie alle Dateien auf Kompilation hinzufügen und Ausführung sie nicht:

// Hack to compile Glob files. Don´t call this function! 
function ಠ_ಠ() { 
    require('views/**/*.js', { glob: true }) 
} 

Und zum Beispiel, könnten Sie erfordern und eine bestimmte Datei auszuführen, wenn Sie es brauchen: D

var homePage = require('views/'+currentView) 
+0

Sehr cool. Ich muss mich später damit anlegen! – Brad

+5

Muahhhahha, Stauchen Analyzer zu glauben, dass Sie sie verwenden - Klassiker: D – incarnate

+0

Warum ist das erforderlich ("app /" + Modul) funktioniert nur, wenn ich es in der gleichen Datei, wo die erfordern ("app/*. js ") ist? Die benötigten JSs sind in der kompilierten JS, ich kann sie finden, aber kann nicht darauf zugreifen ... – haxpanel

2

Browserify unterstützt keine dynamischen Anforderungen - siehe GH issue 377.

Die einzige Methode zum dynamischen Erfordern eines Verzeichnisses, das mir bekannt ist: ein Build-Schritt, um die Verzeichnisdateien aufzulisten und die "static" index.js-Datei zu schreiben.

+0

Danke für den Hinweis. Ich habe am Ende eine statische Include-Datei erstellt, wie Sie es vorgeschlagen haben. Im Moment habe ich nur ungefähr 15 Dinge drin. – Brad

2

es gibt auch die bulkify verwandeln, wie hier dokumentiert:

https://github.com/chrisdavies/tech-thoughts/blob/master/browserify-include-directory.md

Grundsätzlich können Sie dies in Ihrem app.js oder was auch immer:

var bulk = require('bulk-require'); 

// Require all of the scripts in the controllers directory 
bulk(__dirname, ['controllers/**/*.js']); 

Und mein gulpfile hat so etwas in ihm:

gulp.task('js', function() { 
    return gulp.src('./src/js/init.js') 
    .pipe(browserify({ 
     transform: ['bulkify'] 
    })) 
    .pipe(rename('app.js')) 
    .pipe(uglify()) 
    .pipe(gulp.dest('./dest/js')); 
}); 
Verwandte Themen