J'ai une bibliothèque qui peut être utilisée avec node.js et le navigateur. J'utilise CommonJS, puis je publie pour la version Web à l'aide de Webpack. Mon code ressemble à ceci:
// 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');
}
Le problème que je rencontre est que lorsque je lance webpack (browserify ferait la même chose), la sortie générée inclut http
avec toutes ses dépendances. Cela se traduit par un fichier énorme qui n'est pas optimal pour les performances du navigateur.
Ma question est la suivante: comment puis-je exclure le chemin du code de nœud lors de l'exécution d'un bundler de modules? J'ai résolu ce problème temporairement en utilisant les externals de webpack et en retournant simplement indéfini en incluant './adapters/http'
. Cela ne résout pas le cas d'utilisation où d'autres développeurs dépendent de ma bibliothèque utilisant CommonJS. Leur construction se retrouvera avec le même problème à moins d’utiliser une configuration d’exclusion similaire.
J'ai envisagé d'utiliser envify, en me demandant s'il existe une autre solution/meilleure.
Merci!
Vous pouvez utiliser IgnorePlugin
pour Webpack. Si vous utilisez un fichier webpack.config.js, utilisez-le comme ceci:
var webpack = require('webpack')
var ignore = new webpack.IgnorePlugin(/^(canvas|mongoose|react)$/)
module.exports = {
//other options goes here
plugins: [ignore]
}
Pour aller plus loin, vous pouvez utiliser des indicateurs tels que process.env.NODE_ENV
pour contrôler le filtre regex de IgnorePlugin.
Pour exclure node_modules
et les bibliothèques de noeuds natifs du regroupement, vous devez:
target: 'node'
à votre webpack.config.js
. Ceci exclura les modules de nœud natif (chemin, fs, etc.) de la fusion.node_modules
.Ainsi, votre fichier de configuration de résultats devrait ressembler à ceci:
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
...
};
Cela a fonctionné mieux pour moi
var _process;
try {
_process = eval("process"); // avoid browserify shim
} catch (e) {}
var isNode = typeof _process==="object" && _process.toString()==="[object process]";
en tant que nœud renverra true
et non seulement le navigateur renverra false
, mais browserify n'inclura pas son process
shim lors de la compilation de votre code. En conséquence, le code de votre navigateur sera plus petit.
Edit: J'ai écrit un paquet pour mieux gérer ça: broquire
Vous pouvez utiliser require.ensure
pour le fractionnement d'ensembles. Par exemple
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');
});
}
Voir code splitting pour plus d'informations et un exemple d'utilisation de la démonstration ici