compile - webpack config
Cómo requerir JavaScript usando un paquete web desde un directorio dinámico (2)
Tengo un poco de JavaScript ES5 simple y antiguo de la escuela que necesito introducir en mi aplicación que utiliza el paquete web como un empaquetador. El problema es que la ubicación de estos archivos se encuentra en una carpeta cuya ruta es dinámica. Parece que el webpack no funciona bien con las expresiones en require
y require.context
no las permite en absoluto.
Para que los directorios de rutas conocidas requieran todos los archivos en un directorio y sus subdirectorios, este enfoque funciona bien :
let domainRequires = require.context(''./app/domain'', true, //.js$/); domainRequires.keys().forEach(domainRequires);
Ya que no puedo usar una expresión en require.context
, intenté simplemente usar plain require
y NO está funcionando :
require(''../../path/to/code/my-library-'' + versionNumber + ''/domain/clazz.js'');
utilizando la ruta relativa completa.
También he intentado usar require.context
pero mejorando la parte de expresiones regulares para que funcione y no he tenido suerte:
require.context(''../../path/to/code'', true, /^my-library-.*//domain//.*/.js$/);
Cualquier pensamiento, sugerencia o solución sería bienvenido. Si necesito usar algo de terceros con el paquete web, eso también está bien.
De Webpack 3.9 (creo) los commonRequires
no son necesarios. Ejecuto esto en webpack.config.js:
resolve: {
alias: {
tmpDir: path.resolve(__dirname, ''/tmp'')
}
}
Y luego cargo mi módulo personalizado como:
const dynModule = require(''tmpDir/dyn_module.js'');
No estoy seguro de si me olvido de algo de sus requisitos, pero commonRequires
no es necesario para mí y Webpack lo construye bien (y funciona).
Terminé resolviendo esto. Al usar el paquete web resolve.alias
, podría agregar:
resolve: {
alias: {
common: path.resolve(__dirname, ''../../path/to/code/my-library-'' + versionNumber + ''/domain'')
}
}
en webpack.config
.
Luego, en mi código, puedo solicitar todos los archivos bajo /domain
través de:
var commonRequires = require.context(''common'', true, //.js$/);
commonRequires.keys().forEach(commonRequires);
Del mismo modo, podría obtener un solo archivo a través de:
require(''common/clazz.js''); // ../../path/to/code/my-library-1.0.0/domain/clazz.js
FWIW, para obtener la versión Número utilicé el módulo fs
del nodo para leer un archivo json, usé JSON.parse(file)
y luego JSON.parse(file)
la versión en la parte superior de webpack.config