Ich habe eine Bibliothek, die sowohl mit node.js als auch mit dem Browser verwendet werden kann. Ich verwende CommonJS und veröffentliche dann die Webversion mit Webpack. Mein Code sieht so aus:
// For browsers use XHR adapter
if (typeof window !== 'undefined') {
// This adapter uses browser's XMLHttpRequest
require('./adapters/xhr');
}
// For node use HTTP adapter
else if (typeof process !== 'undefined') {
// This adapter uses node's `http`
require('./adapters/http');
}
Das Problem, dem ich begegne, ist, dass die generierte Ausgabe bei der Ausführung von webpack (browserify würde dasselbe tun) http
mit allen Abhängigkeiten enthält. Dies führt zu einer riesigen Datei, die für die Browserleistung nicht optimal ist.
Meine Frage ist, wie ich den Knotencode-Pfad ausschließen kann, wenn ein Modulbündler ausgeführt wird. Ich habe dieses Problem vorübergehend gelöst, indem ich externe Webpacks verwendet habe und bei der Eingabe von './adapters/http'
nur undefined zurückgegeben habe. Dies löst den Anwendungsfall nicht, bei dem andere Entwickler von meiner Bibliothek mit CommonJS abhängig sind. Ihr Build wird mit dem gleichen Problem enden, es sei denn, sie verwenden eine ähnliche ausschließende Konfiguration.
Ich habe mir envify angeschaut und habe mich nur gefragt, ob es eine andere/bessere Lösung gibt.
Vielen Dank!
Sie können IgnorePlugin
für Webpack verwenden. Wenn Sie eine webpack.config.js-Datei verwenden, verwenden Sie diese wie folgt:
var webpack = require('webpack')
var ignore = new webpack.IgnorePlugin(/^(canvas|mongoose|react)$/)
module.exports = {
//other options goes here
plugins: [ignore]
}
Um es weiter zu drücken, können Sie einige Flags wie process.env.NODE_ENV
verwenden, um den Regex-Filter von IgnorePlugin zu steuern
Um node_modules
und native Knotenbibliotheken von der Bündelung auszuschließen, müssen Sie:
target: 'node'
zu Ihrem webpack.config.js
hinzu. Dadurch werden native Knotenmodule (Pfad, fs usw.) von der Bündelung ausgeschlossen.node_modules
auszuschließen.Ihre Ergebnis-Konfigurationsdatei sollte also so aussehen:
var nodeExternals = require('webpack-node-externals');
...
module.exports = {
...
target: 'node', // in order to ignore built-in modules like path, fs, etc.
externals: [nodeExternals()], // in order to ignore all modules in node_modules folder
...
};
Das hat für mich am besten funktioniert
var _process;
try {
_process = eval("process"); // avoid browserify shim
} catch (e) {}
var isNode = typeof _process==="object" && _process.toString()==="[object process]";
node gibt true
zurück und der Browser gibt nicht nur false
zurück, sondern browserify wird bei der Kompilierung des Codes kein process
-Shim enthalten. Ihr browserfähiger Code wird daher kleiner sein.
Edit: Ich habe ein Paket geschrieben, um dies sauberer zu behandeln: broquire
Sie können require.ensure
für die Bündelaufteilung verwenden. Zum Beispiel
if (typeof window !== 'undefined') {
console.log("Loading browser XMLHttpRequest");
require.ensure([], function(require){
// require.ensure creates a bundle split-point
require('./adapters/xhr');
});
} else if (typeof process !== 'undefined') {
console.log("Loading node http");
require.ensure([], function(require){
// require.ensure creates a bundle split-point
require('./adapters/http');
});
}
Siehe Code Splitting für weitere Informationen und eine Beispiel-Demo-Verwendung hier