javascript - org - webpack-- w
¿Cómo puedo excluir la ruta del código al agrupar con webpack/browserify? (4)
Tengo una biblioteca que se puede usar tanto con node.js como con el navegador. Estoy usando CommonJS y luego publico para la versión web usando webpack. Mi código se ve así:
// 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'');
}
El problema que me encuentro es que cuando ejecuto webpack (browserify haría lo mismo) el resultado generado incluye http
junto con todas sus dependencias. Esto da como resultado un archivo ENORME que no es óptimo para el rendimiento del navegador.
Mi pregunta es ¿cómo puedo excluir la ruta del código de nodo cuando ejecuto un agrupador de módulos? Resolví esto temporalmente usando los elementos externos de webpack y simplemente volviendo indefinido al incluir ''./adapters/http''
. Esto no resuelve el caso de uso donde otros desarrolladores dependen de mi biblioteca usando CommonJS. Su compilación terminará con el mismo problema a menos que utilicen configuraciones de exclusión similares.
He analizado el uso de envify, solo me pregunto si hay otra solución mejor.
¡Gracias!
Esto funciono mejor para mi
var _process;
try {
_process = eval("process"); // avoid browserify shim
} catch (e) {}
var isNode = typeof _process==="object" && _process.toString()==="[object process]";
como Node devolverá true
y no solo el navegador devolverá false
, sino que browserify no incluirá su process
compilación cuando compile su código. Como resultado, su código de navegación será más pequeño.
Edit : escribí un paquete para manejar esto de manera más limpia: broquire
Para excluir que los node_modules
y las bibliotecas de nodo nativo no se incluyan, debe:
- Agregue
target: ''node''
a suwebpack.config.js
. Esto excluirá que los módulos de nodo nativos (ruta, fs, etc.) sean agrupados. - Utilice webpack-node-externals para excluir todos los demás
node_modules
.
Entonces tu archivo de configuración de resultados debería verse como:
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
...
};
Puede utilizar IgnorePlugin
para Webpack. Si está utilizando un archivo webpack.config.js, utilícelo así:
var webpack = require(''webpack'')
var ignore = new webpack.IgnorePlugin(/^(canvas|mongoose|react)$/)
module.exports = {
//other options goes here
plugins: [ignore]
}
Para seguir avanzando, puede usar algunos indicadores como process.env.NODE_ENV
para controlar el filtro de expresiones regulares de IgnorePlugin
Puede utilizar require.ensure
para la división de paquetes. Por ejemplo
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'');
});
}
Consulte la división de códigos para obtener más información y una muestra de uso de demostración here